""" 陆运五套询价必填校验。不连 TMS。 """ from __future__ import annotations import os import sys import unittest ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) if ROOT not in sys.path: sys.path.insert(0, ROOT) from agent.schema.field_validate import ( display_name, harvest_oral_land_vehicle, promote_land_vehicle_from_container, shape_facts_for_chosen_mode, validate_required_fields, ) class LandFieldValidateTest(unittest.TestCase): def test_ltl_missing_volume(self): got = validate_required_fields( facts={"起运港": "广州", "目的港": "深圳", "品名": "衣服", "毛重": "50kg"}, business_line="LAND", land_subtype="国内运输拼车", ) self.assertFalse(got["ok"]) self.assertIn("体积", got["missing"]) def test_hk_lcl_skips_vehicle(self): """中港零担/集拼:询价不要车型/数量。""" got = validate_required_fields( facts={ "起运港": "广州", "目的港": "香港", "品名": "衣服", }, business_line="LAND", land_subtype="中港零担/集拼", ) self.assertTrue(got["ok"]) self.assertNotIn("车型/数量", got["missing"]) self.assertNotIn("体积", got["missing"]) self.assertNotIn("毛重", got["missing"]) def test_hk_full_truck_requires_vehicle(self): """中港整车:询价必填车型/数量。""" missing = validate_required_fields( facts={ "起运港": "广州", "目的港": "香港", "品名": "衣服", }, business_line="LAND", land_subtype="中港整车", ) self.assertFalse(missing["ok"]) self.assertIn("车型/数量", missing["missing"]) got = validate_required_fields( facts={ "起运港": "广州", "目的港": "香港", "品名": "衣服", "车型/数量": "9米6/1", }, business_line="LAND", land_subtype="中港整车", ) self.assertTrue(got["ok"]) self.assertEqual(got["facts"]["车型/数量"], "9米6/1") def test_domestic_ftl_one_field(self): got = validate_required_fields( facts={ "起运港": "广州", "目的港": "深圳", "品名": "衣服", "车型/数量": "9米6/1", }, business_line="LAND", land_subtype="国内运输整车", ) self.assertTrue(got["ok"]) self.assertEqual(got["facts"]["车型/数量"], "9米6/1") def test_cross_ftl_folds_split_keys(self): got = validate_required_fields( facts={ "起运港": "广州", "目的港": "河内", "品名": "衣服", "车型": "9米6", "数量": "1", }, business_line="LAND", land_subtype="跨境整车", ) self.assertTrue(got["ok"]) self.assertEqual(got["facts"]["车型/数量"], "9米6/1") def test_harvest_45hq_xiangche(self): """口语 45HQ(13.5厢车)必须写入车型/数量。""" text = ( "陆运,苏州市到谅山,中越整车,通信机柜及线缆配件," "45HQ(13.5厢车),9.11" ) got = harvest_oral_land_vehicle(text, {}) self.assertIn("45HQ", got.get("车型/数量", "")) self.assertIn("厢车", got.get("车型/数量", "")) def test_promote_container_to_land_vehicle(self): """陆运误入箱型箱量时改写到车型/数量,收口后仍保留。""" promoted = promote_land_vehicle_from_container( {"箱型箱量": "45HQ(13.5厢车)", "品名": "机柜"} ) self.assertEqual(promoted.get("车型/数量"), "45HQ(13.5厢车)") shaped = shape_facts_for_chosen_mode(promoted, "LAND") self.assertEqual(shaped.get("车型/数量"), "45HQ(13.5厢车)") self.assertFalse(shaped.get("箱型箱量")) def test_quote_date_defaults(self): got = validate_required_fields( facts={ "起运港": "广州", "目的港": "深圳", "品名": "衣服", "体积": "100CBM", "毛重": "50kg", }, business_line="LAND", land_subtype="国内运输拼车", ) self.assertTrue(got["ok"]) self.assertRegex(got["facts"]["报价日期"], r"^\d{4}-\d{2}-\d{2}$") def test_land_display_names(self): self.assertEqual(display_name("起运港", "LAND"), "始发站") self.assertEqual(display_name("品名", "LAND"), "货物品名") if __name__ == "__main__": unittest.main()