import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; import { parse } from "yaml"; /** * Die Datenbank im Betriebsstand ist absichtlich von aussen nicht erreichbar. * Diese Tests halten das fest, damit ein ports:-Mapping nicht versehentlich * zurueckkommt. Siehe docs/betrieb/inbetriebnahme.md. */ function compose(datei: string): Record { return parse(readFileSync(datei, "utf8")) as Record; } describe("Betriebsstand: docker-compose.yml", () => { const stand = compose("docker-compose.yml") as unknown as { services: Record; networks: Record; }; it("veroeffentlicht keinen Port der Datenbank", () => { expect(stand.services["postgres"]?.ports).toBeUndefined(); }); it("haengt die Datenbank nur in das interne Netz", () => { expect(stand.services["postgres"]?.networks).toEqual(["intern"]); }); it("hat das interne Netz ohne Gateway", () => { expect(stand.networks["intern"]?.internal).toBe(true); }); it("laesst nur den Webdienst in das externe Netz", () => { const aussen = Object.entries(stand.services) .filter(([, dienst]) => dienst.networks?.includes("extern")) .map(([name]) => name); expect(aussen).toEqual(["web"]); }); it("bindet den Webdienst standardmaessig nur auf localhost", () => { expect(stand.services["web"]?.ports).toEqual(["${BIND_ADDR:-127.0.0.1}:${APP_PORT:-3000}:3000"]); }); it("bricht ohne Geheimnisse ab, statt mit Standardwerten zu starten", () => { const roh = readFileSync("docker-compose.yml", "utf8"); expect(roh).toContain("${APP_SECRET:?"); expect(roh).toContain("${POSTGRES_PASSWORD:?"); expect(roh).toContain("${APP_URL:?"); }); }); describe("Betriebsstand: Entwicklungsdatenbank", () => { it("laeuft auf 5433, damit ein lokales 5432 frei bleibt", () => { const stand = compose("docker-compose.dev.yml") as unknown as { services: Record; }; expect(stand.services["postgres"]?.ports).toEqual(["127.0.0.1:5433:5432"]); }); });