()
render(
Toggle
Content
)
expect(ref.current).toBeInstanceOf(HTMLDivElement)
})
it('maintains displayName', () => {
expect(CollapsibleContent.displayName).toBe('CollapsibleContent')
})
it('renders default variant correctly', () => {
render(
Toggle
Content
)
const content = screen.getByTestId('content')
expect(content).toHaveClass('text-muted-foreground')
})
it('renders ghost variant correctly', () => {
render(
Toggle
Content
)
const content = screen.getByTestId('content')
expect(content).toHaveClass('rounded-b')
})
it('renders outline variant correctly', () => {
render(
Toggle
Content
)
const content = screen.getByTestId('content')
expect(content).toHaveClass('border')
})
it('renders sm size correctly', () => {
render(
Toggle
Content
)
const content = screen.getByTestId('content')
expect(content).toHaveClass('text-xs')
})
it('renders default size correctly', () => {
render(
Toggle
Content
)
const content = screen.getByTestId('content')
expect(content).toHaveClass('text-sm')
})
it('renders md size correctly', () => {
render(
Toggle
Content
)
const content = screen.getByTestId('content')
expect(content).toHaveClass('text-base')
})
it('renders lg size correctly', () => {
render(
Toggle
Content
)
const content = screen.getByTestId('content')
expect(content).toHaveClass('text-lg')
})
it('renders content wrapper with padding', () => {
render(
Toggle
Content
)
const content = screen.getByTestId('content')
const wrapper = content.querySelector('.p-4')
expect(wrapper).toBeInTheDocument()
expect(wrapper).toHaveTextContent('Content')
})
it('passes through HTML attributes', () => {
render(
Toggle
Content
)
const content = screen.getByTestId('content')
expect(content).toHaveAttribute('id', 'content-1')
})
})
describe('Variant Functions', () => {
it('collapsibleTriggerVariants generates correct classes', () => {
expect(collapsibleTriggerVariants()).toContain('flex w-full items-center justify-between')
expect(collapsibleTriggerVariants({ variant: 'ghost' })).toContain('rounded')
expect(collapsibleTriggerVariants({ size: 'sm' })).toContain('text-xs py-2 px-3')
})
it('collapsibleContentVariants generates correct classes', () => {
expect(collapsibleContentVariants()).toContain('overflow-hidden transition-all')
expect(collapsibleContentVariants({ variant: 'outline' })).toContain('border')
expect(collapsibleContentVariants({ size: 'lg' })).toContain('text-lg')
})
})
describe('Complex Combinations', () => {
it('renders with all props and variants', () => {
render(
Toggle Content
This is the collapsible content
)
const collapsible = screen.getByTestId('collapsible')
const trigger = screen.getByTestId('trigger')
const content = screen.getByTestId('content')
expect(collapsible).toHaveClass('custom-collapsible')
expect(trigger).toHaveClass('custom-trigger')
expect(content).toHaveClass('custom-content')
})
it('handles toggle functionality', () => {
render(
Toggle
Content
)
const trigger = screen.getByTestId('trigger')
// Initially closed
expect(screen.queryByText('Content')).not.toBeInTheDocument()
// Click to open
fireEvent.click(trigger)
expect(screen.getByText('Content')).toBeInTheDocument()
// Click to close
fireEvent.click(trigger)
expect(screen.queryByText('Content')).not.toBeInTheDocument()
})
it('renders multiple collapsibles independently', () => {
render(
Toggle 1
Content 1
Toggle 2
Content 2
)
const trigger1 = screen.getByTestId('trigger-1')
const trigger2 = screen.getByTestId('trigger-2')
// Open first collapsible
fireEvent.click(trigger1)
expect(screen.getByText('Content 1')).toBeInTheDocument()
expect(screen.queryByText('Content 2')).not.toBeInTheDocument()
// Open second collapsible
fireEvent.click(trigger2)
expect(screen.getByText('Content 1')).toBeInTheDocument()
expect(screen.getByText('Content 2')).toBeInTheDocument()
})
})
describe('Edge Cases', () => {
it('handles empty content', () => {
render(
Toggle
)
const content = screen.getByTestId('content')
expect(content).toBeInTheDocument()
})
it('handles complex nested content', () => {
render(
Toggle
Nested Title
Nested paragraph
)
expect(screen.getByText('Nested Title')).toBeInTheDocument()
expect(screen.getByText('Nested paragraph')).toBeInTheDocument()
expect(screen.getByText('Item 1')).toBeInTheDocument()
})
it('handles disabled state', () => {
render(
Toggle
Content
)
const trigger = screen.getByTestId('trigger')
expect(trigger).toBeDisabled()
})
it('handles null and undefined children', () => {
render(
Toggle
{null}
{undefined}
Valid content
)
expect(screen.getByText('Valid content')).toBeInTheDocument()
})
})
})