import assert from "node:assert/strict" import test from "node:test" import { processLeadSubmission, type ContactLeadPayload, type RequestMachineLeadPayload, } from "@/lib/server/contact-submission" test("processLeadSubmission stores and syncs a contact lead", async () => { const calls: string[] = [] const payload: ContactLeadPayload = { kind: "contact", firstName: "John", lastName: "Doe", email: "john@example.com", phone: "(435) 555-1212", company: "ACME", intent: "Repairs", message: "Need vending help for our office.", serviceTextConsent: true, marketingTextConsent: false, consentVersion: "sms-consent-v1-2026-03-26", consentCapturedAt: "2026-03-25T00:00:00.000Z", consentSourcePage: "/contact-us", source: "website", page: "/contact", timestamp: "2026-03-25T00:00:00.000Z", url: "https://rmv.example/contact", } const result = await processLeadSubmission(payload, "rmv.example", { storageConfigured: true, emailConfigured: true, ghlConfigured: true, tenantSlug: "rocky_mountain_vending", tenantName: "Rocky Mountain Vending", tenantDomains: ["rockymountainvending.com"], ingest: async () => { calls.push("ingest") return { inserted: true, leadId: "lead_123", idempotencyKey: "abc", tenantId: "tenant_123", } }, updateLeadStatus: async () => { calls.push("update") return { ok: true } }, sendEmail: async () => { calls.push("email") return {} }, createContact: async () => { calls.push("ghl") return { contact: { id: "ghl_123" } } }, logger: console, }) assert.equal(result.status, 200) assert.equal(result.body.success, true) assert.deepEqual(result.body.deliveredVia, ["convex", "email", "ghl"]) assert.equal(calls.filter((call) => call === "email").length, 2) assert.ok(calls.includes("ingest")) assert.ok(calls.includes("update")) assert.ok(calls.includes("ghl")) }) test("processLeadSubmission validates request-machine submissions", async () => { const payload: RequestMachineLeadPayload = { kind: "request-machine", firstName: "Jane", lastName: "Smith", email: "jane@example.com", phone: "4352339668", company: "Warehouse Co", employeeCount: "0", machineType: "snack", machineCount: "2", serviceTextConsent: true, marketingTextConsent: false, consentVersion: "sms-consent-v1-2026-03-26", consentCapturedAt: "2026-03-25T00:00:00.000Z", consentSourcePage: "/", } const result = await processLeadSubmission(payload, "rmv.example", { storageConfigured: false, emailConfigured: false, ghlConfigured: false, tenantSlug: "rocky_mountain_vending", tenantName: "Rocky Mountain Vending", tenantDomains: [], ingest: async () => { throw new Error("should not run") }, updateLeadStatus: async () => { throw new Error("should not run") }, sendEmail: async () => { throw new Error("should not run") }, createContact: async () => { throw new Error("should not run") }, logger: console, }) assert.equal(result.status, 400) assert.equal(result.body.success, false) assert.match(result.body.error || "", /Invalid number of employees/) }) test("processLeadSubmission returns deduped success when Convex already has the lead", async () => { const payload: ContactLeadPayload = { kind: "contact", firstName: "John", lastName: "Doe", email: "john@example.com", phone: "(435) 555-1212", message: "Need vending help for our office.", serviceTextConsent: true, marketingTextConsent: false, consentVersion: "sms-consent-v1-2026-03-26", consentCapturedAt: "2026-03-25T00:00:00.000Z", consentSourcePage: "/contact-us", } const result = await processLeadSubmission(payload, "rmv.example", { storageConfigured: true, emailConfigured: false, ghlConfigured: false, tenantSlug: "rocky_mountain_vending", tenantName: "Rocky Mountain Vending", tenantDomains: [], ingest: async () => ({ inserted: false, leadId: "lead_123", idempotencyKey: "abc", tenantId: "tenant_123", }), updateLeadStatus: async () => ({ ok: true }), sendEmail: async () => ({}), createContact: async () => null, logger: console, }) assert.equal(result.status, 200) assert.equal(result.body.success, true) assert.equal(result.body.deduped, true) assert.deepEqual(result.body.deliveredVia, ["convex"]) })