"""绑合同时计划段产品包装规格校验。""" from types import SimpleNamespace from app.services.pl_contract_plan_qty import validate_stop_products_package_against_contract def test_require_package_when_contract_bound(): contract_products = [ SimpleNamespace(product_id="p1", package_spec="25kg/桶"), SimpleNamespace(product_id="p1", package_spec="槽罐车"), ] ok, err = validate_stop_products_package_against_contract( contract_products=contract_products, stop_products=[SimpleNamespace(product_id="p1", package_spec="", product_name="次氯酸钠")], ) assert ok is False assert err and "包装" in err def test_package_must_be_in_contract_set(): contract_products = [ SimpleNamespace(product_id="p1", package_spec="25kg/桶"), SimpleNamespace(product_id="p1", package_spec="槽罐车"), ] ok, err = validate_stop_products_package_against_contract( contract_products=contract_products, stop_products=[SimpleNamespace(product_id="p1", package_spec="吨桶", product_name="次氯酸钠")], ) assert ok is False assert err and "合同" in err def test_valid_package_passes(): contract_products = [ SimpleNamespace(product_id="p1", package_spec="25kg/桶"), SimpleNamespace(product_id="p1", package_spec="槽罐车"), ] ok, err = validate_stop_products_package_against_contract( contract_products=contract_products, stop_products=[SimpleNamespace(product_id="p1", package_spec="槽罐车")], ) assert ok is True assert err is None def test_product_not_on_contract_skipped(): contract_products = [ SimpleNamespace(product_id="p1", package_spec="槽罐车"), ] ok, err = validate_stop_products_package_against_contract( contract_products=contract_products, stop_products=[SimpleNamespace(product_id="p2", package_spec="")], ) assert ok is True def test_contract_empty_package_allows_empty_plan(): """脏数据防御:合同行包装为空时不强制计划填包装。""" contract_products = [ SimpleNamespace(product_id="p1", package_spec=""), ] ok, err = validate_stop_products_package_against_contract( contract_products=contract_products, stop_products=[SimpleNamespace(product_id="p1", package_spec="")], ) assert ok is True