test_pl_plan_price_mask.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. from datetime import date, datetime
  2. from decimal import Decimal
  3. from app.schemas.pl.plan import (
  4. PlanLoadRead,
  5. PlanProductRead,
  6. PlanStopProductRead,
  7. PlanWithProducts,
  8. )
  9. from app.services.pl_plan_price_mask import mask_plan_with_products_prices
  10. def _minimal_plan(**kwargs):
  11. base = dict(
  12. id="p1",
  13. plan_no="P001",
  14. belongs_company="shanxia",
  15. create_date=date(2026, 9, 1),
  16. total_amount=Decimal("100.00"),
  17. freight_amount=Decimal("50.00"),
  18. tenant_no="t1",
  19. create_time=datetime(2026, 9, 1),
  20. update_time=datetime(2026, 9, 1),
  21. products=[],
  22. deliveries=[],
  23. )
  24. base.update(kwargs)
  25. return PlanWithProducts.model_validate(base)
  26. def test_mask_clears_plan_and_product_prices():
  27. product = PlanProductRead.model_validate(
  28. {
  29. "id": "pp1",
  30. "planId": "p1",
  31. "tenantNo": "t1",
  32. "createTime": "2026-09-01T00:00:00",
  33. "updateTime": "2026-09-01T00:00:00",
  34. "productId": "g1",
  35. "productNo": "N1",
  36. "productName": "尿素",
  37. "inboundPrice": "12.5",
  38. "inboundAmount": "125",
  39. "outboundPrice": "13",
  40. "outboundAmount": "130",
  41. "brandQtys": [
  42. {"brandId": "b1", "brandName": "君正", "qty": "10", "unitPrice": "12.5"}
  43. ],
  44. }
  45. )
  46. stop_product = PlanStopProductRead.model_validate(
  47. {
  48. "id": "sp1",
  49. "planId": "p1",
  50. "tenantNo": "t1",
  51. "createTime": "2026-09-01T00:00:00",
  52. "updateTime": "2026-09-01T00:00:00",
  53. "productId": "g1",
  54. "productNo": "N1",
  55. "productName": "尿素",
  56. "inboundPrice": "12.5",
  57. "inboundAmount": "125",
  58. "brandQtys": [{"brandId": "b1", "qty": "10", "unitPrice": "12.5"}],
  59. }
  60. )
  61. plan = _minimal_plan(
  62. products=[product],
  63. load=PlanLoadRead.model_validate(
  64. {
  65. "id": "l1",
  66. "planId": "p1",
  67. "stopKind": "load",
  68. "products": [stop_product],
  69. "tenantNo": "t1",
  70. "createTime": "2026-09-01T00:00:00",
  71. "updateTime": "2026-09-01T00:00:00",
  72. }
  73. ),
  74. )
  75. out = mask_plan_with_products_prices(plan)
  76. assert out.total_amount == Decimal("0")
  77. assert out.freight_amount == Decimal("0")
  78. assert out.products[0].inbound_price is None
  79. assert out.products[0].inbound_amount is None
  80. assert out.products[0].outbound_price is None
  81. assert out.products[0].outbound_amount is None
  82. assert out.products[0].brand_qtys[0].unit_price is None
  83. assert out.load.products[0].inbound_price is None
  84. assert out.load.products[0].brand_qtys[0].unit_price is None
  85. def test_mask_is_noop_when_disabled():
  86. plan = _minimal_plan(total_amount=Decimal("9"), freight_amount=Decimal("8"))
  87. out = mask_plan_with_products_prices(plan, enabled=False)
  88. assert out.total_amount == Decimal("9")
  89. assert out.freight_amount == Decimal("8")