=test_update_homework_tests_and_work_log
Some checks failed
CI / build-deploy (push) Has been cancelled

This commit is contained in:
SpecialX
2026-03-19 13:16:49 +08:00
parent eb08c0ab68
commit 99f116cb64
70 changed files with 7470 additions and 20220 deletions

View File

@@ -0,0 +1,84 @@
import { beforeEach, describe, expect, it, vi } from "vitest"
const mocks = vi.hoisted(() => ({
authMock: vi.fn(),
parseAiChatPayloadMock: vi.fn(),
createAiChatCompletionMock: vi.fn(),
getAiErrorMessageMock: vi.fn(),
}))
vi.mock("@/auth", () => ({
auth: mocks.authMock,
}))
vi.mock("@/shared/lib/ai", () => ({
parseAiChatPayload: mocks.parseAiChatPayloadMock,
createAiChatCompletion: mocks.createAiChatCompletionMock,
getAiErrorMessage: mocks.getAiErrorMessageMock,
}))
import { POST } from "@/app/api/ai/chat/route"
describe("POST /api/ai/chat", () => {
beforeEach(() => {
vi.resetAllMocks()
})
it("returns 401 when session is missing", async () => {
mocks.authMock.mockResolvedValue(null)
const req = new Request("http://localhost/api/ai/chat", {
method: "POST",
body: JSON.stringify({ messages: [] }),
headers: { "Content-Type": "application/json" },
})
const response = await POST(req)
const data = await response.json()
expect(response.status).toBe(401)
expect(data).toEqual({ success: false, message: "Unauthorized" })
})
it("returns ai response content for valid input", async () => {
mocks.authMock.mockResolvedValue({ user: { id: "u_1" } })
mocks.parseAiChatPayloadMock.mockReturnValue({ messages: [{ role: "user", content: "hello" }] })
mocks.createAiChatCompletionMock.mockResolvedValue({
content: "mocked-answer",
usage: { totalTokens: 10, promptTokens: 5, completionTokens: 5 },
})
const req = new Request("http://localhost/api/ai/chat", {
method: "POST",
body: JSON.stringify({ messages: [{ role: "user", content: "hello" }] }),
headers: { "Content-Type": "application/json" },
})
const response = await POST(req)
const data = await response.json()
expect(response.status).toBe(200)
expect(data.success).toBe(true)
expect(data.content).toBe("mocked-answer")
expect(mocks.createAiChatCompletionMock).toHaveBeenCalledTimes(1)
})
it("maps invalid payload errors to 400", async () => {
mocks.authMock.mockResolvedValue({ user: { id: "u_1" } })
mocks.parseAiChatPayloadMock.mockImplementation(() => {
throw new Error("bad payload")
})
mocks.getAiErrorMessageMock.mockReturnValue("Invalid payload")
const req = new Request("http://localhost/api/ai/chat", {
method: "POST",
body: JSON.stringify({ messages: "bad" }),
headers: { "Content-Type": "application/json" },
})
const response = await POST(req)
const data = await response.json()
expect(response.status).toBe(400)
expect(data).toEqual({ success: false, message: "Invalid payload" })
})
})