import React from 'react';
import { describe, it, expect, vi } from 'vitest';
import { render, act } from '@testing-library/react';
import { PixelDrawer } from '../../overlays/PixelDrawer';
describe('PixelDrawer', () => {
it('renders nothing when open=false', () => {
const onOpenChange = vi.fn();
const { queryByTestId } = render(
contents
,
);
expect(queryByTestId('body')).toBeNull();
});
it('renders into portal when open=true', () => {
const onOpenChange = vi.fn();
const { getByTestId, container } = render(
contents
,
);
const body = getByTestId('body');
expect(body).toBeTruthy();
expect(container.contains(body)).toBe(false);
expect(document.body.contains(body)).toBe(true);
});
it('renders with role="dialog" and aria-modal="true"', () => {
const onOpenChange = vi.fn();
const { getByRole } = render(
contents
,
);
const dialog = getByRole('dialog');
expect(dialog.getAttribute('aria-modal')).toBe('true');
expect(dialog.getAttribute('aria-labelledby')).toBeTruthy();
expect(dialog.getAttribute('aria-describedby')).toBeTruthy();
});
it('side="left" applies left-0 and translate-x animation classes', () => {
const onOpenChange = vi.fn();
const { getByTestId } = render(
x
,
);
const panel = getByTestId('body').closest('[data-pxl-drawer-panel]') as HTMLElement;
expect(panel).toBeTruthy();
expect(panel.className).toMatch(/left-0/);
expect(panel.className).toMatch(/translate-x/);
});
it('side="right" (default) applies right-0', () => {
const onOpenChange = vi.fn();
const { getByTestId } = render(
x
,
);
const panel = getByTestId('body').closest('[data-pxl-drawer-panel]') as HTMLElement;
expect(panel.className).toMatch(/right-0/);
});
it('side="top" applies top-0 + translate-y', () => {
const onOpenChange = vi.fn();
const { getByTestId } = render(
x
,
);
const panel = getByTestId('body').closest('[data-pxl-drawer-panel]') as HTMLElement;
expect(panel.className).toMatch(/top-0/);
expect(panel.className).toMatch(/translate-y/);
});
it('size="lg" applies lg width on a side="right" drawer', () => {
const onOpenChange = vi.fn();
const { getByTestId } = render(
x
,
);
const panel = getByTestId('body').closest('[data-pxl-drawer-panel]') as HTMLElement;
// lg sidey drawer: width-based class
expect(panel.className).toMatch(/w-\[/);
});
it('overlay click calls onOpenChange(false) when dismissOnOverlay=true (default)', () => {
const onOpenChange = vi.fn();
render(
x
,
);
const overlay = document.querySelector('[data-pxl-drawer-overlay]') as HTMLElement;
expect(overlay).toBeTruthy();
act(() => {
overlay.click();
});
expect(onOpenChange).toHaveBeenCalledWith(false);
});
it('overlay click does NOT close when dismissOnOverlay=false', () => {
const onOpenChange = vi.fn();
render(
x
,
);
const overlay = document.querySelector('[data-pxl-drawer-overlay]') as HTMLElement;
expect(overlay).toBeTruthy();
act(() => {
overlay.click();
});
expect(onOpenChange).not.toHaveBeenCalled();
});
it('Escape closes by calling onOpenChange(false)', () => {
const onOpenChange = vi.fn();
render(
x
,
);
act(() => {
window.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape' }));
});
expect(onOpenChange).toHaveBeenCalledWith(false);
});
it('Header, Body, Footer subcomponents render their children', () => {
const onOpenChange = vi.fn();
const { getByTestId } = render(
header
body
footer
,
);
expect(getByTestId('hdr')).toBeTruthy();
expect(getByTestId('bdy')).toBeTruthy();
expect(getByTestId('ftr')).toBeTruthy();
});
it('omits overlay when overlay=false', () => {
const onOpenChange = vi.fn();
render(
x
,
);
expect(document.querySelector('[data-pxl-drawer-overlay]')).toBeNull();
});
});