Skip to content

Commit 6050211

Browse files
committed
NPA-4824: Add INVALID_STATUS_REASON error
1 parent 12d6e2d commit 6050211

File tree

5 files changed

+112
-33
lines changed

5 files changed

+112
-33
lines changed

sandbox/api/constants.py

Lines changed: 69 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010

1111
# Common examples
1212
INTERNAL_SERVER_ERROR_EXAMPLE = "./api/examples/errors/internal-server-error.yaml"
13-
BAD_REQUEST_INCLUDE_PARAM_INVALID = "./api/examples/errors/invalid-include-parameter.yaml"
13+
BAD_REQUEST_INCLUDE_PARAM_INVALID = (
14+
"./api/examples/errors/invalid-include-parameter.yaml"
15+
)
1416
INVALIDATED_RESOURCE = "./api/examples/errors/invalidated-resource.yaml"
1517
MISSING_IDENTIFIER = "./api/examples/errors/missing-identifier.yaml"
1618
INVALID_IDENTIFIER = "./api/examples/errors/invalid-identifier.yaml"
@@ -26,7 +28,9 @@
2628
GET_CONSENT__FILTERED_RELATIONSHIPS_STATUS_PROPOSED_ACTIVE = (
2729
f"{GET_CONSENT__DIRECTORY}filtered-relationships-status-proposed-active.yaml"
2830
)
29-
GET_CONSENT__MULTIPLE_RELATIONSHIPS = f"{GET_CONSENT__DIRECTORY}multiple-relationships.yaml"
31+
GET_CONSENT__MULTIPLE_RELATIONSHIPS = (
32+
f"{GET_CONSENT__DIRECTORY}multiple-relationships.yaml"
33+
)
3034
GET_CONSENT__MULTIPLE_RELATIONSHIPS_INCLUDE_BOTH = (
3135
f"{GET_CONSENT__DIRECTORY}multiple-relationships-include-performer-patient.yaml"
3236
)
@@ -37,54 +41,91 @@
3741
f"{GET_CONSENT__DIRECTORY}multiple-relationships-include-performer.yaml"
3842
)
3943
GET_CONSENT__NO_RELATIONSHIPS = f"{GET_CONSENT__DIRECTORY}no-relationships.yaml"
40-
GET_CONSENT__SINGLE_CONSENTING_ADULT_RELATIONSHIP = f"{GET_CONSENT__DIRECTORY}single-consenting-adult-relationship.yaml"
41-
GET_CONSENT__SINGLE_CONSENTING_ADULT_RELATIONSHIP_INCLUDE_BOTH = (
42-
f"{GET_CONSENT__DIRECTORY}single-consenting-adult-relationship-include-performer-patient.yaml"
44+
GET_CONSENT__SINGLE_CONSENTING_ADULT_RELATIONSHIP = (
45+
f"{GET_CONSENT__DIRECTORY}single-consenting-adult-relationship.yaml"
46+
)
47+
GET_CONSENT__SINGLE_CONSENTING_ADULT_RELATIONSHIP_INCLUDE_BOTH = f"{GET_CONSENT__DIRECTORY}single-consenting-adult-relationship-include-performer-patient.yaml"
48+
GET_CONSENT__SINGLE_MOTHER_CHILD_RELATIONSHIP = (
49+
f"{GET_CONSENT__DIRECTORY}single-mother-child-relationship.yaml"
4350
)
44-
GET_CONSENT__SINGLE_MOTHER_CHILD_RELATIONSHIP = f"{GET_CONSENT__DIRECTORY}single-mother-child-relationship.yaml"
45-
GET_CONSENT__SINGLE_MOTHER_CHILD_RELATIONSHIP_INCLUDE_BOTH = (
46-
f"{GET_CONSENT__DIRECTORY}single-mother-child-relationship-include-performer-patient.yaml"
51+
GET_CONSENT__SINGLE_MOTHER_CHILD_RELATIONSHIP_INCLUDE_BOTH = f"{GET_CONSENT__DIRECTORY}single-mother-child-relationship-include-performer-patient.yaml"
52+
GET_CONSENT__STATUS_PARAM_INVALID = (
53+
f"{GET_CONSENT__DIRECTORY}errors/invalid-status-parameter.yaml"
4754
)
48-
GET_CONSENT__STATUS_PARAM_INVALID = f"{GET_CONSENT__DIRECTORY}errors/invalid-status-parameter.yaml"
4955

5056
# POST Consent
5157
POST_CONSENT__DIRECTORY = "./api/examples/POST_Consent/"
5258
POST_CONSENT__SUCCESS = f"{POST_CONSENT__DIRECTORY}success.yaml"
53-
POST_CONSENT__DUPLICATE_RELATIONSHIP_ERROR = f"{POST_CONSENT__DIRECTORY}errors/duplicate_relationship_error.yaml"
54-
POST_CONSENT__PERFORMER_IDENTIFIER_ERROR = f"{POST_CONSENT__DIRECTORY}errors/invalid_performer_identifier_error.yaml"
59+
POST_CONSENT__DUPLICATE_RELATIONSHIP_ERROR = (
60+
f"{POST_CONSENT__DIRECTORY}errors/duplicate_relationship_error.yaml"
61+
)
62+
POST_CONSENT__PERFORMER_IDENTIFIER_ERROR = (
63+
f"{POST_CONSENT__DIRECTORY}errors/invalid_performer_identifier_error.yaml"
64+
)
5565

5666
# PATCH Consent
5767
PATCH_CONSENT__DIRECTORY = "./api/examples/PATCH_Consent/"
5868
PATCH_CONSENT__SUCCESS = f"{PATCH_CONSENT__DIRECTORY}success.yaml"
59-
PATCH_CONSENT__INVALID_PATCH_FORMAT = f"{PATCH_CONSENT__DIRECTORY}errors/invalid_patch_format.yaml"
69+
PATCH_CONSENT__INVALID_PATCH_FORMAT = (
70+
f"{PATCH_CONSENT__DIRECTORY}errors/invalid_patch_format.yaml"
71+
)
6072
PATCH_CONSENT__INVALID_PATH = f"{PATCH_CONSENT__DIRECTORY}errors/invalid_path.yaml"
61-
PATCH_CONSENT__INVALID_STATUS_CODE = f"{PATCH_CONSENT__DIRECTORY}errors/invalid_status_code.yaml"
62-
PATCH_CONSENT__RESOURCE_NOT_FOUND = f"{PATCH_CONSENT__DIRECTORY}errors/resource_not_found.yaml"
63-
PATCH_CONSENT__INVALID_STATE_TRANSITION = f"{PATCH_CONSENT__DIRECTORY}errors/invalid_state_transition.yaml"
73+
PATCH_CONSENT__INVALID_STATUS_CODE = (
74+
f"{PATCH_CONSENT__DIRECTORY}errors/invalid_status_code.yaml"
75+
)
76+
PATCH_CONSENT__INVALID_STATUS_REASON = (
77+
f"{PATCH_CONSENT__DIRECTORY}errors/invalid_status_reason.yaml"
78+
)
79+
PATCH_CONSENT__RESOURCE_NOT_FOUND = (
80+
f"{PATCH_CONSENT__DIRECTORY}errors/resource_not_found.yaml"
81+
)
82+
PATCH_CONSENT__INVALID_STATE_TRANSITION = (
83+
f"{PATCH_CONSENT__DIRECTORY}errors/invalid_state_transition.yaml"
84+
)
6485

6586
# POST QuestionnaireResponse
6687
POST_QUESTIONNAIRE_RESPONSE_DIRECTORY = "./api/examples/POST_QuestionnaireResponse/"
67-
POST_QUESTIONNAIRE_RESPONSE__SUCCESS = f"{POST_QUESTIONNAIRE_RESPONSE_DIRECTORY}success.yaml"
88+
POST_QUESTIONNAIRE_RESPONSE__SUCCESS = (
89+
f"{POST_QUESTIONNAIRE_RESPONSE_DIRECTORY}success.yaml"
90+
)
6891

6992
# GET QuestionnaireResponse
7093
GET_QUESTIONNAIRE_RESPONSE_DIRECTORY = "./api/examples/GET_QuestionnaireResponse/"
71-
GET_QUESTIONNAIRE_RESPONSE__SUCCESS = f"{GET_QUESTIONNAIRE_RESPONSE_DIRECTORY}success.yaml"
72-
GET_QUESTIONNAIRE_RESPONSE__INVALID = f"{GET_QUESTIONNAIRE_RESPONSE_DIRECTORY}errors/invalid_reference_code.yaml"
73-
GET_QUESTIONNAIRE_RESPONSE__MISSING = f"{GET_QUESTIONNAIRE_RESPONSE_DIRECTORY}errors/missing_reference_code.yaml"
74-
GET_QUESTIONNAIRE_RESPONSE__NOT_FOUND = (
75-
f"{GET_QUESTIONNAIRE_RESPONSE_DIRECTORY}errors/questionnaire_response_not_found.yaml"
94+
GET_QUESTIONNAIRE_RESPONSE__SUCCESS = (
95+
f"{GET_QUESTIONNAIRE_RESPONSE_DIRECTORY}success.yaml"
96+
)
97+
GET_QUESTIONNAIRE_RESPONSE__INVALID = (
98+
f"{GET_QUESTIONNAIRE_RESPONSE_DIRECTORY}errors/invalid_reference_code.yaml"
99+
)
100+
GET_QUESTIONNAIRE_RESPONSE__MISSING = (
101+
f"{GET_QUESTIONNAIRE_RESPONSE_DIRECTORY}errors/missing_reference_code.yaml"
76102
)
103+
GET_QUESTIONNAIRE_RESPONSE__NOT_FOUND = f"{GET_QUESTIONNAIRE_RESPONSE_DIRECTORY}errors/questionnaire_response_not_found.yaml"
77104

78105
# GET RelatedPerson
79106
RELATED_DIRECTORY = "./api/examples/GET_RelatedPerson/"
80-
RELATED__ERROR_IDENTIFIER_MISSING = f"{RELATED_DIRECTORY}errors/invalid-identifier-missing.yaml"
81-
RELATED__ERROR_IDENTIFIER_SYSTEM = f"{RELATED_DIRECTORY}errors/invalid-identifier-system.yaml"
107+
RELATED__ERROR_IDENTIFIER_MISSING = (
108+
f"{RELATED_DIRECTORY}errors/invalid-identifier-missing.yaml"
109+
)
110+
RELATED__ERROR_IDENTIFIER_SYSTEM = (
111+
f"{RELATED_DIRECTORY}errors/invalid-identifier-system.yaml"
112+
)
82113
RELATED__ERROR_IDENTIFIER = f"{RELATED_DIRECTORY}errors/invalid-identifier.yaml"
83114
RELATED__EMPTY_RESPONSE = f"{RELATED_DIRECTORY}empty_response.yaml"
84115
RELATED__LIST_RELATIONSHIP = f"{RELATED_DIRECTORY}list_relationship_9000000017.yaml"
85-
RELATED__LIST_RELATIONSHIP_WITH_INCLUDE = f"{RELATED_DIRECTORY}list_relationship_9000000017_include.yaml"
86-
RELATED__VERIFY_RELATIONSHIP_09 = f"{RELATED_DIRECTORY}verify_relationship_9000000009.yaml"
87-
RELATED__VERIFY_RELATIONSHIP_09_WITH_INCLUDE = f"{RELATED_DIRECTORY}verify_relationship_9000000009_include.yaml"
88-
RELATED__VERIFY_RELATIONSHIP_25 = f"{RELATED_DIRECTORY}verify_relationship_9000000025.yaml"
89-
RELATED__VERIFY_RELATIONSHIP_25_WITH_INCLUDE = f"{RELATED_DIRECTORY}verify_relationship_9000000025_include.yaml"
116+
RELATED__LIST_RELATIONSHIP_WITH_INCLUDE = (
117+
f"{RELATED_DIRECTORY}list_relationship_9000000017_include.yaml"
118+
)
119+
RELATED__VERIFY_RELATIONSHIP_09 = (
120+
f"{RELATED_DIRECTORY}verify_relationship_9000000009.yaml"
121+
)
122+
RELATED__VERIFY_RELATIONSHIP_09_WITH_INCLUDE = (
123+
f"{RELATED_DIRECTORY}verify_relationship_9000000009_include.yaml"
124+
)
125+
RELATED__VERIFY_RELATIONSHIP_25 = (
126+
f"{RELATED_DIRECTORY}verify_relationship_9000000025.yaml"
127+
)
128+
RELATED__VERIFY_RELATIONSHIP_25_WITH_INCLUDE = (
129+
f"{RELATED_DIRECTORY}verify_relationship_9000000025_include.yaml"
130+
)
90131
RELATED__EMPTY_RESPONSE = f"{RELATED_DIRECTORY}empty_response_9000000033.yaml"

sandbox/api/patch_consent.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
PATCH_CONSENT__INVALID_STATUS_CODE,
1010
PATCH_CONSENT__RESOURCE_NOT_FOUND,
1111
PATCH_CONSENT__SUCCESS,
12+
PATCH_CONSENT__INVALID_STATUS_REASON,
1213
)
1314
from .utils import generate_response_from_example
1415

@@ -44,23 +45,37 @@ def patch_consent_response(identifier: str) -> Union[dict, tuple]:
4445

4546
elif identifier == "3a2679eb":
4647
# Invalid patch format
47-
return generate_response_from_example(PATCH_CONSENT__INVALID_PATCH_FORMAT, 400)
48+
return generate_response_from_example(
49+
PATCH_CONSENT__INVALID_PATCH_FORMAT, 400
50+
)
4851

4952
elif identifier == "94df7c8f":
5053
# Invalid path
5154
return generate_response_from_example(PATCH_CONSENT__INVALID_PATH, 400)
5255

5356
elif identifier == "2a7b736d":
5457
# Invalid status code
55-
return generate_response_from_example(PATCH_CONSENT__INVALID_STATUS_CODE, 422)
58+
return generate_response_from_example(
59+
PATCH_CONSENT__INVALID_STATUS_CODE, 422
60+
)
5661

5762
elif identifier == "6fb4361b":
5863
# Invalid state transition
59-
return generate_response_from_example(PATCH_CONSENT__INVALID_STATE_TRANSITION, 422)
64+
return generate_response_from_example(
65+
PATCH_CONSENT__INVALID_STATE_TRANSITION, 422
66+
)
67+
68+
elif identifier == "4b6792be":
69+
# Invalid status reason
70+
return generate_response_from_example(
71+
PATCH_CONSENT__INVALID_STATUS_REASON, 422
72+
)
6073

6174
else:
6275
# Resource not found
63-
return generate_response_from_example(PATCH_CONSENT__RESOURCE_NOT_FOUND, 404)
76+
return generate_response_from_example(
77+
PATCH_CONSENT__RESOURCE_NOT_FOUND, 404
78+
)
6479

6580
except Exception:
6681
# Handle any general error

sandbox/api/tests/test_patch_consent.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
PATCH_CONSENT__INVALID_STATUS_CODE,
1212
PATCH_CONSENT__RESOURCE_NOT_FOUND,
1313
PATCH_CONSENT__SUCCESS,
14+
PATCH_CONSENT__INVALID_STATUS_REASON,
1415
)
1516

1617
CONSENT_API_ENDPOINT = "/FHIR/R4/Consent"
@@ -25,6 +26,7 @@
2526
("3a2679eb", PATCH_CONSENT__INVALID_PATCH_FORMAT, 400),
2627
("94df7c8f", PATCH_CONSENT__INVALID_PATH, 400),
2728
("2a7b736d", PATCH_CONSENT__INVALID_STATUS_CODE, 422),
29+
("2a7b736d", PATCH_CONSENT__INVALID_STATUS_REASON, 422),
2830
("6fb4361b", PATCH_CONSENT__INVALID_STATE_TRANSITION, 422),
2931
("xxxxxxxx", PATCH_CONSENT__RESOURCE_NOT_FOUND, 404),
3032
("12345678", PATCH_CONSENT__RESOURCE_NOT_FOUND, 404),
@@ -53,6 +55,8 @@ def test_patch_consent_on_request_returns_expected_response(
5355
json = [{"op": "replace", "path": "/status", "value": "inactive"}]
5456
response = client.patch(CONSENT_API_ENDPOINT + f"/{nhs_num}", json=json)
5557
# Assert
56-
mock_generate_response_from_example.assert_called_once_with(response_file_name, status_code)
58+
mock_generate_response_from_example.assert_called_once_with(
59+
response_file_name, status_code
60+
)
5761
assert response.status_code == status_code
5862
assert response.json == loads(mocked_response.get_data(as_text=True))
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
PatchConsentInvalidStatusReasonError:
2+
summary: Bad request invalid status reason
3+
description: 422 error response for a request with an invalid status reason
4+
value:
5+
issue:
6+
- code: invalid
7+
diagnostics: "Invalid status reason."
8+
details:
9+
coding:
10+
- code: "INVALID_STATUS_REASON"
11+
display: "Status reason is invalid."
12+
system: "https://fhir.nhs.uk/R4/CodeSystem/ValidatedRelationships-ErrorOrWarningCode"
13+
version: '1'
14+
severity: error
15+
resourceType: "OperationOutcome"

specification/validated-relationships-service-api.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -723,6 +723,7 @@ paths:
723723
| Invalid patch format | Malformed JSON patch document, request with id '3a2679eb' | HTTP Status 400 and INVALID_PATCH_FORMAT error response |
724724
| Invalid path | Patch targeting non-existent element, request with id '94df7c8f' | HTTP Status 400 and INVALID_PATCH_PATH error response |
725725
| Invalid status code | Patch with invalid status value, request with id '2a7b736d' | HTTP Status 422 and INVALID_STATUS_CODE error response |
726+
| Invalid status reason | Patch with invalid status reason value, request with id '4b6792be' | HTTP Status 422 and INVALID_STATUS_REASON error response |
726727
| Resource not found | Patch for non-existent Consent, request with an id not listed here | HTTP Status 404 and RESOURCE_NOT_FOUND error response |
727728
| Invalid state transition | Patch attempting invalid status change, request with id '6fb4361b' | HTTP Status 422 and INVALID_STATE_TRANSITION error response |
728729
parameters:
@@ -806,6 +807,7 @@ paths:
806807
| 415 | `UNSUPPORTED_MEDIA` | Unsupported media type. |
807808
| 422 | `INVALID_PATCH_PATH` | Invalid patch path. |
808809
| 422 | `INVALID_STATUS_CODE` | Invalid status code. |
810+
| 422 | `INVALID_STATUS_REASON` | Invalid status reason. |
809811
| 422 | `INVALID_STATE_TRANSITION` | Invalid state transition. |
810812
| 422 | `INVALID_LEGAL_BASIS_CODE` | Invalid legal basis code. |
811813
| 422 | `INVALID_END_DATE` | End date is invalid. |
@@ -823,6 +825,8 @@ paths:
823825
$ref: "./examples/responses/PATCH_Consent/errors/invalid_path.yaml#/PatchConsentInvalidPathError"
824826
patchConsentInvalidStatusCodeError:
825827
$ref: "./examples/responses/PATCH_Consent/errors/invalid_status_code.yaml#/PatchConsentInvalidStatusCodeError"
828+
PatchConsentInvalidStatusReasonError:
829+
$ref: "./examples/responses/PATCH_Consent/errors/invalid_status_reason.yaml#/PatchConsentInvalidStatusReasonError"
826830
patchConsentInvalidStateTransitionError:
827831
$ref: "./examples/responses/PATCH_Consent/errors/invalid_state_transition.yaml#/PatchConsentInvalidStateTransitionError"
828832
"5XX":

0 commit comments

Comments
 (0)