dy-dashboard/tests/test_order_packaging_batches.py
2026-10-28 11:14:17 +08:00

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)