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