This repository has been archived on 2023-03-18. You can view files and clone it, but cannot push or open issues or pull requests.
osr-discourse-src/app/assets/javascripts/discourse/tests/acceptance/topic-quote-button-test.js
Penar Musaraj 7592754c90
FIX: Allow users to quote in closed topics (#17645)
Previously, non-staff users could only quote if they had an open composer.

This change shows the quote control when selecting text in closed topics
at all times and if the composer isn't already open, it will default to
creating a linked topic.
2022-07-26 15:45:34 -04:00

172 lines
5.4 KiB
JavaScript

import {
acceptance,
chromeTest,
exists,
query,
queryAll,
selectText,
} from "discourse/tests/helpers/qunit-helpers";
import I18n from "I18n";
import { click, triggerKeyEvent, visit } from "@ember/test-helpers";
import { cloneJSON } from "discourse-common/lib/object";
import topicFixtures from "discourse/tests/fixtures/topic";
import { test } from "qunit";
// This tests are flaky on Firefox. Fails with `calling set on destroyed object`
acceptance("Topic - Quote button - logged in", function (needs) {
needs.user();
needs.settings({
share_quote_visibility: "anonymous",
share_quote_buttons: "twitter|email",
});
chromeTest(
"Does not show the quote share buttons by default",
async function (assert) {
await visit("/t/internationalization-localization/280");
await selectText("#post_5 blockquote");
assert.ok(exists(".insert-quote"), "it shows the quote button");
assert.ok(!exists(".quote-sharing"), "it does not show quote sharing");
}
);
chromeTest(
"Shows quote share buttons with the right site settings",
async function (assert) {
this.siteSettings.share_quote_visibility = "all";
await visit("/t/internationalization-localization/280");
await selectText("#post_5 blockquote");
assert.ok(exists(".quote-sharing"), "it shows the quote sharing options");
assert.ok(
exists(`.quote-sharing .btn[title='${I18n.t("share.twitter")}']`),
"it includes the twitter share button"
);
assert.ok(
exists(`.quote-sharing .btn[title='${I18n.t("share.email")}']`),
"it includes the email share button"
);
}
);
chromeTest(
"Quoting a Onebox should not copy the formatting of the rendered Onebox",
async function (assert) {
await visit("/t/topic-for-group-moderators/2480");
await selectText("#post_3 aside.onebox p");
await click(".insert-quote");
assert.strictEqual(
query(".d-editor-input").value.trim(),
'[quote="group_moderator, post:3, topic:2480"]\nhttps://example.com/57350945\n[/quote]',
"quote only contains a link"
);
}
);
});
acceptance("Closed Topic - Quote button - logged in", function (needs) {
needs.user();
needs.pretender((server, helper) => {
const topicResponse = cloneJSON(topicFixtures["/t/280/1.json"]);
topicResponse.closed = true;
topicResponse.details.can_create_post = false;
server.get("/t/280.json", () => helper.response(topicResponse));
});
chromeTest("Shows quote button in closed topics", async function (assert) {
await visit("/t/internationalization-localization/280");
await selectText("#post_1 .cooked p:first-child");
assert.ok(exists(".insert-quote"), "it shows the quote button");
await click(".insert-quote");
assert.ok(
query(".d-editor-input")
.value.trim()
.startsWith("Continuing the discussion from"),
"quote action defaults to reply as new topic (since topic is closed)"
);
});
});
acceptance("Topic - Quote button - anonymous", function (needs) {
needs.settings({
share_quote_visibility: "anonymous",
share_quote_buttons: "twitter|email",
});
chromeTest(
"Shows quote share buttons with the right site settings",
async function (assert) {
await visit("/t/internationalization-localization/280");
await selectText("#post_5 blockquote");
assert.ok(
queryAll(".quote-sharing"),
"it shows the quote sharing options"
);
assert.ok(
exists(`.quote-sharing .btn[title='${I18n.t("share.twitter")}']`),
"it includes the twitter share button"
);
assert.ok(
exists(`.quote-sharing .btn[title='${I18n.t("share.email")}']`),
"it includes the email share button"
);
assert.ok(!exists(".insert-quote"), "it does not show the quote button");
}
);
chromeTest(
"Shows single share button when site setting only has one item",
async function (assert) {
this.siteSettings.share_quote_buttons = "twitter";
await visit("/t/internationalization-localization/280");
await selectText("#post_5 blockquote");
assert.ok(exists(".quote-sharing"), "it shows the quote sharing options");
assert.ok(
exists(`.quote-sharing .btn[title='${I18n.t("share.twitter")}']`),
"it includes the twitter share button"
);
assert.ok(
!exists(".quote-share-label"),
"it does not show the Share label"
);
}
);
chromeTest(
"Shows nothing when visibility is disabled",
async function (assert) {
this.siteSettings.share_quote_visibility = "none";
await visit("/t/internationalization-localization/280");
await selectText("#post_5 blockquote");
assert.ok(!exists(".quote-sharing"), "it does not show quote sharing");
assert.ok(!exists(".insert-quote"), "it does not show the quote button");
}
);
});
acceptance("Topic - Quote button - keyboard shortcut", function (needs) {
needs.user();
test("Can use keyboard shortcut to quote selected text", async function (assert) {
await visit("/t/internationalization-localization/280");
await selectText("#post_1 .cooked");
await triggerKeyEvent(document, "keypress", "Q");
assert.ok(exists(".d-editor-input"), "the editor is open");
assert.ok(
query(".d-editor-input").value.includes("Any plans to support"),
"editor includes selected text"
);
});
});