FIX: serializes interaction for direct messages (#29844)

Prior to this fix it would cause an error as we need to pass the user to get the title of the channel.

This commit also adds a test for message interaction serializer.
This commit is contained in:
Joffrey JAFFEUX 2024-11-20 11:26:12 +01:00 committed by GitHub
parent 67ce111861
commit 2fb811a335
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 161 additions and 1 deletions

View File

@ -9,7 +9,7 @@ module Chat
end
def channel
{ id: object.message.chat_channel.id, title: object.message.chat_channel.title }
{ id: object.message.chat_channel.id, title: object.message.chat_channel.title(scope.user) }
end
def message

View File

@ -173,6 +173,11 @@ Fabricator(:chat_reviewable_message, class_name: "Chat::ReviewableMessage") do
reviewable_scores { |p| [Fabricate.build(:reviewable_score, reviewable_id: p[:id])] }
end
Fabricator(:chat_message_interaction, class_name: "Chat::MessageInteraction") do
message { Fabricate(:chat_message) }
user { Fabricate(:user) }
end
Fabricator(:direct_message, class_name: "Chat::DirectMessage") do
users { [Fabricate(:user), Fabricate(:user)] }
end

View File

@ -0,0 +1,54 @@
# frozen_string_literal: true
RSpec.describe Chat::MessageInteractionSerializer do
subject(:serializer) do
interaction =
Fabricate(
:chat_message_interaction,
message:,
user:,
action: message.blocks.first["elements"].first,
)
described_class.new(interaction, scope: Guardian.new(user), root: false)
end
fab!(:user)
let(:message) do
Fabricate(
:chat_message,
chat_channel: channel,
user: Discourse.system_user,
blocks: [
{
type: "actions",
elements: [
{ type: "button", text: { type: "plain_text", text: "Like" }, action_id: "like" },
],
},
],
)
end
let(:message_id) { message.id }
let(:params) { { message_id:, action_id: "like" } }
before do
SiteSetting.chat_allowed_groups = Group::AUTO_GROUPS[:everyone]
SiteSetting.direct_message_enabled_groups = Group::AUTO_GROUPS[:everyone]
end
context "when interaction's channel is private" do
let(:channel) { Fabricate(:direct_message_channel, users: [user, Fabricate(:user)]) }
it "serializes the interaction" do
expect(serializer.as_json).to match_response_schema("message_interaction")
end
end
context "when interaction's channel is public" do
let(:channel) { Fabricate(:chat_channel) }
it "serializes the interaction" do
expect(serializer.as_json).to match_response_schema("message_interaction")
end
end
end

View File

@ -0,0 +1,101 @@
{
"type": "object",
"required": [
"action",
"channel",
"message",
"user"
],
"properties": {
"action": {
"type": "object",
"required": [
"action_id",
"schema_version",
"text",
"type"
],
"properties": {
"action_id": {
"type": "string"
},
"schema_version": {
"type": "integer"
},
"text": {
"type": "object",
"required": [
"text",
"type"
],
"properties": {
"text": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"plain_text"
]
}
}
},
"type": {
"type": "string",
"enum": [
"button"
]
}
}
},
"channel": {
"type": "object",
"required": [
"id",
"title"
],
"properties": {
"id": {
"type": "integer"
},
"title": {
"type": "string"
}
}
},
"message": {
"type": "object",
"required": [
"id",
"text",
"user_id"
],
"properties": {
"id": {
"type": "integer"
},
"text": {
"type": "string"
},
"user_id": {
"type": "integer"
}
}
},
"user": {
"type": "object",
"required": [
"id",
"username"
],
"properties": {
"id": {
"type": "integer"
},
"username": {
"type": "string"
}
}
}
}
}