70 lines
2.6 KiB
TypeScript
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");
|
|
});
|
|
});
|