Files
NextEdu/tests/integration/api-onboarding-status.route.test.ts
SpecialX 99f116cb64
Some checks failed
CI / build-deploy (push) Has been cancelled
=test_update_homework_tests_and_work_log
2026-03-19 13:16:49 +08:00

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" })
})
})