import { render, screen, fireEvent } from '@testing-library/react'; import { ErrorMessage, FullScreenError, FieldError, EmptyState, } from '../ErrorMessage'; describe('ErrorMessage Component', () => { it('renders error message', () => { render(); expect(screen.getByText('Something went wrong')).toBeInTheDocument(); }); it('renders with different severity levels', () => { const { rerender, container } = render( ); let alert = container.querySelector('[role="alert"]'); expect(alert).toHaveClass('bg-red-50', 'border-red-200'); rerender(); alert = container.querySelector('[role="alert"]'); expect(alert).toHaveClass('bg-yellow-50', 'border-yellow-200'); rerender(); alert = container.querySelector('[role="alert"]'); expect(alert).toHaveClass('bg-blue-50', 'border-blue-200'); }); it('calls onRetry when retry button is clicked', () => { const handleRetry = jest.fn(); render(); const retryButton = screen.getByRole('button', { name: /retry/i }); fireEvent.click(retryButton); expect(handleRetry).toHaveBeenCalledTimes(1); }); it('calls onDismiss when dismiss button is clicked', () => { const handleDismiss = jest.fn(); render(); const dismissButton = screen.getByLabelText('Dismiss'); fireEvent.click(dismissButton); expect(handleDismiss).toHaveBeenCalledTimes(1); }); it('renders without action buttons', () => { render(); expect(screen.queryByRole('button')).not.toBeInTheDocument(); }); it('has proper ARIA attributes', () => { render(); const alert = screen.getByRole('alert'); expect(alert).toHaveAttribute('aria-live', 'polite'); }); }); describe('FullScreenError Component', () => { it('renders full screen error with title and message', () => { render( ); expect(screen.getByText('Page Not Found')).toBeInTheDocument(); expect( screen.getByText('The page you are looking for does not exist.') ).toBeInTheDocument(); }); it('uses default title when not provided', () => { render(); expect(screen.getByText('Something went wrong')).toBeInTheDocument(); }); it('calls onRetry when retry button is clicked', () => { const handleRetry = jest.fn(); render( ); const retryButton = screen.getByRole('button', { name: /try again/i }); fireEvent.click(retryButton); expect(handleRetry).toHaveBeenCalledTimes(1); }); it('calls onBack when back button is clicked', () => { const handleBack = jest.fn(); render( ); const backButton = screen.getByRole('button', { name: /go back/i }); fireEvent.click(backButton); expect(handleBack).toHaveBeenCalledTimes(1); }); it('renders with custom button labels', () => { render( {}} onBack={() => {}} retryLabel="Reload" backLabel="Return" /> ); expect(screen.getByRole('button', { name: /reload/i })).toBeInTheDocument(); expect(screen.getByRole('button', { name: /return/i })).toBeInTheDocument(); }); it('renders different icon types', () => { const { container } = render( ); // Check that SVG is rendered expect(container.querySelector('svg')).toBeInTheDocument(); }); }); describe('FieldError Component', () => { it('renders field error message', () => { render(); expect(screen.getByText('Email is required')).toBeInTheDocument(); }); it('has proper ARIA role', () => { render(); const alert = screen.getByRole('alert'); expect(alert).toBeInTheDocument(); }); it('renders with icon', () => { const { container } = render(); const svg = container.querySelector('svg'); expect(svg).toBeInTheDocument(); }); it('applies custom className', () => { render(); const alert = screen.getByRole('alert'); expect(alert).toHaveClass('mb-4'); }); }); describe('EmptyState Component', () => { it('renders empty state with title', () => { render(); expect(screen.getByText('No items found')).toBeInTheDocument(); }); it('renders with message', () => { render( ); expect( screen.getByText('Get started by adding your first item') ).toBeInTheDocument(); }); it('renders action button when provided', () => { const handleAction = jest.fn(); render( ); const button = screen.getByRole('button', { name: /add item/i }); expect(button).toBeInTheDocument(); fireEvent.click(button); expect(handleAction).toHaveBeenCalledTimes(1); }); it('renders custom icon', () => { const icon =
Icon
; render(); expect(screen.getByTestId('custom-icon')).toBeInTheDocument(); }); it('does not render action button when not provided', () => { render(); expect(screen.queryByRole('button')).not.toBeInTheDocument(); }); });