"""包材订单状态与 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()