discourse/plugins/chat/spec/system/network_reconciliation_spec.rb

59 lines
2.2 KiB
Ruby

# frozen_string_literal: true
RSpec.describe "Network reconciliation", type: :system, js: true do
fab!(:current_user) { Fabricate(:user) }
fab!(:other_user) { Fabricate(:user) }
fab!(:channel_1) { Fabricate(:category_channel) }
let(:chat_page) { PageObjects::Pages::Chat.new }
let(:chat_channel_page) { PageObjects::Pages::ChatChannel.new }
before do
chat_system_bootstrap
channel_1.add(current_user)
channel_1.add(other_user)
end
context "when user recovers network" do
it "recovers state" do
using_session(:disconnected_current_user) do
sign_in(current_user)
visit("/")
page.driver.browser.network_conditions = { offline: true, latency: 0, throughput: 0 }
end
using_session(:other_user) do |session|
sign_in(other_user)
chat_page.visit_channel(channel_1)
chat_channel_page.send_message("hello @#{current_user.username}!")
session.quit
end
using_session(:connected_current_user) do |session|
sign_in(current_user)
visit("/")
expect(page).to have_css(".chat-header-icon .chat-channel-unread-indicator")
chat_page.visit_channel(channel_1)
expect(page).to have_no_css(".chat-header-icon .chat-channel-unread-indicator")
session.quit
end
using_session(:disconnected_current_user) do |session|
expect(page).to have_no_css(".chat-header-icon .chat-channel-unread-indicator")
page.driver.browser.network_conditions = { offline: false, latency: 0, throughput: 0 }
expect(page).to have_no_css(".chat-header-icon .chat-channel-unread-indicator")
# generally speaking sleep should be avoided in tests, but in this case
# we need to wait for the client to reconnect and receive the message
# right at the start the icon won't be there so checking for not will be true
# and checking for present could also be true as it might be within capybara finder delay
# which is what we are testing here and want to avoid
sleep 1
expect(page).to have_no_css(".chat-header-icon .chat-channel-unread-indicator")
session.quit
end
end
end
end