test_db_inventory_plan_lock.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. """编辑出入库:有计划号必须存在,且产品只能是该计划的产品。"""
  2. from types import SimpleNamespace
  3. import pytest
  4. from fastapi import HTTPException
  5. from app.api.db.inventory import _enforce_inventory_plan_on_edit
  6. class _Query:
  7. def __init__(self, rows):
  8. self.rows = rows
  9. def filter(self, *args, **kwargs):
  10. return self
  11. def all(self):
  12. return self.rows
  13. def _db(rows):
  14. db = SimpleNamespace()
  15. db.query = lambda model: _Query(rows)
  16. return db
  17. def _row(**kwargs):
  18. data = {
  19. "tenant_no": "t1",
  20. "plan_no": None,
  21. "product_id": "p-old",
  22. "purchase_plan_id": None,
  23. "partner_company": "",
  24. "business_type": "",
  25. }
  26. data.update(kwargs)
  27. return SimpleNamespace(**data)
  28. def _plan(**kwargs):
  29. data = {
  30. "id": "plan-1",
  31. "plan_no": "JH-1",
  32. "product_id": "p-plan",
  33. "customer_name": "山峡客户",
  34. "business_type": "入库",
  35. }
  36. data.update(kwargs)
  37. return SimpleNamespace(**data)
  38. def test_empty_plan_no_skips_product_restriction():
  39. payload = {"plan_no": " ", "product_id": "any-product", "purchase_plan_id": "old"}
  40. _enforce_inventory_plan_on_edit(_db([]), _row(), payload)
  41. assert payload["plan_no"] is None
  42. assert payload["purchase_plan_id"] is None
  43. assert payload["product_id"] == "any-product"
  44. def test_missing_plan_no_is_rejected():
  45. payload = {"plan_no": "JH-404", "product_id": "p1"}
  46. with pytest.raises(HTTPException) as exc:
  47. _enforce_inventory_plan_on_edit(_db([]), _row(), payload)
  48. assert exc.value.status_code == 400
  49. assert exc.value.detail == "计划号不存在"
  50. def test_product_must_match_plan():
  51. payload = {"plan_no": "JH-1", "product_id": "p-other"}
  52. with pytest.raises(HTTPException) as exc:
  53. _enforce_inventory_plan_on_edit(_db([_plan()]), _row(), payload)
  54. assert exc.value.detail == "有计划号时,产品只能选择该计划的产品"
  55. def test_partner_must_match_plan():
  56. payload = {
  57. "plan_no": "JH-1",
  58. "product_id": "p-plan",
  59. "partner_company": "其他单位",
  60. "business_type": "入库",
  61. }
  62. with pytest.raises(HTTPException) as exc:
  63. _enforce_inventory_plan_on_edit(_db([_plan()]), _row(), payload)
  64. assert exc.value.detail == "有计划号时,往来单位必须与该计划一致"
  65. def test_business_type_must_match_plan():
  66. payload = {
  67. "plan_no": "JH-1",
  68. "product_id": "p-plan",
  69. "partner_company": "山峡客户",
  70. "business_type": "出库",
  71. }
  72. with pytest.raises(HTTPException) as exc:
  73. _enforce_inventory_plan_on_edit(_db([_plan()]), _row(), payload)
  74. assert exc.value.detail == "有计划号时,业务类型必须与该计划一致"
  75. def test_matching_plan_binds_product_partner_and_business_type():
  76. payload = {
  77. "plan_no": "JH-1",
  78. "product_id": "p-plan",
  79. "partner_company": "山峡客户",
  80. "business_type": "入库",
  81. }
  82. _enforce_inventory_plan_on_edit(_db([_plan()]), _row(), payload)
  83. assert payload["product_id"] == "p-plan"
  84. assert payload["partner_company"] == "山峡客户"
  85. assert payload["business_type"] == "入库"
  86. assert payload["purchase_plan_id"] == "plan-1"
  87. assert payload["plan_no"] == "JH-1"
  88. def test_payload_without_plan_or_product_is_ignored():
  89. payload = {"quantity": 1}
  90. _enforce_inventory_plan_on_edit(_db([]), _row(plan_no="JH-1"), payload)
  91. assert payload == {"quantity": 1}