import { render, screen } from '@testing-library/react'; import { LoadingSpinner, LoadingOverlay, InlineLoader, PageLoader, } from '../LoadingSpinner'; describe('LoadingSpinner Component', () => { it('renders basic spinner', () => { render(); const spinner = screen.getByRole('status'); expect(spinner).toBeInTheDocument(); expect(spinner).toHaveAttribute('aria-label', 'Loading'); }); it('renders with custom message', () => { render(); expect(screen.getByText('Loading data...')).toBeInTheDocument(); }); it('renders different sizes', () => { const { rerender } = render(); let spinner = screen.getByRole('status'); expect(spinner).toHaveClass('h-4', 'w-4'); rerender(); spinner = screen.getByRole('status'); expect(spinner).toHaveClass('h-12', 'w-12'); }); it('renders in full screen mode', () => { render(); const container = screen.getByRole('status').parentElement; expect(container).toHaveClass('fixed', 'inset-0', 'z-50'); expect(screen.getByText('Please wait...')).toBeInTheDocument(); }); it('applies custom className', () => { render(); const spinner = screen.getByRole('status'); expect(spinner).toHaveClass('custom-class'); }); it('renders with different colors', () => { const { rerender } = render(); let spinner = screen.getByRole('status'); expect(spinner).toHaveClass('border-blue-600'); rerender(); spinner = screen.getByRole('status'); expect(spinner).toHaveClass('border-white'); }); }); describe('LoadingOverlay Component', () => { it('renders overlay with message', () => { render(); expect(screen.getByText('Saving changes...')).toBeInTheDocument(); }); it('renders with different backdrop styles', () => { const { rerender, container } = render(); let overlay = container.querySelector('.fixed'); expect(overlay).toHaveClass('bg-white/80'); rerender(); overlay = container.querySelector('.fixed'); expect(overlay).toHaveClass('bg-slate-900/80'); rerender(); overlay = container.querySelector('.fixed'); expect(overlay).toHaveClass('backdrop-blur-sm'); }); it('renders as fixed overlay', () => { const { container } = render(); const overlay = container.querySelector('.fixed'); expect(overlay).toHaveClass('inset-0', 'z-50'); }); }); describe('InlineLoader Component', () => { it('renders inline spinner', () => { render(); const spinner = screen.getByRole('status'); expect(spinner).toHaveClass('inline-block'); }); it('applies custom className', () => { render(); const spinner = screen.getByRole('status'); expect(spinner).toHaveClass('ml-2'); }); }); describe('PageLoader Component', () => { it('renders page loader', () => { render(); const spinner = screen.getByRole('status'); expect(spinner).toBeInTheDocument(); }); it('renders with message', () => { render(); expect(screen.getByText('Loading dashboard...')).toBeInTheDocument(); }); it('has minimum height', () => { const { container } = render(); const wrapper = container.firstChild as HTMLElement; expect(wrapper).toHaveClass('min-h-[400px]'); }); });