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-edit-timer-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

382 lines
12 KiB
JavaScript

import {
acceptance,
exists,
fakeTime,
loggedInUser,
query,
queryAll,
updateCurrentUser,
} from "discourse/tests/helpers/qunit-helpers";
import { click, fillIn, visit } from "@ember/test-helpers";
import { test } from "qunit";
import selectKit from "discourse/tests/helpers/select-kit-helper";
import I18n from "I18n";
acceptance("Topic - Edit timer", function (needs) {
let clock = null;
needs.user();
needs.pretender((server, helper) => {
server.post("/t/280/timer", () =>
helper.response({
success: "OK",
execute_at: new Date(
new Date().getTime() + 1 * 60 * 60 * 1000
).toISOString(),
duration_minutes: 1440,
based_on_last_post: false,
closed: false,
category_id: null,
})
);
});
needs.hooks.beforeEach(() => {
const timezone = loggedInUser().timezone;
const tuesday = "2100-06-15T08:00:00";
clock = fakeTime(tuesday, timezone, true);
});
needs.hooks.afterEach(() => {
clock.restore();
});
test("autoclose - specific time", async function (assert) {
updateCurrentUser({ moderator: true });
await visit("/t/internationalization-localization");
await click(".toggle-admin-menu");
await click(".admin-topic-timer-update button");
await click("#tap_tile_start_of_next_business_week");
const regex = /will automatically close in/g;
const html = query(
".edit-topic-timer-modal .topic-timer-info"
).innerHTML.trim();
assert.ok(regex.test(html));
});
test("autoclose", async function (assert) {
updateCurrentUser({ moderator: true });
await visit("/t/internationalization-localization");
await click(".toggle-admin-menu");
await click(".admin-topic-timer-update button");
await click("#tap_tile_start_of_next_business_week");
const regex1 = /will automatically close in/g;
const html1 = query(
".edit-topic-timer-modal .topic-timer-info"
).innerHTML.trim();
assert.ok(regex1.test(html1));
await click("#tap_tile_custom");
await fillIn(".tap-tile-date-input .date-picker", "2100-11-24");
const regex2 = /will automatically close in/g;
const html2 = query(
".edit-topic-timer-modal .topic-timer-info"
).innerHTML.trim();
assert.ok(regex2.test(html2));
const timerType = selectKit(".select-kit.timer-type");
await timerType.expand();
await timerType.selectRowByValue("close_after_last_post");
const interval = selectKit(".select-kit.relative-time-intervals");
await interval.expand();
await interval.selectRowByValue("hours");
await fillIn(".relative-time-duration", "2");
const regex3 = /last post in the topic is already/g;
const html3 = query(".edit-topic-timer-modal .warning").innerHTML.trim();
assert.ok(regex3.test(html3));
});
test("close temporarily", async function (assert) {
updateCurrentUser({ moderator: true });
const timerType = selectKit(".select-kit.timer-type");
await visit("/t/internationalization-localization");
await click(".toggle-admin-menu");
await click(".admin-topic-timer-update button");
await timerType.expand();
await timerType.selectRowByValue("open");
await click("#tap_tile_start_of_next_business_week");
const regex1 = /will automatically open in/g;
const html1 = query(
".edit-topic-timer-modal .topic-timer-info"
).innerHTML.trim();
assert.ok(regex1.test(html1));
await click("#tap_tile_custom");
await fillIn(".tap-tile-date-input .date-picker", "2100-11-24");
const regex2 = /will automatically open in/g;
const html2 = query(
".edit-topic-timer-modal .topic-timer-info"
).innerHTML.trim();
assert.ok(regex2.test(html2));
});
test("schedule publish to category - visible for a PM", async function (assert) {
updateCurrentUser({ moderator: true });
const timerType = selectKit(".select-kit.timer-type");
const categoryChooser = selectKit(".modal-body .category-chooser");
await visit("/t/pm-for-testing/12");
await click(".toggle-admin-menu");
await click(".admin-topic-timer-update button");
await timerType.expand();
await timerType.selectRowByValue("publish_to_category");
assert.strictEqual(categoryChooser.header().label(), "category…");
assert.strictEqual(categoryChooser.header().value(), null);
await categoryChooser.expand();
await categoryChooser.selectRowByValue("7");
await click("#tap_tile_start_of_next_business_week");
const text = query(
".edit-topic-timer-modal .topic-timer-info"
).innerText.trim();
// this needs to be done because there is no simple way to get the
// plain text version of a translation with HTML
let el = document.createElement("p");
el.innerHTML = I18n.t(
"topic.status_update_notice.auto_publish_to_category",
{
categoryUrl: "/c/dev/7",
categoryName: "dev",
timeLeft: "in 6 days",
}
);
assert.strictEqual(text, el.innerText);
});
test("schedule publish to category - visible for a private category", async function (assert) {
updateCurrentUser({ moderator: true });
const timerType = selectKit(".select-kit.timer-type");
const categoryChooser = selectKit(".modal-body .category-chooser");
// has private category id 24 (shared drafts)
await visit("/t/some-topic/9");
await click(".toggle-admin-menu");
await click(".admin-topic-timer-update button");
await timerType.expand();
await timerType.selectRowByValue("publish_to_category");
assert.strictEqual(categoryChooser.header().label(), "category…");
assert.strictEqual(categoryChooser.header().value(), null);
await categoryChooser.expand();
await categoryChooser.selectRowByValue("7");
await click("#tap_tile_start_of_next_business_week");
const text = query(
".edit-topic-timer-modal .topic-timer-info"
).innerText.trim();
// this needs to be done because there is no simple way to get the
// plain text version of a translation with HTML
let el = document.createElement("p");
el.innerHTML = I18n.t(
"topic.status_update_notice.auto_publish_to_category",
{
categoryUrl: "/c/dev/7",
categoryName: "dev",
timeLeft: "in 6 days",
}
);
assert.strictEqual(text, el.innerText);
});
test("schedule publish to category - visible for an unlisted public topic", async function (assert) {
updateCurrentUser({ moderator: true });
const timerType = selectKit(".select-kit.timer-type");
const categoryChooser = selectKit(".modal-body .category-chooser");
await visit("/t/internationalization-localization/280");
// make topic not visible
await click(".toggle-admin-menu");
await click(".topic-admin-visible .btn");
await click(".toggle-admin-menu");
await click(".admin-topic-timer-update button");
await timerType.expand();
await timerType.selectRowByValue("publish_to_category");
assert.strictEqual(categoryChooser.header().label(), "category…");
assert.strictEqual(categoryChooser.header().value(), null);
await categoryChooser.expand();
await categoryChooser.selectRowByValue("7");
await click("#tap_tile_start_of_next_business_week");
const text = query(
".edit-topic-timer-modal .topic-timer-info"
).innerText.trim();
// this needs to be done because there is no simple way to get the
// plain text version of a translation with HTML
let el = document.createElement("p");
el.innerHTML = I18n.t(
"topic.status_update_notice.auto_publish_to_category",
{
categoryUrl: "/c/dev/7",
categoryName: "dev",
timeLeft: "in 6 days",
}
);
assert.strictEqual(text, el.innerText);
});
test("schedule publish to category - last custom date and time", async function (assert) {
updateCurrentUser({ moderator: true });
await visit("/t/internationalization-localization");
await click(".toggle-admin-menu");
await click(".admin-topic-timer-update button");
assert.notOk(
exists("#tap_tile_last_custom"),
"it does not show last custom if the custom date and time was not filled before"
);
await click(".modal-close");
await click(".toggle-admin-menu");
await click(".admin-topic-timer-update button");
await click("#tap_tile_custom");
await fillIn(".tap-tile-date-input .date-picker", "2100-11-24");
await fillIn("#custom-time", "10:30");
await click(".edit-topic-timer-buttons button.btn-primary");
await click(".toggle-admin-menu");
await click(".admin-topic-timer-update button");
assert.ok(
exists("#tap_tile_last_custom"),
"it show last custom because the custom date and time was valid"
);
const text = query("#tap_tile_last_custom").innerText.trim();
const regex = /Nov 24, 10:30 am/g;
assert.ok(regex.test(text));
});
test("schedule publish to category - does not show for a public topic", async function (assert) {
updateCurrentUser({ moderator: true });
const timerType = selectKit(".select-kit.timer-type");
await visit("/t/internationalization-localization");
await click(".toggle-admin-menu");
await click(".admin-topic-timer-update button");
await timerType.expand();
assert.notOk(
timerType.rowByValue("publish_to_category").exists(),
"publish to category is not shown for a public topic"
);
});
test("TL4 can't auto-delete", async function (assert) {
updateCurrentUser({ moderator: false, admin: false, trust_level: 4 });
await visit("/t/internationalization-localization");
await click(".toggle-admin-menu");
await click(".admin-topic-timer-update button");
const timerType = selectKit(".select-kit.timer-type");
await timerType.expand();
assert.ok(!timerType.rowByValue("delete").exists());
});
test("auto delete", async function (assert) {
updateCurrentUser({ moderator: true });
const timerType = selectKit(".select-kit.timer-type");
await visit("/t/internationalization-localization");
await click(".toggle-admin-menu");
await click(".admin-topic-timer-update button");
await timerType.expand();
await timerType.selectRowByValue("delete");
await click("#tap_tile_two_weeks");
const regex = /will be automatically deleted/g;
const html = query(
".edit-topic-timer-modal .topic-timer-info"
).innerHTML.trim();
assert.ok(regex.test(html));
});
test("Inline delete timer", async function (assert) {
updateCurrentUser({ moderator: true });
await visit("/t/internationalization-localization");
await click(".toggle-admin-menu");
await click(".admin-topic-timer-update button");
await click("#tap_tile_start_of_next_business_week");
await click(".edit-topic-timer-buttons button.btn-primary");
const removeTimerButton = query(".topic-timer-info .topic-timer-remove");
assert.strictEqual(removeTimerButton.getAttribute("title"), "remove timer");
await click(".topic-timer-info .topic-timer-remove");
assert.ok(!exists(".topic-timer-info .topic-timer-remove"));
});
test("Shows correct time frame options", async function (assert) {
this.siteSettings.suggest_weekends_in_date_pickers = true;
updateCurrentUser({ moderator: true });
await visit("/t/internationalization-localization");
await click(".toggle-admin-menu");
await click(".admin-topic-timer-update button");
assert.deepEqual(
[...queryAll("div.tap-tile-grid div.tap-tile-title")].map((el) =>
el.innerText.trim()
),
[
I18n.t("time_shortcut.tomorrow"),
I18n.t("time_shortcut.this_weekend"),
I18n.t("time_shortcut.start_of_next_business_week"),
I18n.t("time_shortcut.two_weeks"),
I18n.t("time_shortcut.next_month"),
I18n.t("time_shortcut.six_months"),
I18n.t("time_shortcut.custom"),
]
);
});
test("Does not show timer notice unless timer set", async function (assert) {
updateCurrentUser({ moderator: true });
await visit("/t/internationalization-localization");
await click(".toggle-admin-menu");
await click(".admin-topic-timer-update button");
const timerType = selectKit(".select-kit.timer-type");
await timerType.expand();
await timerType.selectRowByValue("close_after_last_post");
assert.notOk(exists(".topic-timer-heading"));
});
});