Skip to content

Commit d562cd2

Browse files
committed
[NRL-1051] Update feature branch with latest develop
2 parents 9a72745 + b77abb9 commit d562cd2

File tree

54 files changed

+2818
-588
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+2818
-588
lines changed

api/consumer/searchDocumentReference/search_document_reference.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from nrlf.core.logger import LogReference, logger
1010
from nrlf.core.model import ConnectionMetadata, ConsumerRequestParams
1111
from nrlf.core.response import Response, SpineErrorResponse
12-
from nrlf.core.validators import validate_type_system
12+
from nrlf.core.validators import validate_category, validate_type_system
1313

1414

1515
@request_handler(params=ConsumerRequestParams)
@@ -58,6 +58,16 @@ def handler(
5858
expression="type",
5959
)
6060

61+
if not validate_category(params.category):
62+
logger.log(
63+
LogReference.CONSEARCH002b,
64+
category=params.category,
65+
) # TODO - Should update error message once permissioning by category is implemented
66+
return SpineErrorResponse.INVALID_CODE_SYSTEM(
67+
diagnostics="Invalid query parameter (The provided category is not valid)",
68+
expression="category",
69+
)
70+
6171
custodian_id = (
6272
params.custodian_identifier.root.split("|", maxsplit=1)[1]
6373
if params.custodian_identifier
@@ -70,6 +80,9 @@ def handler(
7080
if params.type:
7181
self_link += f"&type={params.type.root}"
7282

83+
if params.category:
84+
self_link += f"&category={params.category.root}"
85+
7386
bundle = {
7487
"resourceType": "Bundle",
7588
"type": "searchset",
@@ -89,6 +102,7 @@ def handler(
89102
nhs_number=params.nhs_number,
90103
custodian=custodian_id,
91104
pointer_types=pointer_types,
105+
categories=[params.category.root] if params.category else [],
92106
):
93107
try:
94108
document_reference = DocumentReference.model_validate_json(result.document)

api/consumer/searchDocumentReference/tests/test_search_document_reference_consumer.py

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,47 @@ def test_search_document_reference_happy_path_with_type(
135135
}
136136

137137

138+
@mock_aws
139+
@mock_repository
140+
def test_search_document_reference_happy_path_with_category(
141+
repository: DocumentPointerRepository,
142+
):
143+
doc_ref = load_document_reference("Y05868-736253002-Valid")
144+
doc_pointer = DocumentPointer.from_document_reference(doc_ref)
145+
repository.create(doc_pointer)
146+
147+
event = create_test_api_gateway_event(
148+
headers=create_headers(),
149+
query_string_parameters={
150+
"subject:identifier": "https://fhir.nhs.uk/Id/nhs-number|6700028191",
151+
"category": "http://snomed.info/sct|734163000",
152+
},
153+
)
154+
155+
result = handler(event, create_mock_context())
156+
body = result.pop("body")
157+
158+
assert result == {
159+
"statusCode": "200",
160+
"headers": default_response_headers(),
161+
"isBase64Encoded": False,
162+
}
163+
164+
parsed_body = json.loads(body)
165+
assert parsed_body == {
166+
"resourceType": "Bundle",
167+
"type": "searchset",
168+
"link": [
169+
{
170+
"relation": "self",
171+
"url": "https://pytest.api.service.nhs.uk/record-locator/consumer/FHIR/R4/DocumentReference?subject:identifier=https://fhir.nhs.uk/Id/nhs-number|6700028191&category=http://snomed.info/sct|734163000",
172+
}
173+
],
174+
"total": 1,
175+
"entry": [{"resource": doc_ref.model_dump(exclude_none=True)}],
176+
}
177+
178+
138179
@mock_aws
139180
@mock_repository
140181
def test_search_document_reference_happy_path_with_nicip_type(
@@ -342,6 +383,51 @@ def test_search_document_reference_invalid_type(repository: DocumentPointerRepos
342383
}
343384

344385

386+
@mock_aws
387+
@mock_repository
388+
def test_search_document_reference_invalid_category(
389+
repository: DocumentPointerRepository,
390+
):
391+
event = create_test_api_gateway_event(
392+
headers=create_headers(),
393+
query_string_parameters={
394+
"subject:identifier": "https://fhir.nhs.uk/Id/nhs-number|6700028191",
395+
"category": "https://fhir.nhs.uk/CodeSystem/Document-Type|invalid",
396+
},
397+
)
398+
399+
result = handler(event, create_mock_context())
400+
body = result.pop("body")
401+
402+
assert result == {
403+
"statusCode": "400",
404+
"headers": default_response_headers(),
405+
"isBase64Encoded": False,
406+
}
407+
408+
parsed_body = json.loads(body)
409+
assert parsed_body == {
410+
"resourceType": "OperationOutcome",
411+
"issue": [
412+
{
413+
"severity": "error",
414+
"code": "code-invalid",
415+
"details": {
416+
"coding": [
417+
{
418+
"code": "INVALID_CODE_SYSTEM",
419+
"display": "Invalid code system",
420+
"system": "https://fhir.nhs.uk/ValueSet/Spine-ErrorOrWarningCode-1",
421+
}
422+
]
423+
},
424+
"diagnostics": "Invalid query parameter (The provided category is not valid)",
425+
"expression": ["category"],
426+
}
427+
],
428+
}
429+
430+
345431
@mock_aws
346432
@mock_repository
347433
def test_search_document_reference_invalid_json(repository: DocumentPointerRepository):

api/consumer/searchPostDocumentReference/search_post_document_reference.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from nrlf.core.logger import LogReference, logger
1010
from nrlf.core.model import ConnectionMetadata, ConsumerRequestParams
1111
from nrlf.core.response import Response, SpineErrorResponse
12-
from nrlf.core.validators import validate_type_system
12+
from nrlf.core.validators import validate_category, validate_type_system
1313

1414

1515
@request_handler(body=ConsumerRequestParams)
@@ -61,6 +61,16 @@ def handler(
6161
expression="type",
6262
)
6363

64+
if not validate_category(body.category):
65+
logger.log(
66+
LogReference.CONPOSTSEARCH002b,
67+
type=body.category,
68+
) # TODO - Should update error message once permissioning by category is implemented
69+
return SpineErrorResponse.INVALID_CODE_SYSTEM(
70+
diagnostics="The provided category is not valid",
71+
expression="category",
72+
)
73+
6474
custodian_id = (
6575
body.custodian_identifier.root.split("|", maxsplit=1)[1]
6676
if body.custodian_identifier
@@ -73,6 +83,9 @@ def handler(
7383
if body.type:
7484
self_link += f"&type={body.type.root}"
7585

86+
if body.category:
87+
self_link += f"&category={body.category.root}"
88+
7689
bundle = {
7790
"resourceType": "Bundle",
7891
"type": "searchset",
@@ -89,7 +102,10 @@ def handler(
89102
)
90103

91104
for result in repository.search(
92-
nhs_number=body.nhs_number, custodian=custodian_id, pointer_types=pointer_types
105+
nhs_number=body.nhs_number,
106+
custodian=custodian_id,
107+
pointer_types=pointer_types,
108+
categories=[body.category.root] if body.category else [],
93109
):
94110
try:
95111
document_reference = DocumentReference.model_validate_json(result.document)

api/consumer/searchPostDocumentReference/tests/test_search_post_document_reference_consumer.py

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,49 @@ def test_search_post_document_reference_happy_path_with_type(
144144
}
145145

146146

147+
@mock_aws
148+
@mock_repository
149+
def test_search_post_document_reference_happy_path_with_category(
150+
repository: DocumentPointerRepository,
151+
):
152+
doc_ref = load_document_reference("Y05868-736253002-Valid")
153+
doc_pointer = DocumentPointer.from_document_reference(doc_ref)
154+
repository.create(doc_pointer)
155+
156+
event = create_test_api_gateway_event(
157+
headers=create_headers(),
158+
body=json.dumps(
159+
{
160+
"subject:identifier": "https://fhir.nhs.uk/Id/nhs-number|6700028191",
161+
"category": "http://snomed.info/sct|734163000",
162+
},
163+
),
164+
)
165+
166+
result = handler(event, create_mock_context())
167+
body = result.pop("body")
168+
169+
assert result == {
170+
"statusCode": "200",
171+
"headers": default_response_headers(),
172+
"isBase64Encoded": False,
173+
}
174+
175+
parsed_body = json.loads(body)
176+
assert parsed_body == {
177+
"resourceType": "Bundle",
178+
"type": "searchset",
179+
"link": [
180+
{
181+
"relation": "self",
182+
"url": "https://pytest.api.service.nhs.uk/record-locator/consumer/FHIR/R4/DocumentReference?subject:identifier=https://fhir.nhs.uk/Id/nhs-number|6700028191&category=http://snomed.info/sct|734163000",
183+
}
184+
],
185+
"total": 1,
186+
"entry": [{"resource": doc_ref.model_dump(exclude_none=True)}],
187+
}
188+
189+
147190
@mock_aws
148191
@mock_repository
149192
def test_search_document_reference_no_results(repository: DocumentPointerRepository):
@@ -310,6 +353,53 @@ def test_search_post_document_reference_invalid_type(
310353
}
311354

312355

356+
@mock_aws
357+
@mock_repository
358+
def test_search_document_reference_invalid_category(
359+
repository: DocumentPointerRepository,
360+
):
361+
event = create_test_api_gateway_event(
362+
headers=create_headers(),
363+
body=json.dumps(
364+
{
365+
"subject:identifier": "https://fhir.nhs.uk/Id/nhs-number|6700028191",
366+
"category": "https://fhir.nhs.uk/CodeSystem/Document-Type|invalid",
367+
}
368+
),
369+
)
370+
371+
result = handler(event, create_mock_context())
372+
body = result.pop("body")
373+
374+
assert result == {
375+
"statusCode": "400",
376+
"headers": default_response_headers(),
377+
"isBase64Encoded": False,
378+
}
379+
380+
parsed_body = json.loads(body)
381+
assert parsed_body == {
382+
"resourceType": "OperationOutcome",
383+
"issue": [
384+
{
385+
"severity": "error",
386+
"code": "code-invalid",
387+
"details": {
388+
"coding": [
389+
{
390+
"code": "INVALID_CODE_SYSTEM",
391+
"display": "Invalid code system",
392+
"system": "https://fhir.nhs.uk/ValueSet/Spine-ErrorOrWarningCode-1",
393+
}
394+
]
395+
},
396+
"diagnostics": "The provided category is not valid",
397+
"expression": ["category"],
398+
}
399+
],
400+
}
401+
402+
313403
@mock_aws
314404
@mock_repository
315405
def test_search_post_document_reference_invalid_json(

0 commit comments

Comments
 (0)