import { beforeEach, describe, expect, it, vi } from "vitest" const mocks = vi.hoisted(() => ({ authMock: vi.fn(), redirectMock: vi.fn((target: string) => { throw new Error(`REDIRECT:${target}`) }), })) vi.mock("@/auth", () => ({ auth: mocks.authMock, })) vi.mock("next/navigation", () => ({ redirect: mocks.redirectMock, })) import DashboardPage from "@/app/(dashboard)/dashboard/page" describe("dashboard route dispatcher", () => { beforeEach(() => { vi.resetAllMocks() mocks.redirectMock.mockImplementation((target: string) => { throw new Error(`REDIRECT:${target}`) }) }) it("redirects to login when session is missing", async () => { mocks.authMock.mockResolvedValue(null) await expect(DashboardPage()).rejects.toThrow("REDIRECT:/login") }) it("redirects to login when user is missing", async () => { mocks.authMock.mockResolvedValue({ user: null }) await expect(DashboardPage()).rejects.toThrow("REDIRECT:/login") }) it("redirects admin (school:manage) to admin dashboard", async () => { mocks.authMock.mockResolvedValue({ user: { id: "u_admin", roles: ["admin"], permissions: ["school:manage"] }, }) await expect(DashboardPage()).rejects.toThrow("REDIRECT:/admin/dashboard") }) it("redirects student (homework:submit without exam:create) to student dashboard", async () => { mocks.authMock.mockResolvedValue({ user: { id: "u_student", roles: ["student"], permissions: ["homework:submit"] }, }) await expect(DashboardPage()).rejects.toThrow("REDIRECT:/student/dashboard") }) it("redirects parent to parent dashboard", async () => { mocks.authMock.mockResolvedValue({ user: { id: "u_parent", roles: ["parent"], permissions: ["exam:read"] }, }) await expect(DashboardPage()).rejects.toThrow("REDIRECT:/parent/dashboard") }) it("redirects teacher (with exam:create) to teacher dashboard", async () => { mocks.authMock.mockResolvedValue({ user: { id: "u_teacher", roles: ["teacher"], permissions: ["exam:create", "exam:read"] }, }) await expect(DashboardPage()).rejects.toThrow("REDIRECT:/teacher/dashboard") }) })