import { describe, expect, it } from "vitest"; import { pickLowestRateOptionIndex, pickFlexibilityOptionIndex, pickCarrierOptionIndex, parseFlockFlexibilityKey, parseFlockRateUsd, enrichFlexibilityOption, enrichCarrierOption, validateFlockCheckoutSelection, } from "@/lib/flock/flock-checkout-selection"; import { buildFlockCheckoutDefaults, isFlockCheckoutPaymentButtonLabel, isFlockCheckoutPaymentPageText, } from "@/workers/rpa/flock/checkout"; describe("validateFlockCheckoutSelection", () => { it("要求 flock_direct 或 standard,且必须选灵活性或承运商", () => { expect( validateFlockCheckoutSelection({ preferredTier: "flock_direct", preferredFlexibility: "2_day", }), ).toBeNull(); expect( validateFlockCheckoutSelection({ preferredTier: "standard", preferredFlexibility: "none", }), ).toBeNull(); expect( validateFlockCheckoutSelection({ preferredTier: "standard", preferredCarrier: "Forward Air", }), ).toBeNull(); expect( validateFlockCheckoutSelection({ preferredTier: "other" as "flock_direct", preferredFlexibility: "2_day", }), ).toMatch(/请选择/); expect( validateFlockCheckoutSelection({ preferredTier: "flock_direct" }), ).toMatch(/灵活性|承运商/); expect( validateFlockCheckoutSelection({ preferredTier: "standard", preferredFlexibility: "2_day", preferredCarrier: "Forward Air", }), ).toMatch(/不能同时/); }); it("接受 preferred_flexibility", () => { expect( validateFlockCheckoutSelection({ preferredTier: "flock_direct", preferredFlexibility: "2_day", }), ).toBeNull(); }); }); describe("pickLowestRateOptionIndex", () => { it("选最低价;同价取首项;空列表 -1", () => { expect(pickLowestRateOptionIndex([])).toBe(-1); expect( pickLowestRateOptionIndex([ { key: "2_day", label: "a", rateUsd: 2068 }, { key: "1_day", label: "b", rateUsd: 2034 }, { key: "none", label: "c", rateUsd: 2166 }, ]), ).toBe(1); expect( pickLowestRateOptionIndex([ { key: "2_day", label: "a", rateUsd: 100 }, { key: "1_day", label: "b", rateUsd: 100 }, ]), ).toBe(0); }); }); describe("pickFlexibilityOptionIndex", () => { it("按 key 选档,找不到则回落最低价", () => { const opts = [ { key: "2_day" as const, label: "2-day", rateUsd: 1200 }, { key: "1_day" as const, label: "1-day", rateUsd: 1250 }, { key: "none" as const, label: "No", rateUsd: 1300 }, ]; expect(pickFlexibilityOptionIndex(opts, "1_day")).toBe(1); expect(pickFlexibilityOptionIndex(opts, null)).toBe(0); }); }); describe("parseFlockFlexibilityKey / enrich", () => { it("从文案解析 key", () => { expect(parseFlockFlexibilityKey("2-day flexibility Pickup Jul 30")).toBe( "2_day", ); expect(parseFlockFlexibilityKey("No flexibility")).toBe("none"); expect( enrichFlexibilityOption({ label: "1-day flexibility Pickup Jul 30 Deliver by Aug 3 $1,250.00", rateUsd: 1250, })?.key, ).toBe("1_day"); }); }); describe("parseFlockRateUsd", () => { it("解析美元金额", () => { expect(parseFlockRateUsd("$2,034.00")).toBe(2034); expect(parseFlockRateUsd("Prices from $1,271")).toBe(1271); expect(parseFlockRateUsd("no money")).toBeNull(); }); }); describe("flock checkout payment guards", () => { it("黑名单按钮与支付页文案", () => { expect(isFlockCheckoutPaymentButtonLabel("Complete your order")).toBe( true, ); expect(isFlockCheckoutPaymentButtonLabel("Yes, I want this rate!")).toBe( false, ); expect( isFlockCheckoutPaymentPageText("Complete your order — Pay with card"), ).toBe(true); }); }); describe("enrichCarrierOption / pickCarrierOptionIndex", () => { it("从承运商行文案解析字段", () => { const opt = enrichCarrierOption({ label: "Forward Air 1 business days Jul 28 – Jul 29 $555.14 Select", rateUsd: 555.14, }); expect(opt?.carrierName).toMatch(/Forward Air/i); expect(opt?.transitDays).toMatch(/1 business/i); expect(opt?.rateUsd).toBe(555.14); }); it("按承运商名选档,找不到回落最低价", () => { const opts = [ { carrierName: "Forward Air", transitDays: "1 business days", rateUsd: 555, label: "a", }, { carrierName: "Roadrunner", transitDays: "2 business days", rateUsd: 500, label: "b", }, ]; expect(pickCarrierOptionIndex(opts, "Roadrunner")).toBe(1); expect(pickCarrierOptionIndex(opts, null)).toBe(1); }); }); describe("buildFlockCheckoutDefaults", () => { it("合并 flock_details 覆盖", () => { const d = buildFlockCheckoutDefaults({ pickupZip: "90001", deliveryZip: "75201", tag: "ab12", details: { pickup: { company_name: "Acme Pickup", contact_email: "a@x.com" }, delivery: { company_name: "Acme Del" }, po_number: "PO-99", declaration_statement: "call dock", documentation_required: true, use_billing_for_delivery: true, }, }); expect(d.pickupCompany).toBe("Acme Pickup"); expect(d.pickupEmail).toBe("a@x.com"); expect(d.deliveryPo).toBe("PO-99"); expect(d.declarationStatement).toBe("call dock"); expect(d.pickupZip).toBe("90001"); expect(d.nmfc).toBeTruthy(); expect(d.documentationRequired).toBe(true); expect(d.useBillingForPickup).toBe(true); expect(d.useBillingForDelivery).toBe(true); expect(d.deliveryPhone).not.toMatch(/555/); }); });