discourse/plugins/chat/spec/lib/chat_transcript_service_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

255 lines
8.6 KiB
Ruby

# frozen_string_literal: true
require "rails_helper"
describe ChatTranscriptService do
let(:acting_user) { Fabricate(:user) }
let(:user1) { Fabricate(:user, username: "martinchat") }
let(:user2) { Fabricate(:user, username: "brucechat") }
let(:channel) { Fabricate(:category_channel, name: "The Beam Discussions") }
def service(message_ids, opts: {})
described_class.new(channel, acting_user, messages_or_ids: Array.wrap(message_ids), opts: opts)
end
it "generates a simple chat transcript from one message" do
message =
Fabricate(
:chat_message,
user: user1,
chat_channel: channel,
message: "an extremely insightful response :)",
)
expect(service(message.id).generate_markdown).to eq(<<~MARKDOWN)
[chat quote="martinchat;#{message.id};#{message.created_at.iso8601}" channel="The Beam Discussions" channelId="#{channel.id}"]
an extremely insightful response :)
[/chat]
MARKDOWN
end
it "generates a single chat transcript from multiple subsequent messages from the same user" do
message1 =
Fabricate(
:chat_message,
user: user1,
chat_channel: channel,
message: "an extremely insightful response :)",
)
message2 =
Fabricate(:chat_message, user: user1, chat_channel: channel, message: "if i say so myself")
message3 = Fabricate(:chat_message, user: user1, chat_channel: channel, message: "yay!")
rendered = service([message1.id, message2.id, message3.id]).generate_markdown
expect(rendered).to eq(<<~MARKDOWN)
[chat quote="martinchat;#{message1.id};#{message1.created_at.iso8601}" channel="The Beam Discussions" channelId="#{channel.id}" multiQuote="true"]
an extremely insightful response :)
if i say so myself
yay!
[/chat]
MARKDOWN
end
it "generates chat messages in created_at order no matter what order the message_ids are passed in" do
message1 =
Fabricate(
:chat_message,
created_at: 10.minute.ago,
user: user1,
chat_channel: channel,
message: "an extremely insightful response :)",
)
message2 =
Fabricate(
:chat_message,
created_at: 5.minutes.ago,
user: user1,
chat_channel: channel,
message: "if i say so myself",
)
message3 =
Fabricate(
:chat_message,
created_at: 1.minutes.ago,
user: user1,
chat_channel: channel,
message: "yay!",
)
rendered = service([message3.id, message1.id, message2.id]).generate_markdown
expect(rendered).to eq(<<~MARKDOWN)
[chat quote="martinchat;#{message1.id};#{message1.created_at.iso8601}" channel="The Beam Discussions" channelId="#{channel.id}" multiQuote="true"]
an extremely insightful response :)
if i say so myself
yay!
[/chat]
MARKDOWN
end
it "generates multiple chained chat transcripts for interleaving messages from different users" do
message1 =
Fabricate(
:chat_message,
user: user1,
chat_channel: channel,
message: "an extremely insightful response :)",
)
message2 = Fabricate(:chat_message, user: user2, chat_channel: channel, message: "says you!")
message3 = Fabricate(:chat_message, user: user1, chat_channel: channel, message: "aw :(")
expect(service([message1.id, message2.id, message3.id]).generate_markdown).to eq(<<~MARKDOWN)
[chat quote="martinchat;#{message1.id};#{message1.created_at.iso8601}" channel="The Beam Discussions" channelId="#{channel.id}" multiQuote="true" chained="true"]
an extremely insightful response :)
[/chat]
[chat quote="brucechat;#{message2.id};#{message2.created_at.iso8601}" chained="true"]
says you!
[/chat]
[chat quote="martinchat;#{message3.id};#{message3.created_at.iso8601}" chained="true"]
aw :(
[/chat]
MARKDOWN
end
it "generates image / attachment / video / audio markdown inside the [chat] bbcode for upload-only messages" do
SiteSetting.authorized_extensions = "mp4|mp3|pdf|jpg"
message = Fabricate(:chat_message, user: user1, chat_channel: channel, message: "")
video = Fabricate(:upload, original_filename: "test_video.mp4", extension: "mp4")
audio = Fabricate(:upload, original_filename: "test_audio.mp3", extension: "mp3")
attachment = Fabricate(:upload, original_filename: "test_file.pdf", extension: "pdf")
image =
Fabricate(
:upload,
width: 100,
height: 200,
original_filename: "test_img.jpg",
extension: "jpg",
)
UploadReference.create(target: message, created_at: 10.seconds.ago, upload: video)
UploadReference.create(target: message, created_at: 9.seconds.ago, upload: audio)
UploadReference.create(target: message, created_at: 8.seconds.ago, upload: attachment)
UploadReference.create(target: message, created_at: 7.seconds.ago, upload: image)
video_markdown = UploadMarkdown.new(video).to_markdown
audio_markdown = UploadMarkdown.new(audio).to_markdown
attachment_markdown = UploadMarkdown.new(attachment).to_markdown
image_markdown = UploadMarkdown.new(image).to_markdown
expect(service(message.id).generate_markdown).to eq(<<~MARKDOWN)
[chat quote="martinchat;#{message.id};#{message.created_at.iso8601}" channel="The Beam Discussions" channelId="#{channel.id}"]
#{video_markdown}
#{audio_markdown}
#{attachment_markdown}
#{image_markdown}
[/chat]
MARKDOWN
end
it "generates the correct markdown if a message has text and an upload" do
SiteSetting.authorized_extensions = "mp4|mp3|pdf|jpg"
message =
Fabricate(
:chat_message,
user: user1,
chat_channel: channel,
message: "this is a cool and funny picture",
)
image =
Fabricate(
:upload,
width: 100,
height: 200,
original_filename: "test_img.jpg",
extension: "jpg",
)
UploadReference.create(target: message, created_at: 7.seconds.ago, upload: image)
image_markdown = UploadMarkdown.new(image).to_markdown
expect(service(message.id).generate_markdown).to eq(<<~MARKDOWN)
[chat quote="martinchat;#{message.id};#{message.created_at.iso8601}" channel="The Beam Discussions" channelId="#{channel.id}"]
this is a cool and funny picture
#{image_markdown}
[/chat]
MARKDOWN
end
it "generates a transcript with the noLink option" do
message =
Fabricate(
:chat_message,
user: user1,
chat_channel: channel,
message: "an extremely insightful response :)",
)
expect(service(message.id, opts: { no_link: true }).generate_markdown).to eq(<<~MARKDOWN)
[chat quote="martinchat;#{message.id};#{message.created_at.iso8601}" channel="The Beam Discussions" channelId="#{channel.id}" noLink="true"]
an extremely insightful response :)
[/chat]
MARKDOWN
end
it "generates reaction data for single and subsequent messages" do
message =
Fabricate(
:chat_message,
user: user1,
chat_channel: channel,
message: "an extremely insightful response :)",
)
message2 = Fabricate(:chat_message, user: user1, chat_channel: channel, message: "wow so tru")
message3 =
Fabricate(:chat_message, user: user2, chat_channel: channel, message: "a new perspective")
ChatMessageReaction.create!(
chat_message: message,
user: Fabricate(:user, username: "bjorn"),
emoji: "heart",
)
ChatMessageReaction.create!(
chat_message: message,
user: Fabricate(:user, username: "sigurd"),
emoji: "heart",
)
ChatMessageReaction.create!(
chat_message: message,
user: Fabricate(:user, username: "hvitserk"),
emoji: "+1",
)
ChatMessageReaction.create!(
chat_message: message2,
user: Fabricate(:user, username: "ubbe"),
emoji: "money_mouth_face",
)
ChatMessageReaction.create!(
chat_message: message3,
user: Fabricate(:user, username: "ivar"),
emoji: "sob",
)
expect(
service(
[message.id, message2.id, message3.id],
opts: {
include_reactions: true,
},
).generate_markdown,
).to eq(<<~MARKDOWN)
[chat quote="martinchat;#{message.id};#{message.created_at.iso8601}" channel="The Beam Discussions" channelId="#{channel.id}" multiQuote="true" chained="true" reactions="+1:hvitserk;heart:bjorn,sigurd;money_mouth_face:ubbe"]
an extremely insightful response :)
wow so tru
[/chat]
[chat quote="brucechat;#{message3.id};#{message3.created_at.iso8601}" chained="true" reactions="sob:ivar"]
a new perspective
[/chat]
MARKDOWN
end
end