import React from 'react';
import { describe, it, expect } from 'vitest';
import { render, fireEvent } from '@testing-library/react';
import { PixelAccordion } from '../../navigation/PixelAccordion';
const ITEMS = [
{ id: 'one', title: 'First', content: 'First body' },
{ id: 'two', title: 'Second', content: 'Second body' },
{ id: 'three', title: 'Third', content: 'Third body' },
];
describe('PixelAccordion', () => {
it('expands the first item by default', () => {
const { getByRole, getByText, queryByText } = render();
expect(getByRole('button', { name: 'First' }).getAttribute('aria-expanded')).toBe('true');
expect(getByText('First body')).toBeTruthy();
expect(queryByText('Second body')).toBeNull();
});
it('collapsedByDefault starts with every panel closed', () => {
const { getAllByRole, queryByText } = render(
,
);
getAllByRole('button').forEach((h) => {
expect(h.getAttribute('aria-expanded')).toBe('false');
});
expect(queryByText('First body')).toBeNull();
});
it('clicking a header expands its panel; clicking again collapses it', () => {
const { getByRole, queryByText } = render(
,
);
const second = getByRole('button', { name: 'Second' });
fireEvent.click(second);
expect(second.getAttribute('aria-expanded')).toBe('true');
expect(queryByText('Second body')).toBeTruthy();
fireEvent.click(second);
expect(second.getAttribute('aria-expanded')).toBe('false');
expect(queryByText('Second body')).toBeNull();
});
it('single mode (default): expanding one item collapses the previously open one', () => {
const { getByRole, queryByText } = render();
const first = getByRole('button', { name: 'First' });
const third = getByRole('button', { name: 'Third' });
fireEvent.click(third);
expect(third.getAttribute('aria-expanded')).toBe('true');
expect(first.getAttribute('aria-expanded')).toBe('false');
expect(queryByText('Third body')).toBeTruthy();
expect(queryByText('First body')).toBeNull();
});
it('allowMultiple keeps several panels open simultaneously', () => {
const { getByRole, queryByText } = render(
,
);
fireEvent.click(getByRole('button', { name: 'Second' }));
fireEvent.click(getByRole('button', { name: 'Third' }));
// First was open by default and stays open.
expect(queryByText('First body')).toBeTruthy();
expect(queryByText('Second body')).toBeTruthy();
expect(queryByText('Third body')).toBeTruthy();
});
it('wires aria-controls on the header to the panel id, and aria-labelledby back', () => {
const { getByRole, getByText } = render();
const header = getByRole('button', { name: 'First' });
const panelId = header.getAttribute('aria-controls');
expect(panelId).toBeTruthy();
const panel = document.getElementById(panelId!)!;
expect(panel).toBeTruthy();
expect(panel.textContent).toContain('First body');
expect(panel.getAttribute('aria-labelledby')).toBe(header.id);
// No role="region" on the panel (intentional — avoids landmark proliferation).
expect(panel.getAttribute('role')).toBeNull();
expect(getByText('First body')).toBeTruthy();
});
it('forwards ref to the root div', () => {
const ref = React.createRef();
render();
expect(ref.current).toBeInstanceOf(HTMLDivElement);
});
});