discourse/plugins/chat/spec/system/chat_new_message_spec.rb
David Battersby c39a4de139
FIX: load existing chat dm channel via url (#26998)
When users click a link that points to an existing group chat, we should reopen that chat instead of creating a new group chat so users can more easily continue ongoing conversations.
2024-05-24 12:12:49 +04:00

73 lines
2.3 KiB
Ruby

# frozen_string_literal: true
RSpec.describe "Chat New Message from params", type: :system do
fab!(:current_user) { Fabricate(:user) }
fab!(:user_1) { Fabricate(:user) }
fab!(:user_2) { Fabricate(:user) }
fab!(:public_channel) { Fabricate(:chat_channel) }
fab!(:user_1_channel) { Fabricate(:direct_message_channel, users: [current_user, user_1]) }
let(:chat_page) { PageObjects::Pages::Chat.new }
before do
chat_system_bootstrap
public_channel.add(current_user)
sign_in(current_user)
end
context "with a single user" do
it "redirects to existing chat channel" do
chat_page.visit_new_message(user_1)
expect(page).to have_current_path("/chat/c/#{user_1.username}/#{user_1_channel.id}")
end
it "creates a dm channel and redirects if none exists" do
chat_page.visit_new_message(user_2)
expect(page).to have_current_path("/chat/c/#{user_2.username}/#{Chat::Channel.last.id}")
end
it "redirects to chat channel if recipients param is missing" do
visit("/chat/new-message")
expect(page).to have_no_current_path("/chat/new-message")
end
end
context "with multiple users" do
fab!(:group_dm) do
Fabricate(:direct_message_channel, users: [current_user, user_1, user_2], group: true)
end
fab!(:user_3) { Fabricate(:user) }
it "loads existing dm channel when one exists" do
expect { chat_page.visit_new_message([user_1, user_2]) }.not_to change { Chat::Channel.count }
users = [user_1.username, user_2.username].permutation.map { |u| u.join("-") }.join("|")
expect(page).to have_current_path(%r{/chat/c/(#{users})/#{group_dm.id}})
end
it "creates a dm channel when none exists" do
expect { chat_page.visit_new_message([user_1, user_3]) }.to change { Chat::Channel.count }.by(
1,
)
expect(page).to have_current_path(
"/chat/c/#{user_1.username}-#{user_3.username}/#{Chat::Channel.last.id}",
)
end
context "when user has chat disabled" do
before { user_3.user_option.update!(chat_enabled: false) }
it "loads channel without the chat disabled user" do
expect { chat_page.visit_new_message([user_1, user_3]) }.not_to change {
Chat::Channel.count
}
expect(page).to have_current_path("/chat/c/#{user_1.username}/#{user_1_channel.id}")
end
end
end
end