import { describe, it, expect, vi, beforeEach } from "vitest"; import { Hono } from "hono"; // ─── Mock db module ─────────────────────────────────────────────────────────── let selectImpl: () => Promise; vi.mock("@groombook/db", () => { const staff = new Proxy( { _name: "staff" }, { get(_target, prop) { if (prop === "_name") return "staff"; return { table: "staff", column: prop }; }, } ); return { getDb: () => ({ select: (_fields: unknown) => ({ from: (_table: unknown) => ({ limit: (_n: number) => selectImpl(), }), }), }), staff, }; }); // ─── Build test app ─────────────────────────────────────────────────────────── async function makeApp() { // Import after mocks are in place const { getDb, staff } = await import("@groombook/db"); const app = new Hono(); app.get("/api/readyz", async (c) => { try { await getDb().select({ id: staff.id }).from(staff).limit(1); return c.json({ status: "ready" }, 200); } catch (err) { console.error("[readyz] DB check failed:", err); return c.json({ status: "degraded", check: "db" }, 503); } }); return app; } // ─── Tests ──────────────────────────────────────────────────────────────────── describe("GET /api/readyz", () => { beforeEach(() => { vi.restoreAllMocks(); }); it("returns 200 {status:'ready'} when DB query succeeds", async () => { selectImpl = () => Promise.resolve([{ id: "staff-1" }]); const app = await makeApp(); const res = await app.request("/api/readyz", { method: "GET" }); const body = (await res.json()) as Record; expect(res.status).toBe(200); expect(body.status).toBe("ready"); }); it("returns 503 {status:'degraded',check:'db'} when DB query throws", async () => { selectImpl = () => Promise.reject(new Error("42P01: relation staff does not exist")); const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => {}); const app = await makeApp(); const res = await app.request("/api/readyz", { method: "GET" }); const body = (await res.json()) as Record; expect(res.status).toBe(503); expect(body.status).toBe("degraded"); expect(body.check).toBe("db"); // Raw SQL / driver error must NOT appear in the response body expect(JSON.stringify(body)).not.toContain("42P01"); expect(JSON.stringify(body)).not.toContain("relation"); consoleSpy.mockRestore(); }); });