import unittest from unittest.mock import patch from routes import purchase class OrderPackagingBatchTest(unittest.TestCase): def test_each_order_uses_its_own_confirmation_batch(self): times = {347: '2026-10-07 18:17:54', 362: '2026-10-15 11:20:11'} calls = [] def read(sql, params): calls.append((sql, params)) if 'FROM overseas_orders' in sql: return [{'product_code': 'SKU', 'ordered_at': times[params[0]]}] self.assertIn('`来源产品编码`=%s AND `下单时间`=%s', sql) self.assertEqual(params[0], 'SKU') return [{'id': 10 if params[1] == times[347] else 20, 'material_code': 'OLD-MATERIAL', 'material_name': '历史包材', 'order_qty': 5000, 'arrival_qty': 123, 'order_time': params[1]}] with patch.object(purchase, 'query', side_effect=read): older = purchase._order_packaging_materials(347, 'overseas') newer = purchase._order_packaging_materials(362, 'overseas') self.assertNotEqual(older[0]['packaging_order_id'], newer[0]['packaging_order_id']) self.assertEqual(older[0]['arrival_qty'], 123) self.assertEqual(older[0]['material_name'], '历史包材') self.assertFalse(any('FROM bom ' in sql for sql, _ in calls)) def test_unlinked_or_date_only_history_does_not_use_latest_package(self): for stamp in (None, '', '2026-06-03'): with self.subTest(stamp=stamp), patch.object(purchase, 'query', return_value=[ {'product_code': 'SKU', 'ordered_at': stamp} ]) as read: self.assertEqual(purchase._order_packaging_materials(246, 'overseas'), []) self.assertEqual(read.call_count, 1) def test_no_packages_for_this_batch_does_not_fall_back(self): with patch.object(purchase, 'query', side_effect=[ [{'product_code': 'SKU', 'ordered_at': '2026-10-15 11:20:11'}], [] ]) as read: self.assertEqual(purchase._order_packaging_materials(362, 'overseas'), []) self.assertEqual(read.call_count, 2) def test_domestic_snapshot_and_inner_material_filter_preserved(self): with patch.object(purchase, 'query', side_effect=[ [{'product_code': 'SKU', 'ordered_at': '2026-10-15 11:20:11'}], [{'id': 1, 'material_code': 'M1', 'material_name': '包材'}, {'id': 2, 'material_code': 'SKU-NL', 'material_name': '内料'}] ]), patch.object(purchase, '_domestic_order_pre_packaging', return_value={'M1': 0}): rows = purchase._order_packaging_materials(1, 'domestic') self.assertEqual(len(rows), 1) self.assertEqual(rows[0]['pre_pack_qty'], 0)