import { describe, expect, it, vi } from 'vitest'
import { fireEvent, render, screen } from '@testing-library/react'
import Alert from './Alert'
import { type AlertTypes } from './Alert'
import { capitalize } from '../../services/HelperServiceTyped'
describe('Alert Component', () => {
const alertTypes: AlertTypes[] = ['success', 'error', 'warning', 'info']
alertTypes.forEach((type) => {
it(`renders ${type} alert correctly with class name alert--${type}`, () => {
const { container } = render()
expect(container.firstChild).toHaveClass(`alert${capitalize(type)}`)
expect(screen.getByText('Test Message')).toBeInTheDocument()
})
})
it('renders close button when close prop is provided', () => {
const handleClose = vi.fn<() => void>()
render(
,
)
const closeButton = screen.getByRole('button')
expect(closeButton).toBeInTheDocument()
fireEvent.click(closeButton)
expect(handleClose).toHaveBeenCalledTimes(1)
})
it('shows confirmation popover when close button with confirmation is clicked', () => {
const handleConfirm = vi.fn<() => void>()
render(
{},
confirmation: {
header: 'Confirm Close',
body: 'Are you sure you want to close?',
confirmButtonText: 'Yes, close',
confirmCallout: handleConfirm,
type: 'green',
},
}}
/>,
)
const closeButton = screen.getAllByRole('button')[0]
fireEvent.click(closeButton)
expect(screen.getByText('Confirm Close')).toBeInTheDocument()
expect(
screen.getByText('Are you sure you want to close?'),
).toBeInTheDocument()
expect(screen.getByText('Yes, close')).toBeInTheDocument()
const confirmButton = screen.getByText('Yes, close')
fireEvent.click(confirmButton)
expect(handleConfirm).toHaveBeenCalledTimes(1)
})
it('shows button in Alert when buttons prop is provided', () => {
const handleClick = vi.fn<() => void>()
render(
,
)
const linkButton = screen.getByText('Link Button')
const button = screen.getByText('Button')
expect(linkButton).toBeInTheDocument()
expect(button).toBeInTheDocument()
fireEvent.click(button)
expect(handleClick).toHaveBeenCalledTimes(1)
})
it('applies custom class when provided', () => {
const { container } = render(
,
)
expect(container.firstChild).toHaveClass('custom-alert')
})
})