/* @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'); });