91 lines
2.3 KiB
TypeScript
91 lines
2.3 KiB
TypeScript
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(
|
|
<MemoryRouter initialEntries={['/private']}>
|
|
<ProtectedRoute>
|
|
<div>Secret</div>
|
|
</ProtectedRoute>
|
|
</MemoryRouter>
|
|
);
|
|
|
|
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(
|
|
<MemoryRouter initialEntries={['/private']}>
|
|
<Routes>
|
|
<Route
|
|
path="/private"
|
|
element={
|
|
<ProtectedRoute>
|
|
<div>Secret</div>
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route path="/login" element={<div>Login Page</div>} />
|
|
</Routes>
|
|
</MemoryRouter>
|
|
);
|
|
|
|
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(
|
|
<MemoryRouter>
|
|
<ProtectedRoute>
|
|
<div>Secret</div>
|
|
</ProtectedRoute>
|
|
</MemoryRouter>
|
|
);
|
|
|
|
expect(screen.getByText('Secret')).toBeInTheDocument();
|
|
});
|
|
});
|