"""样本运费:运输方式字典解析与关联规则""" import unittest from decimal import Decimal from unittest.mock import MagicMock from app.services.sample_transport_mode import resolve_transport_mode_value class TestResolveTransportMode(unittest.TestCase): def test_empty_raises(self): db = MagicMock() with self.assertRaises(ValueError): resolve_transport_mode_value(db, tenant_no="zkxw", raw="", user_id=None) def test_hit_by_value(self): db = MagicMock() type_exists = MagicMock() row = MagicMock(dict_value="sfkd", dict_label="顺丰快递", del_flag=0) db.query.return_value.filter.return_value.first.side_effect = [type_exists, row] self.assertEqual( resolve_transport_mode_value(db, tenant_no="zkxw", raw="sfkd", user_id=None), "sfkd", ) def test_hit_by_label_then_create_path_not_called(self): db = MagicMock() type_exists = MagicMock() miss = None hit = MagicMock(dict_value="zxc", dict_label="专线车", del_flag=0) db.query.return_value.filter.return_value.first.side_effect = [ type_exists, miss, hit, ] self.assertEqual( resolve_transport_mode_value(db, tenant_no="zkxw", raw="专线车", user_id=None), "zxc", ) db.add.assert_not_called() class TestFreightAmountValidation(unittest.TestCase): def test_negative_rejected(self): from app.crud.sample_freight import _parse_amount with self.assertRaises(ValueError): _parse_amount(-1) def test_zero_ok(self): from app.crud.sample_freight import _parse_amount self.assertEqual(_parse_amount(0), Decimal("0")) def test_empty_rejected(self): from app.crud.sample_freight import _parse_amount with self.assertRaises(ValueError): _parse_amount(None) with self.assertRaises(ValueError): _parse_amount("") class TestFreightListHelpers(unittest.TestCase): def test_item_dict_has_enrichment_keys(self): from app.crud.sample_freight import _item_to_dict_enriched class I: id = "i1" freight_id = "f1" sample_source = "cell_storage" sample_id = "s1" sample_code = "CODE1" protocol_id = "p1" d = _item_to_dict_enriched( I(), protocol_no="CP001", sample_type_name="脐带血", mother_name="张三", newborn_name="张小宝", ) self.assertEqual(d["protocolNo"], "CP001") self.assertEqual(d["sampleTypeName"], "脐带血") self.assertEqual(d["sampleSource"], "cell_storage") self.assertEqual(d["motherName"], "张三") self.assertEqual(d["newbornName"], "张小宝") def test_row_dict_includes_create_by(self): from app.crud.sample_freight import _row_to_dict class F: id = "f1" freight_no = "YF20261008001" transport_mode = "sfkd" freight_amount = Decimal("10.00") tenant_no = "zkxw" order_num = 0 remark = None create_by = "u1" create_time = None update_time = None d = _row_to_dict(F(), linked_sample_count=2, create_by_name="张三") self.assertEqual(d["createBy"], "u1") self.assertEqual(d["createByName"], "张三") self.assertEqual(d["linkedSampleCount"], 2) self.assertEqual(d["freightNo"], "YF20261008001") class TestGenerateFreightNo(unittest.TestCase): def test_first_of_day(self): from datetime import datetime from app.crud.sample_freight import _generate_freight_no db = MagicMock() db.query.return_value.filter.return_value.order_by.return_value.first.return_value = None no = _generate_freight_no(db, "zkxw", when=datetime(2026, 10, 8, 12, 0, 0)) self.assertEqual(no, "YF20261008001") def test_increments_from_existing(self): from datetime import datetime from app.crud.sample_freight import _generate_freight_no db = MagicMock() db.query.return_value.filter.return_value.order_by.return_value.first.return_value = ( "YF20261008003", ) no = _generate_freight_no(db, "zkxw", when=datetime(2026, 10, 8, 12, 0, 0)) self.assertEqual(no, "YF20261008004") def test_rejects_over_999(self): from datetime import datetime from app.crud.sample_freight import _generate_freight_no db = MagicMock() db.query.return_value.filter.return_value.order_by.return_value.first.return_value = ( "YF20261008999", ) with self.assertRaises(ValueError): _generate_freight_no(db, "zkxw", when=datetime(2026, 10, 8, 12, 0, 0)) if __name__ == "__main__": unittest.main()