test_protocol_sample_eta.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. """协议单样本预计到达时间:运费批次改造后仍应可写回运输表。"""
  2. import unittest
  3. from datetime import datetime
  4. from unittest.mock import MagicMock, patch
  5. from app.crud.collection_protocol import save_sample_transports
  6. from app.crud.research_donation import _create_transport
  7. class TestSaveSampleTransportsEta(unittest.TestCase):
  8. @patch("app.crud.collection_protocol.generate_uuid", return_value="tr-1")
  9. @patch("app.crud.collection_protocol._soft_delete_transports_for_protocol")
  10. def test_accepts_eta_only_without_transport_type(self, _soft_del, _uuid):
  11. db = MagicMock()
  12. sample = MagicMock()
  13. sample.id = "s1"
  14. sample.sample_code = "SC001"
  15. save_sample_transports(
  16. db,
  17. collection_protocol_id="p1",
  18. tenant_no="t1",
  19. user_id="u1",
  20. saved_samples=[sample],
  21. input_samples=[
  22. {"transport": {"etaTime": "2026-10-12 14:30:00"}},
  23. ],
  24. )
  25. self.assertTrue(db.add.called)
  26. obj = db.add.call_args[0][0]
  27. self.assertEqual(obj.sample_id, "s1")
  28. self.assertEqual(obj.eta_time, datetime(2026, 10, 12, 14, 30, 0))
  29. self.assertEqual(obj.transport_type, "")
  30. @patch("app.crud.collection_protocol.generate_uuid", return_value="tr-2")
  31. @patch("app.crud.collection_protocol._soft_delete_transports_for_protocol")
  32. def test_accepts_top_level_eta_time_for_mobile(self, _soft_del, _uuid):
  33. db = MagicMock()
  34. sample = MagicMock()
  35. sample.id = "s2"
  36. sample.sample_code = "SC002"
  37. save_sample_transports(
  38. db,
  39. collection_protocol_id="p1",
  40. tenant_no="t1",
  41. user_id="u1",
  42. saved_samples=[sample],
  43. input_samples=[{"etaTime": "2026-10-13 09:00:00"}],
  44. )
  45. self.assertTrue(db.add.called)
  46. obj = db.add.call_args[0][0]
  47. self.assertEqual(obj.eta_time, datetime(2026, 10, 13, 9, 0, 0))
  48. @patch("app.crud.collection_protocol._soft_delete_transports_for_protocol")
  49. def test_skips_when_no_eta_and_no_transport_type(self, _soft_del):
  50. db = MagicMock()
  51. sample = MagicMock()
  52. sample.id = "s3"
  53. sample.sample_code = "SC003"
  54. save_sample_transports(
  55. db,
  56. collection_protocol_id="p1",
  57. tenant_no="t1",
  58. user_id="u1",
  59. saved_samples=[sample],
  60. input_samples=[{"transport": {"waybillNo": "SF123"}}],
  61. )
  62. db.add.assert_not_called()
  63. class TestDonationCreateTransportEta(unittest.TestCase):
  64. @patch("app.crud.research_donation.generate_uuid", return_value="dtr-1")
  65. def test_create_transport_accepts_eta_only(self, _uuid):
  66. db = MagicMock()
  67. now = datetime(2026, 10, 12, 10, 0, 0)
  68. obj = _create_transport(
  69. db,
  70. donation_id="d1",
  71. sample_id="s1",
  72. tenant_no="t1",
  73. user_id="u1",
  74. raw={"etaTime": "2026-10-15 16:00:00"},
  75. order_num=0,
  76. now=now,
  77. sample_code="SC001",
  78. )
  79. self.assertIsNotNone(obj)
  80. self.assertEqual(obj.eta_time, datetime(2026, 10, 15, 16, 0, 0))
  81. self.assertEqual(obj.transport_type, "")
  82. db.add.assert_called_once()
  83. if __name__ == "__main__":
  84. unittest.main()