# frozen_string_literal: true RSpec.describe "Channel - Info - About page", type: :system do fab!(:channel_1) { Fabricate(:category_channel) } let(:chat_page) { PageObjects::Pages::Chat.new } let(:chat_channel_about_page) { PageObjects::Pages::ChatChannelAbout.new } before { chat_system_bootstrap } context "as regular user" do fab!(:current_user) { Fabricate(:user) } before { sign_in(current_user) } it "shows channel info" do chat_page.visit_channel_about(channel_1) expect(page.find(".category-name")).to have_content(channel_1.chatable.name) expect(page.find(".channel-info-about-view__name")).to have_content(channel_1.title) expect(page.find(".channel-info-about-view__slug")).to have_content(channel_1.slug) end it "escapes channel title" do channel_1.update!(name: "") chat_page.visit_channel_about(channel_1) expect(page.find(".channel-info-about-view__name")["innerHTML"].strip).to eq( "<script>alert('hello')</script>", ) expect(page.find(".chat-channel-title__name")["innerHTML"].strip).to eq( "<script>alert('hello')</script>", ) end it "can’t edit name or slug" do chat_page.visit_channel_about(channel_1) expect(page).to have_no_selector(".edit-name-slug-btn") end it "can’t edit description" do chat_page.visit_channel_about(channel_1) expect(page).to have_no_selector(".edit-description-btn") end context "as a member" do before { channel_1.add(current_user) } it "can leave channel" do chat_page.visit_channel_about(channel_1) membership = channel_1.membership_for(current_user) expect { click_button(I18n.t("js.chat.channel_settings.leave_channel")) expect(page).to have_content(I18n.t("js.chat.channel_settings.join_channel")) }.to change { membership.reload.following }.from(true).to(false) end end context "as not a member" do it "can join channel" do chat_page.visit_channel_about(channel_1) expect { click_button(I18n.t("js.chat.channel_settings.join_channel")) expect(page).to have_content(I18n.t("js.chat.channel_settings.leave_channel")) }.to change { Chat::UserChatChannelMembership.where(user_id: current_user.id, following: true).count }.by(1) end end end context "as admin" do fab!(:current_user) { Fabricate(:admin) } before { sign_in(current_user) } it "can edit name" do chat_page.visit_channel_about(channel_1) edit_modal = chat_channel_about_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(chat_channel_about_page).to have_name(name) end it "can edit description" do chat_page.visit_channel_about(channel_1) find(".edit-description-btn").click expect(page).to have_selector( ".chat-channel-edit-description-modal__description-input", text: channel_1.description, ) description = "A new description" find(".chat-channel-edit-description-modal__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_about(channel_1) edit_modal = chat_channel_about_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(chat_channel_about_page).to have_slug(slug) 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_about(channel_1) edit_modal = chat_channel_about_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(chat_channel_about_page).to have_slug("test-channel") end end end