Files
hapi/web/src/components/ImagePreview.test.tsx
T
AnanovoandGitHub 2be5a07aae feat(web): preview composer image attachments (#1322)
* feat(web): preview composer image attachments

* fix(web): address composer preview review
2026-08-03 18:04:51 +08:00

62 lines
2.8 KiB
TypeScript

import { fireEvent, render, screen, within } from '@testing-library/react'
import { describe, expect, it } from 'vitest'
import { ImagePreview } from './ImagePreview'
function renderGallery() {
render(
<>
<ImagePreview src="/first.png" fileName="first.png" label="First image" />
<ImagePreview src="/second.png" fileName="second.png" label="Second image" />
</>
)
}
describe('ImagePreview gallery navigation', () => {
it('navigates between rendered image previews with toolbar buttons', () => {
renderGallery()
fireEvent.click(screen.getByRole('button', { name: /first image/i }))
const dialog = screen.getByRole('dialog', { name: 'First image' })
expect(within(dialog).getByText('1 / 2')).toBeInTheDocument()
expect(within(dialog).getByRole('button', { name: 'Previous image' })).toBeDisabled()
fireEvent.click(within(dialog).getByRole('button', { name: 'Next image' }))
const nextDialog = screen.getByRole('dialog', { name: 'Second image' })
expect(within(nextDialog).getByText('second.png')).toBeInTheDocument()
expect(within(nextDialog).getByText('2 / 2')).toBeInTheDocument()
expect(within(nextDialog).getByRole('img', { name: 'Second image' })).toHaveAttribute('src', '/second.png')
expect(within(nextDialog).getByRole('button', { name: 'Next image' })).toBeDisabled()
})
it('supports left and right arrow keys', () => {
renderGallery()
fireEvent.click(screen.getByRole('button', { name: /first image/i }))
fireEvent.keyDown(window, { key: 'ArrowRight' })
expect(screen.getByRole('dialog', { name: 'Second image' })).toBeInTheDocument()
fireEvent.keyDown(window, { key: 'ArrowLeft' })
expect(screen.getByRole('dialog', { name: 'First image' })).toBeInTheDocument()
})
it('keeps named galleries separate from ungrouped previews', () => {
render(
<>
<ImagePreview src="/sent.png" fileName="sent.png" label="Sent image" />
<ImagePreview src="/draft-one.png" fileName="draft-one.png" label="First draft" galleryId="composer-attachments" />
<ImagePreview src="/draft-two.png" fileName="draft-two.png" label="Second draft" galleryId="composer-attachments" />
</>
)
fireEvent.click(screen.getByRole('button', { name: /first draft/i }))
const dialog = screen.getByRole('dialog', { name: 'First draft' })
expect(within(dialog).getByText('1 / 2')).toBeInTheDocument()
fireEvent.click(within(dialog).getByRole('button', { name: 'Next image' }))
expect(screen.getByRole('dialog', { name: 'Second draft' })).toBeInTheDocument()
expect(within(screen.getByRole('dialog')).queryByRole('img', { name: 'Sent image' })).not.toBeInTheDocument()
})
})