You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.6 KiB
88 lines
2.6 KiB
import { describe, expect, it } from "vitest";
|
|
import {
|
|
isPickupDateAfterToday,
|
|
minPickupDateDisplay,
|
|
pickupDateValidationMessage,
|
|
} from "@/lib/priority1/pickup-date";
|
|
import { extractPriority1VisibleQuotes } from "@/workers/rpa/priority1/quote-extract";
|
|
|
|
const SAMPLE_SUMMARY = JSON.stringify({
|
|
quote_id: 42830001,
|
|
LTL_best_price_quote_carrier: "XPO",
|
|
LTL_best_price_quote_cost: "481.32",
|
|
LTL_best_price_quote_transit: 8,
|
|
LTL_second_rate_quote_carrier: "Estes",
|
|
LTL_second_rate_quote_cost: "503.68",
|
|
LTL_second_rate_quote_transit: 5,
|
|
});
|
|
|
|
describe("pickup date rules", () => {
|
|
it("requires date strictly after today", () => {
|
|
const min = minPickupDateDisplay();
|
|
expect(min).toMatch(/^\d{2}\/\d{2}\/\d{4}$/);
|
|
expect(pickupDateValidationMessage(min)).toBeNull();
|
|
expect(isPickupDateAfterToday(min)).toBe(true);
|
|
});
|
|
|
|
it("rejects today or past dates", () => {
|
|
const today = new Date();
|
|
const mm = String(today.getMonth() + 1).padStart(2, "0");
|
|
const dd = String(today.getDate()).padStart(2, "0");
|
|
const yyyy = today.getFullYear();
|
|
const todayDisplay = `${mm}/${dd}/${yyyy}`;
|
|
expect(pickupDateValidationMessage(todayDisplay)).toBe("提货日须晚于今天");
|
|
});
|
|
});
|
|
|
|
describe("parseVisibleQuoteCardsDom via extractPriority1VisibleQuotes", () => {
|
|
const sampleDom = `
|
|
YOUR INSTANT QUOTE OPTIONS
|
|
QUOTE 1
|
|
STANDARD LTL
|
|
Estes
|
|
Transit: 1 Business Days
|
|
Quote Expiration Date: 07-09-2026
|
|
Estimated Delivery Date: 07-15-2026
|
|
$426.19
|
|
QUOTE 2
|
|
STANDARD LTL
|
|
TForce Freight
|
|
Transit: 2 Business Days
|
|
Quote Expiration Date: 07-09-2026
|
|
Estimated Delivery Date: 07-16-2026
|
|
$1703.90
|
|
`;
|
|
|
|
it("无网络摘要时以可见 DOM 卡片为准", () => {
|
|
const lines = extractPriority1VisibleQuotes([], sampleDom);
|
|
expect(lines).toHaveLength(2);
|
|
expect(lines[0]!.carrier).toBe("Estes");
|
|
expect(lines[0]!.totalUsd).toBe(426.19);
|
|
expect(lines[0]!.expirationDate).toBe("07/09/2026");
|
|
expect(lines[0]!.deliveryDate).toBe("07/15/2026");
|
|
expect(lines[1]!.totalUsd).toBe(1703.9);
|
|
});
|
|
|
|
it("DOM 无承运商时从 Feathery 摘要按 QUOTE 序号补全承运商与金额", () => {
|
|
const dom = `
|
|
QUOTE 1
|
|
STANDARD LTL
|
|
Transit: 1 Business Days
|
|
Quote Expiration Date: 07-09-2026
|
|
Estimated Delivery Date: 07-15-2026
|
|
$999.99
|
|
QUOTE 2
|
|
STANDARD LTL
|
|
Transit: 2 Business Days
|
|
$888.88
|
|
`;
|
|
const lines = extractPriority1VisibleQuotes([SAMPLE_SUMMARY], dom);
|
|
expect(lines).toHaveLength(2);
|
|
expect(lines[0]!.carrier).toBe("XPO");
|
|
expect(lines[0]!.totalUsd).toBe(481.32);
|
|
expect(lines[0]!.expirationDate).toBe("07/09/2026");
|
|
expect(lines[1]!.carrier).toBe("Estes");
|
|
expect(lines[1]!.totalUsd).toBe(503.68);
|
|
});
|
|
});
|