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.
chajia/__tests__/workers/rpa/mothership-logged-in-quote....

245 lines
7.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import { describe, expect, it } from "vitest";
import {
addressLooksResidential,
buildLoggedInAddressSearchQuery,
buildMsCheckoutDetailsDefaults,
formatLoggedInReadyGridCell,
formatLoggedInReadyGridCellWithYear,
isMsCheckoutPaymentButtonLabel,
isMsCheckoutPaymentPageText,
MOTHERSHIP_CREATE_SHIPMENT_URL,
parseLoggedInRateCardText,
pickLoggedInRateCardIndex,
} from "@/workers/rpa/mothership-logged-in-quote";
import { filterQuotesForMotherShipUiDisplay } from "@/lib/constants/mothership-ui-tiers";
import { validateQuoteSchema } from "@/workers/rpa/quote-capture/quote-schema-validator";
import type { QuoteRequest } from "@/modules/providers/quote-provider";
describe("MOTHERSHIP_CREATE_SHIPMENT_URL", () => {
it("登录态一级表单直达 /ship(避免菜单文案超时)", () => {
expect(MOTHERSHIP_CREATE_SHIPMENT_URL).toBe(
"https://dashboard.mothership.com/ship",
);
});
});
describe("parseLoggedInRateCardText", () => {
it("解析 ABF Direct 卡片文本", () => {
const item = parseLoggedInRateCardText(
"Selected ABF Direct $835.61 Estimated 5 business days",
);
expect(item?.carrier).toBe("ABF Direct");
expect(item?.rawTotal).toBe(835.61);
expect(item?.transitDays).toBe("5");
expect(item?.serviceLevel).toBe("standard");
});
it("解析 XPO Direct", () => {
const item = parseLoggedInRateCardText(
"XPO Direct $1,015.28 Estimated 4 business days",
);
expect(item?.carrier).toBe("XPO Direct");
expect(item?.rawTotal).toBe(1015.28);
});
it("解析区间时效 5-7 business days", () => {
const item = parseLoggedInRateCardText(
"SAIA Direct $900.00 5-7 business days",
);
expect(item?.transitDays).toBe("5-7");
});
it("无时效文案时用待确认,且通过 schema 校验(避免 standard/bestValue 时效为空)", () => {
const item = parseLoggedInRateCardText("Daylight Direct $733.98");
expect(item?.transitDays).toBe("待确认");
expect(item?.rateOption).toBe("bestValue");
expect(validateQuoteSchema([item!])).toHaveLength(1);
});
});
describe("formatLoggedInReadyGridCell", () => {
it("ISO 日期转为 gridcell 名", () => {
expect(formatLoggedInReadyGridCell("2026-07-16")).toBe("Thu Jul 16");
});
it("带年份日格匹配零填充日", () => {
const re = formatLoggedInReadyGridCellWithYear("2026-08-05");
expect(re.test("Wed Aug 05 2026")).toBe(true);
expect(re.test("Wed Aug 5 2026")).toBe(true);
expect(re.test("Wed Jul 05 2026")).toBe(false);
});
});
describe("buildLoggedInAddressSearchQuery", () => {
it("优先用 street/city/state/zip,避开 Places description 的 floor/suite", () => {
const q = buildLoggedInAddressSearchQuery({
street: "2020 West Washington Boulevard",
city: "Los Angeles",
state: "CA",
zip: "",
placeId: "ChIJ-test",
formattedAddress:
"2020 West Washington Boulevard floor 5 rm 508, Los Angeles, CA, USA",
selectedFromSuggestions: true,
mothershipOptionId: "ChIJ-test",
mothershipDisplayLabel:
"2020 West Washington Boulevard floor 5 rm 508, Los Angeles, CA, USA",
selectedFromMothership: true,
});
expect(q).toBe("2020 West Washington Boulevard, Los Angeles, CA");
expect(q).not.toMatch(/floor|rm 508/i);
});
it("ste/suite 也会从 street 剥离", () => {
const q = buildLoggedInAddressSearchQuery({
street: "555 Market St ste 1001",
city: "San Francisco",
state: "CA",
zip: "94105",
placeId: "ChIJ-sf",
formattedAddress: "555 Market St ste 1001, San Francisco, CA, USA",
selectedFromSuggestions: true,
mothershipOptionId: "ChIJ-sf",
mothershipDisplayLabel: "555 Market St ste 1001, San Francisco, CA, USA",
selectedFromMothership: true,
});
expect(q).toBe("555 Market St, San Francisco, CA, 94105");
expect(q).not.toMatch(/ste|1001/i);
});
});
describe("filterQuotesForMotherShipUiDisplay 多承运商", () => {
it("同档不同承运商均保留", () => {
const ui = filterQuotesForMotherShipUiDisplay([
{
service_level: "standard",
rate_option: "bestValue",
carrier: "ABF Direct",
raw: 835,
},
{
service_level: "standard",
rate_option: "bestValue",
carrier: "XPO Direct",
raw: 1015,
},
]);
expect(ui).toHaveLength(2);
});
});
describe("checkout helpers", () => {
it("支付按钮黑名单", () => {
expect(isMsCheckoutPaymentButtonLabel("Pay now")).toBe(true);
expect(isMsCheckoutPaymentButtonLabel("Place order")).toBe(true);
expect(isMsCheckoutPaymentButtonLabel("Complete payment")).toBe(true);
expect(isMsCheckoutPaymentButtonLabel("Add payment method")).toBe(true);
expect(isMsCheckoutPaymentButtonLabel("Agree")).toBe(false);
expect(isMsCheckoutPaymentButtonLabel("Proceed to checkout")).toBe(false);
});
it("支付页正文识别", () => {
expect(isMsCheckoutPaymentPageText("Add payment method\nCard number")).toBe(
true,
);
expect(
isMsCheckoutPaymentPageText("Review your shipment\nAgree to terms"),
).toBe(false);
});
it("选价:hint 优先,否则最低价", () => {
const items = [
{ carrier: "ABF Direct", rawTotal: 888.67 },
{ carrier: "SAIA Direct", rawTotal: 1051.01 },
{ carrier: "Old Dominion", rawTotal: 1803.19 },
];
expect(pickLoggedInRateCardIndex(items)).toBe(0);
expect(pickLoggedInRateCardIndex(items, "SAIA")).toBe(1);
expect(pickLoggedInRateCardIndex(items, "no-match")).toBe(0);
expect(pickLoggedInRateCardIndex([])).toBe(-1);
});
it("Details 默认值含双侧姓名与分邮箱", () => {
const req = {
cargoHash: "t",
pickup: {
street: "a",
city: "b",
state: "CA",
zip: "90001",
placeId: "p",
formattedAddress: "a",
selectedFromSuggestions: true,
},
delivery: {
street: "c",
city: "d",
state: "TX",
zip: "75201",
placeId: "d",
formattedAddress: "c",
selectedFromSuggestions: true,
},
weightLb: 100,
dimsIn: { l: 48, w: 40, h: 48 },
palletCount: 2,
cargoType: "general_freight",
} satisfies QuoteRequest;
const d = buildMsCheckoutDetailsDefaults(req);
expect(d.pickupFirst).toBe("Ops");
expect(d.deliveryLast).toBe("Receiver");
expect(d.pickupEmail).not.toBe(d.deliveryEmail);
expect(d.pieceCountQty).toBe("2");
expect(d.cargoDescription).toBe("General freight pallets");
expect(d.pickupReference).toBe("PO-PICKUP-001");
expect(d.deliveryNotes).toContain("Receiver");
});
});
describe("addressLooksResidential", () => {
const base = {
city: "Columbus",
state: "OH",
zip: "43217",
placeId: "x",
formattedAddress: "",
selectedFromSuggestions: true,
};
it("商业 ste/suite 地址不算住宅(与官网一致,可直接出价)", () => {
expect(
addressLooksResidential({
...base,
street: "6600 Don Eisele Rd ste 2",
formattedAddress: "6600 Don Eisele Rd ste 2, Columbus, OH 43217, USA",
mothershipDisplayLabel:
"6600 Don Eisele Rd ste 2, Columbus, OH 43217, USA",
}),
).toBe(false);
expect(
addressLooksResidential({
...base,
street: "555 Market St Suite 1001",
city: "San Francisco",
state: "CA",
zip: "94105",
}),
).toBe(false);
});
it("明确 apt/apartment 才视为住宅", () => {
expect(
addressLooksResidential({
...base,
street: "100 Main St Apt 4B",
}),
).toBe(true);
expect(
addressLooksResidential({
...base,
street: "100 Main St Apartment 2",
}),
).toBe(true);
});
});