1
0
forked from erp-dev/erp

feat: pick up logic of api - stock_record_change.post to stock - services module

This commit is contained in:
2025-11-24 10:34:54 +08:00
parent 40ca4fc1c3
commit d1f83c7df1
3 changed files with 172 additions and 64 deletions

View File

@@ -371,6 +371,72 @@ class MakeStockChangeCompletedTestCase(StockServicesTestCase):
# 验证记录状态
self.stock_change_in.refresh_from_db()
self.assertTrue(self.stock_change_in.is_finished)
class CreateStockChangeRecordWithDetailsTestCase(StockServicesTestCase):
"""测试 create_stock_change_record_with_details 服务"""
def setUp(self):
super().setUp()
self.products_payload = [
{'product': self.product_fabric_a.id, 'quantity': [Decimal('10.00'), Decimal('20.50')]},
{'product': self.product_fabric_b.id, 'quantity': [Decimal('5.00')]}
]
def test_create_record_success(self):
"""创建库存变动记录并返回所有明细"""
record, details, created_count = services.create_stock_change_record_with_details(
merchant=self.merchant,
created_by=None,
type=models.StockChangeTypeEnum.ADD,
warehouse_id=self.warehouse_main.id,
source_type=models.StockChangeSourceEnum.PURCHASE,
source_id=self.purchase_order.id,
products=self.products_payload,
)
self.assertEqual(record.details.count(), 3)
self.assertEqual(len(details), 3)
self.assertEqual(created_count, 3)
self.assertEqual(record.merchant, self.merchant)
self.assertEqual(record.warehouse, self.warehouse_main)
self.assertCountEqual(
[Decimal('10.00'), Decimal('20.50'), Decimal('5.00')],
[detail.quantity for detail in details]
)
def test_auto_complete_triggers_completion(self):
"""商户开启自动确认时会调用完成逻辑"""
self.merchant.auto_complete_stock_change = True
self.merchant.save()
with patch('stock.services.make_stock_change_completed') as mock_complete:
services.create_stock_change_record_with_details(
merchant=self.merchant,
created_by=None,
type=models.StockChangeTypeEnum.ADD,
warehouse_id=self.warehouse_main.id,
source_type=models.StockChangeSourceEnum.PURCHASE,
source_id=self.purchase_order.id,
products=self.products_payload,
)
mock_complete.assert_called_once()
def test_invalid_product_raises_error(self):
"""无效的产品ID会触发 ValueError"""
products = [{'product': 99999, 'quantity': [Decimal('1.00')]}]
with self.assertRaises(ValueError):
services.create_stock_change_record_with_details(
merchant=self.merchant,
created_by=None,
type=models.StockChangeTypeEnum.ADD,
warehouse_id=self.warehouse_main.id,
source_type=models.StockChangeSourceEnum.PURCHASE,
source_id=self.purchase_order.id,
products=products,
)
def test_complete_outbound_record(self):
"""测试完成出库记录"""