Files
0pt/tests/api/health.test.ts
T

70 lines
2.6 KiB
TypeScript

/**
* Route-level regression test for GET /api/health (BACKLOG P0-3): the old
* handler hardcoded `ok: true` regardless of dependency state. These tests
* cover the default (nothing configured) baseline against the real route
* handler; per-dependency ok/error branching is covered at the unit level in
* tests/lib/health-checks.test.ts (dependency-injected, no network/DB
* needed).
*/
import { describe, it, expect, beforeEach, afterEach } from "vitest";
import { GET as healthGET } from "@/app/api/health/route";
describe("GET /api/health", () => {
const savedEnv = {
DATABASE_URL: process.env.DATABASE_URL,
POSTGRES_URL: process.env.POSTGRES_URL,
ENGINE_URL: process.env.ENGINE_URL,
STRIPE_SECRET_KEY: process.env.STRIPE_SECRET_KEY,
REDIS_URL: process.env.REDIS_URL,
};
beforeEach(() => {
delete process.env.DATABASE_URL;
delete process.env.POSTGRES_URL;
delete process.env.ENGINE_URL;
delete process.env.STRIPE_SECRET_KEY;
delete process.env.REDIS_URL;
});
afterEach(() => {
for (const [k, v] of Object.entries(savedEnv)) {
if (v === undefined) delete process.env[k];
else process.env[k] = v;
}
});
it("REGRESSION: always returns HTTP 200 (liveness), but `ok` now reflects a real per-dependency check rather than a hardcoded true", async () => {
const res = await healthGET();
expect(res.status).toBe(200);
const body = await res.json();
// With nothing configured, nothing can be degraded -- ok:true here is
// now an honest conclusion, not a hardcoded literal.
expect(body.ok).toBe(true);
expect(body.service).toBe("0pt-web");
});
it("reports not_configured (not the old flat 'configured'/'not_configured' guess) for every unset dependency", async () => {
const res = await healthGET();
const body = await res.json();
expect(body.db).toBe("not_configured");
expect(body.engine).toBe("not_configured");
expect(body.stripe).toBe("not_configured");
expect(body.queue).toBe("not_configured");
});
it("reports a configured but unreachable queue as error (never a fabricated ok)", async () => {
process.env.REDIS_URL = "redis://127.0.0.1:1";
const res = await healthGET();
const body = await res.json();
expect(body.queue).toBe("error");
// Liveness stays 200; readiness is what fails closed on a broken dependency.
expect(res.status).toBe(200);
});
it("response includes a ts timestamp", async () => {
const res = await healthGET();
const body = await res.json();
expect(new Date(body.ts).toString()).not.toBe("Invalid Date");
});
});