/* Unit tests for deliver event covering its documented public contract and regression-sensitive edge cases. No network. RFC-0181: initial deliverEvent test. */ import { test, expect } from "vitest"; import { deliverEvent, eventToLeadMessage } from "../index.ts"; import type { IntegrationEvent } from "../port.ts"; const EVENT: IntegrationEvent = { eventId: "evt-1", kind: "lead", source: "send-message", locale: "de", occurredAt: "2026-06-08T00:00:00.000Z", contact: { email: "a@example.de" }, payload: { message: "Hallo" }, }; test("eventToLeadMessage maps the event onto a LeadMessage", () => { const msg = eventToLeadMessage(EVENT); expect(msg.message).toBe("Hallo"); expect(msg.formId).toBe("send-message"); expect(msg.locale).toBe("de"); expect(msg.submittedAt).toBe("2026-06-08T00:00:00.000Z"); expect(msg.contact?.email).toBe("a@example.de"); }); test("deliverEvent with no secrets skips every sink (no failures, no retry)", async () => { const result = await deliverEvent(EVENT, {}); expect(result.channels.delivered.length).toBe(0); expect(result.channels.failed.length).toBe(0); expect(result.channels.skipped.includes("telegram")).toBeTruthy(); expect(result.channels.skipped.includes("whatsapp")).toBeTruthy(); expect(result.destinations.routed.length).toBe(0); expect(result.destinations.failed.length).toBe(0); expect(result.destinations.skipped.includes("crm:lagebild")).toBeTruthy(); }); test("RFC-1198: referrer picks the resolved partner name, else the raw input", () => { const resolved = eventToLeadMessage({ ...EVENT, payload: { message: "Hallo", referrer: "anna-schreiner", referralPartnerSlug: "anna-schreiner", referralPartnerName: "Anna Schreiner", }, }); expect(resolved.referrer).toBe("Anna Schreiner"); const raw = eventToLeadMessage({ ...EVENT, payload: { message: "Hallo", referrer: "Mein Nachbar Karl" }, }); expect(raw.referrer).toBe("Mein Nachbar Karl"); const absent = eventToLeadMessage(EVENT); expect(absent.referrer).toBeUndefined(); }); test("email is no longer a fetch channel adapter (Cloudflare Email Routing handles it)", async () => { const result = await deliverEvent(EVENT, {}); expect(!result.channels.skipped.includes("email")).toBeTruthy(); });