import { describe, it, expect, vi, beforeEach } from "vitest"; import { prismaMock, resetPrismaMock } from "@/__tests__/helpers/prisma-mock"; import { createRequest, parseJsonResponse } from "@/__tests__/helpers/api-test-utils"; import { TEST_USER } from "@/__tests__/helpers/fixtures"; vi.mock("bcryptjs", () => ({ default: { compare: vi.fn(), }, })); import bcrypt from "bcryptjs"; import { POST } from "./route"; const mockCompare = vi.mocked(bcrypt.compare); beforeEach(() => { resetPrismaMock(); mockCompare.mockReset(); }); describe("POST /api/auth/login", () => { it("logs in successfully with correct credentials", async () => { prismaMock.user.findUnique.mockResolvedValue(TEST_USER as never); mockCompare.mockResolvedValue(true as never); const req = createRequest("/api/auth/login", { method: "POST", body: { username: "testuser", password: "password123" }, }); const res = await POST(req, { params: Promise.resolve({}) }); const { status, data } = await parseJsonResponse(res); expect(status).toBe(200); expect(data.id).toBe(TEST_USER.id); expect(data.username).toBe("testuser"); expect(data.avatar).toBe("🐱"); }); it("returns 401 when user not found", async () => { prismaMock.user.findUnique.mockResolvedValue(null as never); const req = createRequest("/api/auth/login", { method: "POST", body: { username: "nonexistent", password: "password123" }, }); const res = await POST(req, { params: Promise.resolve({}) }); expect(res.status).toBe(401); }); it("returns 401 when password is wrong", async () => { prismaMock.user.findUnique.mockResolvedValue(TEST_USER as never); mockCompare.mockResolvedValue(false as never); const req = createRequest("/api/auth/login", { method: "POST", body: { username: "testuser", password: "wrongpassword" }, }); const res = await POST(req, { params: Promise.resolve({}) }); expect(res.status).toBe(401); }); it("returns 400 when fields are missing", async () => { const req = createRequest("/api/auth/login", { method: "POST", body: {}, }); const res = await POST(req, { params: Promise.resolve({}) }); expect(res.status).toBe(400); }); });