|
238 | 238 | end |
239 | 239 | end |
240 | 240 |
|
| 241 | + describe "upload limits in messages_from_chat" do |
| 242 | + fab!(:test_channel) { Fabricate(:category_channel) } |
| 243 | + fab!(:test_user) { Fabricate(:user) } |
| 244 | + |
| 245 | + # Create MAX_CHAT_UPLOADS + 1 uploads |
| 246 | + fab!(:uploads) do |
| 247 | + (described_class::MAX_CHAT_UPLOADS + 1).times.map do |i| |
| 248 | + Fabricate(:upload, user: test_user, original_filename: "image#{i}.png", extension: "png") |
| 249 | + end |
| 250 | + end |
| 251 | + |
| 252 | + # Create MAX_CHAT_UPLOADS + 1 messages with those uploads |
| 253 | + fab!(:messages_with_uploads) do |
| 254 | + uploads.map do |upload| |
| 255 | + Fabricate( |
| 256 | + :chat_message, |
| 257 | + chat_channel: test_channel, |
| 258 | + user: test_user, |
| 259 | + message: "Message with upload #{upload.id}", |
| 260 | + ).tap do |msg| |
| 261 | + UploadReference.create!(target: msg, upload: upload) |
| 262 | + msg.update!(upload_ids: [upload.id]) |
| 263 | + end |
| 264 | + end |
| 265 | + end |
| 266 | + |
| 267 | + let(:max_uploads) { described_class::MAX_CHAT_UPLOADS } |
| 268 | + |
| 269 | + it "limits uploads to MAX_CHAT_UPLOADS in the final result" do |
| 270 | + last_message = messages_with_uploads.last |
| 271 | + |
| 272 | + # Make sure uploads are properly associated |
| 273 | + messages_with_uploads.each_with_index do |msg, i| |
| 274 | + expect(msg.uploads.first.id).to eq(uploads[i].id) |
| 275 | + end |
| 276 | + |
| 277 | + context = |
| 278 | + described_class.messages_from_chat( |
| 279 | + last_message, |
| 280 | + channel: test_channel, |
| 281 | + context_post_ids: nil, |
| 282 | + max_messages: messages_with_uploads.size, |
| 283 | + include_uploads: true, |
| 284 | + bot_user_ids: [], |
| 285 | + instruction_message: nil, |
| 286 | + ) |
| 287 | + |
| 288 | + # We should have one message containing all message content |
| 289 | + expect(context.length).to eq(1) |
| 290 | + content = context.first[:content] |
| 291 | + |
| 292 | + # Count the upload hashes in the content |
| 293 | + upload_hashes = content.select { |item| item.is_a?(Hash) && item[:upload_id] } |
| 294 | + |
| 295 | + # Should have exactly MAX_CHAT_UPLOADS upload references |
| 296 | + expect(upload_hashes.size).to eq(max_uploads) |
| 297 | + |
| 298 | + # The most recent uploads should be preserved (not the oldest) |
| 299 | + expected_upload_ids = uploads.last(max_uploads).map(&:id) |
| 300 | + actual_upload_ids = upload_hashes.map { |h| h[:upload_id] } |
| 301 | + expect(actual_upload_ids).to match_array(expected_upload_ids) |
| 302 | + end |
| 303 | + end |
| 304 | + |
241 | 305 | describe ".messages_from_post" do |
242 | 306 | fab!(:pm) do |
243 | 307 | Fabricate( |
|
0 commit comments