From 57c96ed03dd9ddf8256547eb7b378dc10d7a80be Mon Sep 17 00:00:00 2001 From: Alan Guo Xiang Tan Date: Mon, 19 Jun 2023 17:36:04 +0800 Subject: [PATCH] FIX: Broken group messages inboxes when group name is mixed case (#22183) This is a follow up to 1cbc65ba7949b0763c13347339b3064826023c07 where visiting a group with a mixed case name would result in an error. --- .../app/controllers/user-private-messages.js | 6 ++- .../app/routes/user-private-messages-group.js | 11 +++- .../acceptance/user-private-messages-test.js | 50 ------------------- .../pages/user_private_messages.rb | 21 ++++++++ .../viewing_user_private_messages_spec.rb | 30 +++++++++++ 5 files changed, 66 insertions(+), 52 deletions(-) create mode 100644 spec/system/page_objects/pages/user_private_messages.rb create mode 100644 spec/system/viewing_user_private_messages_spec.rb diff --git a/app/assets/javascripts/discourse/app/controllers/user-private-messages.js b/app/assets/javascripts/discourse/app/controllers/user-private-messages.js index 2ec1886842d..845184601ca 100644 --- a/app/assets/javascripts/discourse/app/controllers/user-private-messages.js +++ b/app/assets/javascripts/discourse/app/controllers/user-private-messages.js @@ -46,7 +46,11 @@ export default class extends Controller { for (let i = this.messagesDropdownContent.length - 1; i >= 0; i--) { const row = this.messagesDropdownContent[i]; - if (currentURL.includes(row.id.replace(this.router.rootURL, "/"))) { + if ( + currentURL.includes( + row.id.toLowerCase().replace(this.router.rootURL, "/") + ) + ) { value = row.id; break; } diff --git a/app/assets/javascripts/discourse/app/routes/user-private-messages-group.js b/app/assets/javascripts/discourse/app/routes/user-private-messages-group.js index 4d70ea3b65f..02dae4aea2f 100644 --- a/app/assets/javascripts/discourse/app/routes/user-private-messages-group.js +++ b/app/assets/javascripts/discourse/app/routes/user-private-messages-group.js @@ -4,7 +4,16 @@ export default class extends DiscourseRoute { model(params) { return this.modelFor("user") .get("groups") - .filterBy("name", params.name.toLowerCase())[0]; + .find((group) => { + return group.name.toLowerCase() === params.name.toLowerCase(); + }); + } + + afterModel(model) { + if (!model) { + this.transitionTo("exception-unknown"); + return; + } } setupController(controller, model) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/user-private-messages-test.js b/app/assets/javascripts/discourse/tests/acceptance/user-private-messages-test.js index 9079245cbc5..c0970b4d5f9 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/user-private-messages-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/user-private-messages-test.js @@ -19,7 +19,6 @@ import { } from "discourse/lib/topic-list-tracker"; import { withPluginApi } from "discourse/lib/plugin-api"; import { resetCustomUserNavMessagesDropdownRows } from "discourse/controllers/user-private-messages"; -import userFixtures from "discourse/tests/fixtures/user-fixtures"; acceptance( "User Private Messages - user with no group messages", @@ -971,52 +970,3 @@ acceptance( }); } ); - -acceptance( - "User Private Messages - user with uppercase username", - function (needs) { - needs.user({ - groups: [{ id: 14, name: "awesome_group", has_messages: true }], - }); - - needs.pretender((server, helper) => { - const response = cloneJSON(userFixtures["/u/charlie.json"]); - response.user.username = "chArLIe"; - server.get("/u/charlie.json", () => helper.response(response)); - - server.get( - "/topics/private-messages-group/:username/:group_name.json", - () => { - return helper.response({ - topic_list: { - topics: [ - { id: 1, posters: [] }, - { id: 2, posters: [] }, - ], - }, - }); - } - ); - }); - - test("viewing inbox", async function (assert) { - await visit("/u/charlie/messages"); - - assert.strictEqual( - query(".user-nav-messages-dropdown .selected-name").textContent.trim(), - "Inbox", - "menu defaults to Inbox" - ); - }); - - test("viewing group inbox", async function (assert) { - await visit("/u/charlie/messages/group/awesome_group"); - - assert.strictEqual( - query(".user-nav-messages-dropdown .selected-name").textContent.trim(), - "awesome_group", - "dropdown menu displays the right group name" - ); - }); - } -); diff --git a/spec/system/page_objects/pages/user_private_messages.rb b/spec/system/page_objects/pages/user_private_messages.rb new file mode 100644 index 00000000000..17549a1d379 --- /dev/null +++ b/spec/system/page_objects/pages/user_private_messages.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module PageObjects + module Pages + class UserPrivateMessages < PageObjects::Pages::Base + def visit(user) + page.visit "/u/#{user.username}/messages" + self + end + + def visit_group_inbox(user, group) + page.visit "/u/#{user.username}/messages/group/#{group.name}" + self + end + + def has_right_inbox_dropdown_value?(value) + has_css?(".user-nav-messages-dropdown .combo-box-header[data-name='#{value}']") + end + end + end +end diff --git a/spec/system/viewing_user_private_messages_spec.rb b/spec/system/viewing_user_private_messages_spec.rb new file mode 100644 index 00000000000..41345168d22 --- /dev/null +++ b/spec/system/viewing_user_private_messages_spec.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +describe "Viewing user private messages", type: :system do + fab!(:user) { Fabricate(:user, username: "mIxed_caSE_usERNAME") } + fab!(:user2) { Fabricate(:user) } + + let(:user_private_messages_page) { PageObjects::Pages::UserPrivateMessages.new } + + before { sign_in(user) } + + describe "when the user has group messages" do + fab!(:group) do + Fabricate(:group, name: "miXeD_caSE_name", has_messages: true).tap { |g| g.add(user) } + end + + before { SiteSetting.personal_message_enabled_groups = Group::AUTO_GROUPS[:everyone] } + + it "allows the user to view the default messages inbox" do + user_private_messages_page.visit(user) + + expect(user_private_messages_page).to have_right_inbox_dropdown_value("Inbox") + end + + it "allows the user to view the group messages inbox of a group" do + user_private_messages_page.visit_group_inbox(user, group) + + expect(user_private_messages_page).to have_right_inbox_dropdown_value("miXeD_caSE_name") + end + end +end