Files
zkxw/backend/tests/test_customer_relations.py
T

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")