mirror of
https://github.com/discourse/discourse.git
synced 2025-02-28 05:50:14 +08:00

Followup ae3231e1406d4ccf1d048ef8a8d8f744f840896b, when a message is trashed we already update the lastReadMessageId of all users in the channel to the latest non-deleted message on the server side. However we didn't propagate this to the client, so in some cases when we did the following: 1. Delete the last message in the channel 2. Switch to another channel 3. Switch back to the original We would get a 404 error from the target message ID being looked up still being the old lastReadMessageId (now deleted) for the user's channel membership. All we need to do is send the last not-deleted message ID for the channel (or thread) to all the member users.
119 lines
4.7 KiB
Ruby
119 lines
4.7 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
RSpec.describe "Deleted message", type: :system, js: true do
|
|
let(:chat_page) { PageObjects::Pages::Chat.new }
|
|
let(:channel_page) { PageObjects::Pages::ChatChannel.new }
|
|
let(:sidebar_component) { PageObjects::Components::Sidebar.new }
|
|
|
|
fab!(:current_user) { Fabricate(:admin) }
|
|
fab!(:channel_1) { Fabricate(:category_channel) }
|
|
|
|
before do
|
|
chat_system_bootstrap
|
|
channel_1.add(current_user)
|
|
sign_in(current_user)
|
|
end
|
|
|
|
context "when deleting a message" do
|
|
it "shows as deleted" do
|
|
chat_page.visit_channel(channel_1)
|
|
channel_page.send_message("aaaaaaaaaaaaaaaaaaaa")
|
|
|
|
expect(page).to have_css(".chat-message-persisted")
|
|
|
|
last_message = find(".chat-message-container:last-child")
|
|
channel_page.delete_message(OpenStruct.new(id: last_message["data-id"]))
|
|
|
|
expect(channel_page).to have_deleted_message(
|
|
OpenStruct.new(id: last_message["data-id"]),
|
|
count: 1,
|
|
)
|
|
end
|
|
|
|
it "does not error when coming back to the channel from another channel" do
|
|
message = Fabricate(:chat_message, chat_channel: channel_1)
|
|
channel_2 = Fabricate(:category_channel, name: "other channel")
|
|
channel_2.add(current_user)
|
|
channel_1
|
|
.user_chat_channel_memberships
|
|
.find_by(user: current_user)
|
|
.update!(last_read_message_id: message.id)
|
|
chat_page.visit_channel(channel_1)
|
|
channel_page.delete_message(message)
|
|
expect(channel_page).to have_deleted_message(message, count: 1)
|
|
sidebar_component.click_link(channel_2.name)
|
|
sidebar_component.click_link(channel_1.name)
|
|
expect(channel_page).to have_deleted_message(message, count: 1)
|
|
end
|
|
end
|
|
|
|
context "when deleting multiple messages" do
|
|
fab!(:message_1) { Fabricate(:chat_message, chat_channel: channel_1) }
|
|
fab!(:message_2) { Fabricate(:chat_message, chat_channel: channel_1) }
|
|
fab!(:message_3) { Fabricate(:chat_message, chat_channel: channel_1) }
|
|
fab!(:message_4) { Fabricate(:chat_message, chat_channel: channel_1) }
|
|
fab!(:message_5) { Fabricate(:chat_message, chat_channel: channel_1) }
|
|
fab!(:message_6) { Fabricate(:chat_message, chat_channel: channel_1) }
|
|
|
|
it "groups them" do
|
|
chat_page.visit_channel(channel_1)
|
|
|
|
channel_page.delete_message(message_1)
|
|
channel_page.delete_message(message_3)
|
|
channel_page.delete_message(message_4)
|
|
channel_page.delete_message(message_6)
|
|
|
|
expect(channel_page).to have_deleted_message(message_1)
|
|
expect(channel_page).to have_deleted_message(message_4, count: 2)
|
|
expect(channel_page).to have_deleted_message(message_6)
|
|
expect(channel_page).to have_no_message(id: message_3.id)
|
|
end
|
|
end
|
|
|
|
context "when bulk deleting messages across the channel and a thread" do
|
|
let(:side_panel) { PageObjects::Pages::ChatSidePanel.new }
|
|
let(:open_thread) { PageObjects::Pages::ChatThread.new }
|
|
|
|
fab!(:other_user) { Fabricate(:user) }
|
|
fab!(:message_1) { Fabricate(:chat_message, chat_channel: channel_1, user: other_user) }
|
|
fab!(:message_2) { Fabricate(:chat_message, chat_channel: channel_1, user: other_user) }
|
|
fab!(:message_3) { Fabricate(:chat_message, chat_channel: channel_1, user: other_user) }
|
|
|
|
fab!(:thread) { Fabricate(:chat_thread, channel: channel_1) }
|
|
fab!(:message_4) do
|
|
Fabricate(:chat_message, chat_channel: channel_1, user: other_user, thread: thread)
|
|
end
|
|
fab!(:message_5) do
|
|
Fabricate(:chat_message, chat_channel: channel_1, user: other_user, thread: thread)
|
|
end
|
|
|
|
before do
|
|
channel_1.update!(threading_enabled: true)
|
|
SiteSetting.enable_experimental_chat_threaded_discussions = true
|
|
chat_system_user_bootstrap(user: other_user, channel: channel_1)
|
|
Chat::Thread.update_counts
|
|
end
|
|
|
|
it "hides the deleted messages" do
|
|
chat_page.visit_channel(channel_1)
|
|
channel_page.message_thread_indicator(thread.original_message).click
|
|
expect(side_panel).to have_open_thread(thread)
|
|
|
|
expect(channel_page).to have_message(id: message_1.id)
|
|
expect(channel_page).to have_message(id: message_2.id)
|
|
expect(open_thread).to have_message(thread_id: thread.id, id: message_4.id)
|
|
expect(open_thread).to have_message(thread_id: thread.id, id: message_5.id)
|
|
|
|
Chat::Publisher.publish_bulk_delete!(
|
|
channel_1,
|
|
[message_1.id, message_2.id, message_4.id, message_5.id].flatten,
|
|
)
|
|
|
|
expect(channel_page).to have_no_message(id: message_1.id)
|
|
expect(channel_page).to have_deleted_message(message_2, count: 2)
|
|
expect(open_thread).to have_no_message(thread_id: thread.id, id: message_4.id)
|
|
expect(open_thread).to have_deleted_message(message_5, count: 2)
|
|
end
|
|
end
|
|
end
|