Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,8 @@ def handler(
expression="type",
)

if not validate_category(params.category):
categories = params.category.root.split(",") if params.category else []
if not validate_category(categories):
logger.log(
LogReference.CONSEARCH002b,
category=params.category,
Expand Down Expand Up @@ -102,7 +103,7 @@ def handler(
nhs_number=params.nhs_number,
custodian=custodian_id,
pointer_types=pointer_types,
categories=[params.category.root] if params.category else [],
categories=categories,
):
try:
document_reference = DocumentReference.model_validate_json(result.document)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,12 @@
from moto import mock_aws

from api.consumer.searchDocumentReference.search_document_reference import handler
from nrlf.core.constants import (
CATEGORY_ATTRIBUTES,
TYPE_ATTRIBUTES,
Categories,
PointerTypes,
)
from nrlf.core.dynamodb.repository import DocumentPointer, DocumentPointerRepository
from nrlf.tests.data import load_document_reference
from nrlf.tests.dynamodb import mock_repository
Expand Down Expand Up @@ -144,6 +150,19 @@ def test_search_document_reference_happy_path_with_category(
doc_pointer = DocumentPointer.from_document_reference(doc_ref)
repository.create(doc_pointer)

# Second pointer different category
doc_ref2 = load_document_reference("Y05868-736253002-Valid")
doc_ref2.id = "Y05868-736253002-Valid2"
doc_ref2.type.coding[0].code = PointerTypes.NEWS2_CHART.coding_value()
doc_ref2.type.coding[0].display = TYPE_ATTRIBUTES.get(
PointerTypes.NEWS2_CHART.value
).get("display")
doc_ref2.category[0].coding[0].code = Categories.OBSERVATIONS.coding_value()
doc_ref2.category[0].coding[0].display = CATEGORY_ATTRIBUTES.get(
Categories.OBSERVATIONS.value
).get("display")
repository.create(DocumentPointer.from_document_reference(doc_ref2))

event = create_test_api_gateway_event(
headers=create_headers(),
query_string_parameters={
Expand All @@ -160,7 +179,6 @@ def test_search_document_reference_happy_path_with_category(
"headers": default_response_headers(),
"isBase64Encoded": False,
}

parsed_body = json.loads(body)
assert parsed_body == {
"resourceType": "Bundle",
Expand All @@ -176,6 +194,63 @@ def test_search_document_reference_happy_path_with_category(
}


@mock_aws
@mock_repository
def test_search_document_reference_happy_path_with_multiple_categories(
repository: DocumentPointerRepository,
):
doc_ref = load_document_reference("Y05868-736253002-Valid")
doc_pointer = DocumentPointer.from_document_reference(doc_ref)
repository.create(doc_pointer)

# Second pointer different category
doc_ref2 = load_document_reference("Y05868-736253002-Valid")
doc_ref2.id = "Y05868-736253002-Valid2"
doc_ref2.type.coding[0].code = PointerTypes.NEWS2_CHART.coding_value()
doc_ref2.type.coding[0].display = TYPE_ATTRIBUTES.get(
PointerTypes.NEWS2_CHART.value
).get("display")
doc_ref2.category[0].coding[0].code = Categories.OBSERVATIONS.coding_value()
doc_ref2.category[0].coding[0].display = CATEGORY_ATTRIBUTES.get(
Categories.OBSERVATIONS.value
).get("display")
repository.create(DocumentPointer.from_document_reference(doc_ref2))

event = create_test_api_gateway_event(
headers=create_headers(),
query_string_parameters={
"subject:identifier": "https://fhir.nhs.uk/Id/nhs-number|6700028191",
"category": "http://snomed.info/sct|734163000,http://snomed.info/sct|1102421000000108",
},
)

result = handler(event, create_mock_context())
body = result.pop("body")

assert result == {
"statusCode": "200",
"headers": default_response_headers(),
"isBase64Encoded": False,
}

parsed_body = json.loads(body)
assert parsed_body == {
"resourceType": "Bundle",
"type": "searchset",
"link": [
{
"relation": "self",
"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,http://snomed.info/sct|1102421000000108",
}
],
"total": 2,
"entry": [
{"resource": doc_ref2.model_dump(exclude_none=True)},
{"resource": doc_ref.model_dump(exclude_none=True)},
],
}


@mock_aws
@mock_repository
def test_search_document_reference_happy_path_with_nicip_type(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,11 @@ def handler(
expression="type",
)

if not validate_category(body.category):
categories = body.category.root.split(",") if body.category else []
if not validate_category(categories):
logger.log(
LogReference.CONPOSTSEARCH002b,
type=body.category,
category=body.category,
) # TODO - Should update error message once permissioning by category is implemented
return SpineErrorResponse.INVALID_CODE_SYSTEM(
diagnostics="The provided category is not valid",
Expand Down Expand Up @@ -105,7 +106,7 @@ def handler(
nhs_number=body.nhs_number,
custodian=custodian_id,
pointer_types=pointer_types,
categories=[body.category.root] if body.category else [],
categories=categories,
):
try:
document_reference = DocumentReference.model_validate_json(result.document)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@
from api.consumer.searchPostDocumentReference.search_post_document_reference import (
handler,
)
from nrlf.core.constants import (
CATEGORY_ATTRIBUTES,
TYPE_ATTRIBUTES,
Categories,
PointerTypes,
)
from nrlf.core.dynamodb.repository import DocumentPointer, DocumentPointerRepository
from nrlf.tests.data import load_document_reference
from nrlf.tests.dynamodb import mock_repository
Expand Down Expand Up @@ -153,6 +159,19 @@ def test_search_post_document_reference_happy_path_with_category(
doc_pointer = DocumentPointer.from_document_reference(doc_ref)
repository.create(doc_pointer)

# Second pointer different category
doc_ref2 = load_document_reference("Y05868-736253002-Valid")
doc_ref2.id = "Y05868-736253002-Valid2"
doc_ref2.type.coding[0].code = PointerTypes.NEWS2_CHART.coding_value()
doc_ref2.type.coding[0].display = TYPE_ATTRIBUTES.get(
PointerTypes.NEWS2_CHART.value
).get("display")
doc_ref2.category[0].coding[0].code = Categories.OBSERVATIONS.coding_value()
doc_ref2.category[0].coding[0].display = CATEGORY_ATTRIBUTES.get(
Categories.OBSERVATIONS.value
).get("display")
repository.create(DocumentPointer.from_document_reference(doc_ref2))

event = create_test_api_gateway_event(
headers=create_headers(),
body=json.dumps(
Expand Down Expand Up @@ -187,6 +206,65 @@ def test_search_post_document_reference_happy_path_with_category(
}


@mock_aws
@mock_repository
def test_search_post_document_reference_happy_path_with_multiple_categories(
repository: DocumentPointerRepository,
):
doc_ref = load_document_reference("Y05868-736253002-Valid")
doc_pointer = DocumentPointer.from_document_reference(doc_ref)
repository.create(doc_pointer)

# Second pointer different category
doc_ref2 = load_document_reference("Y05868-736253002-Valid")
doc_ref2.id = "Y05868-736253002-Valid2"
doc_ref2.type.coding[0].code = PointerTypes.NEWS2_CHART.coding_value()
doc_ref2.type.coding[0].display = TYPE_ATTRIBUTES.get(
PointerTypes.NEWS2_CHART.value
).get("display")
doc_ref2.category[0].coding[0].code = Categories.OBSERVATIONS.coding_value()
doc_ref2.category[0].coding[0].display = CATEGORY_ATTRIBUTES.get(
Categories.OBSERVATIONS.value
).get("display")
repository.create(DocumentPointer.from_document_reference(doc_ref2))

event = create_test_api_gateway_event(
headers=create_headers(),
body=json.dumps(
{
"subject:identifier": "https://fhir.nhs.uk/Id/nhs-number|6700028191",
"category": "http://snomed.info/sct|734163000,http://snomed.info/sct|1102421000000108",
}
),
)

result = handler(event, create_mock_context())
body = result.pop("body")

assert result == {
"statusCode": "200",
"headers": default_response_headers(),
"isBase64Encoded": False,
}

parsed_body = json.loads(body)
assert parsed_body == {
"resourceType": "Bundle",
"type": "searchset",
"link": [
{
"relation": "self",
"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,http://snomed.info/sct|1102421000000108",
}
],
"total": 2,
"entry": [
{"resource": doc_ref2.model_dump(exclude_none=True)},
{"resource": doc_ref.model_dump(exclude_none=True)},
],
}


@mock_aws
@mock_repository
def test_search_document_reference_no_results(repository: DocumentPointerRepository):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,11 @@ def handler(
expression="type",
)

if not validate_category(params.category):
categories = params.category.root.split(",") if params.category else []
if not validate_category(categories):
logger.log(
LogReference.PROSEARCH002b,
type=params.category,
category=params.category,
) # TODO - Should update error message once permissioning by category is implemented
return SpineErrorResponse.INVALID_CODE_SYSTEM(
diagnostics="Invalid query parameter (The provided category is not valid)",
Expand All @@ -78,15 +79,15 @@ def handler(
custodian_suffix=metadata.ods_code_extension,
nhs_number=params.nhs_number,
pointer_types=pointer_types,
categories=[params.category.root] if params.category else [],
categories=params.category.root.split(",") if params.category else [],
)

for result in repository.search(
custodian=metadata.ods_code,
custodian_suffix=metadata.ods_code_extension,
nhs_number=params.nhs_number,
pointer_types=pointer_types,
categories=[params.category.root] if params.category else [],
categories=params.category.root.split(",") if params.category else [],
):
try:
document_reference = DocumentReference.model_validate_json(result.document)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,12 @@
from moto import mock_aws

from api.producer.searchDocumentReference.search_document_reference import handler
from nrlf.core.constants import Categories, PointerTypes
from nrlf.core.constants import (
CATEGORY_ATTRIBUTES,
TYPE_ATTRIBUTES,
Categories,
PointerTypes,
)
from nrlf.core.dynamodb.repository import DocumentPointer, DocumentPointerRepository
from nrlf.tests.data import load_document_reference
from nrlf.tests.dynamodb import mock_repository
Expand Down Expand Up @@ -326,6 +331,19 @@ def test_search_document_reference_filters_by_category(
doc_pointer = DocumentPointer.from_document_reference(doc_ref)
repository.create(doc_pointer)

# Second pointer different category
doc_ref2 = load_document_reference("Y05868-736253002-Valid")
doc_ref2.id = "Y05868-736253002-Valid2"
doc_ref2.type.coding[0].code = PointerTypes.NEWS2_CHART.coding_value()
doc_ref2.type.coding[0].display = TYPE_ATTRIBUTES.get(
PointerTypes.NEWS2_CHART.value
).get("display")
doc_ref2.category[0].coding[0].code = Categories.OBSERVATIONS.coding_value()
doc_ref2.category[0].coding[0].display = CATEGORY_ATTRIBUTES.get(
Categories.OBSERVATIONS.value
).get("display")
repository.create(DocumentPointer.from_document_reference(doc_ref2))

event = create_test_api_gateway_event(
headers=create_headers(),
query_string_parameters={
Expand All @@ -352,6 +370,57 @@ def test_search_document_reference_filters_by_category(
}


@mock_aws
@mock_repository
def test_search_document_reference_filters_with_multiple_categories(
repository: DocumentPointerRepository,
):
doc_ref = load_document_reference("Y05868-736253002-Valid")
doc_pointer = DocumentPointer.from_document_reference(doc_ref)
repository.create(doc_pointer)

# Second pointer different category
doc_ref2 = load_document_reference("Y05868-736253002-Valid")
doc_ref2.id = "Y05868-736253002-Valid2"
doc_ref2.type.coding[0].code = PointerTypes.NEWS2_CHART.coding_value()
doc_ref2.type.coding[0].display = TYPE_ATTRIBUTES.get(
PointerTypes.NEWS2_CHART.value
).get("display")
doc_ref2.category[0].coding[0].code = Categories.OBSERVATIONS.coding_value()
doc_ref2.category[0].coding[0].display = CATEGORY_ATTRIBUTES.get(
Categories.OBSERVATIONS.value
).get("display")
repository.create(DocumentPointer.from_document_reference(doc_ref2))

event = create_test_api_gateway_event(
headers=create_headers(),
query_string_parameters={
"subject:identifier": "https://fhir.nhs.uk/Id/nhs-number|6700028191",
"category": "http://snomed.info/sct|734163000,http://snomed.info/sct|1102421000000108",
},
)

result = handler(event, create_mock_context())
body = result.pop("body")

assert result == {
"statusCode": "200",
"headers": default_response_headers(),
"isBase64Encoded": False,
}

parsed_body = json.loads(body)
assert parsed_body == {
"resourceType": "Bundle",
"type": "searchset",
"total": 2,
"entry": [
{"resource": doc_ref2.model_dump(exclude_none=True)},
{"resource": doc_ref.model_dump(exclude_none=True)},
],
}


@mock_aws
@mock_repository
def test_search_document_reference_filters_by_pointer_types(
Expand Down
Loading
Loading