import { describe, expect, it } from 'vitest'
import { fireEvent, renderWithProviders, screen } from '../../../test/utils'
import { useCarousel } from './useCarousel'
const Harness = ({
open,
length,
initialIndex = 0,
}: {
open: boolean
length: number
initialIndex?: number
}) => {
const { index, prev, next } = useCarousel({ open, length, initialIndex })
return (
{index}
)
}
describe('useCarousel', () => {
it('clamps initial index, wraps, and resets on reopen', () => {
const { rerender } = renderWithProviders(
)
expect(screen.getByTestId('index')).toHaveTextContent('2')
fireEvent.click(screen.getByRole('button', { name: 'Next' }))
expect(screen.getByTestId('index')).toHaveTextContent('0')
fireEvent.click(screen.getByRole('button', { name: 'Prev' }))
expect(screen.getByTestId('index')).toHaveTextContent('2')
rerender()
rerender()
expect(screen.getByTestId('index')).toHaveTextContent('1')
})
it('handles arrows only when open with multiple items', () => {
const { rerender } = renderWithProviders(
)
const right = fireEvent.keyDown(window, { key: 'ArrowRight' })
expect(screen.getByTestId('index')).toHaveTextContent('1')
expect(right).toBe(false)
for (const tagName of ['video', 'audio'] as const) {
const media = document.createElement(tagName)
media.tabIndex = 0
document.body.appendChild(media)
media.focus()
fireEvent.keyDown(window, { key: 'ArrowLeft' })
expect(screen.getByTestId('index')).toHaveTextContent('1')
media.remove()
}
rerender()
fireEvent.keyDown(window, { key: 'ArrowRight' })
expect(screen.getByTestId('index')).toHaveTextContent('0')
rerender()
fireEvent.keyDown(window, { key: 'ArrowRight' })
expect(screen.getByTestId('index')).toHaveTextContent('0')
})
})