mirror of
https://github.com/discourse/discourse.git
synced 2024-12-04 14:26:18 +08:00
5d9306a6fc
There was an issue with channel archiving, where at times the topic creation could fail which left the archive in a bad state, as read-only instead of archived. This commit does several things: * Changes the ChatChannelArchiveService to validate the topic being created first and if it is not valid report the topic creation errors in the PM we send to the user * Changes the UI message in the channel with the archive status to reflect that topic creation failed * Validate the new topic when starting the archive process from the UI, and show the validation errors to the user straight away instead of creating the archive record and starting the process This also fixes another issue in the discourse_dev config which was failing because YAML parsing does not enable all classes by default now, which was making the seeding rake task for chat fail.
136 lines
4.3 KiB
Ruby
136 lines
4.3 KiB
Ruby
# frozen_string_literal: true
|
||
|
||
RSpec.describe "Archive channel", type: :system, js: true do
|
||
fab!(:channel_1) { Fabricate(:chat_channel) }
|
||
|
||
let(:chat) { PageObjects::Pages::Chat.new }
|
||
let(:channel) { PageObjects::Pages::ChatChannel.new }
|
||
|
||
before do
|
||
SiteSetting.navigation_menu = "sidebar"
|
||
chat_system_bootstrap
|
||
sign_in(current_user)
|
||
end
|
||
|
||
context "when archiving is disabled" do
|
||
context "when admin user" do
|
||
fab!(:current_user) { Fabricate(:admin) }
|
||
|
||
before { sign_in(current_user) }
|
||
|
||
it "doesn’t allow to archive a channel" do
|
||
chat.visit_channel_settings(channel_1)
|
||
|
||
expect(page).to have_no_content(I18n.t("js.chat.channel_settings.archive_channel"))
|
||
end
|
||
end
|
||
end
|
||
|
||
context "when archiving is enabled" do
|
||
before { SiteSetting.chat_allow_archiving_channels = true }
|
||
|
||
context "when regular user" do
|
||
fab!(:current_user) { Fabricate(:user) }
|
||
|
||
before { sign_in(current_user) }
|
||
|
||
it "doesn’t allow to archive a channel" do
|
||
chat.visit_channel_settings(channel_1)
|
||
|
||
expect(page).to have_no_content(I18n.t("js.chat.channel_settings.archive_channel"))
|
||
end
|
||
end
|
||
|
||
context "when admin user" do
|
||
fab!(:current_user) { Fabricate(:admin) }
|
||
|
||
before { sign_in(current_user) }
|
||
|
||
it "allows to archive a channel" do
|
||
chat.visit_channel_settings(channel_1)
|
||
|
||
expect(page).to have_content(I18n.t("js.chat.channel_settings.archive_channel"))
|
||
end
|
||
|
||
context "when archiving" do
|
||
it "works" do
|
||
Jobs.run_immediately!
|
||
|
||
chat.visit_channel_settings(channel_1)
|
||
click_button(I18n.t("js.chat.channel_settings.archive_channel"))
|
||
find("#split-topic-name").fill_in(with: "An interesting topic for cats")
|
||
click_button(I18n.t("js.chat.channel_archive.title"))
|
||
|
||
expect(page).to have_content(I18n.t("js.chat.channel_archive.process_started"))
|
||
expect(page).to have_css(".chat-channel-archive-status")
|
||
end
|
||
|
||
it "shows an error when the topic is invalid" do
|
||
chat.visit_channel_settings(channel_1)
|
||
click_button(I18n.t("js.chat.channel_settings.archive_channel"))
|
||
find("#split-topic-name").fill_in(
|
||
with: "An interesting topic for cats :cat: :cat2: :smile_cat:",
|
||
)
|
||
click_button(I18n.t("js.chat.channel_archive.title"))
|
||
|
||
expect(page).not_to have_content(I18n.t("js.chat.channel_archive.process_started"))
|
||
expect(page).to have_content("Title can't have more than 1 emoji")
|
||
end
|
||
|
||
context "when archived channels had unreads" do
|
||
before { channel_1.add(current_user) }
|
||
|
||
it "clears unread indicators" do
|
||
Jobs.run_immediately!
|
||
|
||
other_user = Fabricate(:user)
|
||
channel_1.add(other_user)
|
||
Chat::ChatMessageCreator.create(
|
||
chat_channel: channel_1,
|
||
user: other_user,
|
||
content: "this is fine @#{current_user.username}",
|
||
)
|
||
|
||
visit("/")
|
||
expect(page.find(".chat-channel-unread-indicator")).to have_content(1)
|
||
|
||
chat.visit_channel_settings(channel_1)
|
||
click_button(I18n.t("js.chat.channel_settings.archive_channel"))
|
||
find("#split-topic-name").fill_in(with: "An interesting topic for cats")
|
||
click_button(I18n.t("js.chat.channel_archive.title"))
|
||
|
||
expect(page).to have_no_css(".chat-channel-unread-indicator")
|
||
end
|
||
end
|
||
end
|
||
|
||
context "when archiving failed" do
|
||
before { channel_1.update!(status: :read_only) }
|
||
|
||
fab!(:archive) do
|
||
ChatChannelArchive.create!(
|
||
chat_channel: channel_1,
|
||
archived_by: current_user,
|
||
destination_topic_title: "This will be the archive topic",
|
||
total_messages: 2,
|
||
archived_messages: 1,
|
||
archive_error: "Something went wrong",
|
||
)
|
||
end
|
||
|
||
it "can be retried" do
|
||
Jobs.run_immediately!
|
||
|
||
chat.visit_channel(channel_1)
|
||
click_button(I18n.t("js.chat.channel_archive.retry"))
|
||
|
||
new_window = window_opened_by { find(".chat-channel-archive-status a").click }
|
||
within_window(new_window) do
|
||
expect(page).to have_content(archive.destination_topic_title)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|