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
Martin Brennan ac7bf98ad1
DEV: Load client site settings YML into JS tests (#18413)
Our method of loading a subset of client settings into tests via
tests/helpers/site-settings.js can be improved upon. Currently we have a
hardcoded subset of the client settings, which may get out of date and not have
the correct defaults. As well as this plugins do not get their settings into the
tests, so whenever you need a setting from a plugin, even if it has a default,
you have to do needs.setting({ ... }) which is inconvenient.

This commit introduces an ember CLI build step to take the site_settings.yml and
all the plugin settings.yml files, pull out the client settings, and dump them
into a variable in a single JS file we can load in our tests, so we have the
correct selection of settings and default values in our JS tests. It also fixes
many, many tests that were operating under incorrect assumptions or old
settings.

Co-authored-by: Joffrey JAFFEUX <j.jaffeux@gmail.com>
2022-11-08 09:17:43 +10:00

185 lines
5.7 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",
});
needs.pretender((server, helper) => {
server.get("/inline-onebox", () =>
helper.response({
"inline-oneboxes": [
{
url: "http://www.example.com/57350945",
title: "This is a great title",
},
],
})
);
});
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"
);
});
});