79 lines
2.2 KiB
TypeScript
79 lines
2.2 KiB
TypeScript
import { beforeEach, describe, expect, it, vi } from "vitest"
|
|
|
|
const mocks = vi.hoisted(() => {
|
|
const whereMock = vi.fn()
|
|
const innerJoinMock = vi.fn(() => ({ where: whereMock }))
|
|
const fromMock = vi.fn(() => ({ innerJoin: innerJoinMock }))
|
|
const selectMock = vi.fn(() => ({ from: fromMock }))
|
|
return {
|
|
authMock: vi.fn(),
|
|
findFirstMock: vi.fn(),
|
|
whereMock,
|
|
selectMock,
|
|
}
|
|
})
|
|
|
|
vi.mock("@/auth", () => ({
|
|
auth: mocks.authMock,
|
|
}))
|
|
|
|
vi.mock("@/shared/db", () => ({
|
|
db: {
|
|
query: {
|
|
users: {
|
|
findFirst: mocks.findFirstMock,
|
|
},
|
|
},
|
|
select: mocks.selectMock,
|
|
},
|
|
}))
|
|
|
|
vi.mock("@/shared/db/schema", () => ({
|
|
roles: { name: "name", id: "id" },
|
|
users: { id: "id" },
|
|
usersToRoles: { roleId: "roleId", userId: "userId" },
|
|
}))
|
|
|
|
import { GET } from "@/app/api/onboarding/status/route"
|
|
|
|
describe("GET /api/onboarding/status", () => {
|
|
beforeEach(() => {
|
|
vi.resetAllMocks()
|
|
})
|
|
|
|
it("returns not required when user is unauthenticated", async () => {
|
|
mocks.authMock.mockResolvedValue(null)
|
|
|
|
const response = await GET()
|
|
const data = await response.json()
|
|
|
|
expect(response.status).toBe(200)
|
|
expect(data).toEqual({ required: false })
|
|
expect(mocks.findFirstMock).not.toHaveBeenCalled()
|
|
})
|
|
|
|
it("returns teacher role for grade head and requires onboarding when missing onboardedAt", async () => {
|
|
mocks.authMock.mockResolvedValue({ user: { id: "u_1" } })
|
|
mocks.findFirstMock.mockResolvedValue({ onboardedAt: null })
|
|
mocks.whereMock.mockResolvedValue([{ name: "grade_head" }])
|
|
|
|
const response = await GET()
|
|
const data = await response.json()
|
|
|
|
expect(response.status).toBe(200)
|
|
expect(data).toEqual({ required: true, role: "teacher" })
|
|
})
|
|
|
|
it("prioritizes admin role and marks not required when onboarded", async () => {
|
|
mocks.authMock.mockResolvedValue({ user: { id: "u_2" } })
|
|
mocks.findFirstMock.mockResolvedValue({ onboardedAt: new Date("2026-01-01") })
|
|
mocks.whereMock.mockResolvedValue([{ name: "student" }, { name: "admin" }])
|
|
|
|
const response = await GET()
|
|
const data = await response.json()
|
|
|
|
expect(response.status).toBe(200)
|
|
expect(data).toEqual({ required: false, role: "admin" })
|
|
})
|
|
})
|