Joffrey JAFFEUX 671e6066bf
DEV: adds first_messages/last_messages to thread SDK (#26861)
This commit introduces several enhancements to the ChatSDK module, aiming to improve the functionality and usability of chat thread interactions. Here's what has been changed and added:

1. **New Method: `first_messages`:**
   - Added a method to retrieve the first set of messages from a specified chat thread.
   - This method is particularly useful for fetching initial messages when entering a chat thread.
   - Parameters include `thread_id`, `guardian`, and an optional `page_size` which defaults to 10.
   - Usage example added to demonstrate fetching the first 15 messages from a thread.

2. **New Method: `last_messages`:**
   - Added a method to retrieve the last set of messages from a specified chat thread.
   - This method supports reverse pagination, where the user may want to see the most recent messages first.
   - Similar to `first_messages`, it accepts `thread_id`, `guardian`, and an optional `page_size` parameter, defaulting to 10.
   - Usage example provided to illustrate fetching the last 20 messages from a thread.
2024-05-03 17:30:39 +02:00

138 lines
3.7 KiB
Ruby

# frozen_string_literal: true
describe ChatSDK::Thread do
describe ".update_title" do
fab!(:thread_1) { Fabricate(:chat_thread) }
let(:params) do
{ title: "New Title", thread_id: thread_1.id, guardian: Discourse.system_user.guardian }
end
it "changes the title" do
expect { described_class.update_title(**params) }.to change { thread_1.reload.title }.from(
thread_1.title,
).to(params[:title])
end
context "when missing param" do
it "fails" do
params.delete(:thread_id)
expect { described_class.update_title(**params) }.to raise_error(
"missing keyword: :thread_id",
)
end
end
context "when guardian can't see the channel" do
fab!(:thread_1) { Fabricate(:chat_thread, channel: Fabricate(:private_category_channel)) }
it "fails" do
params[:guardian] = Fabricate(:user).guardian
expect { described_class.update_title(**params) }.to raise_error(
"Guardian can't view channel",
)
end
end
context "when guardian can't edit the thread" do
it "fails" do
params[:guardian] = Fabricate(:user).guardian
expect { described_class.update_title(**params) }.to raise_error(
"Guardian can't edit thread",
)
end
end
context "when the threadind is not enabled" do
before { thread_1.channel.update!(threading_enabled: false) }
it "fails" do
expect { described_class.update_title(**params) }.to raise_error(
"Threading is not enabled for this channel",
)
end
end
context "when the thread doesn't exist" do
it "fails" do
params[:thread_id] = -999
expect { described_class.update_title(**params) }.to raise_error(
"Couldn’t find thread with id: `-999`",
)
end
end
end
describe ".first_messages" do
fab!(:thread_1) { Fabricate(:chat_thread) }
fab!(:messages) do
Fabricate.times(5, :chat_message, thread: thread_1, chat_channel: thread_1.channel)
end
let(:params) { { thread_id: thread_1.id, guardian: Discourse.system_user.guardian } }
it "returns messages" do
expect(described_class.first_messages(**params)).to eq([thread_1.original_message, *messages])
end
end
describe ".last_messages" do
fab!(:thread_1) { Fabricate(:chat_thread) }
fab!(:messages) do
Fabricate.times(
5,
:chat_message,
thread: thread_1,
chat_channel: thread_1.channel,
use_service: true,
)
end
let(:params) do
{ thread_id: thread_1.id, guardian: Discourse.system_user.guardian, page_size: 5 }
end
it "returns messages" do
expect(described_class.last_messages(**params)).to eq([*messages])
end
end
describe ".messages" do
fab!(:thread_1) { Fabricate(:chat_thread) }
fab!(:messages) do
Fabricate.times(
5,
:chat_message,
thread: thread_1,
chat_channel: thread_1.channel,
use_service: true,
)
end
let(:params) { { thread_id: thread_1.id, guardian: Discourse.system_user.guardian } }
it "returns messages" do
expect(described_class.messages(**params)).to eq([thread_1.original_message, *messages])
end
describe "page_size:" do
before { params[:page_size] = 2 }
it "limits returned messages" do
expect(described_class.messages(**params)).to eq([thread_1.original_message, messages[0]])
end
end
context "when target_message doesn’t exist" do
it "fails" do
expect { described_class.messages(**params, target_message_id: -999) }.to raise_error(
"Target message doesn't exist",
)
end
end
end
end