36 lines
1.2 KiB
TypeScript
36 lines
1.2 KiB
TypeScript
import { describe, expect, test } from "vitest";
|
|
import { canTransitionLeadStatus, LEAD_BULK_MAX_ENTRIES, normalizeBulkLeadIds, type LeadStatus } from "./leadService.server";
|
|
|
|
describe("lead status workflow", () => {
|
|
test.each<[LeadStatus, LeadStatus]>([
|
|
["new", "qualified"],
|
|
["new", "lost"],
|
|
["new", "spam"],
|
|
["qualified", "converted"],
|
|
["qualified", "lost"],
|
|
["qualified", "spam"],
|
|
])("allows %s -> %s", (from, to) => {
|
|
expect(canTransitionLeadStatus(from, to)).toBe(true);
|
|
});
|
|
|
|
test.each<[LeadStatus, LeadStatus]>([
|
|
["converted", "new"],
|
|
["converted", "qualified"],
|
|
["lost", "qualified"],
|
|
["spam", "qualified"],
|
|
])("blocks terminal transition %s -> %s", (from, to) => {
|
|
expect(canTransitionLeadStatus(from, to)).toBe(false);
|
|
});
|
|
|
|
test("allows idempotent status writes", () => {
|
|
expect(canTransitionLeadStatus("converted", "converted")).toBe(true);
|
|
});
|
|
|
|
test("bounds and deduplicates bulk lead IDs", () => {
|
|
expect(normalizeBulkLeadIds([" lead-a ", "lead-a", "", "lead-b"])).toEqual(["lead-a", "lead-b"]);
|
|
expect(() => normalizeBulkLeadIds(Array.from({ length: LEAD_BULK_MAX_ENTRIES + 1 }, (_, index) => `lead-${index}`))).toThrow(
|
|
"foundation.mass_action_exceeds_limit"
|
|
);
|
|
});
|
|
});
|