import { render, screen, fireEvent } from '@testing-library/react'
import { SlideCanvas } from '../slide-deck/SlideCanvas'
import { SlideFilmstrip } from '../slide-deck/SlideFilmstrip'
import { SlideDeckViewer } from '../slide-deck/SlideDeckViewer'
import type { SlideData } from '../slide-deck/types'
const slides: SlideData[] = [
{ id: 's1', slideNumber: 1, title: 'Title', imageUrl: 'https://x/1.png', status: 'ready' },
{ id: 's2', slideNumber: 2, title: 'Problem', imageUrl: 'https://x/2.png', status: 'ready' },
{ id: 's3', slideNumber: 3, title: 'Solution', status: 'generating' },
]
describe('SlideCanvas', () => {
it('renders a full-bleed image in image render mode', () => {
render()
const img = screen.getByRole('img')
expect(img).toHaveAttribute('src', 'https://x/1.png')
})
it('shows a generating state while the slide is in progress', () => {
const { container } = render()
const el = container.querySelector('[data-status="generating"]')
expect(el).toBeInTheDocument()
expect(el).toHaveAttribute('aria-busy', 'true')
})
it('shows an error state with a retry control', () => {
const onRetry = jest.fn()
render()
const retry = screen.getByRole('button', { name: /retry|regenerate/i })
fireEvent.click(retry)
expect(onRetry).toHaveBeenCalled()
})
})
describe('SlideFilmstrip', () => {
it('renders a thumbnail per slide and marks the active one', () => {
render( {}} />)
const thumbs = screen.getAllByRole('button')
expect(thumbs).toHaveLength(3)
const active = thumbs.find((t) => t.getAttribute('aria-current') === 'true')
expect(active).toBeTruthy()
})
it('calls onSelect with the slide id when a thumbnail is clicked', () => {
const onSelect = jest.fn()
render()
fireEvent.click(screen.getAllByRole('button')[2])
expect(onSelect).toHaveBeenCalledWith('s3')
})
})
describe('SlideDeckViewer', () => {
it('renders the active slide and the position indicator', () => {
const { container } = render()
expect(screen.getByText('2 / 3')).toBeInTheDocument()
const stage = container.querySelector('[data-testid="slide-deck-stage"]') as HTMLElement
expect(stage.querySelector('img')).toHaveAttribute('src', 'https://x/2.png')
})
it('advances the active slide with ArrowRight', () => {
const onActiveChange = jest.fn()
const { container } = render(
)
const stage = container.querySelector('[data-testid="slide-deck-stage"]') as HTMLElement
fireEvent.keyDown(stage, { key: 'ArrowRight' })
expect(onActiveChange).toHaveBeenCalledWith('s2')
})
it('renders an empty state when there are no slides', () => {
render(No slides yet} />)
expect(screen.getByText('No slides yet')).toBeInTheDocument()
})
it('invokes onRegenerate for the active slide', () => {
const onRegenerate = jest.fn()
render()
fireEvent.click(screen.getByRole('button', { name: /regenerate/i }))
expect(onRegenerate).toHaveBeenCalledWith(slides[0])
})
})