Skip to content

Commit 249e261

Browse files
committed
[NRL-520] Add ASID validation unit tests for update and upsert endpoints. Fix happy path ASID unit test for create endpoint
1 parent 9ccff55 commit 249e261

File tree

3 files changed

+511
-7
lines changed

3 files changed

+511
-7
lines changed

api/producer/createDocumentReference/tests/test_create_document_reference.py

Lines changed: 65 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,6 @@
2828
@mock_repository
2929
@freeze_time("2024-03-21T12:34:56.789")
3030
@freeze_uuid("00000000-0000-0000-0000-000000000001")
31-
@mark.parametrize(
32-
"doc_ref_name",
33-
[
34-
"Y05868-736253002-Valid",
35-
"Y05868-736253002-Valid-with-ssp-content",
36-
],
37-
)
3831
def test_create_document_reference_happy_path(repository: DocumentPointerRepository):
3932
doc_ref_data = load_document_reference_data("Y05868-736253002-Valid")
4033

@@ -92,6 +85,71 @@ def test_create_document_reference_happy_path(repository: DocumentPointerReposit
9285
}
9386

9487

88+
@mock_aws
89+
@mock_repository
90+
@freeze_time("2024-03-21T12:34:56.789")
91+
@freeze_uuid("00000000-0000-0000-0000-000000000001")
92+
def test_create_document_reference_happy_path_with_ssp(
93+
repository: DocumentPointerRepository,
94+
):
95+
doc_ref_data = load_document_reference_data(
96+
"Y05868-736253002-Valid-with-ssp-content"
97+
)
98+
99+
event = create_test_api_gateway_event(
100+
headers=create_headers(),
101+
body=doc_ref_data,
102+
)
103+
104+
result = handler(event, create_mock_context())
105+
body = result.pop("body")
106+
107+
assert result == {
108+
"statusCode": "201",
109+
"headers": {
110+
"Location": "/nrl-producer-api/FHIR/R4/DocumentReference/Y05868-00000000-0000-0000-0000-000000000001"
111+
},
112+
"isBase64Encoded": False,
113+
}
114+
115+
parsed_body = json.loads(body)
116+
assert parsed_body == {
117+
"resourceType": "OperationOutcome",
118+
"issue": [
119+
{
120+
"severity": "information",
121+
"code": "informational",
122+
"details": {
123+
"coding": [
124+
{
125+
"code": "RESOURCE_CREATED",
126+
"display": "Resource created",
127+
"system": "https://fhir.nhs.uk/ValueSet/NRL-ResponseCode",
128+
}
129+
],
130+
},
131+
"diagnostics": "The document has been created",
132+
}
133+
],
134+
}
135+
136+
created_doc_pointer = repository.get_by_id(
137+
"Y05868-00000000-0000-0000-0000-000000000001"
138+
)
139+
140+
assert created_doc_pointer is not None
141+
assert created_doc_pointer.created_on == "2024-03-21T12:34:56.789Z"
142+
assert created_doc_pointer.updated_on is None
143+
assert json.loads(created_doc_pointer.document) == {
144+
**json.loads(doc_ref_data),
145+
"meta": {
146+
"lastUpdated": "2024-03-21T12:34:56.789Z",
147+
},
148+
"date": "2024-03-21T12:34:56.789Z",
149+
"id": "Y05868-00000000-0000-0000-0000-000000000001",
150+
}
151+
152+
95153
def test_create_document_reference_no_body():
96154
event = create_test_api_gateway_event(
97155
headers=create_headers(),

api/producer/updateDocumentReference/tests/test_update_document_reference.py

Lines changed: 215 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,67 @@ def test_update_document_reference_happy_path(repository: DocumentPointerReposit
7878
assert updated_doc_pointer.created_on == existing_doc_pointer.created_on
7979

8080

81+
@mock_aws
82+
@mock_repository
83+
@freeze_time("2024-03-21T12:34:56.789")
84+
def test_update_document_reference_happy_path_with_ssp(
85+
repository: DocumentPointerRepository,
86+
):
87+
doc_ref = load_document_reference("Y05868-736253002-Valid-with-ssp-content")
88+
doc_pointer = DocumentPointer.from_document_reference(doc_ref)
89+
repository.create(doc_pointer)
90+
91+
existing_doc_pointer = repository.get_by_id("Y05868-99999-99999-999999")
92+
assert existing_doc_pointer is not None
93+
94+
existing_doc_ref = DocumentReference.parse_raw(existing_doc_pointer.document)
95+
assert existing_doc_ref.docStatus == "final"
96+
97+
doc_ref.docStatus = "entered-in-error"
98+
event = create_test_api_gateway_event(
99+
headers=create_headers(),
100+
path_parameters={"id": "Y05868-99999-99999-999999"},
101+
body=doc_ref.json(),
102+
)
103+
104+
result = handler(event, create_mock_context())
105+
106+
body = result.pop("body")
107+
108+
assert result == {"statusCode": "200", "headers": {}, "isBase64Encoded": False}
109+
parsed_body = json.loads(body)
110+
111+
assert parsed_body == {
112+
"resourceType": "OperationOutcome",
113+
"issue": [
114+
{
115+
"severity": "information",
116+
"code": "informational",
117+
"details": {
118+
"coding": [
119+
{
120+
"code": "RESOURCE_UPDATED",
121+
"display": "Resource updated",
122+
"system": "https://fhir.nhs.uk/ValueSet/NRL-ResponseCode",
123+
}
124+
]
125+
},
126+
"diagnostics": "The DocumentReference has been updated",
127+
}
128+
],
129+
}
130+
131+
updated_doc_pointer = repository.get_by_id("Y05868-99999-99999-999999")
132+
assert updated_doc_pointer is not None
133+
134+
updated_doc_ref = DocumentReference.parse_raw(updated_doc_pointer.document)
135+
assert updated_doc_ref.docStatus == "entered-in-error"
136+
137+
assert updated_doc_ref.meta.lastUpdated == "2024-03-21T12:34:56.789Z"
138+
assert updated_doc_pointer.updated_on == "2024-03-21T12:34:56.789Z"
139+
assert updated_doc_pointer.created_on == existing_doc_pointer.created_on
140+
141+
81142
def test_create_document_reference_no_body():
82143
event = create_test_api_gateway_event(
83144
headers=create_headers(),
@@ -408,6 +469,160 @@ def test_update_document_reference_immutable_fields(repository):
408469
}
409470

410471

472+
@mock_aws
473+
@mock_repository
474+
def test_update_document_reference_with_no_context_related_for_ssp_url(repository):
475+
doc_ref = load_document_reference("Y05868-736253002-Valid-with-ssp-content")
476+
doc_pointer = DocumentPointer.from_document_reference(doc_ref)
477+
repository.create(doc_pointer)
478+
479+
del doc_ref.context.related
480+
481+
event = create_test_api_gateway_event(
482+
headers=create_headers(),
483+
path_parameters={"id": "Y05868-99999-99999-999999"},
484+
body=doc_ref.json(exclude_none=True),
485+
)
486+
487+
result = handler(event, create_mock_context())
488+
489+
body = result.pop("body")
490+
491+
assert result == {"statusCode": "400", "headers": {}, "isBase64Encoded": False}
492+
parsed_body = json.loads(body)
493+
494+
assert parsed_body == {
495+
"resourceType": "OperationOutcome",
496+
"issue": [
497+
{
498+
"severity": "error",
499+
"code": "required",
500+
"details": {
501+
"coding": [
502+
{
503+
"code": "INVALID_RESOURCE",
504+
"display": "Invalid validation of resource",
505+
"system": "https://fhir.nhs.uk/ValueSet/Spine-ErrorOrWarningCode-1",
506+
}
507+
]
508+
},
509+
"diagnostics": "Missing context.related. It must be provided and contain a valid ASID identifier when content contains an SSP URL",
510+
"expression": ["context.related"],
511+
}
512+
],
513+
}
514+
515+
516+
@mock_aws
517+
@mock_repository
518+
def test_create_document_reference_with_no_asid_in_for_ssp_url(
519+
repository: DocumentPointerRepository,
520+
):
521+
doc_ref = load_document_reference("Y05868-736253002-Valid-with-ssp-content")
522+
523+
doc_ref.context.related = [
524+
{
525+
"identifier": {
526+
"system": "https://fhir.nhs.uk/Id/not-an-asid",
527+
"value": "some-other-value",
528+
}
529+
}
530+
]
531+
532+
event = create_test_api_gateway_event(
533+
headers=create_headers(),
534+
path_parameters={"id": "Y05868-99999-99999-999999"},
535+
body=doc_ref.json(exclude_none=True),
536+
)
537+
538+
result = handler(event, create_mock_context())
539+
body = result.pop("body")
540+
541+
assert result == {
542+
"statusCode": "400",
543+
"headers": {},
544+
"isBase64Encoded": False,
545+
}
546+
547+
parsed_body = json.loads(body)
548+
549+
assert parsed_body == {
550+
"resourceType": "OperationOutcome",
551+
"issue": [
552+
{
553+
"severity": "error",
554+
"code": "required",
555+
"details": {
556+
"coding": [
557+
{
558+
"code": "INVALID_RESOURCE",
559+
"display": "Invalid validation of resource",
560+
"system": "https://fhir.nhs.uk/ValueSet/Spine-ErrorOrWarningCode-1",
561+
}
562+
]
563+
},
564+
"diagnostics": "Missing ASID identifier. context.related must contain a valid ASID identifier when content contains an SSP URL",
565+
"expression": ["context.related"],
566+
}
567+
],
568+
}
569+
570+
571+
@mock_aws
572+
@mock_repository
573+
def test_create_document_reference_with_invalid_asid_for_ssp_url(
574+
repository: DocumentPointerRepository,
575+
):
576+
doc_ref = load_document_reference("Y05868-736253002-Valid-with-ssp-content")
577+
578+
doc_ref.context.related = [
579+
{
580+
"identifier": {
581+
"system": "https://fhir.nhs.uk/Id/nhsSpineASID",
582+
"value": "not-a-valid-asid",
583+
}
584+
}
585+
]
586+
587+
event = create_test_api_gateway_event(
588+
headers=create_headers(),
589+
path_parameters={"id": "Y05868-99999-99999-999999"},
590+
body=doc_ref.json(exclude_none=True),
591+
)
592+
593+
result = handler(event, create_mock_context())
594+
body = result.pop("body")
595+
596+
assert result == {
597+
"statusCode": "400",
598+
"headers": {},
599+
"isBase64Encoded": False,
600+
}
601+
602+
parsed_body = json.loads(body)
603+
604+
assert parsed_body == {
605+
"resourceType": "OperationOutcome",
606+
"issue": [
607+
{
608+
"severity": "error",
609+
"code": "value",
610+
"details": {
611+
"coding": [
612+
{
613+
"code": "INVALID_IDENTIFIER_VALUE",
614+
"display": "Invalid identifier value",
615+
"system": "https://fhir.nhs.uk/ValueSet/Spine-ErrorOrWarningCode-1",
616+
}
617+
]
618+
},
619+
"diagnostics": "Invalid ASID value not-a-valid-asid. context.related must contain a valid ASID identifier when content contains an SSP URL",
620+
"expression": ["context.related[].identifier.value"],
621+
}
622+
],
623+
}
624+
625+
411626
@mock_aws
412627
@mock_repository
413628
@freeze_time("2024-03-21T12:34:56.789")

0 commit comments

Comments
 (0)