Skip to content

Commit c113df8

Browse files
NRL-518 Add validation for format code display mismatch
1 parent 3137b90 commit c113df8

File tree

2 files changed

+87
-0
lines changed

2 files changed

+87
-0
lines changed

layer/nrlf/core/tests/test_validators.py

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1360,3 +1360,73 @@ def test_validate_content_invalid_content_type():
13601360
"diagnostics": "Invalid contentType: invalid/type. Must be 'application/pdf' or 'text/html'",
13611361
"expression": ["content[0].attachment.contentType"],
13621362
}
1363+
1364+
1365+
@pytest.mark.parametrize(
1366+
"format_code, format_display",
1367+
[
1368+
("urn:nhs-ic:record-contact", "Contact details (HTTP Unsecured)"),
1369+
("urn:nhs-ic:unstructured", "Unstructured Document"),
1370+
],
1371+
)
1372+
def test_validate_nrl_format_code_valid_match(format_code, format_display):
1373+
validator = DocumentReferenceValidator()
1374+
document_ref_data = load_document_reference_json("Y05868-736253002-Valid")
1375+
1376+
document_ref_data["content"][0]["format"] = {
1377+
"system": "https://fhir.nhs.uk/England/CodeSystem/England-NRLFormatCode",
1378+
"code": format_code,
1379+
"display": format_display,
1380+
}
1381+
1382+
result = validator.validate(document_ref_data)
1383+
1384+
assert result.is_valid is True
1385+
1386+
1387+
@pytest.mark.parametrize(
1388+
"format_code, format_display, expected_display",
1389+
[
1390+
(
1391+
"urn:nhs-ic:unstructured",
1392+
"Contact details (HTTP Unsecured)",
1393+
"Unstructured Document",
1394+
),
1395+
(
1396+
"urn:nhs-ic:record-contact",
1397+
"Unstructured Document",
1398+
"Contact details (HTTP Unsecured)",
1399+
),
1400+
],
1401+
)
1402+
def test_validate_nrl_format_code_display_mismatch(
1403+
format_code, format_display, expected_display
1404+
):
1405+
validator = DocumentReferenceValidator()
1406+
document_ref_data = load_document_reference_json("Y05868-736253002-Valid")
1407+
1408+
document_ref_data["content"][0]["format"] = {
1409+
"system": "https://fhir.nhs.uk/England/CodeSystem/England-NRLFormatCode",
1410+
"code": format_code,
1411+
"display": format_display,
1412+
}
1413+
1414+
result = validator.validate(document_ref_data)
1415+
1416+
assert result.is_valid is False
1417+
assert len(result.issues) == 1
1418+
assert result.issues[0].model_dump(exclude_none=True) == {
1419+
"severity": "error",
1420+
"code": "value",
1421+
"details": {
1422+
"coding": [
1423+
{
1424+
"system": "https://fhir.nhs.uk/ValueSet/Spine-ErrorOrWarningCode-1",
1425+
"code": "INVALID_RESOURCE",
1426+
"display": "Invalid validation of resource",
1427+
}
1428+
]
1429+
},
1430+
"diagnostics": f"Invalid display for format code '{format_code}'. Expected '{expected_display}'",
1431+
"expression": ["content[0].format.display"],
1432+
}

layer/nrlf/core/validators.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,11 @@ def _validate_content(self, model: DocumentReference):
550550
"""
551551
logger.log(LogReference.VALIDATOR001, step="content")
552552

553+
format_code_display_map = {
554+
"urn:nhs-ic:record-contact": "Contact details (HTTP Unsecured)",
555+
"urn:nhs-ic:unstructured": "Unstructured Document",
556+
}
557+
553558
for i, content in enumerate(model.content):
554559
if content.attachment.contentType not in ["application/pdf", "text/html"]:
555560
self.result.add_error(
@@ -558,3 +563,15 @@ def _validate_content(self, model: DocumentReference):
558563
diagnostics=f"Invalid contentType: {content.attachment.contentType}. Must be 'application/pdf' or 'text/html'",
559564
field=f"content[{i}].attachment.contentType",
560565
)
566+
567+
# Validate NRLFormatCode
568+
format_code = content.format.code
569+
format_display = content.format.display
570+
expected_display = format_code_display_map.get(format_code)
571+
if expected_display and format_display != expected_display:
572+
self.result.add_error(
573+
issue_code="value",
574+
error_code="INVALID_RESOURCE",
575+
diagnostics=f"Invalid display for format code '{format_code}'. Expected '{expected_display}'",
576+
field=f"content[{i}].format.display",
577+
)

0 commit comments

Comments
 (0)