Files
zkxw/backend/tests/test_sample_freight.py
T
zlwuandCursor db31990ebe feat: 细胞存储缴费催缴、统一样本信息与协议支付能力增强
汇总近期业务改动:催缴菜单与后端、样本信息快捷登记与进度、运费关联、客户档案扩展、协议优惠/期次与押金划转,并同步 SQL 迁移与管理端页面收敛。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-10 21:20:37 +08:00

149 lines
4.9 KiB
Python

"""样本运费:运输方式字典解析与关联规则"""
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()