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();
});
});
});