Skip to content

Commit f667f94

Browse files
committed
Merge branch 'develop' of github.com:NHSDigital/NRLF into feature/eema1-NRL-478-validateContext
2 parents 3d7de78 + af36c46 commit f667f94

19 files changed

+1515
-369
lines changed

api/producer/createDocumentReference/create_document_reference.py

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
from nrlf.core.constants import (
55
PERMISSION_AUDIT_DATES_FROM_PAYLOAD,
66
PERMISSION_SUPERSEDE_IGNORE_DELETE_FAIL,
7-
TYPE_CATEGORIES,
87
)
98
from nrlf.core.decorators import request_handler
109
from nrlf.core.dynamodb.repository import DocumentPointer, DocumentPointerRepository
@@ -91,19 +90,6 @@ def _check_permissions(
9190
expression="type.coding[0].code",
9291
)
9392

94-
type_category = TYPE_CATEGORIES.get(core_model.type)
95-
if type_category != core_model.category:
96-
logger.log(
97-
LogReference.PROCREATE005a,
98-
ods_code=metadata.ods_code,
99-
type=core_model.type,
100-
category=core_model.category,
101-
)
102-
return SpineErrorResponse.BAD_REQUEST(
103-
diagnostics=f"The Category code of the provided document '{core_model.category}' must match the allowed category for pointer type '{core_model.type}' with a category value of '{type_category}'",
104-
expression="category.coding[0].code",
105-
)
106-
10793

