52 lines
2.7 KiB
Python
52 lines
2.7 KiB
Python
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)
|