import { render, screen } from '@testing-library/react'
import userEvent from '@testing-library/user-event'
import { describe, it, expect, vi } from 'vitest'
import { axe } from 'vitest-axe'
import { Toggle } from './toggle'
import { Button } from '../button/button'
describe('Toggle', () => {
it('renders as a button', () => {
render(B)
const el = screen.getByRole('button', { name: 'Bold' })
expect(el.tagName).toBe('BUTTON')
expect(el).toHaveAttribute('aria-pressed', 'false')
})
it('composes with Button via render and propagates data-pressed', async () => {
const user = userEvent.setup()
render(Bold} />)
const btn = screen.getByRole('button', { name: 'Bold' })
expect(btn.className).toContain('bg-primary')
expect(btn).toHaveAttribute('aria-pressed', 'false')
await user.click(btn)
expect(btn).toHaveAttribute('aria-pressed', 'true')
expect(btn).toHaveAttribute('data-pressed')
})
it('reflects defaultPressed', () => {
render(
B
,
)
expect(screen.getByRole('button', { name: 'Bold' })).toHaveAttribute('aria-pressed', 'true')
})
it('toggles when clicked', async () => {
const user = userEvent.setup()
const onPressedChange = vi.fn()
render(
B
,
)
const btn = screen.getByRole('button', { name: 'Bold' })
await user.click(btn)
expect(onPressedChange).toHaveBeenCalledWith(true, expect.anything())
expect(btn).toHaveAttribute('aria-pressed', 'true')
})
it('toggles via keyboard (Space)', async () => {
const user = userEvent.setup()
const onPressedChange = vi.fn()
render(
B
,
)
const btn = screen.getByRole('button', { name: 'Bold' })
btn.focus()
await user.keyboard(' ')
expect(onPressedChange).toHaveBeenCalledOnce()
expect(btn).toHaveAttribute('aria-pressed', 'true')
})
it('does not toggle when disabled', async () => {
const user = userEvent.setup()
const onPressedChange = vi.fn()
render(
B
,
)
await user.click(screen.getByRole('button', { name: 'Bold' }))
expect(onPressedChange).not.toHaveBeenCalled()
})
it('honors controlled pressed prop', async () => {
const user = userEvent.setup()
const onPressedChange = vi.fn()
render(
B
,
)
const btn = screen.getByRole('button', { name: 'Bold' })
await user.click(btn)
expect(onPressedChange).toHaveBeenCalledWith(true, expect.anything())
expect(btn).toHaveAttribute('aria-pressed', 'false')
})
it('forwards className', () => {
render(
B
,
)
expect(screen.getByRole('button', { name: 'Bold' }).className).toContain('custom-class')
})
it('has no accessibility violations', async () => {
const { container } = render(B)
expect(await axe(container)).toHaveNoViolations()
})
})