discourse/plugins/chat/spec/system/message_notifications_with_sidebar_spec.rb
Joffrey JAFFEUX c0808b2537
FIX: correctly makes dm creator to follow channel (#22470)
In previous changes we prevented creating a channel to also make users follow the channel. We were forcing recipients to follow the channel on message sent but this was not including the creator of the message itself.

This commit fixes it and also write an end-to-end system spec to cover these cases. The message creator service is currently being rewritten and should correctly test and ensure this logic is present.

This commit also makes changes on the frontend to instantly follow a DM when you open it, this change prevents a green dot to appear for a split second when you send a message in a channel you were previously not following. Only recipients will see the green dot.
2023-07-06 21:42:19 +02:00

244 lines
8.4 KiB
Ruby
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# frozen_string_literal: true
RSpec.describe "Message notifications - with sidebar", type: :system do
fab!(:current_user) { Fabricate(:user) }
let!(:chat_page) { PageObjects::Pages::Chat.new }
let!(:channel_page) { PageObjects::Pages::ChatChannel.new }
before do
SiteSetting.navigation_menu = "sidebar"
chat_system_bootstrap
end
def create_message(text: nil, channel:, creator: Fabricate(:user))
sign_in(creator)
chat_page.visit_channel(channel)
channel_page.send_message(text)
args = { persisted: true }
args[:text] = text if text
expect(channel_page.messages).to have_message(**args)
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("/")
using_session(:user_1) do |session|
create_message(channel: channel_1, creator: user_1)
session.quit
end
expect(page).to have_no_css(".chat-header-icon .chat-channel-unread-indicator")
expect(page).to have_no_css(".sidebar-row.channel-#{channel_1.id}")
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 "doesnt show indicator in header" do
Jobs.run_immediately!
visit("/")
using_session(:user_1) do |session|
create_message(channel: channel_1, creator: user_1)
session.quit
end
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("/")
using_session(:user_1) do |session|
create_message(channel: channel_1, creator: user_1)
session.quit
end
expect(page).to have_no_css(".chat-header-icon .chat-channel-unread-indicator")
expect(page).to have_no_css(".sidebar-row.channel-#{channel_1.id} .unread")
end
end
end
context "when user chat_header_indicator_preference is set to 'never'" do
before do
current_user.user_option.update!(
chat_header_indicator_preference:
UserOption.chat_header_indicator_preferences[:never],
)
end
context "when a message is created" do
it "doesn't show any indicator on chat-header-icon" do
visit("/")
using_session(:user_1) do |session|
create_message(channel: channel_1, creator: user_1)
session.quit
end
expect(page).to have_no_css(".chat-header-icon .chat-channel-unread-indicator")
end
end
end
context "when user chat_header_indicator_preference is set to 'dm_and_mentions'" do
before do
current_user.user_option.update!(
chat_header_indicator_preference:
UserOption.chat_header_indicator_preferences[:dm_and_mentions],
)
end
context "when a message is created" do
it "doesn't show any indicator on chat-header-icon" do
visit("/")
using_session(:user_1) do |session|
create_message(channel: channel_1, creator: user_1)
session.quit
end
expect(page).to have_no_css(
".chat-header-icon .chat-channel-unread-indicator.-urgent",
)
end
end
context "when a message with a mention is created" do
it "does show an indicator on chat-header-icon" do
Jobs.run_immediately!
visit("/")
using_session(:user_1) do
create_message(
text: "hey what's going on @#{current_user.username}?",
channel: channel_1,
creator: user_1,
)
end
expect(page).to have_css(".chat-header-icon .chat-channel-unread-indicator.-urgent")
end
end
end
context "when a message is created" do
it "correctly renders notifications" do
visit("/")
using_session(:user_1) do |session|
create_message(channel: channel_1, creator: user_1)
session.quit
end
expect(page).to have_css(".chat-header-icon .chat-channel-unread-indicator", text: "")
expect(page).to have_css(".sidebar-row.channel-#{channel_1.id} .unread")
end
end
context "when a message with mentions is created" do
it "correctly renders notifications" do
Jobs.run_immediately!
visit("/")
using_session(:user_1) do
create_message(
channel: channel_1,
creator: user_1,
text: "hello @#{current_user.username} what's up?",
)
end
expect(page).to have_css(
".chat-header-icon .chat-channel-unread-indicator.-urgent",
text: "1",
)
expect(page).to have_css(".sidebar-row.channel-#{channel_1.id} .icon.urgent")
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("/")
using_session(:user_1) do |session|
create_message(channel: dm_channel_1, creator: user_1)
session.quit
end
expect(page).to have_css(".chat-header-icon .chat-channel-unread-indicator", text: "1")
expect(page).to have_css(".sidebar-row.channel-#{dm_channel_1.id} .icon.urgent")
using_session(:user_1) do |session|
create_message(channel: dm_channel_1, creator: user_1)
session.quit
end
expect(page).to have_css(".chat-header-icon .chat-channel-unread-indicator", text: "2")
end
it "reorders channels" do
visit("/chat")
expect(page).to have_css(
"#sidebar-section-content-chat-dms .sidebar-section-link-wrapper:nth-child(1) .channel-#{dm_channel_1.id}",
)
expect(page).to have_css(
"#sidebar-section-content-chat-dms .sidebar-section-link-wrapper:nth-child(2) .channel-#{dm_channel_2.id}",
)
using_session(:user_1) do |session|
create_message(channel: dm_channel_2, creator: user_2)
session.quit
end
expect(page).to have_css(
"#sidebar-section-content-chat-dms .sidebar-section-link-wrapper:nth-child(1) .channel-#{dm_channel_2.id}",
)
expect(page).to have_css(
"#sidebar-section-content-chat-dms .sidebar-section-link-wrapper:nth-child(2) .channel-#{dm_channel_1.id}",
)
end
end
end
end
end
end