import { describe, expect, it } from "vitest"; import { extractContainerHeaderFromText, matchShippingLineId, } from "@/services/parse/extract-container-header"; import { AIRLINE_ALIASES, EXPRESS_ALIASES, SHIPPING_LINE_ALIASES, } from "@/services/parse/carrier-aliases"; describe("matchShippingLineId", () => { it.each([ ["COSCO", "中国远洋海运集团有限公司", "cosco-cn"], ["OOCL", "东方海外货柜航运公司", "oocl-cn"], ["WAN HAI", "万海航运股份有限公司", "whl-cn"], ["HMM", "韩新海运", "hmm-cn"], ["MSC", "地中海航运", "msc-cn"], ["EMC", "长荣海运", "emc-cn"], ["EGLV", "长荣海运", "emc-cn"], ["CMA CGM", "达飞轮船", "cma-cn"], ["ZIM", "以星综合航运", "zim-cn"], ["ZIMU", "以星综合航运", "zim-cn"], ["ONE", "海洋网联船务", "one-cn"], ["ONEY", "海洋网联船务", "one-cn"], ["MATSON", "美森轮船", "matson-cn"], ])("matches alias %s to shipping line %s", (hint, fullName, expectedId) => { const id = matchShippingLineId(hint, [ { F_Id: expectedId, F_FullName: fullName }, { F_Id: "other", F_FullName: "其他船司", F_EnCode: "OTHER" }, ]); expect(id).toBe(expectedId); }); it("infers sea mode and evergreen from EGLV master BL", () => { const h = extractContainerHeaderFromText( "柜号:TRHU8524770 提单号:EGLV143661466958 整柜直送", ); expect(h.F_BLCopyCode).toBe("EGLV143661466958"); expect(h.shipping_line_hint).toBe("EGLV"); expect(h.F_TransMode).toBe(0); const id = matchShippingLineId(h.shipping_line_hint, [ { F_Id: "eglv", F_FullName: "长荣海运", F_EnCode: "EMC", F_Prefix: "EGLV" }, ]); expect(id).toBe("eglv"); }); it("puts 封号 into memo, not other header fields", () => { const h = extractContainerHeaderFromText( "柜号:TRHU8524770 提单号:EGLV143661466958 封号:EMCEJJ0635 整柜直送", ); expect(h.F_BLCopyCode).toBe("EGLV143661466958"); expect(h.F_MemoRemark).toBe("封号:EMCEJJ0635"); expect(h.F_OperationType).toBe(2); }); }); describe("carrier-aliases catalog", () => { it("includes common express and airline aliases", () => { expect(EXPRESS_ALIASES.TNT).toContain("TNT EXPRESS"); expect(EXPRESS_ALIASES["4PX"]).toContain("递四方"); expect(AIRLINE_ALIASES.CA).toContain("中国国际航空"); expect(AIRLINE_ALIASES.FDX).toContain("联邦快递"); expect(SHIPPING_LINE_ALIASES.MAERSK).toContain("马士基"); expect(SHIPPING_LINE_ALIASES.PIL).toContain("太平船务"); }); it("infers air trans mode from airline aliases", () => { const h = extractContainerHeaderFromText( "航司 Air China 提单号 999-12345678 空运操作", ); expect(h.F_TransMode).toBe(1); }); it("parses loose ETA and bare COSCO from forecast body", () => { const h = extractContainerHeaderFromText( "FCIU7089474 提柜 COSCO 40HQ ETA:7.10 卡派拆柜派送", ); expect(h.F_CabinetType).toBe("40HQ"); expect(h.F_ETA).toMatch(/^\d{4}-07-10$/); expect(h.shipping_line_hint).toBe("COSCO"); expect(h.F_Dock).toBeUndefined(); }); });