FIX: serializes interaction for direct messages ()

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
plugins/chat

@ -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

@ -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

@ -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

@ -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"
}
}
}
}
}