mirror of
https://github.com/discourse/discourse.git
synced 2024-12-04 10:15:50 +08:00
90efdd7f9d
This commit starts from a simple observation: cooking messages on the hot path can be slow. Especially with a lot of mentions. To move cooking from the hot path, this commit has made the following changes: - updating cooked, inserting mentions and notifying user of new mentions has been moved inside the `process_message` job. It happens right after the `Chat::MessageProcessor` run, which is where the cooking happens. - the similar existing code in `rebake!` has also been moved to rely on the `process_message`job only - refactored `create_mentions` and `update_mentions` into one single `upsert_mentions` which can be called invariably - allows services to decide if their job is ran inline or later. It avoids to need to know you have to use `Jobs.run_immediately!` in this case, in tests it will be inline per default - made various frontend changes to make the chat-channel component lifecycle clearer. we had to handle `did-update @channel` which was super awkward and creating bugs with listeners which the changes of the PR made clear in failing specs - adds a new `-processed` (and `-not-processed`) class on the chat message, this is made to have a good lifecyle hook in system specs
193 lines
6.3 KiB
Ruby
193 lines
6.3 KiB
Ruby
# frozen_string_literal: true
|
||
|
||
RSpec.describe "Message notifications - mobile", type: :system, mobile: true do
|
||
fab!(:current_user) { Fabricate(:user) }
|
||
|
||
let!(:chat_page) { PageObjects::Pages::Chat.new }
|
||
let!(:chat_channel_page) { PageObjects::Pages::ChatChannel.new }
|
||
let!(:channel_index_page) { PageObjects::Components::Chat::ChannelIndex.new }
|
||
|
||
before do
|
||
SiteSetting.navigation_menu = "sidebar"
|
||
chat_system_bootstrap
|
||
end
|
||
|
||
def create_message(channel, text: "this is fine", user: Fabricate(:user))
|
||
Fabricate(:chat_message_with_service, chat_channel: channel, message: text, user: user)
|
||
end
|
||
|
||
context "as a user" do
|
||
before { sign_in(current_user) }
|
||
|
||
context "when on homepage" do
|
||
context "with public channel" do
|
||
fab!(:channel_1) { Fabricate(:category_channel) }
|
||
fab!(:channel_2) { Fabricate(:category_channel) }
|
||
fab!(:user_1) { Fabricate(:user) }
|
||
|
||
before { channel_1.add(user_1) }
|
||
|
||
context "when not member of the channel" do
|
||
context "when a message is created" do
|
||
it "doesn't show anything" do
|
||
visit("/chat")
|
||
|
||
create_message(channel_1, user: user_1)
|
||
|
||
expect(page).to have_no_css(".chat-header-icon .chat-channel-unread-indicator")
|
||
expect(page).to have_no_css(channel_index_page.channel_row_selector(channel_1))
|
||
end
|
||
end
|
||
end
|
||
|
||
context "when member of the channel" do
|
||
before { channel_1.add(current_user) }
|
||
|
||
context "when user is in DnD" do
|
||
before do
|
||
Fabricate(
|
||
:do_not_disturb_timing,
|
||
user: current_user,
|
||
starts_at: 1.week.ago,
|
||
ends_at: 1.week.from_now,
|
||
)
|
||
end
|
||
|
||
it "doesn’t show indicator in header" do
|
||
visit("/chat")
|
||
|
||
create_message(channel_1, user: user_1)
|
||
|
||
expect(page).to have_css(".do-not-disturb-background")
|
||
expect(page).to have_no_css(".chat-header-icon .chat-channel-unread-indicator")
|
||
end
|
||
end
|
||
|
||
context "when channel is muted" do
|
||
before { channel_1.membership_for(current_user).update!(muted: true) }
|
||
|
||
context "when a message is created" do
|
||
it "doesn't show anything" do
|
||
visit("/chat")
|
||
|
||
create_message(channel_1, user: user_1)
|
||
|
||
expect(page).to have_no_css(".chat-header-icon .chat-channel-unread-indicator")
|
||
expect(channel_index_page).to have_no_unread_channel(channel_1)
|
||
end
|
||
end
|
||
end
|
||
|
||
context "when a message is created" do
|
||
it "correctly renders notifications" do
|
||
visit("/chat")
|
||
|
||
create_message(channel_1, user: user_1)
|
||
|
||
expect(page).to have_css(".chat-header-icon .chat-channel-unread-indicator", text: "")
|
||
expect(channel_index_page).to have_unread_channel(channel_1)
|
||
end
|
||
end
|
||
|
||
context "when a message with mentions is created" do
|
||
it "correctly renders notifications" do
|
||
Jobs.run_immediately!
|
||
|
||
visit("/chat")
|
||
|
||
create_message(
|
||
channel_1,
|
||
user: user_1,
|
||
text: "hello @#{current_user.username} what's up?",
|
||
)
|
||
|
||
expect(page).to have_css(".chat-header-icon .chat-channel-unread-indicator")
|
||
expect(channel_index_page).to have_unread_channel(channel_1, count: 1)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
context "with dm channel" do
|
||
fab!(:current_user) { Fabricate(:admin) }
|
||
fab!(:user_1) { Fabricate(:user) }
|
||
fab!(:user_2) { Fabricate(:user) }
|
||
|
||
fab!(:dm_channel_1) { Fabricate(:direct_message_channel, users: [current_user, user_1]) }
|
||
fab!(:dm_channel_2) { Fabricate(:direct_message_channel, users: [current_user, user_2]) }
|
||
|
||
context "when a message is created" do
|
||
it "correctly renders notifications" do
|
||
visit("/chat")
|
||
|
||
create_message(dm_channel_1, user: user_1)
|
||
|
||
expect(page).to have_css(
|
||
".chat-header-icon .chat-channel-unread-indicator",
|
||
text: "1",
|
||
wait: 25,
|
||
)
|
||
expect(channel_index_page).to have_unread_channel(dm_channel_1, wait: 25)
|
||
|
||
create_message(dm_channel_1, user: user_1)
|
||
|
||
expect(page).to have_css(
|
||
".chat-header-icon .chat-channel-unread-indicator",
|
||
text: "2",
|
||
wait: 25,
|
||
)
|
||
end
|
||
|
||
it "reorders channels" do
|
||
visit("/chat")
|
||
|
||
expect(page).to have_css(
|
||
".chat-channel-row:nth-child(1)[data-chat-channel-id=\"#{dm_channel_1.id}\"]",
|
||
)
|
||
expect(page).to have_css(
|
||
".chat-channel-row:nth-child(2)[data-chat-channel-id=\"#{dm_channel_2.id}\"]",
|
||
)
|
||
|
||
create_message(dm_channel_2, user: user_2)
|
||
|
||
expect(page).to have_css(
|
||
".chat-channel-row:nth-child(1)[data-chat-channel-id=\"#{dm_channel_2.id}\"]",
|
||
)
|
||
expect(page).to have_css(
|
||
".chat-channel-row:nth-child(2)[data-chat-channel-id=\"#{dm_channel_1.id}\"]",
|
||
)
|
||
end
|
||
end
|
||
end
|
||
|
||
context "with dm and public channel" do
|
||
fab!(:current_user) { Fabricate(:admin) }
|
||
fab!(:user_1) { Fabricate(:user) }
|
||
fab!(:channel_1) { Fabricate(:category_channel) }
|
||
fab!(:dm_channel_1) { Fabricate(:direct_message_channel, users: [current_user, user_1]) }
|
||
|
||
before do
|
||
channel_1.add(user_1)
|
||
channel_1.add(current_user)
|
||
end
|
||
|
||
context "when messages are created" do
|
||
it "correctly renders notifications" do
|
||
visit("/chat")
|
||
|
||
create_message(channel_1, user: user_1)
|
||
|
||
expect(page).to have_css(".chat-header-icon .chat-channel-unread-indicator", text: "")
|
||
expect(channel_index_page).to have_unread_channel(channel_1)
|
||
|
||
create_message(dm_channel_1, user: user_1)
|
||
|
||
expect(channel_index_page).to have_unread_channel(dm_channel_1)
|
||
expect(page).to have_css(".chat-header-icon .chat-channel-unread-indicator", text: "1")
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|