/** * Tests for Skeleton Loading Components * Verifies structure and rendering of loading placeholders */ import { render, screen } from '@testing-library/react'; import { HeaderSkeleton } from '@/components/layout/HeaderSkeleton'; import { AuthLoadingSkeleton } from '@/components/layout/AuthLoadingSkeleton'; describe('HeaderSkeleton', () => { it('renders header skeleton structure', () => { render(); // Check for header element const header = screen.getByRole('banner'); expect(header).toBeInTheDocument(); expect(header).toHaveClass('sticky', 'top-0', 'z-50', 'w-full', 'border-b'); }); it('renders with correct layout structure', () => { const { container } = render(); // Check for container const contentDiv = container.querySelector('.container'); expect(contentDiv).toBeInTheDocument(); // Check for animated skeleton elements const skeletonElements = container.querySelectorAll('.animate-pulse'); expect(skeletonElements.length).toBeGreaterThan(0); }); it('has proper styling classes', () => { const { container } = render(); // Verify backdrop blur and background const header = screen.getByRole('banner'); expect(header).toHaveClass('bg-background/95', 'backdrop-blur'); }); }); describe('AuthLoadingSkeleton', () => { it('renders full page skeleton structure', () => { render(); // Check for header (via HeaderSkeleton) expect(screen.getByRole('banner')).toBeInTheDocument(); // Check for main content area expect(screen.getByRole('main')).toBeInTheDocument(); // Check for footer (via Footer component) expect(screen.getByRole('contentinfo')).toBeInTheDocument(); }); it('renders with flex layout', () => { const { container } = render(); const wrapper = container.firstChild as HTMLElement; expect(wrapper).toHaveClass('flex', 'min-h-screen', 'flex-col'); }); it('renders main content with container', () => { const { container } = render(); const main = screen.getByRole('main'); expect(main).toHaveClass('flex-1'); // Check for container inside main const contentContainer = main.querySelector('.container'); expect(contentContainer).toBeInTheDocument(); }); it('renders skeleton placeholders in main content', () => { const { container } = render(); const main = screen.getByRole('main'); // Check for animated skeleton elements const skeletonElements = main.querySelectorAll('.animate-pulse'); expect(skeletonElements.length).toBeGreaterThan(0); }); it('includes HeaderSkeleton component', () => { render(); // HeaderSkeleton should render a banner role const header = screen.getByRole('banner'); expect(header).toBeInTheDocument(); // Should have skeleton animation const { container } = render(); const skeletons = container.querySelectorAll('.animate-pulse'); expect(skeletons.length).toBeGreaterThan(0); }); it('includes Footer component', () => { render(); // Footer should render with contentinfo role const footer = screen.getByRole('contentinfo'); expect(footer).toBeInTheDocument(); }); });