import '@testing-library/jest-dom'
import { cleanup, fireEvent, render, waitFor } from '@testing-library/react'
import { axe, toHaveNoViolations } from 'jest-axe'
import { vi } from 'vitest'
import { PktAlert } from './Alert'
expect.extend(toHaveNoViolations)
afterEach(cleanup)
describe('PktAlert', () => {
test('calls onClose when close button is clicked', async () => {
const onClose = vi.fn()
const { getByLabelText } = render(
Hello World
,
)
fireEvent.click(getByLabelText('close'))
await waitFor(() => {
expect(onClose).toHaveBeenCalledTimes(1)
})
})
test('renders with default role', async () => {
const { getByRole } = render(Alert text)
const alert = getByRole('status')
expect(alert).toBeInTheDocument()
expect(alert).toHaveAttribute('role', 'status')
})
test('renders with alert as role prop', async () => {
const { getByRole } = render(Alert text)
const alert = getByRole('alert')
expect(alert).toBeInTheDocument()
expect(alert).toHaveAttribute('role', 'alert')
})
test.each`
camelCase | kebabCase | rendered
${'assertive'} | ${undefined} | ${'assertive'}
${undefined} | ${'assertive'} | ${'assertive'}
${'polite'} | ${undefined} | ${'polite'}
${undefined} | ${undefined} | ${'polite'}
${'off'} | ${'assertive'} | ${'off'}
`(
'should support both ariaLive ($camelCase) and aria-live ($kebabCase) attributes ',
async ({ camelCase, kebabCase, rendered }) => {
const { container } = render(
Alert text
,
)
const elementThatHasAriaLive = container.querySelector('*[aria-live]')
expect(elementThatHasAriaLive).toHaveAttribute('aria-live', rendered)
},
)
test.each`
title | expected
${'Simple title'} | ${'Simple title'}
${''} | ${undefined}
${null} | ${undefined}
${(
Complex title
)} | ${'Complex title'}
`('support complex title %$', async ({title, expected}) => {
const { container } = render(
Alert text
,
)
const titleElement = container.querySelector('.pkt-alert__title');
expect(titleElement?.innerHTML).toEqual(expected)
})
describe('accessibility', () => {
test('renders with no wcag errors with axe', async () => {
const { container } = render()
const results = await axe(container)
expect(results).toHaveNoViolations()
})
})
})