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.

150 lines
3.8 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 type { CargoCommitProbe } from "@/workers/rpa/cargo-lock";
import {
buildWeightDisplayForUnit,
inferWeightUnitFromFieldHint,
isStaleCargoState,
probeWeightMatchesExpected,
resolveMotherShipWeightDisplay,
} from "@/workers/rpa/cargo-weight";
const expected500x2 = {
...resolveMotherShipWeightDisplay(500, "Weight (lbs)"),
palletCount: 2,
};
function probe(
overrides: Partial<CargoCommitProbe>,
): CargoCommitProbe {
return {
hasSummaryChip: true,
visibleEditableCargoInputs: 0,
editorOpen: false,
internalPalletCount: 2,
internalWeight: 500,
widgetTextPreview: "2 托盘s 40W, x 48L, x 48H, x 500Lbs",
...overrides,
};
}
describe("inferWeightUnitFromFieldHint", () => {
it("lbs placeholder → lb", () => {
expect(inferWeightUnitFromFieldHint("Weight (lbs)")).toBe("lb");
});
it("kg placeholder → kg", () => {
expect(inferWeightUnitFromFieldHint("Weight (kg)")).toBe("kg");
});
it("合并多 spec 字符串含 kg 时仍优先 lb有 lbs 标记)", () => {
const joined = "Weight (lbs) Weight (kg) 重量(公斤)";
expect(inferWeightUnitFromFieldHint(joined)).toBe("lb");
});
});
describe("buildWeightDisplayForUnit", () => {
it("lb 页直接填原始 lb不换算", () => {
expect(buildWeightDisplayForUnit(503, "lb")).toEqual({
displayValue: "503",
unit: "lb",
weightLbPerPallet: 503,
});
});
it("kg 页才换算", () => {
const r = buildWeightDisplayForUnit(500, "kg");
expect(r.unit).toBe("kg");
expect(Number(r.displayValue)).toBeCloseTo(226.8, 0);
});
});
describe("resolveMotherShipWeightDisplay", () => {
it("lbs 字段填单托 lb", () => {
expect(resolveMotherShipWeightDisplay(500, "Weight (lbs)")).toEqual({
displayValue: "500",
unit: "lb",
weightLbPerPallet: 500,
});
});
it("kg 字段填单托 kg", () => {
const r = resolveMotherShipWeightDisplay(500, "Weight (kg)");
expect(r.unit).toBe("kg");
expect(Number(r.displayValue)).toBeCloseTo(226.8, 0);
});
it("503lb 在 lbs 页不得变成 228.16", () => {
expect(resolveMotherShipWeightDisplay(503, "Weight (lbs)").displayValue).toBe(
"503",
);
});
});
describe("probeWeightMatchesExpected", () => {
it("单托 500lb × 2 托 → 匹配", () => {
expect(probeWeightMatchesExpected(probe({}), expected500x2)).toBe(true);
});
it("widget 残留 2296lb → 不匹配", () => {
expect(
probeWeightMatchesExpected(
probe({
internalWeight: 2296,
widgetTextPreview: "2 托盘s x 2296Lbs",
}),
expected500x2,
),
).toBe(false);
});
it("托盘数不一致 → 不匹配", () => {
expect(
probeWeightMatchesExpected(
probe({ internalPalletCount: 4 }),
expected500x2,
),
).toBe(false);
});
it("摘要总重匹配 → 通过", () => {
expect(
probeWeightMatchesExpected(
{
hasSummaryChip: true,
visibleEditableCargoInputs: 0,
editorOpen: false,
internalPalletCount: 3,
internalWeight: null,
widgetTextPreview: "3 托盘s x 1371Lbs",
},
{
displayValue: "457",
unit: "lb",
weightLbPerPallet: 457,
palletCount: 3,
},
),
).toBe(true);
});
});
describe("isStaleCargoState", () => {
it("无摘要 → 非残留", () => {
expect(
isStaleCargoState(
probe({ hasSummaryChip: false, internalWeight: null }),
expected500x2,
),
).toBe(false);
});
it("摘要重量错误 → 残留", () => {
expect(
isStaleCargoState(
probe({ internalWeight: 2296, widgetTextPreview: "x 2296Lbs" }),
expected500x2,
),
).toBe(true);
});
});