=test_update_homework_tests_and_work_log
Some checks failed
CI / build-deploy (push) Has been cancelled
Some checks failed
CI / build-deploy (push) Has been cancelled
This commit is contained in:
84
tests/integration/api-ai-chat.route.test.ts
Normal file
84
tests/integration/api-ai-chat.route.test.ts
Normal 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" })
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user