# frozen_string_literal: true RSpec.describe "Channel - Info - Settings page", type: :system do let(:chat_page) { PageObjects::Pages::Chat.new } fab!(:current_user) { Fabricate(:user) } fab!(:channel_1) { Fabricate(:category_channel) } before do chat_system_bootstrap sign_in(current_user) end context "as unauthorized user" do before { SiteSetting.chat_allowed_groups = Fabricate(:group).id } it "redirects to home page" do chat_page.visit_channel_settings(channel_1) expect(page).to have_current_path("/latest") end end context "as authorized user" do context "as not member" do it "redirects to about tab" do chat_page.visit_channel_settings(channel_1) expect(page).to have_current_path("/chat/c/#{channel_1.slug}/#{channel_1.id}/info/about") end it "doesn’t have settings tab" do chat_page.visit_channel_settings(channel_1) expect(page).to have_no_selector(".chat-tabs-list__item[aria-controls='settings-tab']") end context "as an admin" do before { sign_in(Fabricate(:admin)) } it "shows settings tab" do chat_page.visit_channel_settings(channel_1) expect(page).to have_selector(".chat-tabs-list__item[aria-controls='settings-tab']") end it "can navigate to settings tab" do chat_page.visit_channel_settings(channel_1) expect(page).to have_current_path( "/chat/c/#{channel_1.slug}/#{channel_1.id}/info/settings", ) end end end context "as a member" do before { channel_1.add(current_user) } context "when visiting the settings of a recently joined channel" do fab!(:channel_2) { Fabricate(:category_channel) } it "is correctly populated" do chat_page.visit_browse find( ".chat-channel-card[data-channel-id='#{channel_2.id}'] .toggle-channel-membership-button", ).click expect( page.find(".chat-channel-card[data-channel-id='#{channel_2.id}']"), ).to have_content(I18n.t("js.chat.joined").upcase) find( ".chat-channel-card[data-channel-id='#{channel_2.id}'] .chat-channel-card__setting", ).click expect(page).to have_content(I18n.t("js.chat.notification_levels.mention")) end end it "can mute channel" do chat_page.visit_channel_settings(channel_1) membership = channel_1.membership_for(current_user) expect { select_kit = PageObjects::Components::SelectKit.new(".-mute .channel-settings-view__selector") select_kit.expand select_kit.select_row_by_name("On") expect(page).to have_content(I18n.t("js.chat.settings.saved")) }.to change { membership.reload.muted }.from(false).to(true) end it "can change desktop notification level" do chat_page.visit_channel_settings(channel_1) membership = channel_1.membership_for(current_user) expect { select_kit = PageObjects::Components::SelectKit.new( ".-desktop-notification-level .channel-settings-view__selector", ) select_kit.expand select_kit.select_row_by_name("Never") expect(page).to have_content(I18n.t("js.chat.settings.saved")) }.to change { membership.reload.desktop_notification_level }.from("mention").to("never") end it "can change mobile notification level" do chat_page.visit_channel_settings(channel_1) membership = channel_1.membership_for(current_user) expect { select_kit = PageObjects::Components::SelectKit.new( ".-mobile-notification-level .channel-settings-view__selector", ) select_kit.expand select_kit.select_row_by_name("Never") expect(page).to have_content(I18n.t("js.chat.settings.saved")) }.to change { membership.reload.mobile_notification_level }.from("mention").to("never") end it "doesn’t show admin section" do chat_page.visit_channel_settings(channel_1) expect(page).to have_no_content(I18n.t("js.chat.settings.admin_title")) end context "as an admin" do before { sign_in(Fabricate(:admin)) } it "shows admin section" do chat_page.visit_channel_settings(channel_1) expect(page).to have_content(I18n.t("js.chat.settings.admin_title")) end it "can change auto join setting" do chat_page.visit_channel_settings(channel_1) expect { select_kit = PageObjects::Components::SelectKit.new(".-autojoin .channel-settings-view__selector") select_kit.expand select_kit.select_row_by_name("Yes") find("#dialog-holder .btn-primary").click expect(page).to have_content(I18n.t("js.chat.settings.saved")) }.to change { channel_1.reload.auto_join_users }.from(false).to(true) end it "can change allow channel wide mentions" do chat_page.visit_channel_settings(channel_1) expect { select_kit = PageObjects::Components::SelectKit.new( ".-channel-wide-mentions .channel-settings-view__selector", ) select_kit.expand select_kit.select_row_by_name("No") expect(page).to have_content(I18n.t("js.chat.settings.saved")) }.to change { channel_1.reload.allow_channel_wide_mentions }.from(true).to(false) end it "can close channel" do chat_page.visit_channel_settings(channel_1) expect { click_button(I18n.t("js.chat.channel_settings.close_channel")) find("#chat-channel-toggle-btn").click expect(page).to have_content(I18n.t("js.chat.channel_status.closed_header")) }.to change { channel_1.reload.status }.from("open").to("closed") end it "can enable threading" do SiteSetting.enable_experimental_chat_threaded_discussions = true chat_page.visit_channel_settings(channel_1) expect { select_kit = PageObjects::Components::SelectKit.new(".-threading .channel-settings-view__selector") select_kit.expand select_kit.select_row_by_name("Enabled") expect(page).to have_content(I18n.t("js.chat.settings.saved")) }.to change { channel_1.reload.threading_enabled }.from(false).to(true) end it "can delete channel" do chat_page.visit_channel_settings(channel_1) click_button(I18n.t("js.chat.channel_settings.delete_channel")) fill_in("channel-delete-confirm-name", with: channel_1.title) find_button("chat-confirm-delete-channel", disabled: false).click expect(page).to have_content(I18n.t("js.chat.channel_delete.process_started")) end context "when confirmation name is wrong" do it "doesn’t delete submission" do chat_page.visit_channel_settings(channel_1) find(".delete-btn").click fill_in("channel-delete-confirm-name", with: channel_1.title + "wrong") expect(page).to have_button("chat-confirm-delete-channel", disabled: true) end end end end end end