import React from 'react';
import { describe, it, expect } from 'vitest';
import { render, screen, fireEvent } from '@testing-library/react';
import { PixelCollapsible } from '../../data/PixelCollapsible';
describe('PixelCollapsible — toggle behavior', () => {
it('is closed by default — body content not rendered', () => {
render(
hidden body
,
);
expect(screen.getByRole('button', { name: /Details/ })).toBeInTheDocument();
expect(screen.queryByText('hidden body')).toBeNull();
});
it('clicking the trigger reveals the body, clicking again hides it', () => {
render(
secret payload
,
);
const trigger = screen.getByRole('button', { name: /Details/ });
fireEvent.click(trigger);
expect(screen.getByText('secret payload')).toBeInTheDocument();
fireEvent.click(trigger);
expect(screen.queryByText('secret payload')).toBeNull();
});
it('defaultOpen renders the body on mount', () => {
render(
visible body
,
);
expect(screen.getByText('visible body')).toBeInTheDocument();
});
it('rotates the chevron icon when open', () => {
const { container } = render(
body
,
);
const chevron = () => container.querySelector('button svg');
expect(chevron()!.getAttribute('class') ?? '').not.toContain('rotate-180');
fireEvent.click(screen.getByRole('button', { name: /Chevron/ }));
expect(chevron()!.getAttribute('class') ?? '').toContain('rotate-180');
});
});
describe('PixelCollapsible — aria wiring (disclosure pattern)', () => {
it('trigger exposes aria-expanded reflecting the open state', () => {
render(
body
,
);
const trigger = screen.getByRole('button', { name: /Details/ });
expect(trigger.getAttribute('aria-expanded')).toBe('false');
fireEvent.click(trigger);
expect(trigger.getAttribute('aria-expanded')).toBe('true');
fireEvent.click(trigger);
expect(trigger.getAttribute('aria-expanded')).toBe('false');
});
it('defaultOpen renders with aria-expanded="true"', () => {
render(
body
,
);
const trigger = screen.getByRole('button', { name: /Open me/ });
expect(trigger.getAttribute('aria-expanded')).toBe('true');
});
it('trigger aria-controls points at the content region id, content labelled by the trigger', () => {
render(
linked body
,
);
const trigger = screen.getByRole('button', { name: /Linked/ });
const controls = trigger.getAttribute('aria-controls');
expect(controls).toBeTruthy();
const content = document.getElementById(controls!);
expect(content).not.toBeNull();
expect(content!.textContent).toContain('linked body');
expect(content!.getAttribute('aria-labelledby')).toBe(trigger.id);
expect(trigger.id).toBeTruthy();
});
it('keeps a stable aria-controls id across toggles', () => {
render(
body
,
);
const trigger = screen.getByRole('button', { name: /Stable/ });
const before = trigger.getAttribute('aria-controls');
fireEvent.click(trigger);
expect(trigger.getAttribute('aria-controls')).toBe(before);
expect(document.getElementById(before!)).not.toBeNull();
});
});
describe('PixelCollapsible — chrome props', () => {
it('bordered adds surface border + radius chrome to the wrapper', () => {
const { container } = render(
body
,
);
const root = container.firstElementChild as HTMLElement;
// pixel surface default: border-2 + staircase corner
expect(root.className).toContain('border-2');
expect(root.className).toContain('pxl-corner-sm');
});
it('no chrome by default', () => {
const { container } = render(
body
,
);
const root = container.firstElementChild as HTMLElement;
expect(root.className).not.toContain('border-2');
});
it('tone tints the trigger button', () => {
render(
body
,
);
const trigger = screen.getByRole('button', { name: /L/ });
expect(trigger.className).toContain('retro-cyan');
});
});