| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- """编辑出入库:有计划号必须存在,且产品只能是该计划的产品。"""
- from types import SimpleNamespace
- import pytest
- from fastapi import HTTPException
- from app.api.db.inventory import _enforce_inventory_plan_on_edit
- class _Query:
- def __init__(self, rows):
- self.rows = rows
- def filter(self, *args, **kwargs):
- return self
- def all(self):
- return self.rows
- def _db(rows):
- db = SimpleNamespace()
- db.query = lambda model: _Query(rows)
- return db
- def _row(**kwargs):
- data = {
- "tenant_no": "t1",
- "plan_no": None,
- "product_id": "p-old",
- "purchase_plan_id": None,
- "partner_company": "",
- "business_type": "",
- }
- data.update(kwargs)
- return SimpleNamespace(**data)
- def _plan(**kwargs):
- data = {
- "id": "plan-1",
- "plan_no": "JH-1",
- "product_id": "p-plan",
- "customer_name": "山峡客户",
- "business_type": "入库",
- }
- data.update(kwargs)
- return SimpleNamespace(**data)
- def test_empty_plan_no_skips_product_restriction():
- payload = {"plan_no": " ", "product_id": "any-product", "purchase_plan_id": "old"}
- _enforce_inventory_plan_on_edit(_db([]), _row(), payload)
- assert payload["plan_no"] is None
- assert payload["purchase_plan_id"] is None
- assert payload["product_id"] == "any-product"
- def test_missing_plan_no_is_rejected():
- payload = {"plan_no": "JH-404", "product_id": "p1"}
- with pytest.raises(HTTPException) as exc:
- _enforce_inventory_plan_on_edit(_db([]), _row(), payload)
- assert exc.value.status_code == 400
- assert exc.value.detail == "计划号不存在"
- def test_product_must_match_plan():
- payload = {"plan_no": "JH-1", "product_id": "p-other"}
- with pytest.raises(HTTPException) as exc:
- _enforce_inventory_plan_on_edit(_db([_plan()]), _row(), payload)
- assert exc.value.detail == "有计划号时,产品只能选择该计划的产品"
- def test_partner_must_match_plan():
- payload = {
- "plan_no": "JH-1",
- "product_id": "p-plan",
- "partner_company": "其他单位",
- "business_type": "入库",
- }
- with pytest.raises(HTTPException) as exc:
- _enforce_inventory_plan_on_edit(_db([_plan()]), _row(), payload)
- assert exc.value.detail == "有计划号时,往来单位必须与该计划一致"
- def test_business_type_must_match_plan():
- payload = {
- "plan_no": "JH-1",
- "product_id": "p-plan",
- "partner_company": "山峡客户",
- "business_type": "出库",
- }
- with pytest.raises(HTTPException) as exc:
- _enforce_inventory_plan_on_edit(_db([_plan()]), _row(), payload)
- assert exc.value.detail == "有计划号时,业务类型必须与该计划一致"
- def test_matching_plan_binds_product_partner_and_business_type():
- payload = {
- "plan_no": "JH-1",
- "product_id": "p-plan",
- "partner_company": "山峡客户",
- "business_type": "入库",
- }
- _enforce_inventory_plan_on_edit(_db([_plan()]), _row(), payload)
- assert payload["product_id"] == "p-plan"
- assert payload["partner_company"] == "山峡客户"
- assert payload["business_type"] == "入库"
- assert payload["purchase_plan_id"] == "plan-1"
- assert payload["plan_no"] == "JH-1"
- def test_payload_without_plan_or_product_is_ignored():
- payload = {"quantity": 1}
- _enforce_inventory_plan_on_edit(_db([]), _row(plan_no="JH-1"), payload)
- assert payload == {"quantity": 1}
|