import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import React from 'react'; import { describe, expect, it } from 'vitest'; import { MdAccordion } from '../MdAccordion'; import { MdAccordionItem } from '../MdAccordionItem'; describe('MdAccordion', () => { describe('rendering', () => { it('renders with default props', () => { render( Content 1 , ); expect(screen.getByText('Item 1')).toBeInTheDocument(); }); it('renders multiple accordion items', () => { render( Content 1 Content 2 Content 3 , ); expect(screen.getByText('Item 1')).toBeInTheDocument(); expect(screen.getByText('Item 2')).toBeInTheDocument(); expect(screen.getByText('Item 3')).toBeInTheDocument(); }); it('applies custom className', () => { const { container } = render( Content 1 , ); expect(container.querySelector('.md-accordion')).toHaveClass('custom-class'); }); }); describe('themes', () => { it('passes primary theme to children', () => { const { container } = render( Content 1 , ); expect(container.querySelector('.md-accordion-item')).toBeInTheDocument(); }); it('passes secondary theme to children', () => { const { container } = render( Content 1 , ); expect(container.querySelector('.md-accordion-item--secondary')).toBeInTheDocument(); }); it('passes add theme to children', () => { const { container } = render( Content 1 , ); expect(container.querySelector('.md-accordion-item--add')).toBeInTheDocument(); }); }); describe('props forwarding', () => { it('forwards rounded prop to children', () => { const { container } = render( Content 1 , ); expect(container.querySelector('.md-accordion-item--rounded')).toBeInTheDocument(); }); it('forwards disabled prop to children', () => { const { container } = render( Content 1 , ); expect(container.querySelector('.md-accordion-item--disabled')).toBeInTheDocument(); }); it('forwards data-* attributes', () => { render( Content 1 , ); expect(screen.getByTestId('accordion-test')).toBeInTheDocument(); }); }); }); describe('MdAccordionItem', () => { describe('rendering', () => { it('renders with label', () => { render(Content); expect(screen.getByText('Test Label')).toBeInTheDocument(); }); it('renders with headerContent', () => { render( Custom Header}> Content , ); expect(screen.getByTestId('custom-header')).toBeInTheDocument(); }); it('renders children content', () => { render(Test Content); expect(screen.getByText('Test Content')).toBeInTheDocument(); }); it('renders close button when hideCloseButton is false', () => { render( Content , ); expect(screen.getByText('Lukk')).toBeInTheDocument(); }); it('hides close button when hideCloseButton is true', () => { render( Content , ); expect(screen.queryByText('Lukk')).not.toBeInTheDocument(); }); it('renders custom close button text', () => { render( Content , ); expect(screen.getByText('Close')).toBeInTheDocument(); }); }); describe('interactions', () => { it('can be expanded by clicking summary', async () => { const user = userEvent.setup(); render(Hidden Content); const summary = screen.getByText('Click Me'); await user.click(summary); // The details element should have the open attribute const details = summary.closest('details'); expect(details).toHaveAttribute('open'); }); }); describe('expanded state', () => { it('is collapsed by default', () => { render(Content); const details = screen.getByText('Label').closest('details'); expect(details).not.toHaveAttribute('open'); }); it('can be expanded initially', () => { render( Content , ); const details = screen.getByText('Label').closest('details'); expect(details).toHaveAttribute('open'); }); }); describe('disabled state', () => { it('applies disabled class when disabled', () => { const { container } = render( Content , ); expect(container.querySelector('.md-accordion-item--disabled')).toBeInTheDocument(); }); }); describe('custom id', () => { it('uses provided id', () => { const { container } = render( Content , ); expect(container.querySelector('#custom-id')).toBeInTheDocument(); }); }); });