101 lines
3.3 KiB
Python
101 lines
3.3 KiB
Python
"""协议单样本预计到达时间:运费批次改造后仍应可写回运输表。"""
|
|
|
|
import unittest
|
|
from datetime import datetime
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
from app.crud.collection_protocol import save_sample_transports
|
|
from app.crud.research_donation import _create_transport
|
|
|
|
|
|
class TestSaveSampleTransportsEta(unittest.TestCase):
|
|
@patch("app.crud.collection_protocol.generate_uuid", return_value="tr-1")
|
|
@patch("app.crud.collection_protocol._soft_delete_transports_for_protocol")
|
|
def test_accepts_eta_only_without_transport_type(self, _soft_del, _uuid):
|
|
db = MagicMock()
|
|
sample = MagicMock()
|
|
sample.id = "s1"
|
|
sample.sample_code = "SC001"
|
|
|
|
save_sample_transports(
|
|
db,
|
|
collection_protocol_id="p1",
|
|
tenant_no="t1",
|
|
user_id="u1",
|
|
saved_samples=[sample],
|
|
input_samples=[
|
|
{"transport": {"etaTime": "2026-10-12 14:30:00"}},
|
|
],
|
|
)
|
|
|
|
self.assertTrue(db.add.called)
|
|
obj = db.add.call_args[0][0]
|
|
self.assertEqual(obj.sample_id, "s1")
|
|
self.assertEqual(obj.eta_time, datetime(2026, 10, 12, 14, 30, 0))
|
|
self.assertEqual(obj.transport_type, "")
|
|
|
|
@patch("app.crud.collection_protocol.generate_uuid", return_value="tr-2")
|
|
@patch("app.crud.collection_protocol._soft_delete_transports_for_protocol")
|
|
def test_accepts_top_level_eta_time_for_mobile(self, _soft_del, _uuid):
|
|
db = MagicMock()
|
|
sample = MagicMock()
|
|
sample.id = "s2"
|
|
sample.sample_code = "SC002"
|
|
|
|
save_sample_transports(
|
|
db,
|
|
collection_protocol_id="p1",
|
|
tenant_no="t1",
|
|
user_id="u1",
|
|
saved_samples=[sample],
|
|
input_samples=[{"etaTime": "2026-10-13 09:00:00"}],
|
|
)
|
|
|
|
self.assertTrue(db.add.called)
|
|
obj = db.add.call_args[0][0]
|
|
self.assertEqual(obj.eta_time, datetime(2026, 10, 13, 9, 0, 0))
|
|
|
|
@patch("app.crud.collection_protocol._soft_delete_transports_for_protocol")
|
|
def test_skips_when_no_eta_and_no_transport_type(self, _soft_del):
|
|
db = MagicMock()
|
|
sample = MagicMock()
|
|
sample.id = "s3"
|
|
sample.sample_code = "SC003"
|
|
|
|
save_sample_transports(
|
|
db,
|
|
collection_protocol_id="p1",
|
|
tenant_no="t1",
|
|
user_id="u1",
|
|
saved_samples=[sample],
|
|
input_samples=[{"transport": {"waybillNo": "SF123"}}],
|
|
)
|
|
|
|
db.add.assert_not_called()
|
|
|
|
|
|
class TestDonationCreateTransportEta(unittest.TestCase):
|
|
@patch("app.crud.research_donation.generate_uuid", return_value="dtr-1")
|
|
def test_create_transport_accepts_eta_only(self, _uuid):
|
|
db = MagicMock()
|
|
now = datetime(2026, 10, 12, 10, 0, 0)
|
|
obj = _create_transport(
|
|
db,
|
|
donation_id="d1",
|
|
sample_id="s1",
|
|
tenant_no="t1",
|
|
user_id="u1",
|
|
raw={"etaTime": "2026-10-15 16:00:00"},
|
|
order_num=0,
|
|
now=now,
|
|
sample_code="SC001",
|
|
)
|
|
self.assertIsNotNone(obj)
|
|
self.assertEqual(obj.eta_time, datetime(2026, 10, 15, 16, 0, 0))
|
|
self.assertEqual(obj.transport_type, "")
|
|
db.add.assert_called_once()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|