// User CRUD test import { describe, it, before, after } from "node:test"; import assert from "node:assert/strict"; import { buildApp } from "../index.js"; import type { FastifyInstance } from "fastify"; let app: FastifyInstance; let token: string; let createdId: string; before(async () => { process.env.JWT_SECRET = "test-secret"; process.env.DATABASE_URL = ":memory:"; app = await buildApp(); await app.ready(); // Register and login to get a token const regRes = await app.inject({ method: "POST", url: "/api/auth/register", payload: { username: `test_${Date.now()}`, password: "password123" }, }); token = regRes.json().token; }); after(async () => { await app.close(); }); describe("GET /api/users", () => { it("returns empty list", async () => { const res = await app.inject({ method: "GET", url: "/api/users", headers: { authorization: `Bearer ${token}` }, }); assert.equal(res.statusCode, 200); const body = res.json(); assert.ok(Array.isArray(body.data)); }); }); describe("POST /api/users", () => { it("creates a user", async () => { const res = await app.inject({ method: "POST", url: "/api/users", headers: { authorization: `Bearer ${token}` }, payload: { "phone": "sample-phone", "nickname": "sample-nickname", "avatarUrl": "sample-avatarurl" }, }); assert.equal(res.statusCode, 201); const body = res.json(); assert.ok(body.data.id); createdId = body.data.id; }); }); describe("GET /api/users/:id", () => { it("returns the created user", async () => { const res = await app.inject({ method: "GET", url: `/api/users/${createdId}`, headers: { authorization: `Bearer ${token}` }, }); assert.equal(res.statusCode, 200); const body = res.json(); assert.equal(body.data.id, createdId); }); it("returns 404 for nonexistent id", async () => { const res = await app.inject({ method: "GET", url: `/api/users/nonexistent`, headers: { authorization: `Bearer ${token}` }, }); assert.equal(res.statusCode, 404); }); }); describe("PUT /api/users/:id", () => { it("updates the user", async () => { const res = await app.inject({ method: "PUT", url: `/api/users/${createdId}`, headers: { authorization: `Bearer ${token}` }, payload: { "phone": "sample-phone", "nickname": "sample-nickname", "avatarUrl": "sample-avatarurl" }, }); assert.equal(res.statusCode, 200); }); }); describe("DELETE /api/users/:id", () => { it("deletes the user", async () => { const res = await app.inject({ method: "DELETE", url: `/api/users/${createdId}`, headers: { authorization: `Bearer ${token}` }, }); assert.equal(res.statusCode, 204); }); it("returns 404 after delete", async () => { const res = await app.inject({ method: "GET", url: `/api/users/${createdId}`, headers: { authorization: `Bearer ${token}` }, }); assert.equal(res.statusCode, 404); }); });