| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- """客户关联协议 / 同单家庭成员聚合"""
- 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")
|