test_sample_freight.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. """样本运费:运输方式字典解析与关联规则"""
  2. import unittest
  3. from decimal import Decimal
  4. from unittest.mock import MagicMock
  5. from app.services.sample_transport_mode import resolve_transport_mode_value
  6. class TestResolveTransportMode(unittest.TestCase):
  7. def test_empty_raises(self):
  8. db = MagicMock()
  9. with self.assertRaises(ValueError):
  10. resolve_transport_mode_value(db, tenant_no="zkxw", raw="", user_id=None)
  11. def test_hit_by_value(self):
  12. db = MagicMock()
  13. type_exists = MagicMock()
  14. row = MagicMock(dict_value="sfkd", dict_label="顺丰快递", del_flag=0)
  15. db.query.return_value.filter.return_value.first.side_effect = [type_exists, row]
  16. self.assertEqual(
  17. resolve_transport_mode_value(db, tenant_no="zkxw", raw="sfkd", user_id=None),
  18. "sfkd",
  19. )
  20. def test_hit_by_label_then_create_path_not_called(self):
  21. db = MagicMock()
  22. type_exists = MagicMock()
  23. miss = None
  24. hit = MagicMock(dict_value="zxc", dict_label="专线车", del_flag=0)
  25. db.query.return_value.filter.return_value.first.side_effect = [
  26. type_exists,
  27. miss,
  28. hit,
  29. ]
  30. self.assertEqual(
  31. resolve_transport_mode_value(db, tenant_no="zkxw", raw="专线车", user_id=None),
  32. "zxc",
  33. )
  34. db.add.assert_not_called()
  35. class TestFreightAmountValidation(unittest.TestCase):
  36. def test_negative_rejected(self):
  37. from app.crud.sample_freight import _parse_amount
  38. with self.assertRaises(ValueError):
  39. _parse_amount(-1)
  40. def test_zero_ok(self):
  41. from app.crud.sample_freight import _parse_amount
  42. self.assertEqual(_parse_amount(0), Decimal("0"))
  43. def test_empty_rejected(self):
  44. from app.crud.sample_freight import _parse_amount
  45. with self.assertRaises(ValueError):
  46. _parse_amount(None)
  47. with self.assertRaises(ValueError):
  48. _parse_amount("")
  49. class TestFreightListHelpers(unittest.TestCase):
  50. def test_item_dict_has_enrichment_keys(self):
  51. from app.crud.sample_freight import _item_to_dict_enriched
  52. class I:
  53. id = "i1"
  54. freight_id = "f1"
  55. sample_source = "cell_storage"
  56. sample_id = "s1"
  57. sample_code = "CODE1"
  58. protocol_id = "p1"
  59. d = _item_to_dict_enriched(
  60. I(),
  61. protocol_no="CP001",
  62. sample_type_name="脐带血",
  63. mother_name="张三",
  64. newborn_name="张小宝",
  65. )
  66. self.assertEqual(d["protocolNo"], "CP001")
  67. self.assertEqual(d["sampleTypeName"], "脐带血")
  68. self.assertEqual(d["sampleSource"], "cell_storage")
  69. self.assertEqual(d["motherName"], "张三")
  70. self.assertEqual(d["newbornName"], "张小宝")
  71. def test_row_dict_includes_create_by(self):
  72. from app.crud.sample_freight import _row_to_dict
  73. class F:
  74. id = "f1"
  75. freight_no = "YF20261008001"
  76. transport_mode = "sfkd"
  77. freight_amount = Decimal("10.00")
  78. tenant_no = "zkxw"
  79. order_num = 0
  80. remark = None
  81. create_by = "u1"
  82. create_time = None
  83. update_time = None
  84. d = _row_to_dict(F(), linked_sample_count=2, create_by_name="张三")
  85. self.assertEqual(d["createBy"], "u1")
  86. self.assertEqual(d["createByName"], "张三")
  87. self.assertEqual(d["linkedSampleCount"], 2)
  88. self.assertEqual(d["freightNo"], "YF20261008001")
  89. class TestGenerateFreightNo(unittest.TestCase):
  90. def test_first_of_day(self):
  91. from datetime import datetime
  92. from app.crud.sample_freight import _generate_freight_no
  93. db = MagicMock()
  94. db.query.return_value.filter.return_value.order_by.return_value.first.return_value = None
  95. no = _generate_freight_no(db, "zkxw", when=datetime(2026, 10, 8, 12, 0, 0))
  96. self.assertEqual(no, "YF20261008001")
  97. def test_increments_from_existing(self):
  98. from datetime import datetime
  99. from app.crud.sample_freight import _generate_freight_no
  100. db = MagicMock()
  101. db.query.return_value.filter.return_value.order_by.return_value.first.return_value = (
  102. "YF20261008003",
  103. )
  104. no = _generate_freight_no(db, "zkxw", when=datetime(2026, 10, 8, 12, 0, 0))
  105. self.assertEqual(no, "YF20261008004")
  106. def test_rejects_over_999(self):
  107. from datetime import datetime
  108. from app.crud.sample_freight import _generate_freight_no
  109. db = MagicMock()
  110. db.query.return_value.filter.return_value.order_by.return_value.first.return_value = (
  111. "YF20261008999",
  112. )
  113. with self.assertRaises(ValueError):
  114. _generate_freight_no(db, "zkxw", when=datetime(2026, 10, 8, 12, 0, 0))
  115. if __name__ == "__main__":
  116. unittest.main()