src/bot/botHelpers.test.ts

import { test } from "bun:test"; import assert from "node:assert/strict"; import { parseStructuredInitiativeOutput, resolveMaxMediaPromptLen } from "./botHelpers.ts"; import { normalizeSettings } from "../store/settingsNormalization.ts";

test("resolveMaxMediaPromptLen reads canonical discovery settings", () => { const settings = normalizeSettings({ identity: { botName: "clanky" }, initiative: { discovery: { maxMediaPromptChars: 1375 } } });

assert.equal(resolveMaxMediaPromptLen(settings), 1375); });

test("parseStructuredInitiativeOutput treats malformed non-drop actions as contract violations", () => { const parsed = parseStructuredInitiativeOutput(JSON.stringify({ action: "hold", reason: "later" }));

assert.equal(parsed.action, "hold"); assert.equal(parsed.skip, false); assert.equal(parsed.contractViolation, true); assert.equal(parsed.contractViolationReason, "missing_channel_id_and_text"); });

test("parseStructuredInitiativeOutput preserves multiline post text", () => { const parsed = parseStructuredInitiativeOutput(JSON.stringify({ action: "post_now", channelId: "123", replyToMessageId: null, text: "Quick rundown:

  • One
  • Two

More if you want", mediaDirective: "none", mediaPrompt: null, reason: "share summary" }));

assert.equal(parsed.contractViolation, false); assert.equal(parsed.text, "Quick rundown:

  • One
  • Two

More if you want"); });