2022-11-02 21:41:30 +08:00
|
|
|
# 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
|
2023-01-24 11:28:21 +08:00
|
|
|
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)
|
2022-11-02 21:41:30 +08:00
|
|
|
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
|
2022-11-08 07:06:13 +08:00
|
|
|
Fabricate(
|
|
|
|
:chat_message_revision,
|
2022-11-02 21:41:30 +08:00
|
|
|
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
|
|
|
|
|
2023-01-24 11:28:21 +08:00
|
|
|
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
|
|
|
|
|
2022-11-02 21:41:30 +08:00
|
|
|
it "deletes all of the messages and related records completely" do
|
2023-01-24 11:28:21 +08:00
|
|
|
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
|
2022-11-02 21:41:30 +08:00
|
|
|
end
|
|
|
|
end
|