discourse/plugins/chat/spec/jobs/chat_channel_delete_spec.rb
Martin Brennan 0924f874bd
DEV: Use UploadReference instead of ChatUpload in chat (#19947)
We've had the UploadReference table for some time now in core,
but it was added after ChatUpload was and chat was just never
moved over to this new system.

This commit changes all chat code dealing with uploads to create/
update/delete/query UploadReference records instead of ChatUpload
records for consistency. At a later date we will drop the ChatUpload
table, but for now keeping it for data backup.

The migration + post migration are the same, we need both in case
any chat uploads are added/removed during deploy.
2023-01-24 13:28:21 +10:00

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