"""协议单样本预计到达时间:运费批次改造后仍应可写回运输表。""" 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()