mirror of
https://github.com/discourse/discourse.git
synced 2026-08-07 13:19:19 +08:00
Previously, assignment permissions only came from the global `assign_allowed_on_groups` site setting. This change lets categories grant assignment permission to additional groups, keeping assignment controls and assignee suggestions scoped to the relevant category.
347 lines
10 KiB
JavaScript
Vendored
347 lines
10 KiB
JavaScript
Vendored
import { click, fillIn, visit } from "@ember/test-helpers";
|
|
import { test } from "qunit";
|
|
import { cloneJSON } from "discourse/lib/object";
|
|
import topicFixtures from "discourse/tests/fixtures/topic";
|
|
import userFixtures from "discourse/tests/fixtures/user-fixtures";
|
|
import pretender, {
|
|
parsePostData,
|
|
response,
|
|
} from "discourse/tests/helpers/create-pretender";
|
|
import {
|
|
acceptance,
|
|
updateCurrentUser,
|
|
} from "discourse/tests/helpers/qunit-helpers";
|
|
import selectKit from "discourse/tests/helpers/select-kit-helper";
|
|
|
|
function topicWithAssignablePosts() {
|
|
const topic = cloneJSON(topicFixtures["/t/280/1.json"]);
|
|
topic.can_assign = true;
|
|
topic.post_stream.posts.forEach((post) => (post.can_assign = true));
|
|
|
|
return topic;
|
|
}
|
|
|
|
acceptance("Assign mobile", function (needs) {
|
|
needs.user();
|
|
needs.mobileView();
|
|
needs.settings({
|
|
assign_enabled: true,
|
|
});
|
|
|
|
needs.pretender((server, helper) => {
|
|
server.get("/t/280.json", () =>
|
|
helper.response(topicWithAssignablePosts())
|
|
);
|
|
server.get("/t/280/:post_number.json", () =>
|
|
helper.response(topicWithAssignablePosts())
|
|
);
|
|
|
|
server.get("/assign/suggestions", () => {
|
|
return helper.response({
|
|
success: true,
|
|
assign_allowed_groups: false,
|
|
assign_allowed_for_groups: [],
|
|
suggestions: [
|
|
{
|
|
id: 19,
|
|
username: "eviltrout",
|
|
name: "Robin Ward",
|
|
avatar_template:
|
|
"/user_avatar/meta.discourse.org/eviltrout/{size}/5275_2.png",
|
|
},
|
|
],
|
|
});
|
|
});
|
|
});
|
|
|
|
test("Footer dropdown contains button", async function (assert) {
|
|
updateCurrentUser({ can_assign: true });
|
|
await visit("/t/internationalization-localization/280");
|
|
await click(".topic-footer-mobile-dropdown-trigger");
|
|
await click(".assign");
|
|
assert.dom(".assign.d-modal").exists("assign modal opens");
|
|
});
|
|
});
|
|
|
|
acceptance("Assign desktop", function (needs) {
|
|
needs.user({ can_assign: true });
|
|
needs.settings({
|
|
assign_enabled: true,
|
|
});
|
|
|
|
needs.pretender((server, helper) => {
|
|
server.get("/t/280.json", () =>
|
|
helper.response(topicWithAssignablePosts())
|
|
);
|
|
server.get("/t/280/:post_number.json", () =>
|
|
helper.response(topicWithAssignablePosts())
|
|
);
|
|
|
|
server.get("/assign/suggestions", () => {
|
|
return helper.response({
|
|
success: true,
|
|
assign_allowed_groups: false,
|
|
assign_allowed_for_groups: [],
|
|
suggestions: [
|
|
{
|
|
id: 19,
|
|
username: "eviltrout",
|
|
name: "Robin Ward",
|
|
avatar_template:
|
|
"/user_avatar/meta.discourse.org/eviltrout/{size}/5275_2.png",
|
|
},
|
|
],
|
|
});
|
|
});
|
|
});
|
|
|
|
test("Assigning user to a post", async function (assert) {
|
|
await visit("/t/internationalization-localization/280");
|
|
|
|
assert
|
|
.dom("#post_2 .post-action-menu__assign-post")
|
|
.doesNotExist("assign to post button is hidden");
|
|
|
|
await click("#post_2 button.show-more-actions");
|
|
assert
|
|
.dom("#post_2 .post-action-menu__assign-post")
|
|
.exists("assign to post button exists");
|
|
|
|
await click("#post_2 .post-action-menu__assign-post");
|
|
assert.dom(".assign.d-modal").exists("assign modal opens");
|
|
|
|
const menu = selectKit(".assign.d-modal .user-chooser");
|
|
assert.true(menu.isExpanded(), "user selector is expanded");
|
|
|
|
await click(".assign.d-modal .btn-primary");
|
|
assert.dom(".error-label").includesText("Choose a user to assign");
|
|
|
|
await menu.expand();
|
|
await menu.selectRowByIndex(0);
|
|
assert.strictEqual(menu.header().value(), "eviltrout");
|
|
assert.dom(".error-label").doesNotExist();
|
|
|
|
pretender.put("/assign/assign", ({ requestBody }) => {
|
|
const body = parsePostData(requestBody);
|
|
assert.strictEqual(body.target_type, "Post");
|
|
assert.strictEqual(body.username, "eviltrout");
|
|
assert.strictEqual(body.note, "a note!");
|
|
return response({ success: true });
|
|
});
|
|
|
|
await fillIn("#assign-modal-note", "a note!");
|
|
await click(".assign.d-modal .btn-primary");
|
|
|
|
assert.dom(".assign.d-modal").doesNotExist("assign modal closes");
|
|
});
|
|
|
|
test("Footer dropdown contains button", async function (assert) {
|
|
await visit("/t/internationalization-localization/280");
|
|
await click("#topic-footer-button-assign");
|
|
|
|
assert.dom(".assign.d-modal").exists("assign modal opens");
|
|
});
|
|
});
|
|
|
|
acceptance("Assign Status enabled", function (needs) {
|
|
needs.user({
|
|
can_assign: true,
|
|
});
|
|
needs.settings({
|
|
assign_enabled: true,
|
|
enable_assign_status: true,
|
|
assign_statuses: "New|In Progress|Done",
|
|
});
|
|
|
|
needs.pretender((server, helper) => {
|
|
server.get("/assign/suggestions", () => {
|
|
return helper.response({
|
|
success: true,
|
|
assign_allowed_groups: false,
|
|
assign_allowed_for_groups: [],
|
|
suggestions: [
|
|
{
|
|
id: 19,
|
|
username: "eviltrout",
|
|
name: "Robin Ward",
|
|
avatar_template:
|
|
"/user_avatar/meta.discourse.org/eviltrout/{size}/5275_2.png",
|
|
},
|
|
],
|
|
});
|
|
});
|
|
});
|
|
|
|
test("Modal contains status dropdown", async function (assert) {
|
|
pretender.put("/assign/assign", ({ requestBody }) => {
|
|
const body = parsePostData(requestBody);
|
|
assert.strictEqual(body.target_type, "Topic");
|
|
assert.strictEqual(body.target_id, "280");
|
|
assert.strictEqual(body.username, "eviltrout");
|
|
assert.strictEqual(body.status, "In Progress");
|
|
|
|
return response({ success: true });
|
|
});
|
|
|
|
await visit("/t/internationalization-localization/280");
|
|
await click("#topic-footer-button-assign");
|
|
|
|
assert
|
|
.dom(".assign.d-modal #assign-status")
|
|
.exists("assign status dropdown exists");
|
|
|
|
const statusDropdown = selectKit("#assign-status");
|
|
assert.strictEqual(statusDropdown.header().value(), "New");
|
|
|
|
await statusDropdown.expand();
|
|
await statusDropdown.selectRowByValue("In Progress");
|
|
assert.strictEqual(statusDropdown.header().value(), "In Progress");
|
|
|
|
const menu = selectKit(".assign.d-modal .user-chooser");
|
|
await menu.expand();
|
|
await menu.selectRowByIndex(0);
|
|
|
|
await click(".assign.d-modal .btn-primary");
|
|
});
|
|
});
|
|
|
|
acceptance("Assign Status disabled", function (needs) {
|
|
needs.user({
|
|
can_assign: true,
|
|
});
|
|
needs.settings({
|
|
assign_enabled: true,
|
|
enable_assign_status: false,
|
|
});
|
|
|
|
needs.pretender((server, helper) => {
|
|
server.get("/assign/suggestions", () => {
|
|
return helper.response({
|
|
success: true,
|
|
assign_allowed_groups: false,
|
|
assign_allowed_for_groups: [],
|
|
suggestions: [
|
|
{
|
|
id: 19,
|
|
username: "eviltrout",
|
|
name: "Robin Ward",
|
|
avatar_template:
|
|
"/user_avatar/meta.discourse.org/eviltrout/{size}/5275_2.png",
|
|
},
|
|
],
|
|
});
|
|
});
|
|
});
|
|
|
|
test("Modal contains status dropdown", async function (assert) {
|
|
await visit("/t/internationalization-localization/280");
|
|
await click("#topic-footer-button-assign");
|
|
|
|
assert
|
|
.dom(".assign.d-modal #assign-status")
|
|
.doesNotExist("assign status dropdown doesn't exists");
|
|
});
|
|
});
|
|
|
|
// See RemindAssignsFrequencySiteSettings
|
|
const remindersFrequency = [
|
|
{
|
|
name: "discourse_assign.reminders_frequency.never",
|
|
value: 0,
|
|
},
|
|
{
|
|
name: "discourse_assign.reminders_frequency.daily",
|
|
value: 1440,
|
|
},
|
|
{
|
|
name: "discourse_assign.reminders_frequency.weekly",
|
|
value: 10080,
|
|
},
|
|
{
|
|
name: "discourse_assign.reminders_frequency.monthly",
|
|
value: 43200,
|
|
},
|
|
{
|
|
name: "discourse_assign.reminders_frequency.quarterly",
|
|
value: 129600,
|
|
},
|
|
];
|
|
|
|
acceptance("User preferences", function (needs) {
|
|
needs.user({ can_assign: true, reminders_frequency: remindersFrequency });
|
|
needs.settings({
|
|
assign_enabled: true,
|
|
remind_assigns_frequency: 43200,
|
|
});
|
|
|
|
test("The frequency for assigned topic reminders defaults to the site setting", async function (assert) {
|
|
await visit("/u/eviltrout/preferences/notifications");
|
|
|
|
assert.strictEqual(
|
|
selectKit("#remind-assigns-frequency").header().value(),
|
|
"43200",
|
|
"set frequency to default of Monthly"
|
|
);
|
|
});
|
|
|
|
test("The user can change the frequency to Never", async function (assert) {
|
|
await visit("/u/eviltrout/preferences/notifications");
|
|
|
|
await selectKit("#remind-assigns-frequency").expand();
|
|
await selectKit("#remind-assigns-frequency").selectRowByValue(0);
|
|
|
|
assert.strictEqual(
|
|
selectKit("#remind-assigns-frequency").header().value(),
|
|
"0",
|
|
"set frequency to Never"
|
|
);
|
|
});
|
|
|
|
test("The user can change the frequency to some other non-default value", async function (assert) {
|
|
await visit("/u/eviltrout/preferences/notifications");
|
|
|
|
await selectKit("#remind-assigns-frequency").expand();
|
|
await selectKit("#remind-assigns-frequency").selectRowByValue(10080); // weekly
|
|
|
|
assert.strictEqual(
|
|
selectKit("#remind-assigns-frequency").header().value(),
|
|
"10080",
|
|
"set frequency to Weekly"
|
|
);
|
|
});
|
|
});
|
|
|
|
acceptance(
|
|
"User preferences | Pre-selected reminder frequency",
|
|
function (needs) {
|
|
needs.user({ can_assign: true, reminders_frequency: remindersFrequency });
|
|
needs.settings({
|
|
assign_enabled: true,
|
|
remind_assigns_frequency: 43200,
|
|
});
|
|
|
|
needs.pretender((server, helper) => {
|
|
server.get("/u/eviltrout.json", () => {
|
|
let json = cloneJSON(userFixtures["/u/eviltrout.json"]);
|
|
json.user.custom_fields = { remind_assigns_frequency: 10080 };
|
|
|
|
// usually this is done automatically by this pretender but we
|
|
// have to do it manually here because we are overriding the
|
|
// pretender see frontend/discourse/tests/helpers/create-pretender.js
|
|
json.user.can_edit = true;
|
|
|
|
return helper.response(200, json);
|
|
});
|
|
});
|
|
|
|
test("The user's previously selected value is loaded", async function (assert) {
|
|
await visit("/u/eviltrout/preferences/notifications");
|
|
|
|
assert.strictEqual(
|
|
selectKit("#remind-assigns-frequency").header().value(),
|
|
"10080",
|
|
"frequency is pre-selected to Weekly"
|
|
);
|
|
});
|
|
}
|
|
);
|