Skip to content

Commit a208752

Browse files
committed
test(spp_api_v2): add coverage for records without valid identifiers
1 parent 1f4442b commit a208752

3 files changed

Lines changed: 94 additions & 0 deletions

File tree

spp_api_v2/tests/test_group_api.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,35 @@ def test_read_group_not_found(self):
134134

135135
self.assertEqual(response.status_code, 404)
136136

137+
def test_read_group_no_identifiers_returns_404(self):
138+
"""GET group without valid identifiers returns 404"""
139+
no_id_group = self.env["res.partner"].create(
140+
{
141+
"name": "No Identifier Group",
142+
"is_registrant": True,
143+
"is_group": True,
144+
}
145+
)
146+
self.env["spp.registry.id"].create(
147+
{
148+
"registrant_id": no_id_group.id,
149+
"value": "NO-TYPE-GRP-001",
150+
}
151+
)
152+
153+
no_consent_client = self.create_api_client(
154+
name="No Consent Client For Group 404",
155+
scopes=[{"resource": "group", "action": "read"}],
156+
require_consent=False,
157+
legal_basis="public_interest",
158+
)
159+
token = self.generate_jwt_token(no_consent_client)
160+
161+
url = f"{self.api_base_url}/urn:openspp:vocab:id-type%23test_national_id|NO-TYPE-GRP-001"
162+
response = self.url_open(url, headers=self._get_headers(token=token))
163+
164+
self.assertEqual(response.status_code, 404)
165+
137166
def test_read_group_invalid_format(self):
138167
"""GET with invalid identifier format returns 400"""
139168
url = f"{self.api_base_url}/INVALID-FORMAT"

spp_api_v2/tests/test_group_service.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,36 @@ def test_to_api_schema_no_members(self):
322322
self.assertNotIn("member", data)
323323
self.assertNotIn("quantity", data)
324324

325+
def test_to_api_schema_member_without_identifiers_skipped(self):
326+
"""Members without valid identifiers are skipped from member list"""
327+
# Create an individual without registry IDs
328+
no_id_individual = self.env["res.partner"].create(
329+
{
330+
"name": "No ID Member",
331+
"is_registrant": True,
332+
"is_group": False,
333+
}
334+
)
335+
group = self.create_test_group(identifier_value="HH-MEMBER-SKIP")
336+
337+
# Create membership directly (bypassing the API which would validate)
338+
self.env["spp.group.membership"].create(
339+
{
340+
"group": group.id,
341+
"individual": no_id_individual.id,
342+
}
343+
)
344+
345+
data = self.service.to_api_schema(group)
346+
347+
# Member without identifiers should be skipped
348+
if "member" in data:
349+
for member in data["member"]:
350+
self.assertNotIn(
351+
"No ID Member",
352+
member.get("entity", {}).get("display", ""),
353+
)
354+
325355
def test_create_member_invalid_reference_ignored(self):
326356
"""Invalid member references are logged and ignored"""
327357
schema = Group(

spp_api_v2/tests/test_individual_api.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,41 @@ def test_read_individual_not_found(self):
108108

109109
self.assertEqual(response.status_code, 404)
110110

111+
def test_read_individual_no_identifiers_returns_404(self):
112+
"""GET individual without valid identifiers returns 404"""
113+
# Create individual without registry IDs but with a known identifier
114+
# to look it up. The partner exists but has no reg_ids, so
115+
# to_api_schema returns None and the router returns 404.
116+
no_id_partner = self.env["res.partner"].create(
117+
{
118+
"name": "No Identifier Person",
119+
"is_registrant": True,
120+
"is_group": False,
121+
}
122+
)
123+
# Add a reg_id with a value but no id_type (invalid identifier)
124+
self.env["spp.registry.id"].create(
125+
{
126+
"registrant_id": no_id_partner.id,
127+
"value": "NO-TYPE-001",
128+
}
129+
)
130+
131+
no_consent_client = self.create_api_client(
132+
name="No Consent Client For 404",
133+
scopes=[{"resource": "individual", "action": "read"}],
134+
require_consent=False,
135+
legal_basis="public_interest",
136+
)
137+
token = self.generate_jwt_token(no_consent_client)
138+
139+
url = f"{self.api_base_url}/urn:openspp:vocab:id-type%23test_national_id|NO-TYPE-001"
140+
response = self.url_open(url, headers=self._get_headers(token=token))
141+
142+
# Partner exists but to_api_schema returns None (no valid identifiers)
143+
# Router should return 404
144+
self.assertEqual(response.status_code, 404)
145+
111146
def test_read_individual_invalid_format(self):
112147
"""GET with invalid identifier format returns 400"""
113148
url = f"{self.api_base_url}/INVALID-FORMAT"

0 commit comments

Comments
 (0)