/** * Tests for HeroSection component */ import { render, screen, fireEvent } from '@testing-library/react'; import { HeroSection } from '@/components/home/HeroSection'; // Mock framer-motion jest.mock('framer-motion', () => ({ motion: { div: ({ children, ...props }: any) =>
{children}
, h1: ({ children, ...props }: any) =>

{children}

, p: ({ children, ...props }: any) =>

{children}

, }, })); // Mock Next.js Link jest.mock('next/link', () => ({ __esModule: true, default: ({ children, href, ...props }: any) => { return ( {children} ); }, })); // Mock DemoCredentialsModal jest.mock('@/components/home/DemoCredentialsModal', () => ({ DemoCredentialsModal: ({ open, onClose }: any) => ( open ?
: null ), })); describe('HeroSection', () => { it('renders badge with key highlights', () => { render(); expect(screen.getByText('MIT Licensed')).toBeInTheDocument(); expect(screen.getAllByText('97% Test Coverage')[0]).toBeInTheDocument(); expect(screen.getByText('Production Ready')).toBeInTheDocument(); }); it('renders main headline', () => { render(); expect(screen.getAllByText(/Everything You Need to Build/i)[0]).toBeInTheDocument(); expect(screen.getAllByText(/Modern Web Applications/i)[0]).toBeInTheDocument(); }); it('renders subheadline with key messaging', () => { render(); expect(screen.getByText(/Production-ready FastAPI \+ Next.js template/i)).toBeInTheDocument(); expect(screen.getByText(/Start building features on day one/i)).toBeInTheDocument(); }); it('renders Try Live Demo button', () => { render(); const demoButton = screen.getByRole('button', { name: /try live demo/i }); expect(demoButton).toBeInTheDocument(); }); it('renders View on GitHub link', () => { render(); const githubLink = screen.getByRole('link', { name: /view on github/i }); expect(githubLink).toHaveAttribute('href', 'https://github.com/your-org/fast-next-template'); expect(githubLink).toHaveAttribute('target', '_blank'); expect(githubLink).toHaveAttribute('rel', 'noopener noreferrer'); }); it('renders Explore Components link', () => { render(); const componentsLink = screen.getByRole('link', { name: /explore components/i }); expect(componentsLink).toHaveAttribute('href', '/dev'); }); it('displays test coverage stats', () => { render(); const coverageTexts = screen.getAllByText('97%'); expect(coverageTexts.length).toBeGreaterThan(0); const testCountTexts = screen.getAllByText('743'); expect(testCountTexts.length).toBeGreaterThan(0); expect(screen.getAllByText(/Passing Tests/i)[0]).toBeInTheDocument(); expect(screen.getByText('0')).toBeInTheDocument(); expect(screen.getByText(/Flaky Tests/i)).toBeInTheDocument(); }); it('opens demo modal when Try Live Demo button is clicked', () => { render(); const demoButton = screen.getByRole('button', { name: /try live demo/i }); fireEvent.click(demoButton); expect(screen.getByTestId('demo-modal')).toBeInTheDocument(); }); it('closes demo modal when close is called', () => { render(); // Open modal const demoButton = screen.getByRole('button', { name: /try live demo/i }); fireEvent.click(demoButton); expect(screen.getByTestId('demo-modal')).toBeInTheDocument(); // Close modal const closeButton = screen.getByText('Close Modal'); fireEvent.click(closeButton); expect(screen.queryByTestId('demo-modal')).not.toBeInTheDocument(); }); describe('Accessibility', () => { it('has proper heading hierarchy', () => { render(); const heading = screen.getAllByRole('heading', { level: 1 })[0]; expect(heading).toBeInTheDocument(); }); it('has proper external link attributes', () => { render(); const githubLink = screen.getByRole('link', { name: /view on github/i }); expect(githubLink).toHaveAttribute('target', '_blank'); expect(githubLink).toHaveAttribute('rel', 'noopener noreferrer'); }); }); });