mirror of
https://github.com/discourse/discourse.git
synced 2024-11-27 02:23:44 +08:00
0924f874bd
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.
255 lines
8.6 KiB
Ruby
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
|