import { describe, expect, it, vi } from 'vitest'
import { fireEvent, render, screen } from '@testing-library/react'
import Accordion from './Accordion'
import Button from '../Button/Button'
describe('Accordion', () => {
const defaultProps = {
title: 'Test Accordion',
children:
Accordion Content
,
}
it('renders with basic props', () => {
render()
expect(screen.getByTestId('accordion-container')).toBeInTheDocument()
const accordionTitle = screen.getByTestId('accordion-title')
expect(accordionTitle).toBeInTheDocument()
expect(accordionTitle).toHaveTextContent('Test Accordion')
const accordionContent = screen.getByTestId('accordion-content')
expect(accordionContent).toBeInTheDocument()
expect(accordionContent).toHaveTextContent('Accordion Content')
})
it('renders with subtitle', () => {
const subtitle = 'Test Subtitle'
render()
const accordionSubtitle = screen.getByTestId('accordion-subtitle')
expect(accordionSubtitle).toBeInTheDocument()
expect(accordionSubtitle).toHaveTextContent('Test Subtitle')
})
it('renders with actions', () => {
const actions =
render()
expect(screen.getByTestId('accordion-actions')).toBeInTheDocument()
expect(
screen.getByRole('button', { name: 'Test Action' }),
).toBeInTheDocument()
})
it('renders with caret text instead of icon', () => {
const caretText = 'Click to expand'
render()
expect(screen.getByTestId('accordion-caret-text')).toBeInTheDocument()
expect(screen.getByText(caretText)).toBeInTheDocument()
})
it('renders with icon when no caret text is provided', () => {
render()
const icon = screen.getByTestId('icon-caretDown')
expect(icon).toBeInTheDocument()
})
it('toggles content visibility when clicked', () => {
render()
const header = screen.getByTestId('accordion-header')
const container = screen.getByTestId('accordion-container')
expect(container).not.toHaveClass('isOpen')
fireEvent.click(header)
expect(container).toHaveClass('isOpen')
fireEvent.click(header)
expect(container).not.toHaveClass('isOpen')
})
it('calls callout function when toggled', () => {
const callout = vi.fn<(isExpanded: boolean) => void>()
render()
const header = screen.getByTestId('accordion-header')
fireEvent.click(header)
expect(callout).toHaveBeenCalledWith(true)
fireEvent.click(header)
expect(callout).toHaveBeenCalledWith(false)
})
it('does not toggle when disabled', () => {
const callout = vi.fn<(isExpanded: boolean) => void>()
render()
const header = screen.getByTestId('accordion-header')
const container = screen.getByTestId('accordion-container')
fireEvent.click(header)
expect(container).not.toHaveClass('isOpen')
expect(container).toHaveClass('disabled')
expect(callout).not.toHaveBeenCalled()
})
it('renders in expanded state when isExpanded is true', () => {
render()
const container = screen.getByTestId('accordion-container')
expect(container).toHaveClass('isOpen')
})
it('renders with custom background color', () => {
render()
const container = screen.getByTestId('accordion-container')
expect(container).toHaveStyle({ backgroundColor: 'var(--faint-gray)' })
})
it('renders checkbox in checked state when checked prop is true', () => {
render()
const checkbox = screen.getByTestId('checkbox-component')
expect(checkbox).toHaveClass('checked')
})
it('prevents action click from toggling accordion', () => {
const actionClick = vi.fn<() => void>()
const actions =
render()
const actionButton = screen.getByRole('button', { name: 'Test Action' })
fireEvent.click(actionButton)
expect(actionClick).toHaveBeenCalled()
const container = screen.getByTestId('accordion-container')
expect(container).not.toHaveClass('isOpen')
})
})