147 lines
4.9 KiB
Python
147 lines
4.9 KiB
Python
"""
|
||
陆运五套询价必填校验。不连 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()
|