/* @vitest-environment jsdom */
import { fireEvent, render, screen } from '@testing-library/react';
import { expect, test, vi } from 'vitest';
import { UnifiedModal } from './UnifiedModal';
test('renders an accessible platform modal', () => {
render(
{}} portal={false}>
窗口内容
,
);
expect(screen.getByRole('dialog', { name: '统一弹窗' })).toBeTruthy();
expect(screen.getByText('窗口内容')).toBeTruthy();
expect(screen.getByRole('button', { name: '关闭' }).className).toContain(
'platform-icon-button',
);
});
test('closes through backdrop and escape', () => {
const onClose = vi.fn();
const { rerender } = render(
窗口内容
,
);
fireEvent.click(screen.getByRole('dialog').parentElement as HTMLElement);
expect(onClose).toHaveBeenCalledTimes(1);
rerender(
窗口内容
,
);
fireEvent.keyDown(window, { key: 'Escape' });
expect(onClose).toHaveBeenCalledTimes(2);
});
test('keeps the modal open when a pointer press starts inside and releases over the backdrop', () => {
const onClose = vi.fn();
render(
,
);
const dialog = screen.getByRole('dialog');
const backdrop = dialog.parentElement as HTMLElement;
fireEvent.pointerDown(screen.getByRole('button', { name: '窗口内容' }));
fireEvent.pointerUp(backdrop);
fireEvent.click(backdrop);
expect(onClose).not.toHaveBeenCalled();
});
test('supports disabling escape close while keeping the custom close button chrome', () => {
const onClose = vi.fn();
render(
窗口内容
,
);
fireEvent.keyDown(window, { key: 'Escape' });
expect(onClose).not.toHaveBeenCalled();
const closeButton = screen.getByRole('button', { name: '关闭' });
expect(closeButton.className).toContain('platform-profile-icon-button');
expect(screen.getByRole('dialog', { name: '个人中心弹窗' })).toBeTruthy();
});
test('supports headerless dialogs while preserving the accessible name', () => {
render(
{}}
showHeader={false}
showCloseButton={false}
portal={false}
>
窗口内容
,
);
const dialog = screen.getByRole('dialog', { name: '支付成功' });
expect(dialog).toBeTruthy();
expect(screen.queryByRole('button', { name: '关闭' })).toBeNull();
expect(screen.getByText('窗口内容')).toBeTruthy();
});
test('supports a stable aria label while keeping the visible title', () => {
render(
{}}
portal={false}
>
窗口内容
,
);
const dialog = screen.getByRole('dialog', { name: '关卡详情' });
expect(dialog).toBeTruthy();
expect(screen.getByText('雨夜猫街')).toBeTruthy();
});
test('respects closeDisabled for every default close path', () => {
const onClose = vi.fn();
render(
窗口内容
,
);
fireEvent.click(screen.getByRole('dialog').parentElement as HTMLElement);
fireEvent.keyDown(window, { key: 'Escape' });
fireEvent.click(screen.getByRole('button', { name: '关闭' }));
expect(onClose).not.toHaveBeenCalled();
});
test('uses shared pixel close button chrome', () => {
render(
{}}
variant="pixel"
portal={false}
>
窗口内容
,
);
const closeButton = screen.getByRole('button', { name: '关闭' });
expect(screen.getByRole('dialog', { name: '像素弹窗' }).className).toContain(
'pixel-modal-shell',
);
expect(closeButton.className).toContain('bg-black/30');
expect(closeButton.className).toContain('text-zinc-400');
});