import { describe, expect, it } from "vitest"; import { parseEnv } from "./env.js"; const valid = { DATABASE_URL: "postgres://u:p@h:5432/db", DATA_DIR: "/data", SESSIONS_DIR: "/data/sessions", MEDIA_DIR: "/data/media", BOT_HEALTH_PORT: "8081", BOT_LOG_LEVEL: "info", }; describe("parseEnv", () => { it("parses a valid env", () => { const env = parseEnv(valid); expect(env.BOT_HEALTH_PORT).toBe(8081); }); it("rejects missing DATABASE_URL", () => { const { DATABASE_URL: _, ...rest } = valid; expect(() => parseEnv(rest)).toThrow(); }); it("rejects malformed port", () => { expect(() => parseEnv({ ...valid, BOT_HEALTH_PORT: "notanumber" })).toThrow(); }); it("defaults BOT_FIRE_CONCURRENCY to 8 when unset", () => { expect(parseEnv(valid).BOT_FIRE_CONCURRENCY).toBe(8); }); it("defaults BOT_GROUP_CONCURRENCY to 3 when unset", () => { expect(parseEnv(valid).BOT_GROUP_CONCURRENCY).toBe(3); }); it("defaults BOT_MAX_SEND_PER_MINUTE to 40 when unset", () => { expect(parseEnv(valid).BOT_MAX_SEND_PER_MINUTE).toBe(40); }); it("parses overrides for the fan-out tuning vars as integers", () => { const env = parseEnv({ ...valid, BOT_FIRE_CONCURRENCY: "16", BOT_GROUP_CONCURRENCY: "5", BOT_MAX_SEND_PER_MINUTE: "60", }); expect(env.BOT_FIRE_CONCURRENCY).toBe(16); expect(env.BOT_GROUP_CONCURRENCY).toBe(5); expect(env.BOT_MAX_SEND_PER_MINUTE).toBe(60); }); it("rejects non-numeric values for the fan-out tuning vars", () => { expect(() => parseEnv({ ...valid, BOT_FIRE_CONCURRENCY: "many" })).toThrow(); expect(() => parseEnv({ ...valid, BOT_GROUP_CONCURRENCY: "-1" })).toThrow(); expect(() => parseEnv({ ...valid, BOT_MAX_SEND_PER_MINUTE: "40.5" })).toThrow(); }); });