mirror of
https://github.com/wu736139669/hapi.git
synced 2026-08-05 06:24:37 +00:00
* feat(web): preview composer image attachments * fix(web): address composer preview review
62 lines
2.8 KiB
TypeScript
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()
|
|
})
|
|
})
|