|
|
@@ -0,0 +1,37 @@
|
|
|
+"""质检物料批次列表:剩余库存过滤语义。"""
|
|
|
+import unittest
|
|
|
+from decimal import Decimal
|
|
|
+
|
|
|
+from app.crud.qc_material_batch_stock_status import (
|
|
|
+ batch_matches_stock_status,
|
|
|
+ normalize_batch_stock_status,
|
|
|
+)
|
|
|
+
|
|
|
+
|
|
|
+class TestNormalizeBatchStockStatus(unittest.TestCase):
|
|
|
+ def test_available_and_exhausted(self):
|
|
|
+ self.assertEqual(normalize_batch_stock_status("available"), "available")
|
|
|
+ self.assertEqual(normalize_batch_stock_status("exhausted"), "exhausted")
|
|
|
+ self.assertEqual(normalize_batch_stock_status(" Available "), "available")
|
|
|
+
|
|
|
+ def test_all_empty_invalid_map_to_none(self):
|
|
|
+ self.assertIsNone(normalize_batch_stock_status(None))
|
|
|
+ self.assertIsNone(normalize_batch_stock_status(""))
|
|
|
+ self.assertIsNone(normalize_batch_stock_status("all"))
|
|
|
+ self.assertIsNone(normalize_batch_stock_status("bogus"))
|
|
|
+
|
|
|
+
|
|
|
+class TestBatchMatchesStockStatus(unittest.TestCase):
|
|
|
+ def test_all_always_true(self):
|
|
|
+ self.assertTrue(batch_matches_stock_status(0, "all"))
|
|
|
+ self.assertTrue(batch_matches_stock_status(1, None))
|
|
|
+
|
|
|
+ def test_available_gt_zero(self):
|
|
|
+ self.assertTrue(batch_matches_stock_status(Decimal("0.1"), "available"))
|
|
|
+ self.assertFalse(batch_matches_stock_status(0, "available"))
|
|
|
+ self.assertFalse(batch_matches_stock_status(Decimal("0"), "available"))
|
|
|
+
|
|
|
+ def test_exhausted_eq_zero(self):
|
|
|
+ self.assertTrue(batch_matches_stock_status(0, "exhausted"))
|
|
|
+ self.assertTrue(batch_matches_stock_status(Decimal("0.0000"), "exhausted"))
|
|
|
+ self.assertFalse(batch_matches_stock_status(1, "exhausted"))
|