import test from "node:test"; import assert from "node:assert/strict"; const { buildTelegramPayload, buildTelegramUrl } = await import("../../src/lib/webhooks/integrations/telegram.ts"); const VALID_TOKEN = "123456789:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghi"; test("buildTelegramUrl constructs correct API URL from valid botToken", () => { const url = buildTelegramUrl(VALID_TOKEN); assert.equal(url, `https://api.telegram.org/bot${VALID_TOKEN}/sendMessage`); }); test("buildTelegramUrl throws on invalid botToken format", () => { assert.throws(() => buildTelegramUrl("123456:SHORT"), /Invalid Telegram bot token/); assert.throws( () => buildTelegramUrl("notanumber:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghi"), /Invalid Telegram bot token/ ); assert.throws(() => buildTelegramUrl(""), /Invalid Telegram bot token/); }); test("buildTelegramPayload — request.failed includes model and event label", () => { const payload = buildTelegramPayload( "request.failed", { model: "claude-opus-4-7", error: "503" }, "-100123" ); assert.equal(payload.chat_id, "-100123"); assert.ok(payload.text.includes("claude-opus-4-7"), "should include model name"); assert.ok( payload.text.toLowerCase().includes("request failed") || payload.text.toLowerCase().includes("failed"), "should include event label" ); assert.equal(payload.parse_mode, "Markdown"); }); test("buildTelegramPayload — request.completed includes provider, account, combo, and metrics", () => { const payload = buildTelegramPayload( "request.completed", { model: "codex/gpt-5.5", provider: "codex", account: "Workspace Principal", combo: "auto-fallback", latencyMs: 1421, fallbackCount: 2, }, "-100123" ); assert.ok(payload.text.includes("Model: `codex/gpt-5.5`")); assert.ok(payload.text.includes("Provider: `codex`")); assert.ok(payload.text.includes("Account: `Workspace Principal`")); assert.ok(payload.text.includes("Combo: `auto-fallback`")); assert.ok(payload.text.includes("Latency: `1421ms`")); assert.ok(payload.text.includes("Fallbacks: `2`")); }); test("buildTelegramPayload — accountId falls back to short account label", () => { const payload = buildTelegramPayload( "request.completed", { provider: "codex", accountId: "12345678-abcd-efgh-ijkl-1234567890ab", }, "-100123" ); assert.ok(payload.text.includes("Account: `Account #123456`")); }); test("buildTelegramPayload — chat_id matches provided value for groups", () => { const payload = buildTelegramPayload("test.ping", { message: "ping" }, "-1001234567890"); assert.equal(payload.chat_id, "-1001234567890"); }); test("buildTelegramPayload — all WEBHOOK_EVENTS produce valid payloads with chat_id", () => { const events = [ "request.completed", "request.failed", "provider.error", "provider.recovered", "quota.exceeded", "combo.switched", "test.ping", ] as const; for (const event of events) { const payload = buildTelegramPayload(event, {}, "99999"); assert.equal(payload.chat_id, "99999"); assert.ok( typeof payload.text === "string" && payload.text.length > 0, `event ${event} must produce non-empty text` ); } });