test_pl_plan_package_validate.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. """绑合同时计划段产品包装规格校验。"""
  2. from types import SimpleNamespace
  3. from app.services.pl_contract_plan_qty import validate_stop_products_package_against_contract
  4. def test_require_package_when_contract_bound():
  5. contract_products = [
  6. SimpleNamespace(product_id="p1", package_spec="25kg/桶"),
  7. SimpleNamespace(product_id="p1", package_spec="槽罐车"),
  8. ]
  9. ok, err = validate_stop_products_package_against_contract(
  10. contract_products=contract_products,
  11. stop_products=[SimpleNamespace(product_id="p1", package_spec="", product_name="次氯酸钠")],
  12. )
  13. assert ok is False
  14. assert err and "包装" in err
  15. def test_package_must_be_in_contract_set():
  16. contract_products = [
  17. SimpleNamespace(product_id="p1", package_spec="25kg/桶"),
  18. SimpleNamespace(product_id="p1", package_spec="槽罐车"),
  19. ]
  20. ok, err = validate_stop_products_package_against_contract(
  21. contract_products=contract_products,
  22. stop_products=[SimpleNamespace(product_id="p1", package_spec="吨桶", product_name="次氯酸钠")],
  23. )
  24. assert ok is False
  25. assert err and "合同" in err
  26. def test_valid_package_passes():
  27. contract_products = [
  28. SimpleNamespace(product_id="p1", package_spec="25kg/桶"),
  29. SimpleNamespace(product_id="p1", package_spec="槽罐车"),
  30. ]
  31. ok, err = validate_stop_products_package_against_contract(
  32. contract_products=contract_products,
  33. stop_products=[SimpleNamespace(product_id="p1", package_spec="槽罐车")],
  34. )
  35. assert ok is True
  36. assert err is None
  37. def test_product_not_on_contract_skipped():
  38. contract_products = [
  39. SimpleNamespace(product_id="p1", package_spec="槽罐车"),
  40. ]
  41. ok, err = validate_stop_products_package_against_contract(
  42. contract_products=contract_products,
  43. stop_products=[SimpleNamespace(product_id="p2", package_spec="")],
  44. )
  45. assert ok is True
  46. def test_contract_empty_package_allows_empty_plan():
  47. """脏数据防御:合同行包装为空时不强制计划填包装。"""
  48. contract_products = [
  49. SimpleNamespace(product_id="p1", package_spec=""),
  50. ]
  51. ok, err = validate_stop_products_package_against_contract(
  52. contract_products=contract_products,
  53. stop_products=[SimpleNamespace(product_id="p1", package_spec="")],
  54. )
  55. assert ok is True