10894
def _get_document_ids_to_supersede(
10995
resource: DocumentReference,

api/producer/createDocumentReference/tests/test_create_document_reference.py

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import json
2+
from unittest.mock import patch
23

34
from freeze_uuid import freeze_uuid
45
from freezegun import freeze_time
@@ -468,6 +469,55 @@ def test_create_document_reference_invalid_pointer_type():
468469
result = handler(event, create_mock_context())
469470
body = result.pop("body")
470471

472+
assert result == {
473+
"statusCode": "400",
474+
"headers": default_response_headers(),
475+
"isBase64Encoded": False,
476+
}
477+
478+
parsed_body = json.loads(body)
479+
480+
assert parsed_body == {
481+
"resourceType": "OperationOutcome",
482+
"issue": [
483+
{
484+
"severity": "error",
485+
"code": "value",
486+
"details": {
487+
"coding": [
488+
{
489+
"code": "INVALID_RESOURCE",
490+
"display": "Invalid validation of resource",
491+
"system": "https://fhir.nhs.uk/ValueSet/Spine-ErrorOrWarningCode-1",
492+
}
493+
]
494+
},
495+
"diagnostics": "Invalid type code: invalid Type must be a member of the England-NRLRecordType value set (https://fhir.nhs.uk/England/CodeSystem/England-NRLRecordType)",
496+
"expression": ["type.coding[0].code"],
497+
}
498+
],
499+
}
500+
501+
502+
@mock_aws
503+
@mock_repository
504+
@patch("nrlf.core.decorators.parse_permissions_file")
505+
def test_create_document_reference_pointer_type_not_allowed(
506+
parse_permissions_mock, repository: DocumentPointerRepository
507+
):
508+
doc_ref = load_document_reference("Y05868-736253002-Valid")
509+
510+
assert doc_ref.type and doc_ref.type.coding
511+
512+
event = create_test_api_gateway_event(
513+
headers=create_headers(),
514+
body=doc_ref.model_dump_json(exclude_none=True),
515+
)
516+
517+
parse_permissions_mock.return_value = ["invalid"]
518+
result = handler(event, create_mock_context())
519+
body = result.pop("body")
520+
471521
assert result == {
472522
"statusCode": "403",
473523
"headers": default_response_headers(),
@@ -526,12 +576,12 @@ def test_create_document_reference_invalid_category_type():
526576
"issue": [
527577
{
528578
"severity": "error",
529-
"code": "invalid",
579+
"code": "value",
530580
"details": {
531581
"coding": [
532582
{
533-
"code": "BAD_REQUEST",
534-
"display": "Bad request",
583+
"code": "INVALID_RESOURCE",
584+
"display": "Invalid validation of resource",
535585
"system": "https://fhir.nhs.uk/ValueSet/Spine-ErrorOrWarningCode-1",
536586
}
537587
]
@@ -813,6 +863,7 @@ def test_create_document_reference_invalid_relatesto_type(
813863

814864
assert doc_ref.type and doc_ref.type.coding
815865
doc_ref.type.coding[0].code = "861421000000109"
866+
doc_ref.type.coding[0].display = "End of life care coordination summary"
816867
doc_ref.relatesTo = [
817868
DocumentReferenceRelatesTo(
818869
code="transforms",

api/producer/updateDocumentReference/tests/test_update_document_reference.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -556,8 +556,8 @@ def test_update_document_reference_immutable_fields(repository):
556556
id=None,
557557
system="http://snomed.info/sct",
558558
version=None,
559-
code="1213324",
560-
display="Some Code",
559+
code="861421000000109",
560+
display="End of life care coordination summary",
561561
userSelected=None,
562562
)
563563
],

api/producer/upsertDocumentReference/tests/test_upsert_document_reference.py

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import json
2+
from unittest.mock import patch
23

34
from freezegun import freeze_time
45
from moto import mock_aws
@@ -221,12 +222,12 @@ def test_upsert_document_reference_invalid_category_type():
221222
"issue": [
222223
{
223224
"severity": "error",
224-
"code": "invalid",
225+
"code": "value",
225226
"details": {
226227
"coding": [
227228
{
228-
"code": "BAD_REQUEST",
229-
"display": "Bad request",
229+
"code": "INVALID_RESOURCE",
230+
"display": "Invalid validation of resource",
230231
"system": "https://fhir.nhs.uk/ValueSet/Spine-ErrorOrWarningCode-1",
231232
}
232233
]
@@ -594,6 +595,55 @@ def test_upsert_document_reference_invalid_pointer_type():
594595
result = handler(event, create_mock_context())
595596
body = result.pop("body")
596597

598+
assert result == {
599+
"statusCode": "400",
600+
"headers": default_response_headers(),
601+
"isBase64Encoded": False,
602+
}
603+
604+
parsed_body = json.loads(body)
605+
606+
assert parsed_body == {
607+
"resourceType": "OperationOutcome",
608+
"issue": [
609+
{
610+
"severity": "error",
611+
"code": "value",
612+
"details": {
613+
"coding": [
614+
{
615+
"code": "INVALID_RESOURCE",
616+
"display": "Invalid validation of resource",
617+
"system": "https://fhir.nhs.uk/ValueSet/Spine-ErrorOrWarningCode-1",
618+
}
619+
]
620+
},
621+
"diagnostics": "Invalid type code: invalid Type must be a member of the England-NRLRecordType value set (https://fhir.nhs.uk/England/CodeSystem/England-NRLRecordType)",
622+
"expression": ["type.coding[0].code"],
623+
},
624+
],
625+
}
626+
627+
628+
@mock_aws
629+
@mock_repository
630+
@patch("nrlf.core.decorators.parse_permissions_file")
631+
def test_upsert_document_reference_pointer_type_not_allowed(
632+
parse_permissions_mock, repository: DocumentPointerRepository
633+
):
634+
doc_ref = load_document_reference("Y05868-736253002-Valid")
635+
636+
assert doc_ref.type and doc_ref.type.coding
637+
638+
event = create_test_api_gateway_event(
639+
headers=create_headers(),
640+
body=doc_ref.model_dump_json(exclude_none=True),
641+
)
642+
643+
parse_permissions_mock.return_value = ["invalid"]
644+
result = handler(event, create_mock_context())
645+
body = result.pop("body")
646+
597647
assert result == {
598648
"statusCode": "403",
599649
"headers": default_response_headers(),
@@ -904,6 +954,7 @@ def test_upsert_document_reference_invalid_relatesto_type(
904954

905955
assert doc_ref.type and doc_ref.type.coding
906956
doc_ref.type.coding[0].code = "861421000000109"
957+
doc_ref.type.coding[0].display = "End of life care coordination summary"
907958
doc_ref.relatesTo = [
908959
DocumentReferenceRelatesTo(
909960
code="transforms",

api/producer/upsertDocumentReference/upsert_document_reference.py

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
from nrlf.core.constants import (
33
PERMISSION_AUDIT_DATES_FROM_PAYLOAD,
44
PERMISSION_SUPERSEDE_IGNORE_DELETE_FAIL,
5-
TYPE_CATEGORIES,
65
)
76
from nrlf.core.decorators import request_handler
87
from nrlf.core.dynamodb.repository import DocumentPointer, DocumentPointerRepository
@@ -89,19 +88,6 @@ def _check_permissions(
8988
expression="type.coding[0].code",
9089
)
9190

92-
type_category = TYPE_CATEGORIES.get(core_model.type)
93-
if type_category != core_model.category:
94-
logger.log(
95-
LogReference.PROUPSERT005a,
96-
ods_code=metadata.ods_code,
97-
type=core_model.type,
98-
category=core_model.category,
99-
)
100-
return SpineErrorResponse.BAD_REQUEST(
101-
diagnostics=f"The Category code of the provided document '{core_model.category}' must match the allowed category for pointer type '{core_model.type}' with a category value of '{type_category}'",
102-
expression="category.coding[0].code",
103-
)
104-
10591

10692
def _get_document_ids_to_supersede(
10793
resource: DocumentReference,

layer/nrlf/core/constants.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,51 @@ def coding_value(self):
113113
},
114114
}
115115

116+
TYPE_ATTRIBUTES = {
117+
PointerTypes.MENTAL_HEALTH_PLAN.value: {
118+
"display": "Mental health crisis plan",
119+
},
120+
PointerTypes.EMERGENCY_HEALTHCARE_PLAN.value: {
121+
"display": "Emergency health care plan",
122+
},
123+
PointerTypes.EOL_COORDINATION_SUMMARY.value: {
124+
"display": "End of life care coordination summary",
125+
},
126+
PointerTypes.RESPECT_FORM.value: {
127+
"display": "ReSPECT (Recommended Summary Plan for Emergency Care and Treatment) form",
128+
},
129+
PointerTypes.NEWS2_CHART.value: {
130+
"display": "Royal College of Physicians NEWS2 (National Early Warning Score 2) chart",
131+
},
132+
PointerTypes.CONTINGENCY_PLAN.value: {
133+
"display": "Contingency plan",
134+
},
135+
PointerTypes.EOL_CARE_PLAN.value: {
136+
"display": "End of life care plan",
137+
},
138+
PointerTypes.LLOYD_GEORGE_FOLDER.value: {
139+
"display": "Lloyd George record folder",
140+
},
141+
PointerTypes.ADVANCED_CARE_PLAN.value: {
142+
"display": "Advanced care plan",
143+
},
144+
PointerTypes.TREATMENT_ESCALATION_PLAN.value: {
145+
"display": "Treatment escalation plan",
146+
},
147+
PointerTypes.SUMMARY_RECORD.value: {
148+
"display": "Summary record",
149+
},
150+
PointerTypes.PERSONALISED_CARE_AND_SUPPORT_PLAN.value: {
151+
"display": "Personalised Care and Support Plan",
152+
},
153+
PointerTypes.MRA_UPPER_LIMB_ARTERY.value: {
154+
"display": "MRA Upper Limb Rt",
155+
},
156+
PointerTypes.MRI_AXILLA_BOTH.value: {
157+
"display": "MRI Axilla Both",
158+
},
159+
}
160+
116161
TYPE_CATEGORIES = {
117162
#
118163
# Care plans

layer/nrlf/core/log_references.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -227,11 +227,7 @@ class LogReference(Enum):
227227
)
228228
PROCREATE005 = _Reference(
229229
"WARN", "Organisation is not allowed to create pointer type"
230-
) #
231-
PROCREATE005a = _Reference(
232-
"WARN",
233-
"Organisation is not allowed to create pointer type with incorrect category",
234-
) #
230+
)
235231
PROCREATE006 = _Reference("DEBUG", "Performing relatesTo validation on resource")
236232
PROCREATE007a = _Reference(
237233
"WARN", "RelatesTo validation failed - no target identifier value"

0 commit comments

Comments
 (0)