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.
206 lines
5.2 KiB
206 lines
5.2 KiB
import { describe, expect, it } from "vitest";
|
|
import {
|
|
buildQuoteRequestBodyFromLoggedIn,
|
|
resolveLoggedInPalletCount,
|
|
} from "@/lib/frontend/mothership-logged-in-quote-body";
|
|
import type { MothershipLoggedInShipmentPayload } from "@/components/mothership/mothership-logged-in-shipment-form";
|
|
import type { MothershipAddressCandidate } from "@/lib/frontend/types";
|
|
|
|
const pickup: MothershipAddressCandidate = {
|
|
option_id: "p1",
|
|
display_label: "A, Fairhope, AL",
|
|
formatted_address: "A, Fairhope, AL",
|
|
street: "A",
|
|
city: "Fairhope",
|
|
state: "AL",
|
|
zip: "36532",
|
|
};
|
|
|
|
const delivery: MothershipAddressCandidate = {
|
|
option_id: "d1",
|
|
display_label: "B, Brea, CA",
|
|
formatted_address: "B, Brea, CA",
|
|
street: "B",
|
|
city: "Brea",
|
|
state: "CA",
|
|
zip: "92821",
|
|
};
|
|
|
|
function payload(
|
|
cargo: MothershipLoggedInShipmentPayload["cargo"],
|
|
): MothershipLoggedInShipmentPayload {
|
|
return {
|
|
pickupQuery: pickup.display_label,
|
|
deliveryQuery: delivery.display_label,
|
|
pickupConfirmed: pickup,
|
|
deliveryConfirmed: delivery,
|
|
pickupAccessorials: [],
|
|
deliveryAccessorials: [],
|
|
readyDate: "2026-07-16",
|
|
readyTime: "12:00 PM",
|
|
timezone: "GMT+8",
|
|
cargo,
|
|
};
|
|
}
|
|
|
|
describe("mothership-logged-in-quote-body", () => {
|
|
it("多行托盘 quantity 合计", () => {
|
|
expect(
|
|
resolveLoggedInPalletCount(
|
|
payload([
|
|
{
|
|
cargoType: "pallet",
|
|
quantity: 2,
|
|
weightLb: 250,
|
|
lengthIn: 48,
|
|
widthIn: 48,
|
|
heightIn: 48,
|
|
},
|
|
{
|
|
cargoType: "pallet",
|
|
quantity: 3,
|
|
weightLb: 100,
|
|
lengthIn: 40,
|
|
widthIn: 40,
|
|
heightIn: 40,
|
|
},
|
|
]),
|
|
),
|
|
).toBe(5);
|
|
});
|
|
|
|
it("询价体重取首行单件重量", () => {
|
|
const body = buildQuoteRequestBodyFromLoggedIn(
|
|
payload([
|
|
{
|
|
cargoType: "pallet",
|
|
quantity: 2,
|
|
weightLb: 250,
|
|
lengthIn: 48,
|
|
widthIn: 48,
|
|
heightIn: 48,
|
|
},
|
|
]),
|
|
"CUST_001",
|
|
);
|
|
expect(body.weight.value).toBe(250);
|
|
expect(body.pallet_count).toBe(2);
|
|
});
|
|
|
|
it("透传附加服务与可提货时间", () => {
|
|
const base = payload([
|
|
{
|
|
cargoType: "pallet",
|
|
quantity: 1,
|
|
weightLb: 100,
|
|
lengthIn: 48,
|
|
widthIn: 40,
|
|
heightIn: 48,
|
|
},
|
|
]);
|
|
const body = buildQuoteRequestBodyFromLoggedIn(
|
|
{
|
|
...base,
|
|
pickupAccessorials: ["liftgate", "residential"],
|
|
deliveryAccessorials: ["appointment"],
|
|
readyDate: "2026-07-16",
|
|
readyTime: "3:00 PM",
|
|
},
|
|
"CUST_001",
|
|
);
|
|
expect(body.pickup_accessorials).toEqual(["liftgate", "residential"]);
|
|
expect(body.delivery_accessorials).toEqual(["appointment"]);
|
|
expect(body.ready_date).toBe("2026-07-16");
|
|
expect(body.ready_time).toBe("3:00 PM");
|
|
});
|
|
|
|
it("透传多行 cargo_lines", () => {
|
|
const body = buildQuoteRequestBodyFromLoggedIn(
|
|
payload([
|
|
{
|
|
cargoType: "pallet",
|
|
quantity: 2,
|
|
weightLb: 250,
|
|
lengthIn: 48,
|
|
widthIn: 40,
|
|
heightIn: 48,
|
|
},
|
|
{
|
|
cargoType: "box",
|
|
quantity: 2,
|
|
weightLb: 250,
|
|
lengthIn: 50,
|
|
widthIn: 40,
|
|
heightIn: 50,
|
|
},
|
|
]),
|
|
"CUST_001",
|
|
);
|
|
expect(body.cargo_lines).toHaveLength(2);
|
|
expect(body.cargo_lines?.[1]?.cargo_type).toBe("box");
|
|
expect(body.pallet_count).toBe(4);
|
|
});
|
|
|
|
it("透传二级 details 字段", () => {
|
|
const body = buildQuoteRequestBodyFromLoggedIn(
|
|
payload([
|
|
{
|
|
cargoType: "pallet",
|
|
quantity: 1,
|
|
weightLb: 100,
|
|
lengthIn: 48,
|
|
widthIn: 40,
|
|
heightIn: 48,
|
|
},
|
|
]),
|
|
"CUST_001",
|
|
{
|
|
pickup: {
|
|
companyName: "Pickup Co",
|
|
suite: "Ste 100",
|
|
contactFirst: "A",
|
|
contactLast: "B",
|
|
contactEmail: "pickup@example.com",
|
|
contactPhone: "5551112222",
|
|
reference: "REF-1",
|
|
notes: "note",
|
|
opensAt: "8:00 AM",
|
|
closesAt: "5:00 PM",
|
|
},
|
|
delivery: {
|
|
companyName: "Delivery Co",
|
|
suite: "",
|
|
contactFirst: "C",
|
|
contactLast: "D",
|
|
contactEmail: "delivery@example.com",
|
|
contactPhone: "5553334444",
|
|
reference: "",
|
|
notes: "",
|
|
opensAt: "9:00 AM",
|
|
closesAt: "6:00 PM",
|
|
},
|
|
requestDeliveryAppointment: true,
|
|
fbaNumber: "FBA-123",
|
|
fbaPoNumber: "PO-456",
|
|
cargo: [
|
|
{
|
|
pieceCountType: "Pieces",
|
|
pieceCountQty: 10,
|
|
description: "General freight",
|
|
nmfc: "",
|
|
hazmat: false,
|
|
alcohol: false,
|
|
tobacco: false,
|
|
},
|
|
],
|
|
},
|
|
);
|
|
expect(body.mothership_details?.pickup.company_name).toBe("Pickup Co");
|
|
expect(body.mothership_details?.delivery.contact_email).toBe(
|
|
"delivery@example.com",
|
|
);
|
|
expect(body.mothership_details?.request_delivery_appointment).toBe(true);
|
|
expect(body.mothership_details?.cargo?.[0]?.piece_count_type).toBe("Pieces");
|
|
});
|
|
});
|