diff --git a/apps/desktop/src/app/chat/composer/attachments.test.tsx b/apps/desktop/src/app/chat/composer/attachments.test.tsx
index 52e8f6bf98e8..b405b011d62e 100644
--- a/apps/desktop/src/app/chat/composer/attachments.test.tsx
+++ b/apps/desktop/src/app/chat/composer/attachments.test.tsx
@@ -1,11 +1,14 @@
-import { act, cleanup, render, screen } from '@testing-library/react'
+import { act, cleanup, fireEvent, render, screen } from '@testing-library/react'
import { afterEach, describe, expect, it } from 'vitest'
import { I18nProvider } from '@/i18n/context'
import type { ComposerAttachment } from '@/store/composer'
+import { $previewTabs } from '@/store/preview'
import { AttachmentList } from './attachments'
+const DATA_URL = 'data:image/png;base64,iVBORw0KGgoAAAANS'
+
function makeAttachment(id: string, label = 'test.pdf'): ComposerAttachment {
return { id, kind: 'file', label }
}
@@ -66,4 +69,43 @@ describe('AttachmentList', () => {
expect(screen.getByText('valid.txt')).toBeDefined()
})
+
+ it('opens an attached image in the lightbox, not the preview rail', async () => {
+ $previewTabs.set([])
+
+ const image: ComposerAttachment = {
+ id: 'img',
+ kind: 'image',
+ label: 'shot.png',
+ path: '/tmp/shot.png',
+ previewUrl: DATA_URL
+ }
+
+ await renderWithI18n()
+
+ await act(async () => {
+ fireEvent.click(screen.getByRole('button', { name: /shot\.png/ }))
+ })
+
+ // The lightbox renders the full-size image in a dialog; the rail stays empty.
+ const lightbox = await screen.findByRole('dialog')
+
+ expect(lightbox.querySelector('img')?.src).toBe(DATA_URL)
+ expect($previewTabs.get()).toHaveLength(0)
+ })
+
+ it('still routes a non-image attachment to the preview rail', async () => {
+ $previewTabs.set([])
+
+ const file: ComposerAttachment = { id: 'doc', kind: 'file', label: 'notes.md', path: '/tmp/notes.md' }
+
+ await renderWithI18n()
+
+ await act(async () => {
+ fireEvent.click(screen.getByRole('button', { name: /notes\.md/ }))
+ })
+
+ expect(screen.queryByRole('dialog')).toBeNull()
+ expect($previewTabs.get().map(tab => tab.target.path)).toEqual(['/tmp/notes.md'])
+ })
})