@@ -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+
81142def 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