FIX: Bug setting notification level to muted/ignored on user page (#16268)

This commit is contained in:
Mark VanLandingham
2022-03-25 10:51:45 -05:00
committed by GitHub
parent f3aab19829
commit a3563336db
7 changed files with 146 additions and 11 deletions

View File

@ -18,7 +18,7 @@ export default Controller.extend(ModalFunctionality, {
this.set("loading", true); this.set("loading", true);
this.model this.model
.updateNotificationLevel({ .updateNotificationLevel({
level: "ignored", level: "ignore",
expiringAt: this.ignoredUntil, expiringAt: this.ignoredUntil,
}) })
.then(() => { .then(() => {

View File

@ -168,7 +168,8 @@ export default Controller.extend(CanCheckEmails, {
"currentUser.ignored_ids", "currentUser.ignored_ids",
"model.ignored", "model.ignored",
"model.muted", "model.muted",
function () { {
get() {
if (this.get("model.ignored")) { if (this.get("model.ignored")) {
return "changeToIgnored"; return "changeToIgnored";
} else if (this.get("model.muted")) { } else if (this.get("model.muted")) {
@ -176,6 +177,10 @@ export default Controller.extend(CanCheckEmails, {
} else { } else {
return "changeToNormal"; return "changeToNormal";
} }
},
set(key, value) {
return value;
},
} }
), ),
@ -250,7 +255,7 @@ export default Controller.extend(CanCheckEmails, {
}, },
updateNotificationLevel(level) { updateNotificationLevel(level) {
return this.model.updateNotificationLevel({ level }); return this.model.updateNotificationLevel(level);
}, },
}, },
}); });

View File

@ -11,7 +11,7 @@
{{/d-modal-body}} {{/d-modal-body}}
<div class="modal-footer"> <div class="modal-footer">
{{d-button class="btn-primary" {{d-button class="btn-primary ignore-duration-save"
disabled=saveDisabled disabled=saveDisabled
label="user.user_notifications.ignore_duration_save" label="user.user_notifications.ignore_duration_save"
action=(action "ignore")}} action=(action "ignore")}}

View File

@ -2,6 +2,7 @@ import EmberObject from "@ember/object";
import User from "discourse/models/user"; import User from "discourse/models/user";
import selectKit from "discourse/tests/helpers/select-kit-helper"; import selectKit from "discourse/tests/helpers/select-kit-helper";
import sinon from "sinon"; import sinon from "sinon";
import userFixtures from "discourse/tests/fixtures/user-fixtures";
import { import {
acceptance, acceptance,
exists, exists,
@ -9,6 +10,7 @@ import {
queryAll, queryAll,
} from "discourse/tests/helpers/qunit-helpers"; } from "discourse/tests/helpers/qunit-helpers";
import { click, currentRouteName, visit } from "@ember/test-helpers"; import { click, currentRouteName, visit } from "@ember/test-helpers";
import { cloneJSON } from "discourse-common/lib/object";
import { test } from "qunit"; import { test } from "qunit";
acceptance("User Routes", function (needs) { acceptance("User Routes", function (needs) {
@ -177,3 +179,118 @@ acceptance("User - Saving user options", function (needs) {
); );
}); });
}); });
acceptance("User - Notification level dropdown visibility", function (needs) {
needs.user({ username: "eviltrout", id: 1, ignored_ids: [] });
needs.pretender((server, helper) => {
server.get("/u/charlie.json", () => {
const cloned = cloneJSON(userFixtures["/u/charlie.json"]);
cloned.user.can_ignore_user = false;
cloned.user.can_mute_user = false;
return helper.response(200, cloned);
});
});
test("Notification level button is not rendered for user who cannot mute or ignore another user", async function (assert) {
await visit("/u/charlie");
assert.notOk(exists(".user-notifications-dropdown"));
});
});
acceptance(
"User - Muting other user with notification level dropdown",
function (needs) {
needs.user({ username: "eviltrout", id: 1, ignored_ids: [] });
needs.pretender((server, helper) => {
server.get("/u/charlie.json", () => {
const cloned = cloneJSON(userFixtures["/u/charlie.json"]);
cloned.user.can_mute_user = true;
return helper.response(200, cloned);
});
server.put("/u/charlie/notification_level.json", (request) => {
let requestParams = new URLSearchParams(request.requestBody);
// Ensure the correct `notification_level` param is sent to the server
if (requestParams.get("notification_level") === "mute") {
return helper.response(200, {});
} else {
return helper.response(422, {});
}
});
});
test("Notification level is set to normal and can be changed to muted", async function (assert) {
await visit("/u/charlie");
assert.ok(
exists(".user-notifications-dropdown"),
"Notification level dropdown is present"
);
const dropdown = selectKit(".user-notifications-dropdown");
await dropdown.expand();
assert.strictEqual(dropdown.selectedRow().value(), "changeToNormal");
await dropdown.selectRowByValue("changeToMuted");
await dropdown.expand();
assert.strictEqual(dropdown.selectedRow().value(), "changeToMuted");
});
}
);
acceptance(
"User - Ignoring other user with notification level dropdown",
function (needs) {
needs.user({ username: "eviltrout", id: 1, ignored_ids: [] });
needs.pretender((server, helper) => {
server.get("/u/charlie.json", () => {
const cloned = cloneJSON(userFixtures["/u/charlie.json"]);
cloned.user.can_ignore_user = true;
return helper.response(200, cloned);
});
server.put("/u/charlie/notification_level.json", (request) => {
let requestParams = new URLSearchParams(request.requestBody);
// Ensure the correct `notification_level` param is sent to the server
if (requestParams.get("notification_level") === "ignore") {
return helper.response(200, {});
} else {
return helper.response(422, {});
}
});
});
test("Notification level can be changed to ignored", async function (assert) {
await visit("/u/charlie");
assert.ok(
exists(".user-notifications-dropdown"),
"Notification level dropdown is present"
);
const notificationLevelDropdown = selectKit(
".user-notifications-dropdown"
);
await notificationLevelDropdown.expand();
assert.strictEqual(
notificationLevelDropdown.selectedRow().value(),
"changeToNormal"
);
await notificationLevelDropdown.selectRowByValue("changeToIgnored");
assert.ok(exists(".ignore-duration-modal"));
const durationDropdown = selectKit(
".ignore-duration-modal .future-date-input-selector"
);
await durationDropdown.expand();
await durationDropdown.selectRowByIndex(0);
await click(".modal-footer .ignore-duration-save");
await notificationLevelDropdown.expand();
assert.strictEqual(
notificationLevelDropdown.selectedRow().value(),
"changeToIgnored"
);
});
}
);

