test_collection_protocol_save_bundle.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. """采集协议单创建/更新子表持久化与字段名规范化测试。"""
  2. import unittest
  3. from unittest.mock import MagicMock, patch
  4. from app.crud.collection_protocol import (
  5. _normalize_fields,
  6. attachments_to_urls,
  7. lookup_attachments_by_urls,
  8. urls_to_attachment_list,
  9. upsert_party_customer,
  10. )
  11. class TestNormalizeFields(unittest.TestCase):
  12. def test_camel_case_to_snake(self):
  13. raw = {
  14. "customerId": "c1",
  15. "motherName": "张三",
  16. "motherBirthYm": "199001",
  17. "apgar1min": 9.5,
  18. "apgar5min": 10,
  19. }
  20. out = _normalize_fields(raw)
  21. self.assertEqual(out["customer_id"], "c1")
  22. self.assertEqual(out["mother_name"], "张三")
  23. self.assertEqual(out["mother_birth_ym"], "199001")
  24. self.assertEqual(out["apgar_1min"], 9.5)
  25. self.assertEqual(out["apgar_5min"], 10)
  26. class TestAttachmentsHelpers(unittest.TestCase):
  27. def test_attachments_to_urls(self):
  28. urls = attachments_to_urls(
  29. [{"fileUrl": "http://a/1.jpg"}, {"fileUrl": "http://a/2.jpg"}]
  30. )
  31. self.assertEqual(urls, "http://a/1.jpg,http://a/2.jpg")
  32. def test_urls_to_attachment_list(self):
  33. items = urls_to_attachment_list("http://x/a.pdf,http://x/b.png")
  34. self.assertEqual(len(items), 2)
  35. self.assertEqual(items[0]["fileUrl"], "http://x/a.pdf")
  36. def test_urls_to_attachment_list_uses_original_name_from_db(self):
  37. db = MagicMock()
  38. att = MagicMock()
  39. att.id = "att-1"
  40. att.original_name = "合同扫描件.pdf"
  41. att.file_url = "protocol/2025/05/16/abc.pdf"
  42. att.file_size = 2048
  43. att.file_type = "application/pdf"
  44. q = MagicMock()
  45. db.query.return_value = q
  46. q.filter.return_value = q
  47. q.first.return_value = att
  48. items = urls_to_attachment_list("protocol/2025/05/16/abc.pdf", db, "t1")
  49. self.assertEqual(len(items), 1)
  50. self.assertEqual(items[0]["fileName"], "合同扫描件.pdf")
  51. self.assertEqual(items[0]["id"], "att-1")
  52. def test_urls_to_attachment_list_uses_prefetched_map(self):
  53. att = MagicMock()
  54. att.id = "att-2"
  55. att.original_name = "报告.pdf"
  56. att.file_url = "qc/a.pdf"
  57. att.file_size = 1024
  58. att.file_type = "application/pdf"
  59. items = urls_to_attachment_list(
  60. "qc/a.pdf,qc/missing.pdf",
  61. db=MagicMock(),
  62. tenant_no="t1",
  63. attachment_by_url={"qc/a.pdf": att},
  64. )
  65. self.assertEqual(len(items), 2)
  66. self.assertEqual(items[0]["fileName"], "报告.pdf")
  67. self.assertEqual(items[0]["id"], "att-2")
  68. self.assertEqual(items[1]["fileName"], "missing.pdf")
  69. self.assertNotIn("id", items[1])
  70. def test_lookup_attachments_by_urls_batches_exact_match(self):
  71. db = MagicMock()
  72. att = MagicMock()
  73. att.file_url = "qc/a.pdf"
  74. q = MagicMock()
  75. db.query.return_value = q
  76. q.filter.return_value = q
  77. q.all.return_value = [att]
  78. out = lookup_attachments_by_urls(db, ["qc/a.pdf", "qc/a.pdf", ""], "t1")
  79. self.assertEqual(out["qc/a.pdf"], att)
  80. db.query.assert_called_once()
  81. class TestUpsertPartyCustomer(unittest.TestCase):
  82. @patch("app.crud.collection_protocol.get_party_customer")
  83. def test_upsert_applies_camel_case_fields(self, mock_get):
  84. mock_get.return_value = None
  85. db = MagicMock()
  86. fields = {
  87. "motherName": "李四",
  88. "motherPhone": "13800000000",
  89. "motherIdCard": "110101199001011234",
  90. "motherBirthYm": "199001",
  91. "fatherName": "王五",
  92. }
  93. upsert_party_customer(db, "proto-1", "t1", "u1", **fields)
  94. added = db.add.call_args[0][0]
  95. self.assertEqual(added.mother_name, "李四")
  96. self.assertEqual(added.mother_phone, "13800000000")
  97. self.assertEqual(added.mother_id_card, "110101199001011234")
  98. self.assertEqual(added.mother_birth_ym, "199001")
  99. self.assertEqual(added.father_name, "王五")
  100. if __name__ == "__main__":
  101. unittest.main()