import React from 'react'; import { describe, it, expect } from 'vitest'; import { render, screen, fireEvent } from '@testing-library/react'; import { Modal } from '@/components/ui/Modal'; describe('Modal', () => { it('renders nothing when open=false', () => { render( {}}>Content); expect(screen.queryByText('Content')).not.toBeInTheDocument(); }); it('renders content when open=true', () => { render( {}}>Modal Content); expect(screen.getByText('Modal Content')).toBeInTheDocument(); }); it('has role=dialog and aria-modal=true', () => { render( {}}>Content); expect(screen.getByRole('dialog')).toHaveAttribute('aria-modal', 'true'); }); it('calls onClose when backdrop clicked', () => { const onClose = vi.fn(); render(Content); fireEvent.click(screen.getByTestId('modal-backdrop')); expect(onClose).toHaveBeenCalledTimes(1); }); it('calls onClose when ESC pressed', () => { const onClose = vi.fn(); render(Content); fireEvent.keyDown(document, { key: 'Escape' }); expect(onClose).toHaveBeenCalledTimes(1); }); it('does not call onClose on backdrop when closeOnBackdrop=false', () => { const onClose = vi.fn(); render(Content); fireEvent.click(screen.getByTestId('modal-backdrop')); expect(onClose).not.toHaveBeenCalled(); }); it('renders title with aria-labelledby', () => { render( {}} title="Test Title">Content); const dialog = screen.getByRole('dialog'); expect(dialog).toHaveAttribute('aria-labelledby', 'modal-title'); expect(screen.getByText('Test Title')).toBeInTheDocument(); }); it('renders close button with aria-label', () => { render( {}}>Content); expect(screen.getByLabelText('Close dialog')).toBeInTheDocument(); }); });