import { describe, it, expect, vi } from 'vitest'
import { renderWithProviders, screen, userEvent } from '../../test/utils'
import ActionButton from '.'
describe('ActionButton', () => {
describe('Rendering', () => {
it('renders with children text', () => {
renderWithProviders(Click me)
expect(
screen.getByRole('button', { name: 'Click me' })
).toBeInTheDocument()
})
})
describe('Disabled State', () => {
it('is disabled when disabled prop is true', () => {
renderWithProviders(Disabled)
const button = screen.getByRole('button')
expect(button).toBeDisabled()
})
it('does not trigger onClick when disabled', async () => {
const handleClick = vi.fn()
const user = userEvent.setup()
renderWithProviders(
Disabled
)
const button = screen.getByRole('button')
await user.click(button)
expect(handleClick).not.toHaveBeenCalled()
})
})
describe('Click Handling', () => {
it('calls onClick when clicked', async () => {
const handleClick = vi.fn()
const user = userEvent.setup()
renderWithProviders(
Click me
)
const button = screen.getByRole('button')
await user.click(button)
expect(handleClick).toHaveBeenCalledTimes(1)
})
})
describe('Type Attribute', () => {
it('has button type by default', () => {
renderWithProviders(Default Type)
const button = screen.getByRole('button')
expect(button).toHaveAttribute('type', 'button')
})
it('can have submit type', () => {
renderWithProviders(Submit)
const button = screen.getByRole('button')
expect(button).toHaveAttribute('type', 'submit')
})
})
describe('Accessibility', () => {
it('is keyboard accessible', async () => {
const handleClick = vi.fn()
const user = userEvent.setup()
renderWithProviders(
Press me
)
const button = screen.getByRole('button')
button.focus()
await user.keyboard('{Enter}')
expect(handleClick).toHaveBeenCalledTimes(1)
})
it('can be focused', () => {
renderWithProviders(Focus me)
const button = screen.getByRole('button')
button.focus()
expect(button).toHaveFocus()
})
})
})