discourse/plugins/chat/spec/system/channel_settings_page_spec.rb
David Battersby 532d656d17
Some checks are pending
Licenses / run (push) Waiting to run
Linting / run (push) Waiting to run
Publish Assets / publish-assets (push) Waiting to run
Tests / core backend (push) Waiting to run
Tests / plugins backend (push) Waiting to run
Tests / core frontend (Chrome) (push) Waiting to run
Tests / plugins frontend (push) Waiting to run
Tests / themes frontend (push) Waiting to run
Tests / core system (push) Waiting to run
Tests / plugins system (push) Waiting to run
Tests / themes system (push) Waiting to run
Tests / core frontend (Firefox ESR) (push) Waiting to run
Tests / core frontend (Firefox Evergreen) (push) Waiting to run
Tests / chat system (push) Waiting to run
Tests / merge (push) Blocked by required conditions
FEATURE: disable chat DM threads by default (#34840)
Previously we introduced threads in Chat DMs in #29170 - however setting
the default to false seems like a better fit.

This will take effect for all new DM chats initiated, existing chats are
not changed but threads can still be turned off manually within each
channel's settings.
2025-09-17 16:52:13 +04:00

318 lines
9.9 KiB
Ruby
Vendored
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# frozen_string_literal: true
RSpec.describe "Channel - Info - Settings page", type: :system do
fab!(:current_user, :user)
fab!(:channel_1, :category_channel)
let(:chat_page) { PageObjects::Pages::Chat.new }
let(:toasts) { PageObjects::Components::Toasts.new }
let(:channel_settings_page) { PageObjects::Pages::ChatChannelSettings.new }
before do
chat_system_bootstrap
sign_in(current_user)
end
context "when visiting from browse page" do
context "when clicking back button" do
it "redirects to browse page" do
chat_page.visit_browse
find(".c-navbar__back-button").click
expect(page).to have_current_path("/chat/browse/open")
end
end
end
context "when visiting from channel page" do
context "when clicking back button" do
it "redirects to channel page" do
chat_page.visit_channel(channel_1)
find(".c-navbar__channel-title").click
find(".c-navbar__back-button").click
expect(page).to have_current_path(chat.channel_path(channel_1.slug, channel_1.id))
end
end
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 not allowed to see the channel" do
fab!(:channel_1, :private_category_channel)
it "redirects to browse page" do
chat_page.visit_channel_settings(channel_1)
expect(page).to have_current_path("/chat/browse/open")
end
end
context "as not member of channel" do
it "shows settings page" 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
context "as regular user of channel" do
before { channel_1.add(current_user) }
it "shows settings page" 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
it "shows channel info" do
chat_page.visit_channel_settings(channel_1)
expect(page.find(".badge-category__name")).to have_content(channel_1.chatable.name)
expect(page.find(".c-channel-settings__name")).to have_content(channel_1.title)
expect(page.find(".c-channel-settings__slug")).to have_content(channel_1.slug)
end
it "cant edit name or slug" do
chat_page.visit_channel_settings(channel_1)
expect(page).to have_no_selector(".edit-name-slug-btn")
end
it "cant edit description" do
chat_page.visit_channel_settings(channel_1)
expect(page).to have_no_selector(".edit-description-btn")
end
it "escapes channel title" do
channel_1.update!(name: "<script>alert('hello')</script>")
chat_page.visit_channel_settings(channel_1)
expect(page.find(".c-channel-settings__name")["innerHTML"].strip).to eq(
"&lt;script&gt;alert('hello')&lt;/script&gt;",
)
expect(page.find(".chat-channel-name__label")["innerHTML"].strip).to include(
"&lt;script&gt;alert('hello')&lt;/script&gt;",
)
end
it "is not showing admin section" do
chat_page.visit_channel_settings(channel_1)
expect(page).to have_no_css("[data-section='admin']")
end
it "can mute channel" do
chat_page.visit_channel_settings(channel_1)
membership = channel_1.membership_for(current_user)
expect {
PageObjects::Components::DToggleSwitch.new(".c-channel-settings__mute-switch").toggle
expect(toasts).to have_success(I18n.t("js.saved"))
}.to change { membership.reload.muted }.from(false).to(true)
end
it "can change notification level" do
chat_page.visit_channel_settings(channel_1)
membership = channel_1.membership_for(current_user)
expect {
select_kit =
PageObjects::Components::SelectKit.new(".c-channel-settings__notifications-selector")
select_kit.expand
select_kit.select_row_by_name("Never")
expect(toasts).to have_success(I18n.t("js.saved"))
}.to change { membership.reload.notification_level }.from("mention").to("never")
end
it "can unfollow channel" do
membership = channel_1.membership_for(current_user)
chat_page.visit_channel_settings(channel_1)
click_button(I18n.t("js.chat.channel_settings.leave_channel"))
expect(page).to have_current_path("/chat/browse/open")
expect(membership.reload.following).to eq(false)
end
context "when group channel" do
fab!(:channel_1) do
Fabricate(:direct_message_channel, group: true, users: [current_user, Fabricate(:user)])
end
before { channel_1.add(current_user) }
it "can leave channel" do
membership = channel_1.membership_for(current_user)
chat_page.visit_channel_settings(channel_1)
click_button(I18n.t("js.chat.channel_settings.leave_channel"))
expect(page).to have_current_path("/chat/browse/open")
expect(Chat::UserChatChannelMembership.exists?(membership.id)).to eq(false)
expect(
channel_1.chatable.direct_message_users.where(user_id: current_user.id).exists?,
).to eq(false)
end
end
context "when direct message channel" do
fab!(:channel_1) do
Fabricate(:direct_message_channel, users: [current_user, Fabricate(:user)])
end
before { channel_1.add(current_user) }
it "can toggle threading" do
chat_page.visit_channel_settings(channel_1)
expect {
PageObjects::Components::DToggleSwitch.new(".c-channel-settings__threading-switch").toggle
expect(toasts).to have_success(I18n.t("js.saved"))
}.to change { channel_1.reload.threading_enabled }.from(false).to(true)
end
end
end
context "as staff" do
fab!(:current_user, :admin)
before { channel_1.add(current_user) }
it "can edit name" do
chat_page.visit_channel_settings(channel_1)
edit_modal = channel_settings_page.open_edit_modal
expect(edit_modal).to have_name_input(channel_1.title)
name = "A new name"
edit_modal.fill_and_save_name(name)
expect(page).to have_content(name)
end
it "can edit description" do
chat_page.visit_channel_settings(channel_1)
find(".edit-description-btn").click
expect(page).to have_selector(
".chat-modal-edit-channel-description__description-input",
text: channel_1.description,
)
description = "A new description"
find(".chat-modal-edit-channel-description__description-input").fill_in(with: description)
find(".create").click
expect(page).to have_content(description)
end
it "can edit slug" do
chat_page.visit_channel_settings(channel_1)
edit_modal = channel_settings_page.open_edit_modal
slug = "gonzo-slug"
expect(edit_modal).to have_slug_input(channel_1.slug)
edit_modal.fill_and_save_slug(slug)
expect(page).to have_current_path("/chat/c/gonzo-slug/#{channel_1.id}")
end
it "can clear the slug to use the autogenerated version based on the name" do
channel_1.update!(name: "test channel")
chat_page.visit_channel_settings(channel_1)
edit_modal = channel_settings_page.open_edit_modal
expect(edit_modal).to have_slug_input(channel_1.slug)
edit_modal.fill_in_slug_input("")
edit_modal.wait_for_auto_generated_slug
edit_modal.save_changes
expect(page).to have_current_path("/chat/c/test-channel/#{channel_1.id}")
end
it "shows settings page" 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
it "can change auto join setting" do
chat_page.visit_channel_settings(channel_1)
expect {
PageObjects::Components::DToggleSwitch.new(".c-channel-settings__auto-join-switch").toggle
find("#dialog-holder .btn-primary").click
expect(toasts).to have_success(I18n.t("js.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 {
PageObjects::Components::DToggleSwitch.new(
".c-channel-settings__channel-wide-mentions",
).toggle
expect(toasts).to have_success(I18n.t("js.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
chat_page.visit_channel_settings(channel_1)
expect {
PageObjects::Components::DToggleSwitch.new(".c-channel-settings__threading-switch").toggle
expect(toasts).to have_success(I18n.t("js.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
it "doesnt delete when confirmation is wrong" 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