"""客户关联协议 / 同单家庭成员聚合""" import unittest from datetime import datetime from types import SimpleNamespace from unittest.mock import MagicMock, patch from app.services.customer_relations import ( build_customer_relations, party_members, resolve_my_role, ) class TestResolveMyRole(unittest.TestCase): def test_mother_father_newborn(self): party = SimpleNamespace( customer_id="m1", father_customer_id="f1", newborn_customer_id="n1", ) self.assertEqual(resolve_my_role(party, "m1"), "mother") self.assertEqual(resolve_my_role(party, "f1"), "father") self.assertEqual(resolve_my_role(party, "n1"), "newborn") def test_unknown_returns_empty(self): party = SimpleNamespace( customer_id="m1", father_customer_id=None, newborn_customer_id="", ) self.assertEqual(resolve_my_role(party, "x"), "") class TestPartyMembers(unittest.TestCase): def test_includes_named_roles_only(self): party = SimpleNamespace( customer_id="m1", mother_name="妈", mother_phone="1", mother_id_card="idm", father_customer_id="f1", father_name="爸", father_phone="2", father_id_card="idf", newborn_customer_id=None, newborn_name="", newborn_id_card="", ) members = party_members(party) roles = [m["role"] for m in members] self.assertEqual(roles, ["mother", "father"]) self.assertEqual(members[0]["customerId"], "m1") self.assertEqual(members[0]["name"], "妈") self.assertEqual(members[1]["name"], "爸") def test_name_without_customer_id_still_listed(self): party = SimpleNamespace( customer_id=None, mother_name="妈", mother_phone="", mother_id_card="", father_customer_id=None, father_name="", father_phone="", father_id_card="", newborn_customer_id=None, newborn_name="宝", newborn_id_card="", ) members = party_members(party) self.assertEqual(len(members), 2) newborn = next(m for m in members if m["role"] == "newborn") self.assertEqual(newborn["customerId"], "") self.assertEqual(newborn["name"], "宝") class TestBuildCustomerRelations(unittest.TestCase): def test_missing_customer_returns_none(self): db = MagicMock() with patch("app.services.customer_relations.customer_crud.get_customer", return_value=None): self.assertIsNone(build_customer_relations(db, "c1", "zkxw")) def test_two_protocols_sorted_and_roles(self): db = MagicMock() customer = SimpleNamespace(id="m1", customer_name="妈") older = ( SimpleNamespace( customer_id="m1", father_customer_id="f1", newborn_customer_id="n1", mother_name="妈", mother_phone="", mother_id_card="", father_name="爸", father_phone="", father_id_card="", newborn_name="宝", newborn_id_card="", ), SimpleNamespace( id="p-old", protocol_no="P001", protocol_status="sxz", register_date="20260101", create_time=datetime(2026, 1, 1, 10, 0, 0), ), ) newer = ( SimpleNamespace( customer_id="m1", father_customer_id=None, newborn_customer_id=None, mother_name="妈", mother_phone="", mother_id_card="", father_name="", father_phone="", father_id_card="", newborn_name="", newborn_id_card="", ), SimpleNamespace( id="p-new", protocol_no="P002", protocol_status="dsx", register_date="20260301", create_time=datetime(2026, 3, 1, 10, 0, 0), ), ) donation = ( SimpleNamespace( customer_id=None, father_customer_id="m1", newborn_customer_id=None, mother_name="他妈", mother_phone="", mother_id_card="", father_name="爸本人", father_phone="", father_id_card="", newborn_name="", newborn_id_card="", ), SimpleNamespace( id="d1", donation_no="D001", donation_status="sxz", donation_date="20260201", create_time=datetime(2026, 2, 1, 10, 0, 0), ), ) with patch("app.services.customer_relations.customer_crud.get_customer", return_value=customer): with patch("app.services.customer_relations.customer_crud._row_to_dict", return_value={"id": "m1"}): with patch( "app.services.customer_relations._fetch_storage_party_rows", return_value=[older, newer], ): with patch( "app.services.customer_relations._fetch_donation_party_rows", return_value=[donation], ): data = build_customer_relations(db, "m1", "zkxw") self.assertIsNotNone(data) groups = data["relatedGroups"] self.assertEqual(len(groups), 3) # create_time desc: p-new, d1, p-old self.assertEqual(groups[0]["protocolId"], "p-new") self.assertEqual(groups[0]["bizType"], "cell_storage") self.assertEqual(groups[0]["myRole"], "mother") self.assertEqual(groups[1]["protocolId"], "d1") self.assertEqual(groups[1]["bizType"], "research_donation") self.assertEqual(groups[1]["myRole"], "father") self.assertEqual(groups[2]["protocolNo"], "P001") self.assertEqual(len(groups[2]["members"]), 3) protocols = data["protocols"] self.assertEqual(len(protocols), 3) self.assertEqual(protocols[0]["protocolNo"], "P002") self.assertEqual(protocols[0]["registerDate"], "20260301") self.assertEqual(protocols[1]["protocolNo"], "D001") self.assertEqual(protocols[1]["myRole"], "father")