Skip to content

Commit 906f25d

Browse files
authored
HMAI-136 400 response if HMPPS ID does not match format (#557)
* add error handling for invalid hmpps id on prison controller * add annotation for the 400 response
1 parent bbd709c commit 906f25d

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/prison/PrisonController.kt

+9
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import uk.gov.justice.digital.hmpps.hmppsintegrationapi.exception.EntityNotFound
1717
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.DataResponse
1818
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Person
1919
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApi
20+
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError.Type.BAD_REQUEST
2021
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError.Type.ENTITY_NOT_FOUND
2122
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.services.GetPersonService
2223
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.services.GetPrisonersService
@@ -40,6 +41,11 @@ class PrisonController(
4041
description = "<b>Applicable filters</b>: <ul><li>prisons</li></ul>",
4142
responses = [
4243
ApiResponse(responseCode = "200", useReturnTypeSchema = true, description = "Successfully found a prisoner with the provided HMPPS ID."),
44+
ApiResponse(
45+
responseCode = "400",
46+
description = "The HMPPS ID provided has an invalid format.",
47+
content = [Content(schema = Schema(ref = "#/components/schemas/BadRequest"))],
48+
),
4349
ApiResponse(responseCode = "404", content = [Content(schema = Schema(ref = "#/components/schemas/PersonNotFound"))]),
4450
ApiResponse(responseCode = "500", content = [Content(schema = Schema(ref = "#/components/schemas/InternalServerError"))]),
4551
],
@@ -49,6 +55,9 @@ class PrisonController(
4955
): DataResponse<Person?> {
5056
val response = getPersonService.getPrisoner(hmppsId)
5157

58+
if (response.hasErrorCausedBy(BAD_REQUEST, causedBy = UpstreamApi.NOMIS)) {
59+
throw ValidationException("Invalid HMPPS ID: $hmppsId")
60+
}
5261
if (response.hasErrorCausedBy(ENTITY_NOT_FOUND, causedBy = UpstreamApi.PROBATION_OFFENDER_SEARCH)) {
5362
throw EntityNotFoundException("Could not find person with hmppsId: $hmppsId")
5463
}

src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/prison/PrisonControllerTest.kt

+21
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Person
1818
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Response
1919
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApi
2020
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError
21+
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError.Type.BAD_REQUEST
2122
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError.Type.ENTITY_NOT_FOUND
2223
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.services.GetPersonService
2324
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.services.GetPrisonersService
@@ -174,6 +175,26 @@ internal class PrisonControllerTest(
174175
result.response.status.shouldBe(404)
175176
}
176177

178+
it("returns 400 when HMPPS ID does not match format") {
179+
whenever(getPersonService.getPrisoner(hmppsId)).thenReturn(
180+
Response(
181+
data = null,
182+
errors =
183+
listOf(
184+
UpstreamApiError(
185+
description = "Invalid HMPPS ID: $hmppsId",
186+
type = BAD_REQUEST,
187+
causedBy = UpstreamApi.NOMIS,
188+
),
189+
),
190+
),
191+
)
192+
193+
val result = mockMvc.performAuthorised("$basePath/prisoners/$hmppsId")
194+
195+
result.response.status.shouldBe(400)
196+
}
197+
177198
it("returns 500 when prison/prisoners throws an unexpected error") {
178199

179200
whenever(getPrisonersService.execute("Barry", "Allen", "2023-03-01")).thenThrow(RuntimeException("Service error"))

0 commit comments

Comments
 (0)