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(); }); });