import test from "node:test"; import assert from "node:assert/strict"; import { createHttpServer } from "../src/app/http.ts"; import { createStore } from "../src/store.ts"; test("health endpoint exposes the service contract", async () => { const server = createHttpServer(createStore(), { host: "127.0.0.1", port: 0, accessTokenSecret: "test", accessTokenTtlSeconds: 900, refreshCookieName: "refresh", adminEmail: "admin@example.com", adminPassword: "change-me-now", adminMfaRequired: true }); await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve)); const address = server.address(); assert.ok(address && typeof address !== "string"); const response = await fetch(`http://127.0.0.1:${address.port}/api/health`); assert.equal(response.status, 200); const payload = (await response.json()) as { ok: boolean; data: { service: string } }; assert.equal(payload.ok, true); assert.equal(payload.data.service, "miragenflow-server"); await new Promise((resolve, reject) => server.close((error) => (error ? reject(error) : resolve()))); }); test("readiness returns 503 when a dependency is unavailable and unknown API routes return 404", async () => { const store = createStore(); store.health = async () => ({ persistence: { adapter: "memory", status: "unavailable", detail: "test failure" }, queue: { adapter: "memory", status: "ready" } }); const server = createHttpServer(store, { host: "127.0.0.1", port: 0, accessTokenSecret: "test", accessTokenTtlSeconds: 900, refreshCookieName: "refresh", adminEmail: "admin@example.com", adminPassword: "change-me-now", adminMfaRequired: true }); await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve)); const address = server.address(); assert.ok(address && typeof address !== "string"); try { const base = `http://127.0.0.1:${address.port}`; assert.equal((await fetch(`${base}/api/ready`)).status, 503); assert.equal((await fetch(`${base}/api/v1/not-a-real-route`)).status, 404); } finally { await new Promise((resolve, reject) => server.close((error) => error ? reject(error) : resolve())); } }); test("fixture profiles keep mock payment out of normal development and production", async () => { const previousNodeEnv = process.env.NODE_ENV; const previousTestMode = process.env.MIRAGENFLOW_TEST_MODE; let server: ReturnType | undefined; try { process.env.NODE_ENV = "development"; delete process.env.MIRAGENFLOW_TEST_MODE; assert.equal(createStore().paymentProviders.size, 0); process.env.MIRAGENFLOW_TEST_MODE = "true"; assert.equal(createStore().paymentProviders.size, 1); process.env.NODE_ENV = "production"; delete process.env.MIRAGENFLOW_TEST_MODE; const store = createStore(); const serverInstance = createHttpServer(store, { host: "127.0.0.1", port: 0, accessTokenSecret: "production-test-secret", accessTokenTtlSeconds: 900, refreshCookieName: "refresh", adminEmail: "admin@example.com", adminPassword: "production-password", adminMfaRequired: false }); server = serverInstance; assert.equal(store.products.length, 0); assert.equal(store.paymentProviders.size, 0); await new Promise((resolve) => serverInstance.listen(0, "127.0.0.1", resolve)); const address = serverInstance.address(); assert.ok(address && typeof address !== "string"); const response = await fetch(`http://127.0.0.1:${address.port}/api/v1/payment/webhooks/mock`, { method: "POST", headers: { "content-type": "application/json" }, body: "{}" }); assert.equal(response.status, 404); } finally { const activeServer = server; if (activeServer) await new Promise((resolve, reject) => activeServer.close((error) => error ? reject(error) : resolve())); if (previousNodeEnv === undefined) delete process.env.NODE_ENV; else process.env.NODE_ENV = previousNodeEnv; if (previousTestMode === undefined) delete process.env.MIRAGENFLOW_TEST_MODE; else process.env.MIRAGENFLOW_TEST_MODE = previousTestMode; } });