// Book 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/books", () => { it("returns empty list", async () => { const res = await app.inject({ method: "GET", url: "/api/books", headers: { authorization: `Bearer ${token}` }, }); assert.equal(res.statusCode, 200); const body = res.json(); assert.ok(Array.isArray(body.data)); }); }); describe("POST /api/books", () => { it("creates a book", async () => { const res = await app.inject({ method: "POST", url: "/api/books", headers: { authorization: `Bearer ${token}` }, payload: { "userId": "00000000-0000-0000-0000-000000000001", "title": "sample-title", "description": "sample-description", "status": "sample-status", "data": "sample-data" }, }); assert.equal(res.statusCode, 201); const body = res.json(); assert.ok(body.data.id); createdId = body.data.id; }); }); describe("GET /api/books/:id", () => { it("returns the created book", async () => { const res = await app.inject({ method: "GET", url: `/api/books/${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/books/nonexistent`, headers: { authorization: `Bearer ${token}` }, }); assert.equal(res.statusCode, 404); }); }); describe("PUT /api/books/:id", () => { it("updates the book", async () => { const res = await app.inject({ method: "PUT", url: `/api/books/${createdId}`, headers: { authorization: `Bearer ${token}` }, payload: { "userId": "00000000-0000-0000-0000-000000000001", "title": "sample-title", "description": "sample-description", "status": "sample-status", "data": "sample-data" }, }); assert.equal(res.statusCode, 200); }); }); describe("DELETE /api/books/:id", () => { it("deletes the book", async () => { const res = await app.inject({ method: "DELETE", url: `/api/books/${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/books/${createdId}`, headers: { authorization: `Bearer ${token}` }, }); assert.equal(res.statusCode, 404); }); });