"""包材订单状态与 BOM 供应商字段回归测试。""" import unittest from pathlib import Path from unittest.mock import patch from routes.products import (_bom_material_supplier_sql, _normalize_bom_supplier, _sync_bom_supplier_from_product) from routes.purchase import PACKAGING_ORDER_STATUSES ROOT = Path(__file__).resolve().parents[1] APP_JS = (ROOT / 'static' / 'js' / 'app.js').read_text(encoding='utf-8') PRODUCTS_PY = (ROOT / 'routes' / 'products.py').read_text(encoding='utf-8') PURCHASE_PY = (ROOT / 'routes' / 'purchase.py').read_text(encoding='utf-8') class PackagingAndBomBugfixTest(unittest.TestCase): def test_packaging_statuses_are_limited_to_two(self): self.assertEqual(('未完结', '已完结'), PACKAGING_ORDER_STATUSES) packaging_start = APP_JS.index('function loadPackagingOrdersPage(container)') packaging_end = APP_JS.index('function packagingLoadFilters()', packaging_start) packaging_page = APP_JS[packaging_start:packaging_end] self.assertIn('', packaging_page) self.assertIn('', packaging_page) self.assertNotIn('分批送货', packaging_page) self.assertNotIn('已取消', packaging_page) # 国内/海外订单仍保留原有状态,避免本需求影响其他订单管理页面。 self.assertGreaterEqual(APP_JS.count("options:['未完结','已完结','分批送货','已取消']"), 2) def test_packaging_backend_rejects_removed_statuses(self): self.assertIn("if field == '状态' and value not in PACKAGING_ORDER_STATUSES", PURCHASE_PY) self.assertIn("if '状态' in fields and fields['状态'] not in PACKAGING_ORDER_STATUSES", PURCHASE_PY) def test_bom_invalid_type_is_not_used_as_supplier(self): self.assertEqual('', _normalize_bom_supplier('原料')) self.assertEqual('', _normalize_bom_supplier('包材')) self.assertEqual('广州供应商', _normalize_bom_supplier(' 广州供应商 ')) expression = _bom_material_supplier_sql() self.assertIn("TRIM(b.supplier) IN ('其他', '包材', '原料', '成品')", expression) self.assertIn('ms.supplier_name', expression) self.assertIn('m.supplier_name_match', expression) self.assertIn('_bom_material_supplier_sql()', PRODUCTS_PY) @patch('routes.products.query') def test_product_supplier_change_syncs_bom_snapshot(self, mock_query): mock_query.side_effect = [[{ 'product_code': 'M-001', 'product_type': '包材', 'supplier_name': '新供应商', }], 1] _sync_bom_supplier_from_product(product_id=9) self.assertEqual(2, mock_query.call_count) self.assertIn('UPDATE bom SET supplier=%s WHERE material_code=%s', mock_query.call_args_list[1].args[0]) self.assertEqual(('新供应商', 'M-001'), mock_query.call_args_list[1].args[1]) self.assertGreaterEqual( PRODUCTS_PY.count("_sync_bom_supplier_from_product("), 3) if __name__ == '__main__': unittest.main()