Martin Brennan f76a9aab22
DEV: Fix and re-enable chat flakys (#22653)
* DEV: Fix and re-enable chat flakys

The early return in JS was added to prevent an error
from channel being null, and it's better to use known
users for the message fabrications in the specs.

* DEV: Use travel_to in drawer spec for thread tracking

Sometimes in the system test the datetime that is last
viewed for the channel for the user and the datetime for
the last message created_at is only microseconds of difference,
and we do not provide that level of fidelity in the MessageBus
serializer, so unreadThreadsCountSinceLastViewed is not
accurate.

Better to just utilize travel_to and move forward 1 minute in
time before sending the new message to easily differentiate.
2023-07-18 15:45:52 +10:00

122 lines
4.9 KiB
Ruby

# frozen_string_literal: true
describe "Thread tracking state | drawer", type: :system do
include ActiveSupport::Testing::TimeHelpers
fab!(:current_user) { Fabricate(:admin) }
fab!(:channel) { Fabricate(:chat_channel, threading_enabled: true) }
fab!(:other_user) { Fabricate(:user) }
fab!(:thread) { Fabricate(:chat_thread, channel: channel) }
let(:chat_page) { PageObjects::Pages::Chat.new }
let(:channel_page) { PageObjects::Pages::ChatChannel.new }
let(:thread_page) { PageObjects::Pages::ChatThread.new }
let(:thread_list_page) { PageObjects::Components::Chat::ThreadList.new }
let(:drawer_page) { PageObjects::Pages::ChatDrawer.new }
before do
SiteSetting.enable_experimental_chat_threaded_discussions = true
chat_system_bootstrap(current_user, [channel])
chat_system_user_bootstrap(user: other_user, channel: channel)
sign_in(current_user)
thread.add(current_user)
end
context "when the user has unread messages for a thread" do
fab!(:message_1) do
Fabricate(:chat_message, chat_channel: channel, thread: thread, user: current_user)
end
fab!(:message_2) { Fabricate(:chat_message, chat_channel: channel, thread: thread) }
it "shows the count of threads with unread messages on the thread list button" do
visit("/")
chat_page.open_from_header
drawer_page.open_channel(channel)
expect(drawer_page).to have_unread_thread_indicator(count: 1)
end
it "shows an indicator on the unread thread in the list" do
visit("/")
chat_page.open_from_header
drawer_page.open_channel(channel)
drawer_page.open_thread_list
expect(drawer_page).to have_open_thread_list
expect(thread_list_page).to have_unread_item(thread.id)
end
it "marks the thread as read and removes both indicators when the user opens it" do
visit("/")
chat_page.open_from_header
drawer_page.open_channel(channel)
drawer_page.open_thread_list
thread_list_page.item_by_id(thread.id).click
expect(drawer_page).to have_no_unread_thread_indicator
drawer_page.open_thread_list
expect(thread_list_page).to have_no_unread_item(thread.id)
end
it "shows unread indicators for the header icon and the list when a new unread arrives" do
thread.membership_for(current_user).update!(last_read_message_id: message_2.id)
visit("/")
chat_page.open_from_header
drawer_page.open_channel(channel)
drawer_page.open_thread_list
expect(drawer_page).to have_no_unread_thread_indicator
expect(thread_list_page).to have_no_unread_item(thread.id)
travel_to(1.minute.from_now)
Fabricate(:chat_message, chat_channel: channel, thread: thread, user: other_user)
expect(drawer_page).to have_unread_thread_indicator(count: 1)
expect(thread_list_page).to have_unread_item(thread.id)
end
describe "channel index unread indicators" do
fab!(:other_channel) { Fabricate(:chat_channel) }
before { other_channel.add(current_user) }
it "shows an unread indicator for the channel with unread threads in the index" do
visit("/")
chat_page.open_from_header
expect(drawer_page).to have_unread_channel(channel)
end
it "does not show an unread indicator for the channel if the user has visited the channel since the unread thread message arrived" do
channel.membership_for(current_user).update!(last_viewed_at: Time.zone.now)
visit("/")
chat_page.open_from_header
expect(drawer_page).to have_no_unread_channel(channel)
end
it "clears the index unread indicator for the channel when opening it but keeps the thread list unread indicator" do
visit("/")
chat_page.open_from_header
drawer_page.open_channel(channel)
expect(channel_page).to have_unread_thread_indicator(count: 1)
drawer_page.back
expect(drawer_page).to have_no_unread_channel(channel)
end
it "does not show an unread indicator for the channel index if a new thread message arrives while the user is looking at the channel" do
visit("/")
chat_page.open_from_header
expect(drawer_page).to have_unread_channel(channel)
drawer_page.open_channel(channel)
Fabricate(:chat_message, thread: thread, user: other_user)
drawer_page.back
expect(drawer_page).to have_no_unread_channel(channel)
end
it "shows an unread indicator for the channel index if a new thread message arrives while the user is not looking at the channel" do
visit("/")
chat_page.open_from_header
drawer_page.open_channel(channel)
drawer_page.back
expect(drawer_page).to have_no_unread_channel(channel)
travel_to(1.minute.from_now)
Fabricate(:chat_message, thread: thread, user: other_user)
expect(drawer_page).to have_unread_channel(channel)
end
end
end
end