test_customer_relations.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. """客户关联协议 / 同单家庭成员聚合"""
  2. import unittest
  3. from datetime import datetime
  4. from types import SimpleNamespace
  5. from unittest.mock import MagicMock, patch
  6. from app.services.customer_relations import (
  7. build_customer_relations,
  8. party_members,
  9. resolve_my_role,
  10. )
  11. class TestResolveMyRole(unittest.TestCase):
  12. def test_mother_father_newborn(self):
  13. party = SimpleNamespace(
  14. customer_id="m1",
  15. father_customer_id="f1",
  16. newborn_customer_id="n1",
  17. )
  18. self.assertEqual(resolve_my_role(party, "m1"), "mother")
  19. self.assertEqual(resolve_my_role(party, "f1"), "father")
  20. self.assertEqual(resolve_my_role(party, "n1"), "newborn")
  21. def test_unknown_returns_empty(self):
  22. party = SimpleNamespace(
  23. customer_id="m1",
  24. father_customer_id=None,
  25. newborn_customer_id="",
  26. )
  27. self.assertEqual(resolve_my_role(party, "x"), "")
  28. class TestPartyMembers(unittest.TestCase):
  29. def test_includes_named_roles_only(self):
  30. party = SimpleNamespace(
  31. customer_id="m1",
  32. mother_name="妈",
  33. mother_phone="1",
  34. mother_id_card="idm",
  35. father_customer_id="f1",
  36. father_name="爸",
  37. father_phone="2",
  38. father_id_card="idf",
  39. newborn_customer_id=None,
  40. newborn_name="",
  41. newborn_id_card="",
  42. )
  43. members = party_members(party)
  44. roles = [m["role"] for m in members]
  45. self.assertEqual(roles, ["mother", "father"])
  46. self.assertEqual(members[0]["customerId"], "m1")
  47. self.assertEqual(members[0]["name"], "妈")
  48. self.assertEqual(members[1]["name"], "爸")
  49. def test_name_without_customer_id_still_listed(self):
  50. party = SimpleNamespace(
  51. customer_id=None,
  52. mother_name="妈",
  53. mother_phone="",
  54. mother_id_card="",
  55. father_customer_id=None,
  56. father_name="",
  57. father_phone="",
  58. father_id_card="",
  59. newborn_customer_id=None,
  60. newborn_name="宝",
  61. newborn_id_card="",
  62. )
  63. members = party_members(party)
  64. self.assertEqual(len(members), 2)
  65. newborn = next(m for m in members if m["role"] == "newborn")
  66. self.assertEqual(newborn["customerId"], "")
  67. self.assertEqual(newborn["name"], "宝")
  68. class TestBuildCustomerRelations(unittest.TestCase):
  69. def test_missing_customer_returns_none(self):
  70. db = MagicMock()
  71. with patch("app.services.customer_relations.customer_crud.get_customer", return_value=None):
  72. self.assertIsNone(build_customer_relations(db, "c1", "zkxw"))
  73. def test_two_protocols_sorted_and_roles(self):
  74. db = MagicMock()
  75. customer = SimpleNamespace(id="m1", customer_name="妈")
  76. older = (
  77. SimpleNamespace(
  78. customer_id="m1",
  79. father_customer_id="f1",
  80. newborn_customer_id="n1",
  81. mother_name="妈",
  82. mother_phone="",
  83. mother_id_card="",
  84. father_name="爸",
  85. father_phone="",
  86. father_id_card="",
  87. newborn_name="宝",
  88. newborn_id_card="",
  89. ),
  90. SimpleNamespace(
  91. id="p-old",
  92. protocol_no="P001",
  93. protocol_status="sxz",
  94. register_date="20260101",
  95. create_time=datetime(2026, 1, 1, 10, 0, 0),
  96. ),
  97. )
  98. newer = (
  99. SimpleNamespace(
  100. customer_id="m1",
  101. father_customer_id=None,
  102. newborn_customer_id=None,
  103. mother_name="妈",
  104. mother_phone="",
  105. mother_id_card="",
  106. father_name="",
  107. father_phone="",
  108. father_id_card="",
  109. newborn_name="",
  110. newborn_id_card="",
  111. ),
  112. SimpleNamespace(
  113. id="p-new",
  114. protocol_no="P002",
  115. protocol_status="dsx",
  116. register_date="20260301",
  117. create_time=datetime(2026, 3, 1, 10, 0, 0),
  118. ),
  119. )
  120. donation = (
  121. SimpleNamespace(
  122. customer_id=None,
  123. father_customer_id="m1",
  124. newborn_customer_id=None,
  125. mother_name="他妈",
  126. mother_phone="",
  127. mother_id_card="",
  128. father_name="爸本人",
  129. father_phone="",
  130. father_id_card="",
  131. newborn_name="",
  132. newborn_id_card="",
  133. ),
  134. SimpleNamespace(
  135. id="d1",
  136. donation_no="D001",
  137. donation_status="sxz",
  138. donation_date="20260201",
  139. create_time=datetime(2026, 2, 1, 10, 0, 0),
  140. ),
  141. )
  142. with patch("app.services.customer_relations.customer_crud.get_customer", return_value=customer):
  143. with patch("app.services.customer_relations.customer_crud._row_to_dict", return_value={"id": "m1"}):
  144. with patch(
  145. "app.services.customer_relations._fetch_storage_party_rows",
  146. return_value=[older, newer],
  147. ):
  148. with patch(
  149. "app.services.customer_relations._fetch_donation_party_rows",
  150. return_value=[donation],
  151. ):
  152. data = build_customer_relations(db, "m1", "zkxw")
  153. self.assertIsNotNone(data)
  154. groups = data["relatedGroups"]
  155. self.assertEqual(len(groups), 3)
  156. # create_time desc: p-new, d1, p-old
  157. self.assertEqual(groups[0]["protocolId"], "p-new")
  158. self.assertEqual(groups[0]["bizType"], "cell_storage")
  159. self.assertEqual(groups[0]["myRole"], "mother")
  160. self.assertEqual(groups[1]["protocolId"], "d1")
  161. self.assertEqual(groups[1]["bizType"], "research_donation")
  162. self.assertEqual(groups[1]["myRole"], "father")
  163. self.assertEqual(groups[2]["protocolNo"], "P001")
  164. self.assertEqual(len(groups[2]["members"]), 3)
  165. protocols = data["protocols"]
  166. self.assertEqual(len(protocols), 3)
  167. self.assertEqual(protocols[0]["protocolNo"], "P002")
  168. self.assertEqual(protocols[0]["registerDate"], "20260301")
  169. self.assertEqual(protocols[1]["protocolNo"], "D001")
  170. self.assertEqual(protocols[1]["myRole"], "father")