import { describe, expect, it, vi, beforeEach } from 'vitest'; import { render, screen } from '@testing-library/react'; import { MemoryRouter, Route, Routes } from 'react-router-dom'; import { ProtectedRoute } from './ProtectedRoute'; import { useAuth } from './AuthContext'; vi.mock('./AuthContext', () => ({ useAuth: vi.fn(), })); const mockedUseAuth = vi.mocked(useAuth); describe('ProtectedRoute', () => { beforeEach(() => { vi.clearAllMocks(); }); it('shows a loading state while auth is being checked', () => { mockedUseAuth.mockReturnValue({ isAuthenticated: false, isCheckingAuth: true, user: null, login: vi.fn(), register: vi.fn(), logout: vi.fn(), }); render(
Secret
); expect(screen.getByText('Loading...')).toBeInTheDocument(); expect(screen.queryByText('Secret')).not.toBeInTheDocument(); }); it('redirects unauthenticated users to the login page', () => { mockedUseAuth.mockReturnValue({ isAuthenticated: false, isCheckingAuth: false, user: null, login: vi.fn(), register: vi.fn(), logout: vi.fn(), }); render(
Secret
} /> Login Page} />
); expect(screen.getByText('Login Page')).toBeInTheDocument(); expect(screen.queryByText('Secret')).not.toBeInTheDocument(); }); it('renders children for authenticated users', () => { mockedUseAuth.mockReturnValue({ isAuthenticated: true, isCheckingAuth: false, user: { username: 'evan', is_admin: false }, login: vi.fn(), register: vi.fn(), logout: vi.fn(), }); render(
Secret
); expect(screen.getByText('Secret')).toBeInTheDocument(); }); });