BOT_FIRE_CONCURRENCY (8) — pg-boss worker pool size, gates max accounts firing fan-outs in parallel. BOT_GROUP_CONCURRENCY (3) — per-account parallel group sends; parts within a group stay serial so chat order is preserved. BOT_MAX_SEND_PER_MINUTE (40) — per-account token-bucket rate. Defaults are tuned for an established WhatsApp account (~30-60 msg/min safe band). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
58 lines
1.8 KiB
TypeScript
58 lines
1.8 KiB
TypeScript
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();
|
|
});
|
|
});
|