import React from 'react';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { render, screen } from '@testing-library/react';
import { MemoryRouter } from 'react-router-dom';
import AppRoutes from './AppRoutes';
const mockUseAuth = vi.fn();
vi.mock('./contexts/AuthContext', () => ({
useAuth: () => mockUseAuth(),
}));
vi.mock('./contexts/UserContext', () => ({
useUser: () => ({ isInitialized: true }),
}));
vi.mock('./debugConfig', () => ({
logger: { debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error: vi.fn() },
}));
vi.mock('./pages/Layout', () => ({
default: ({ children }: { children: React.ReactNode }) =>
{children}
,
}));
vi.mock('./pages/auth/PlatformAdminPage', () => ({ default: () => Platform Admin Page
}));
vi.mock('./pages/auth/adminPage', () => ({ default: () => Legacy Admin
}));
vi.mock('./pages/auth/loginPage', () => ({ default: () => Login Page
}));
vi.mock('./pages/auth/signupPage', () => ({ default: () => Signup Page
}));
vi.mock('./pages/user/dashboardPage', () => ({ default: () => Dashboard Page
}));
vi.mock('./pages/user/NotFound', () => ({ default: () => Private Not Found
}));
vi.mock('./pages/NotFoundPublic', () => ({ default: () => Public Not Found
}));
vi.mock('./pages/tldraw/TLDrawCanvas', () => ({ default: () => Public Home
}));
vi.mock('./pages/tldraw/singlePlayerPage', () => ({ default: () => Single Player
}));
vi.mock('./pages/tldraw/multiplayerUser', () => ({ default: () => Multiplayer
}));
vi.mock('./pages/exam', () => ({ ExamDashboardPage: () => Exam Marker
}));
vi.mock('./pages/user/calendarPage', () => ({ default: () => Calendar
}));
vi.mock('./pages/user/settingsPage', () => ({ default: () => Settings
}));
vi.mock('./pages/tldraw/devPlayerPage', () => ({ default: () => TLDraw Dev
}));
vi.mock('./pages/tldraw/devPage', () => ({ default: () => Dev
}));
vi.mock('./pages/react-flow/teacherPlanner', () => ({ default: () => Teacher Planner
}));
vi.mock('./pages/morphicPage', () => ({ default: () => Morphic
}));
vi.mock('./pages/tldraw/ShareHandler', () => ({ default: () => Share
}));
vi.mock('./pages/searxngPage', () => ({ default: () => Search
}));
vi.mock('./pages/dev/SimpleUploadTest', () => ({ default: () => Upload Test
}));
vi.mock('./pages/tldraw/CCDocumentIntelligence/CCDocumentIntelligence', () => ({
CCDocumentIntelligence: () => Doc Intelligence
,
}));
vi.mock('./pages/timetable', () => ({
TimetablePage: () => Timetable
,
TimetableListPage: () => Timetable List
,
ClassesPage: () => Classes
,
LessonPage: () => Lesson
,
TaughtLessonsPage: () => Taught Lessons
,
MyClassesPage: () => My Classes
,
EnrollmentRequestsPage: () => Enrollment Requests
,
StaffManagerPage: () => Staff Manager
,
StudentManagerPage: () => Student Manager
,
SchoolSettingsPage: () => School Settings
,
ClassDetailPage: () => Class Detail
,
StudentLessonsPage: () => Student Lessons
,
LessonPlansPage: () => Lesson Plans
,
LessonPlanDetailPage: () => Lesson Plan Detail
,
}));
function renderAt(path: string) {
return render(
);
}
function authState(overrides: Record) {
return {
user: null,
user_role: null,
accessToken: null,
loading: false,
error: null,
signIn: vi.fn(),
signOut: vi.fn(),
clearError: vi.fn(),
...overrides,
};
}
describe('/admin route authorization', () => {
beforeEach(() => {
mockUseAuth.mockReset();
});
it('redirects anonymous users away from /admin', () => {
mockUseAuth.mockReturnValue(authState({ user: null, user_role: null }));
renderAt('/admin');
expect(screen.queryByText('Platform Admin Page')).not.toBeInTheDocument();
expect(screen.getByText('Login Page')).toBeInTheDocument();
});
it('redirects authenticated non-admin users away from /admin', () => {
mockUseAuth.mockReturnValue(authState({
user: { id: 'user-1', email: 'teacher@example.com', user_type: 'email_teacher' },
user_role: 'email_teacher',
accessToken: 'token',
}));
renderAt('/admin');
expect(screen.queryByText('Platform Admin Page')).not.toBeInTheDocument();
expect(screen.getByText('Dashboard Page')).toBeInTheDocument();
});
it('allows super_admin users to access /admin', () => {
mockUseAuth.mockReturnValue(authState({
user: { id: 'admin-1', email: 'admin@example.com', user_type: 'super_admin' },
user_role: 'super_admin',
accessToken: 'token',
}));
renderAt('/admin');
expect(screen.getByText('Platform Admin Page')).toBeInTheDocument();
});
});