Skip to content

Commit 677debf

Browse files
committed
[NRL-1150] WIP Fix up errors
1 parent fc29146 commit 677debf

File tree

2 files changed

+152
-4
lines changed

2 files changed

+152
-4
lines changed

layer/nrlf/core/errors.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ def from_validation_error(
5959
severity="error",
6060
code="invalid",
6161
details=details, # type: ignore
62-
diagnostics=f"{msg} ({error['loc'][0]}: {error['msg']})",
63-
expression=[str(error["loc"][0])], # type: ignore
62+
diagnostics=f"{msg} ({error['loc']}: {error['msg']})",
63+
expression=[str(error["loc"])], # type: ignore
6464
)
6565
for error in exc.errors()
6666
]

layer/nrlf/core/tests/test_request.py

Lines changed: 150 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
import pytest
44

5-
from nrlf.core.errors import OperationOutcomeError
6-
from nrlf.core.request import parse_headers
5+
from nrlf.core.errors import OperationOutcomeError, ParseError
6+
from nrlf.core.request import parse_body, parse_headers
7+
from nrlf.producer.fhir.r4.model import DocumentReference
8+
from nrlf.tests.data import load_document_reference_data
79

810

911
def test_parse_headers_empty_headers():
@@ -129,3 +131,149 @@ def test_parse_headers_case_insensitive():
129131
assert metadata.client_rp_details.developer_app_name == "TestApp"
130132
assert metadata.client_rp_details.developer_app_id == "12345"
131133
assert metadata.ods_code_parts == ("X26", "001")
134+
135+
136+
def test_parse_body_no_model_no_body():
137+
body = None
138+
model = None
139+
140+
result = parse_body(model, body)
141+
142+
assert result is None
143+
144+
145+
def test_parse_body_valid_docref():
146+
model = DocumentReference
147+
docref_body = load_document_reference_data("Y05868-736253002-Valid")
148+
149+
result = parse_body(model, docref_body)
150+
151+
assert isinstance(result, DocumentReference)
152+
153+
154+
def test_parse_body_no_body():
155+
model = DocumentReference
156+
body = None
157+
158+
with pytest.raises(OperationOutcomeError) as error:
159+
parse_body(model, body)
160+
161+
exc = error.value
162+
163+
assert exc.status_code == "400"
164+
assert exc.operation_outcome.model_dump(exclude_none=True) == {
165+
"resourceType": "OperationOutcome",
166+
"issue": [
167+
{
168+
"severity": "error",
169+
"code": "invalid",
170+
"details": {
171+
"coding": [
172+
{
173+
"system": "https://fhir.nhs.uk/ValueSet/Spine-ErrorOrWarningCode-1",
174+
"code": "BAD_REQUEST",
175+
"display": "Bad request",
176+
}
177+
],
178+
},
179+
"diagnostics": "Request body is required",
180+
}
181+
],
182+
}
183+
184+
185+
def test_parse_body_invalid_docref_json():
186+
model = DocumentReference
187+
docref_body = load_document_reference_data("Y05868-736253002-Valid")
188+
189+
docref_body = docref_body.replace('unstructured"', "unstructured")
190+
191+
with pytest.raises(ParseError) as error:
192+
parse_body(model, docref_body)
193+
194+
response = error.value.response.model_dump()
195+
196+
assert response["statusCode"] == "400"
197+
assert response["body"] == json.dumps(
198+
{
199+
"resourceType": "OperationOutcome",
200+
"issue": [
201+
{
202+
"severity": "error",
203+
"code": "invalid",
204+
"details": {
205+
"coding": [
206+
{
207+
"system": "https://fhir.nhs.uk/ValueSet/Spine-ErrorOrWarningCode-1",
208+
"code": "MESSAGE_NOT_WELL_FORMED",
209+
"display": "Message not well formed",
210+
}
211+
],
212+
},
213+
"diagnostics": "Request body could not be parsed ((): Invalid JSON: control character (\\\\u0000-\\\\u001F) found while parsing a string at line 72 column 0)",
214+
}
215+
],
216+
}
217+
)
218+
219+
220+
def test_parse_body_invalid_json():
221+
model = DocumentReference
222+
body = '{ "type": "is-not-a-docref" }'
223+
224+
with pytest.raises(ParseError) as error:
225+
parse_body(model, body)
226+
227+
response = error.value.response
228+
229+
assert response.statusCode == "400"
230+
assert json.loads(response.body) == {
231+
"resourceType": "OperationOutcome",
232+
"issue": [
233+
{
234+
"severity": "error",
235+
"code": "invalid",
236+
"details": {
237+
"coding": [
238+
{
239+
"system": "https://fhir.nhs.uk/ValueSet/Spine-ErrorOrWarningCode-1",
240+
"code": "MESSAGE_NOT_WELL_FORMED",
241+
"display": "Message not well formed",
242+
}
243+
],
244+
},
245+
"diagnostics": "",
246+
}
247+
],
248+
}
249+
250+
251+
def test_parse_body_not_json():
252+
model = DocumentReference
253+
body = "is not json"
254+
255+
with pytest.raises(OperationOutcomeError) as error:
256+
parse_body(model, body)
257+
258+
exc = error.value
259+
260+
assert exc.status_code == "400"
261+
assert exc.operation_outcome.model_dump(exclude_none=True) == {
262+
"resourceType": "OperationOutcome",
263+
"issue": [
264+
{
265+
"severity": "error",
266+
"code": "invalid",
267+
"details": {
268+
"coding": [
269+
{
270+
"system": "https://fhir.nhs.uk/ValueSet/Spine-ErrorOrWarningCode-1",
271+
"code": "INVALID_PARAMETER",
272+
"display": "The parameter value is not valid",
273+
}
274+
],
275+
},
276+
"diagnostics": "Invalid query parameter",
277+
}
278+
],
279+
}

0 commit comments

Comments
 (0)