* FEATURE: Always show advanced invite options The UI is more simple and more efficient than how it was when the advanced options toggle was introduced. It does not make sense to keep it anymore. * UX: Minor copy edits * UX: Merge expire invite controls There were two controls in the create invite modal. One was a static text that displayed how much time is left until the invite expires. The other one was a datetime selector that set the time the invite expires. This commit merges the two controls in a single one: staff users will continue to see the datetime selector without the static text and regular users will only see the static text because they cannot set when the invite expires. * UX: Remove invite link It should only be visible after the invite was created.
230 lines
6.8 KiB
JavaScript
230 lines
6.8 KiB
JavaScript
import { click, fillIn, visit } from "@ember/test-helpers";
|
|
import {
|
|
acceptance,
|
|
count,
|
|
exists,
|
|
fakeTime,
|
|
queryAll,
|
|
} from "discourse/tests/helpers/qunit-helpers";
|
|
import I18n from "I18n";
|
|
import { test } from "qunit";
|
|
|
|
acceptance("Invites - Create & Edit Invite Modal", function (needs) {
|
|
needs.user();
|
|
needs.pretender((server, helper) => {
|
|
const inviteData = {
|
|
id: 1,
|
|
invite_key: "52641ae8878790bc7b79916247cfe6ba",
|
|
link: "http://example.com/invites/52641ae8878790bc7b79916247cfe6ba",
|
|
max_redemptions_allowed: 1,
|
|
redemption_count: 0,
|
|
created_at: "2021-01-26T12:00:00.000Z",
|
|
updated_at: "2021-01-26T12:00:00.000Z",
|
|
expires_at: "2121-01-26T12:00:00.000Z",
|
|
expired: false,
|
|
topics: [],
|
|
groups: [],
|
|
};
|
|
|
|
server.post("/invites", () => helper.response(inviteData));
|
|
server.put("/invites/1", (request) => {
|
|
const data = helper.parsePostData(request.requestBody);
|
|
if (data.email === "error") {
|
|
return helper.response(422, {
|
|
errors: ["error isn't a valid email address."],
|
|
});
|
|
} else {
|
|
return helper.response(inviteData);
|
|
}
|
|
});
|
|
|
|
server.delete("/invites", () => {
|
|
return helper.response({});
|
|
});
|
|
});
|
|
|
|
test("basic functionality", async function (assert) {
|
|
await visit("/u/eviltrout/invited/pending");
|
|
await click(".user-invite-buttons .btn:first-child");
|
|
|
|
await assert.ok(exists(".invite-to-groups"));
|
|
await assert.ok(exists(".invite-to-topic"));
|
|
await assert.ok(exists(".invite-expires-at"));
|
|
});
|
|
|
|
test("saving", async function (assert) {
|
|
await visit("/u/eviltrout/invited/pending");
|
|
await click(".user-invite-buttons .btn:first-child");
|
|
|
|
assert.ok(!exists("tbody tr"), "does not show invite before saving");
|
|
|
|
await click(".btn-primary");
|
|
|
|
assert.strictEqual(
|
|
count("tbody tr"),
|
|
1,
|
|
"adds invite to list after saving"
|
|
);
|
|
});
|
|
|
|
test("copying saves invite", async function (assert) {
|
|
await visit("/u/eviltrout/invited/pending");
|
|
await click(".user-invite-buttons .btn:first-child");
|
|
|
|
await click(".save-invite");
|
|
assert.ok(exists(".invite-link .btn"));
|
|
});
|
|
});
|
|
|
|
acceptance("Invites - Link Invites", function (needs) {
|
|
needs.user();
|
|
needs.pretender((server, helper) => {
|
|
const inviteData = {
|
|
id: 1,
|
|
invite_key: "52641ae8878790bc7b79916247cfe6ba",
|
|
link: "http://example.com/invites/52641ae8878790bc7b79916247cfe6ba",
|
|
max_redemptions_allowed: 1,
|
|
redemption_count: 0,
|
|
created_at: "2021-01-26T12:00:00.000Z",
|
|
updated_at: "2021-01-26T12:00:00.000Z",
|
|
expires_at: "2121-01-26T12:00:00.000Z",
|
|
expired: false,
|
|
topics: [],
|
|
groups: [],
|
|
};
|
|
|
|
server.post("/invites", () => helper.response(inviteData));
|
|
server.put("/invites/1", () => helper.response(inviteData));
|
|
server.delete("/invites", () => helper.response({}));
|
|
});
|
|
|
|
test("invite links", async function (assert) {
|
|
await visit("/u/eviltrout/invited/pending");
|
|
await click(".user-invite-buttons .btn:first-child");
|
|
|
|
assert.ok(exists("#invite-max-redemptions"), "shows max redemptions field");
|
|
});
|
|
});
|
|
|
|
acceptance("Invites - Email Invites", function (needs) {
|
|
let lastRequest;
|
|
|
|
needs.user();
|
|
needs.pretender((server, helper) => {
|
|
const inviteData = {
|
|
id: 1,
|
|
invite_key: "52641ae8878790bc7b79916247cfe6ba",
|
|
link: "http://example.com/invites/52641ae8878790bc7b79916247cfe6ba",
|
|
email: "test@example.com",
|
|
emailed: false,
|
|
custom_message: null,
|
|
created_at: "2021-01-26T12:00:00.000Z",
|
|
updated_at: "2021-01-26T12:00:00.000Z",
|
|
expires_at: "2121-01-26T12:00:00.000Z",
|
|
expired: false,
|
|
topics: [],
|
|
groups: [],
|
|
};
|
|
|
|
server.post("/invites", (request) => {
|
|
lastRequest = request;
|
|
return helper.response(inviteData);
|
|
});
|
|
|
|
server.put("/invites/1", (request) => {
|
|
lastRequest = request;
|
|
return helper.response(inviteData);
|
|
});
|
|
});
|
|
needs.hooks.beforeEach(() => {
|
|
lastRequest = null;
|
|
});
|
|
|
|
test("invite email", async function (assert) {
|
|
await visit("/u/eviltrout/invited/pending");
|
|
await click(".user-invite-buttons .btn:first-child");
|
|
|
|
assert.ok(exists("#invite-email"), "shows email field");
|
|
await fillIn("#invite-email", "test@example.com");
|
|
|
|
assert.ok(exists(".save-invite"), "shows save without email button");
|
|
await click(".save-invite");
|
|
assert.ok(
|
|
lastRequest.requestBody.indexOf("skip_email=true") !== -1,
|
|
"sends skip_email to server"
|
|
);
|
|
|
|
await fillIn("#invite-email", "test2@example.com");
|
|
assert.ok(exists(".send-invite"), "shows save and send email button");
|
|
await click(".send-invite");
|
|
assert.ok(
|
|
lastRequest.requestBody.indexOf("send_email=true") !== -1,
|
|
"sends send_email to server"
|
|
);
|
|
});
|
|
});
|
|
|
|
acceptance(
|
|
"Invites - Create & Edit Invite Modal - timeframe choosing",
|
|
function (needs) {
|
|
let clock = null;
|
|
|
|
needs.user();
|
|
needs.pretender((server, helper) => {
|
|
const inviteData = {
|
|
id: 1,
|
|
invite_key: "52641ae8878790bc7b79916247cfe6ba",
|
|
link: "http://example.com/invites/52641ae8878790bc7b79916247cfe6ba",
|
|
max_redemptions_allowed: 1,
|
|
redemption_count: 0,
|
|
created_at: "2021-01-26T12:00:00.000Z",
|
|
updated_at: "2021-01-26T12:00:00.000Z",
|
|
expires_at: "2121-01-26T12:00:00.000Z",
|
|
expired: false,
|
|
topics: [],
|
|
groups: [],
|
|
};
|
|
|
|
server.post("/invites", () => helper.response(inviteData));
|
|
server.put("/invites/1", () => helper.response(inviteData));
|
|
});
|
|
|
|
needs.hooks.beforeEach(() => {
|
|
const timezone = moment.tz.guess();
|
|
clock = fakeTime("2100-05-03T08:00:00", timezone, true); // Monday morning
|
|
});
|
|
|
|
needs.hooks.afterEach(() => {
|
|
clock.restore();
|
|
});
|
|
|
|
test("shows correct timeframe options", async function (assert) {
|
|
await visit("/u/eviltrout/invited/pending");
|
|
|
|
await click(".user-invite-buttons .btn:first-child");
|
|
await click(".future-date-input-selector-header");
|
|
|
|
const options = Array.from(
|
|
queryAll(`ul.select-kit-collection li span.name`).map((_, x) =>
|
|
x.innerText.trim()
|
|
)
|
|
);
|
|
|
|
const expected = [
|
|
I18n.t("topic.auto_update_input.later_today"),
|
|
I18n.t("topic.auto_update_input.tomorrow"),
|
|
I18n.t("topic.auto_update_input.next_week"),
|
|
I18n.t("topic.auto_update_input.two_weeks"),
|
|
I18n.t("topic.auto_update_input.next_month"),
|
|
I18n.t("topic.auto_update_input.two_months"),
|
|
I18n.t("topic.auto_update_input.three_months"),
|
|
I18n.t("topic.auto_update_input.four_months"),
|
|
I18n.t("topic.auto_update_input.six_months"),
|
|
I18n.t("topic.auto_update_input.pick_date_and_time"),
|
|
];
|
|
|
|
assert.deepEqual(options, expected, "options are correct");
|
|
});
|
|
}
|
|
);
|