test: 添加完整测试套件(52 个文件,326 个用例)
基于 Vitest 搭建测试基础设施,覆盖后端纯函数、API 路由、 前端 hooks、UI 组件和页面级集成测试。
This commit is contained in:
@@ -0,0 +1,106 @@
|
||||
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: { hash: vi.fn().mockResolvedValue("$2a$10$hashed") },
|
||||
}));
|
||||
|
||||
import { POST } from "./route";
|
||||
|
||||
beforeEach(() => {
|
||||
resetPrismaMock();
|
||||
});
|
||||
|
||||
describe("POST /api/auth/register", () => {
|
||||
it("registers a new user successfully", async () => {
|
||||
prismaMock.user.create.mockResolvedValue({
|
||||
...TEST_USER,
|
||||
id: "new-user",
|
||||
username: "newuser",
|
||||
avatar: "🐱",
|
||||
} as never);
|
||||
|
||||
const req = createRequest("/api/auth/register", {
|
||||
method: "POST",
|
||||
body: { username: "newuser", password: "password123" },
|
||||
});
|
||||
const res = await POST(req, { params: Promise.resolve({}) });
|
||||
const { status, data } = await parseJsonResponse(res);
|
||||
|
||||
expect(status).toBe(200);
|
||||
expect(data.username).toBe("newuser");
|
||||
expect(data.id).toBe("new-user");
|
||||
expect(data.avatar).toBe("🐱");
|
||||
});
|
||||
|
||||
it("uses custom avatar if provided", async () => {
|
||||
prismaMock.user.create.mockResolvedValue({
|
||||
...TEST_USER,
|
||||
avatar: "🦊",
|
||||
} as never);
|
||||
|
||||
const req = createRequest("/api/auth/register", {
|
||||
method: "POST",
|
||||
body: { username: "newuser", password: "password123", avatar: "🦊" },
|
||||
});
|
||||
const res = await POST(req, { params: Promise.resolve({}) });
|
||||
const { data } = await parseJsonResponse(res);
|
||||
|
||||
expect(data.avatar).toBe("🦊");
|
||||
});
|
||||
|
||||
it("returns 400 when username is missing", async () => {
|
||||
const req = createRequest("/api/auth/register", {
|
||||
method: "POST",
|
||||
body: { password: "password123" },
|
||||
});
|
||||
const res = await POST(req, { params: Promise.resolve({}) });
|
||||
expect(res.status).toBe(400);
|
||||
});
|
||||
|
||||
it("returns 400 when password is missing", async () => {
|
||||
const req = createRequest("/api/auth/register", {
|
||||
method: "POST",
|
||||
body: { username: "testuser" },
|
||||
});
|
||||
const res = await POST(req, { params: Promise.resolve({}) });
|
||||
expect(res.status).toBe(400);
|
||||
});
|
||||
|
||||
it("returns 400 when username too short", async () => {
|
||||
const req = createRequest("/api/auth/register", {
|
||||
method: "POST",
|
||||
body: { username: "a", password: "password123" },
|
||||
});
|
||||
const res = await POST(req, { params: Promise.resolve({}) });
|
||||
expect(res.status).toBe(400);
|
||||
});
|
||||
|
||||
it("returns 400 when password too short", async () => {
|
||||
const req = createRequest("/api/auth/register", {
|
||||
method: "POST",
|
||||
body: { username: "testuser", password: "12345" },
|
||||
});
|
||||
const res = await POST(req, { params: Promise.resolve({}) });
|
||||
expect(res.status).toBe(400);
|
||||
});
|
||||
|
||||
it("returns 409 when username already exists", async () => {
|
||||
const { Prisma } = await import("@prisma/client");
|
||||
prismaMock.user.create.mockRejectedValue(
|
||||
new Prisma.PrismaClientKnownRequestError("Unique constraint", {
|
||||
code: "P2002",
|
||||
clientVersion: "5.0.0",
|
||||
}),
|
||||
);
|
||||
|
||||
const req = createRequest("/api/auth/register", {
|
||||
method: "POST",
|
||||
body: { username: "existing", password: "password123" },
|
||||
});
|
||||
const res = await POST(req, { params: Promise.resolve({}) });
|
||||
expect(res.status).toBe(409);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user