import { expect, test } from "vitest"; import { loadConfig } from "../src/config.js"; test("loadConfig accepts container listening and runtime paths", () => { expect(loadConfig({ HOST: "0.0.0.0", PORT: "9000", THT_HARNESS_DIR: "/app/harness", THT_BIN: "/opt/venv/bin/tht", PI_BIN: "/usr/local/bin/pi", SETTINGS_FILE: "/data/settings/settings.json", THT_DATA_ROOT: "/data", })).toMatchObject({ host: "0.0.0.0", port: 9000, harnessDir: "/app/harness", thtBin: "/opt/venv/bin/tht", piBin: "/usr/local/bin/pi", settingsFile: "/data/settings/settings.json", dataRoot: "/data", }); }); test("loadConfig keeps local development defaults", () => { expect(loadConfig({})).toMatchObject({ host: "127.0.0.1", port: 8787, harnessDir: "../harness", thtBin: "tht", piBin: "pi", settingsFile: "data/settings.json", }); expect(loadConfig({}).dataRoot).toBeUndefined(); }); test("loadConfig rejects unauthenticated public exposure", () => { expect(() => loadConfig({ THOTH_PUBLIC_EXPOSURE: "true", AUTH_MODE: "none", })).toThrow(/public exposure requires AUTH_MODE=upstream/); }); test("loadConfig accepts an authenticated upstream trust boundary", () => { expect(loadConfig({ THOTH_PUBLIC_EXPOSURE: "true", AUTH_MODE: "upstream", }).authMode).toBe("upstream"); });