'方案.pdf', 'ext' => 'PDF', 'path' => 'uploads/chat/202608/1/plan.pdf', 'thumb' => 'images/ext/pdf.png', 'size' => 2048, ]); $this->assertCount(1, $attachments); $this->assertSame(WebSocketDialogMsgAttachment::SOURCE_FILE_MESSAGE, $attachments[0]['source_type']); $this->assertSame(WebSocketDialogMsgAttachment::KIND_FILE, $attachments[0]['kind']); $this->assertSame('pdf', $attachments[0]['ext']); $this->assertSame(2048, $attachments[0]['size']); } public function test_classifies_uploaded_image_as_image_attachment(): void { $attachments = MessageAttachmentService::extract('file', [ 'name' => 'design.png', 'ext' => 'png', 'path' => 'uploads/chat/202608/1/design.png', 'thumb' => 'uploads/chat/202608/1/design.png_thumb.jpg', 'size' => 4096, 'width' => 1200, 'height' => 800, ]); $this->assertSame(WebSocketDialogMsgAttachment::KIND_IMAGE, $attachments[0]['kind']); $this->assertSame(1200, $attachments[0]['width']); $this->assertSame(800, $attachments[0]['height']); } public function test_extracts_each_browse_image_and_ignores_emoticons(): void { $html = <<<'HTML'

设计图 笑脸 重复图片

HTML; $attachments = MessageAttachmentService::extract('text', ['text' => $html]); $this->assertCount(2, $attachments); $this->assertSame([0, 1], array_column($attachments, 'position')); $this->assertSame('uploads/chat/202608/1/design.png', $attachments[0]['path']); $this->assertSame('uploads/chat/202608/1/design.png_thumb.jpg', $attachments[0]['thumb']); $this->assertSame('设计图', $attachments[0]['name']); $this->assertSame('重复图片', $attachments[1]['name']); } public function test_extracts_legacy_image_token(): void { $attachments = MessageAttachmentService::extract('text', [ 'text' => '

旧消息

[:IMAGE:browse:120:80:uploads/chat/202001/1/legacy.webp:旧截图:]', ]); $this->assertCount(1, $attachments); $this->assertSame('uploads/chat/202001/1/legacy.webp', $attachments[0]['path']); $this->assertSame('webp', $attachments[0]['ext']); $this->assertSame(120, $attachments[0]['width']); $this->assertSame(80, $attachments[0]['height']); } public function test_ignores_broken_placeholder_and_non_attachment_messages(): void { $this->assertSame([], MessageAttachmentService::extract('text', [ 'text' => '', ])); $this->assertSame([], MessageAttachmentService::extract('meeting', ['name' => '周会'])); } }