discourse/plugins/chat/spec/jobs/chat_channel_delete_spec.rb

102 lines
4.0 KiB
Ruby

# frozen_string_literal: true
describe Jobs::ChatChannelDelete do
fab!(:chat_channel) { Fabricate(:chat_channel) }
fab!(:user1) { Fabricate(:user) }
fab!(:user2) { Fabricate(:user) }
fab!(:user3) { Fabricate(:user) }
let(:users) { [user1, user2, user3] }
before do
messages = []
20.times do
messages << Fabricate(:chat_message, chat_channel: chat_channel, user: users.sample)
end
@message_ids = messages.map(&:id)
10.times { ChatMessageReaction.create(chat_message: messages.sample, user: users.sample) }
10.times do
upload = Fabricate(:upload, user: users.sample)
message = messages.sample
# TODO (martin) Remove this when we remove ChatUpload completely, 2023-04-01
DB.exec(<<~SQL)
INSERT INTO chat_uploads(upload_id, chat_message_id, created_at, updated_at)
VALUES(#{upload.id}, #{message.id}, NOW(), NOW())
SQL
UploadReference.create(target: message, upload: upload)
end
ChatMention.create(
user: user2,
chat_message: messages.sample,
notification: Fabricate(:notification),
)
@incoming_chat_webhook_id = Fabricate(:incoming_chat_webhook, chat_channel: chat_channel)
ChatWebhookEvent.create(
incoming_chat_webhook: @incoming_chat_webhook_id,
chat_message: messages.sample,
)
revision_message = messages.sample
Fabricate(
:chat_message_revision,
chat_message: revision_message,
old_message: "some old message",
new_message: revision_message.message,
)
ChatDraft.create(chat_channel: chat_channel, user: users.sample, data: "wow some draft")
Fabricate(:user_chat_channel_membership, chat_channel: chat_channel, user: user1)
Fabricate(:user_chat_channel_membership, chat_channel: chat_channel, user: user2)
Fabricate(:user_chat_channel_membership, chat_channel: chat_channel, user: user3)
chat_channel.trash!
end
def counts
{
incoming_webhooks: IncomingChatWebhook.where(chat_channel_id: chat_channel.id).count,
webhook_events:
ChatWebhookEvent.where(incoming_chat_webhook_id: @incoming_chat_webhook_id).count,
drafts: ChatDraft.where(chat_channel: chat_channel).count,
channel_memberships: UserChatChannelMembership.where(chat_channel: chat_channel).count,
revisions: ChatMessageRevision.where(chat_message_id: @message_ids).count,
mentions: ChatMention.where(chat_message_id: @message_ids).count,
chat_uploads:
DB.query_single(
"SELECT COUNT(*) FROM chat_uploads WHERE chat_message_id IN (#{@message_ids.join(",")})",
).first,
upload_references:
UploadReference.where(target_id: @message_ids, target_type: "ChatMessage").count,
messages: ChatMessage.where(id: @message_ids).count,
reactions: ChatMessageReaction.where(chat_message_id: @message_ids).count,
}
end
it "deletes all of the messages and related records completely" do
initial_counts = counts
described_class.new.execute(chat_channel_id: chat_channel.id)
new_counts = counts
expect(new_counts[:incoming_webhooks]).to eq(initial_counts[:incoming_webhooks] - 1)
expect(new_counts[:webhook_events]).to eq(initial_counts[:webhook_events] - 1)
expect(new_counts[:drafts]).to eq(initial_counts[:drafts] - 1)
expect(new_counts[:channel_memberships]).to eq(initial_counts[:channel_memberships] - 3)
expect(new_counts[:revisions]).to eq(initial_counts[:revisions] - 1)
expect(new_counts[:mentions]).to eq(initial_counts[:mentions] - 1)
expect(new_counts[:chat_uploads]).to eq(initial_counts[:chat_uploads] - 10)
expect(new_counts[:upload_references]).to eq(initial_counts[:upload_references] - 10)
expect(new_counts[:messages]).to eq(initial_counts[:messages] - 20)
expect(new_counts[:reactions]).to eq(initial_counts[:reactions] - 10)
end
it "does not error if there are no messages in the channel" do
other_channel = Fabricate(:chat_channel)
expect { described_class.new.execute(chat_channel_id: other_channel.id) }.not_to raise_error
end
end