# 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