Files
zkxw/backend/tests/test_sample_freight.py
T
zlwuandCursor 6d542a0acf feat(backend): add sample freight CRUD and link/unlink
Provide freight batch create/update/link/unlink, sample enrichment map, and protocol-save draft grouping without writing legacy transport rows.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-08 07:47:41 +08:00

66 lines
2.0 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("")
if __name__ == "__main__":
unittest.main()