View File

@ -1365,6 +1365,8 @@ class UsersController < ApplicationController
elsif params[:notification_level] == "normal" elsif params[:notification_level] == "normal"
MutedUser.where(user: acting_user, muted_user: target_user).delete_all MutedUser.where(user: acting_user, muted_user: target_user).delete_all
IgnoredUser.where(user: acting_user, ignored_user: target_user).delete_all IgnoredUser.where(user: acting_user, ignored_user: target_user).delete_all
else
return render_json_error(I18n.t("notification_level.invalid_value", value: params[:notification_level]))
end end
render json: success_json render json: success_json

View File

@ -5154,6 +5154,7 @@ en:
ignore_error: "Sorry, you can't ignore that user." ignore_error: "Sorry, you can't ignore that user."
mute_error: "Sorry, you can't mute that user." mute_error: "Sorry, you can't mute that user."
error: "Sorry, you cannot change the notification level for that user." error: "Sorry, you cannot change the notification level for that user."
invalid_value: '"%{value}" is not a valid notification level.'
discord: discord:
not_in_allowed_guild: "Authentication failed. You are not a member of a permitted Discord guild." not_in_allowed_guild: "Authentication failed. You are not a member of a permitted Discord guild."

View File

@ -2876,6 +2876,16 @@ describe UsersController do
end end
end end
describe "#notification_level" do
it 'raises an error when `notification_level` param is not a valid value' do
sign_in(user)
invalid_arg = "invalid"
put "/u/#{user.username}/notification_level.json", params: { notification_level: invalid_arg }
expect(response.status).to eq(422)
expect(response.parsed_body["errors"].first).to eq(I18n.t("notification_level.invalid_value", value: invalid_arg))
end
end
describe '#ignore' do describe '#ignore' do
it 'raises an error when not logged in' do it 'raises an error when not logged in' do
put "/u/#{user1.username}/notification_level.json", params: { notification_level: "" } put "/u/#{user1.username}/notification_level.json", params: { notification_level: "" }