geocrop-platform./apps/nextgen/client/e2e/helpers/nav.ts

207 lines
5.1 KiB
TypeScript

/**
* E2E route map per role.
*
* Source of truth: client/src/App.tsx (getRoutes() per role).
* Keep this in sync when new routes are added — the smoke tests walk
* every entry here.
*
* Routes that require dynamic params (`:id`, `:uid`) are recorded with a
* sample placeholder. The smoke test only checks that the route mounts,
* not that the resource exists. A 200/200ish page with an "id not found"
* empty state is still considered "mounted" — the goal is to catch
* crashes, auth errors, and ProtectedRoute misconfigurations.
*/
import type { PortalRole } from './auth';
export const ROLE_LANDING: Record<PortalRole, string> = {
school_admin: '/dashboard/admin',
systems_admin: '/dashboard/admin',
principal: '/dashboard/admin',
hr: '/dashboard/admin',
bursar: '/dashboard/admin',
accountant: '/dashboard/accountant',
nurse: '/dashboard/nurse',
dining_staff: '/dashboard/dining',
teacher: '/dashboard/teacher',
librarian: '/dashboard/librarian',
clubs_head: '/dashboard/clubs_head',
student: '/dashboard/student',
parent: '/dashboard/parent',
driver: '/dashboard/admin',
groundsman: '/dashboard/admin',
matron: '/dashboard/admin',
boarding_master: '/dashboard/admin',
security: '/dashboard/admin',
janitor: '/dashboard/admin',
};
/**
* The full set of routes each role can reach. Hand-curated from App.tsx
* to keep portal specs independent of the router's internal structure.
*
* `paramRoutes` are paths with `:id` / `:uid` placeholders; the smoke
* test uses the first available real id from a list response, or
* `placeholder` as a fallback.
*/
export const ROUTES_PER_ROLE: Record<PortalRole, string[]> = {
school_admin: [
// Dashboards
'/dashboard/admin',
'/dashboard/hr',
'/dashboard/finance',
// Core admin
'/users',
'/students',
'/teachers',
'/classes',
'/attendance',
'/departments',
'/reports',
'/fees',
'/settings',
'/profile',
// Library + inventory
'/library',
'/inventory',
// HR
'/hr/management',
'/hr/attendance',
'/hr/leave-approval',
'/hr/staff',
// Front office
'/front-office/visitors',
'/front-office/enquiries',
'/front-office/complaints',
'/front-office/phone-calls',
'/front-office/postal',
// Hostel / transport
'/hostels',
'/transport',
// Marks / academic
'/attendance/take',
'/attendance/history',
'/admin/academic-rollover',
'/marks/bulk',
// Finance surface
'/finance/expenses',
'/finance/payroll/runs',
'/finance/payslips',
'/finance/suppliers',
'/finance/chart-of-accounts',
'/finance/invoices',
'/finance/trips',
'/finance/banking',
'/finance/groups',
'/finance/plans',
'/finance/discounts',
// Medical
'/sanatorium',
'/dining-hall',
// Shared
'/extracurriculars',
'/messages',
'/events',
'/notice-board',
'/enrollments',
],
systems_admin: [
'/dashboard/admin',
'/settings',
'/audit-logs',
'/sync-logs',
'/users',
'/departments',
'/reports',
'/fees',
'/hr/attendance',
'/attendance/take',
'/attendance/history',
'/front-office/visitors',
'/front-office/enquiries',
'/front-office/complaints',
'/front-office/phone-calls',
'/front-office/postal',
'/admin/academic-rollover',
'/marks/bulk',
'/sanatorium',
'/dining-hall',
'/extracurriculars',
'/notice-board',
'/messages',
'/events',
'/profile',
'/enrollments',
],
teacher: [
'/dashboard/teacher',
'/my-courses',
'/assignments',
'/students',
'/attendance/take',
'/attendance/history',
'/homework',
'/tests',
'/resources',
'/class-room',
'/front-office/visitors',
'/extracurriculars',
'/messages',
'/events',
'/notice-board',
'/profile',
'/enrollments',
],
student: [
'/dashboard/student',
'/exams',
'/grades',
'/assignments',
'/my-courses',
'/enrollments',
'/medical',
'/homework',
'/tests',
'/resources',
'/report-card',
'/fees',
'/extracurriculars',
'/messages',
'/events',
'/notice-board',
'/profile',
],
parent: [
'/dashboard/parent',
'/academic-progress',
'/calendar',
'/attendance',
'/attendance/history',
'/fees',
'/extracurriculars',
'/resources',
'/medical',
'/messages',
'/events',
'/notice-board',
'/profile',
'/enrollments',
],
// Unused in this push — left as empty arrays to keep the type honest.
// Other portals (HR, bursar, librarian, clubs_head, principal, nurse,
// dining_staff, support roles) get their own spec in a follow-up.
principal: [],
hr: [],
bursar: [],
accountant: [],
nurse: [],
dining_staff: [],
librarian: [],
clubs_head: [],
driver: [],
groundsman: [],
matron: [],
boarding_master: [],
security: [],
janitor: [],
};