mirror of
https://github.com/discourse/discourse.git
synced 2024-12-03 05:54:18 +08:00
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",
|
||
|
)
|
||
|
cu1 = ChatUpload.create(chat_message: message, created_at: 10.seconds.ago, upload: video)
|
||
|
cu2 = ChatUpload.create(chat_message: message, created_at: 9.seconds.ago, upload: audio)
|
||
|
cu3 = ChatUpload.create(chat_message: message, created_at: 8.seconds.ago, upload: attachment)
|
||
|
cu4 = ChatUpload.create(chat_message: 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",
|
||
|
)
|
||
|
cu = ChatUpload.create(chat_message: 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
|