From d51eb6d39e28003c32b7541d7971f12f05829349 Mon Sep 17 00:00:00 2001 From: Chiara Date: Fri, 1 Mar 2024 11:47:04 +0000 Subject: [PATCH 01/15] Thin Slice --- .../v1/person/RiskCategoriesController.kt | 36 ++++++ .../gateways/NomisGateway.kt | 24 ++++ .../models/hmpps/RiskAssessment.kt | 5 + .../models/hmpps/RiskCategory.kt | 6 + .../models/nomis/NomisAssessment.kt | 11 ++ .../models/nomis/NomisInmateDetail.kt | 13 +++ .../GetRiskCategoriesForPersonService.kt | 29 +++++ .../v1/person/RiskCategoriesControllerTest.kt | 109 ++++++++++++++++++ .../nomis/GetRiskCategoriesForPersonTest.kt | 74 ++++++++++++ .../mockservers/NomisApiMockServer.kt | 13 +++ .../GetRiskCategoriesForPersonServiceTest.kt | 99 ++++++++++++++++ 11 files changed, 419 insertions(+) create mode 100644 src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/RiskCategoriesController.kt create mode 100644 src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/RiskAssessment.kt create mode 100644 src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/RiskCategory.kt create mode 100644 src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/nomis/NomisAssessment.kt create mode 100644 src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/nomis/NomisInmateDetail.kt create mode 100644 src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskCategoriesForPersonService.kt create mode 100644 src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/RiskCategoriesControllerTest.kt create mode 100644 src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/nomis/GetRiskCategoriesForPersonTest.kt create mode 100644 src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskCategoriesForPersonServiceTest.kt diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/RiskCategoriesController.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/RiskCategoriesController.kt new file mode 100644 index 000000000..ae8b9b9d4 --- /dev/null +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/RiskCategoriesController.kt @@ -0,0 +1,36 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.controllers.v1.person + +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.exception.EntityNotFoundException +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.extensions.decodeUrlCharacters +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.RiskCategory +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.services.GetRiskCategoriesForPersonService +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.services.internal.AuditService + +@RestController +@RequestMapping("/v1/persons") +class RiskCategoriesController( + @Autowired val getRiskCategoriesForPersonService: GetRiskCategoriesForPersonService, + @Autowired val auditService: AuditService, +) { + + @GetMapping("{encodedHmppsId}/risks/categories") + fun getPersonRiskCategories( + @PathVariable encodedHmppsId: String, + + ): Map { + val hmppsId = encodedHmppsId.decodeUrlCharacters() + val response = getRiskCategoriesForPersonService.execute(hmppsId) + + if (response.hasError(UpstreamApiError.Type.ENTITY_NOT_FOUND)) { + throw EntityNotFoundException("Could not find person with id: $hmppsId") + } + auditService.createEvent("GET_PERSON_RISK_CATEGORIES", "Person risk categories with hmpps id: $hmppsId has been retrieved") + return mapOf("data" to response.data) + } +} diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/NomisGateway.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/NomisGateway.kt index a01f8974b..9b8a62846 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/NomisGateway.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/NomisGateway.kt @@ -11,6 +11,7 @@ import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Alert import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.ImageMetadata import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Offence import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Response +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.RiskCategory import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Sentence import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.SentenceAdjustment import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.SentenceKeyDates @@ -19,6 +20,7 @@ import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.nomis.NomisAddres import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.nomis.NomisAlert import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.nomis.NomisBooking import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.nomis.NomisImageDetail +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.nomis.NomisInmateDetail import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.nomis.NomisOffenceHistoryDetail import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.nomis.NomisOffenderSentence import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.nomis.NomisSentence @@ -215,6 +217,28 @@ class NomisGateway(@Value("\${services.prison-api.base-url}") baseUrl: String) { } } + fun getRiskCategoriesForPerson(id: String): Response { + val result = webClient.request( + HttpMethod.GET, + "/api/offenders/$id", + authenticationHeader(), + UpstreamApi.NOMIS, + ) + + return when (result) { + is WebClientWrapperResponse.Success -> { + Response(data = result.data.toRiskCategory()) + } + + is WebClientWrapperResponse.Error -> { + Response( + data = RiskCategory(), + errors = result.errors, + ) + } + } + } + private fun authenticationHeader(): Map { val token = hmppsAuthGateway.getClientToken("NOMIS") diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/RiskAssessment.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/RiskAssessment.kt new file mode 100644 index 000000000..1e4791fb4 --- /dev/null +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/RiskAssessment.kt @@ -0,0 +1,5 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps + +class RiskAssessment( + val classificationCode: String? = null, +) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/RiskCategory.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/RiskCategory.kt new file mode 100644 index 000000000..733fe49c4 --- /dev/null +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/RiskCategory.kt @@ -0,0 +1,6 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps + +data class RiskCategory( + val offenderNo: String? = null, + val assessments: List = emptyList(), +) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/nomis/NomisAssessment.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/nomis/NomisAssessment.kt new file mode 100644 index 000000000..f57098198 --- /dev/null +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/nomis/NomisAssessment.kt @@ -0,0 +1,11 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.nomis + +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.RiskAssessment + +data class NomisAssessment( + val classificationCode: String? = null, +) { + fun toRiskAssessment(): RiskAssessment = RiskAssessment( + classificationCode = this.classificationCode, + ) +} diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/nomis/NomisInmateDetail.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/nomis/NomisInmateDetail.kt new file mode 100644 index 000000000..17095dd03 --- /dev/null +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/nomis/NomisInmateDetail.kt @@ -0,0 +1,13 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.nomis + +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.RiskCategory + +data class NomisInmateDetail( + val offenderNo: String? = null, + val assessments: List = emptyList(), +) { + fun toRiskCategory(): RiskCategory = RiskCategory( + offenderNo = this.offenderNo, + assessments = this.assessments.mapNotNull { it?.toRiskAssessment() }, + ) +} diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskCategoriesForPersonService.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskCategoriesForPersonService.kt new file mode 100644 index 000000000..074d62b4a --- /dev/null +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskCategoriesForPersonService.kt @@ -0,0 +1,29 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.services + +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.stereotype.Service +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.NomisGateway +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Response +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.RiskCategory + +@Service +class GetRiskCategoriesForPersonService( + @Autowired val nomisGateway: NomisGateway, + @Autowired val getPersonService: GetPersonService, +) { + fun execute(hmppsId: String): Response { + val personResponse = getPersonService.execute(hmppsId = hmppsId) + val deliusCrn = personResponse.data?.identifiers?.deliusCrn + + var personRiskCategories: Response = Response(data = RiskCategory()) + + if (deliusCrn != null) { + personRiskCategories = nomisGateway.getRiskCategoriesForPerson(id = deliusCrn) + } + + return Response( + data = personRiskCategories.data, + errors = personResponse.errors + personRiskCategories.errors, + ) + } +} diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/RiskCategoriesControllerTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/RiskCategoriesControllerTest.kt new file mode 100644 index 000000000..397f9b854 --- /dev/null +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/RiskCategoriesControllerTest.kt @@ -0,0 +1,109 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.controllers.v1.person + +import io.kotest.core.spec.style.DescribeSpec +import io.kotest.matchers.shouldBe +import io.kotest.matchers.string.shouldContain +import org.mockito.Mockito +import org.mockito.internal.verification.VerificationModeFactory +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest +import org.springframework.boot.test.mock.mockito.MockBean +import org.springframework.http.HttpStatus +import org.springframework.test.context.ActiveProfiles +import org.springframework.test.web.servlet.MockMvc +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.extensions.removeWhitespaceAndNewlines +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.helpers.IntegrationAPIMockMvc +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Response +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.RiskAssessment +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.RiskCategory +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApi +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.services.GetRiskCategoriesForPersonService +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.services.internal.AuditService +import java.net.URLEncoder +import java.nio.charset.StandardCharsets + +@WebMvcTest(controllers = [RiskCategoriesController::class]) +@ActiveProfiles("test") +internal class RiskCategoriesControllerTest( + @Autowired var springMockMvc: MockMvc, + @MockBean val getRiskCategoriesForPersonService: GetRiskCategoriesForPersonService, + @MockBean val auditService: AuditService, +) : DescribeSpec( + { + val hmppsId = "9999/11111A" + val encodedHmppsId = URLEncoder.encode(hmppsId, StandardCharsets.UTF_8) + val path = "/v1/persons/$encodedHmppsId/risks/categories" + val mockMvc = IntegrationAPIMockMvc(springMockMvc) + + describe("GET $path") { + beforeTest { + Mockito.reset(getRiskCategoriesForPersonService) + whenever(getRiskCategoriesForPersonService.execute(hmppsId)).thenReturn( + Response( + data = RiskCategory( + offenderNo = "123", + assessments = listOf(RiskAssessment(classificationCode = "C")), + ), + ), + ) + + Mockito.reset(auditService) + } + + it("returns a 200 OK status code") { + val result = mockMvc.performAuthorised(path) + + result.response.status.shouldBe(HttpStatus.OK.value()) + } + + it("gets the risk categories for a person with the matching ID") { + mockMvc.performAuthorised(path) + verify(getRiskCategoriesForPersonService, VerificationModeFactory.times(1)).execute(hmppsId) + } + + it("logs audit") { + mockMvc.performAuthorised(path) + + verify(auditService, VerificationModeFactory.times(1)).createEvent("GET_PERSON_RISK_CATEGORIES", "Person risk categories with hmpps id: $hmppsId has been retrieved") + } + + it("returns the risk categories for a person with the matching ID") { + val result = mockMvc.performAuthorised(path) + + result.response.contentAsString.shouldContain( + """ + "data": { + "offenderNo": "123", + "assessments": [ + { + "classificationCode": "C" + } + ] + } + """.removeWhitespaceAndNewlines(), + ) + } + + it("returns a 404 NOT FOUND status code when person isn't found in the upstream API") { + whenever(getRiskCategoriesForPersonService.execute(hmppsId)).thenReturn( + Response( + data = RiskCategory(), + errors = listOf( + UpstreamApiError( + causedBy = UpstreamApi.NOMIS, + type = UpstreamApiError.Type.ENTITY_NOT_FOUND, + ), + ), + ), + ) + + val result = mockMvc.performAuthorised(path) + + result.response.status.shouldBe(HttpStatus.NOT_FOUND.value()) + } + } + }, +) diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/nomis/GetRiskCategoriesForPersonTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/nomis/GetRiskCategoriesForPersonTest.kt new file mode 100644 index 000000000..c0f68fb25 --- /dev/null +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/nomis/GetRiskCategoriesForPersonTest.kt @@ -0,0 +1,74 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.nomis + +import io.kotest.core.spec.style.DescribeSpec +import io.kotest.matchers.collections.shouldHaveSize +import io.kotest.matchers.shouldBe +import org.mockito.Mockito +import org.mockito.internal.verification.VerificationModeFactory +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever +import org.springframework.boot.test.context.ConfigDataApplicationContextInitializer +import org.springframework.boot.test.mock.mockito.MockBean +import org.springframework.http.HttpStatus +import org.springframework.test.context.ActiveProfiles +import org.springframework.test.context.ContextConfiguration +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.extensions.removeWhitespaceAndNewlines +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.HmppsAuthGateway +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.NomisGateway +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers.HmppsAuthMockServer +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.mockservers.NomisApiMockServer +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApi +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError + +@ActiveProfiles("test") +@ContextConfiguration( + initializers = [ConfigDataApplicationContextInitializer::class], + classes = [NomisGateway::class], +) +class GetRiskCategoriesForPersonTest( + @MockBean val hmppsAuthGateway: HmppsAuthGateway, + val nomisGateway: NomisGateway, +) : + DescribeSpec( + { + val nomisApiMockServer = NomisApiMockServer() + val offenderNo = "123" + + beforeEach { + nomisApiMockServer.start() + nomisApiMockServer.stubGetRiskCategoriesForPerson( + offenderNo, + """ + { + "assessments": [ + "classificationCode": "C" + ] + } + """.removeWhitespaceAndNewlines(), + ) + + Mockito.reset(hmppsAuthGateway) + whenever(hmppsAuthGateway.getClientToken("NOMIS")).thenReturn(HmppsAuthMockServer.TOKEN) + } + + afterTest { + nomisApiMockServer.stop() + } + + it("authenticates using HMPPS Auth with credentials") { + nomisGateway.getRiskCategoriesForPerson(offenderNo) + + verify(hmppsAuthGateway, VerificationModeFactory.times(1)).getClientToken("NOMIS") + } + + it("returns an error when 404 Not Found is returned because no person is found") { + nomisApiMockServer.stubGetRiskCategoriesForPerson(offenderNo, "", HttpStatus.NOT_FOUND) + + val response = nomisGateway.getRiskCategoriesForPerson(offenderNo) + + response.errors.shouldHaveSize(1) + response.errors.first().causedBy.shouldBe(UpstreamApi.NOMIS) + response.errors.first().type.shouldBe(UpstreamApiError.Type.ENTITY_NOT_FOUND) + } + }, + ) diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/mockservers/NomisApiMockServer.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/mockservers/NomisApiMockServer.kt index 9985d9a82..ccb4bbaa6 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/mockservers/NomisApiMockServer.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/mockservers/NomisApiMockServer.kt @@ -160,4 +160,17 @@ class NomisApiMockServer : WireMockServer(WIREMOCK_PORT) { ), ) } + + fun stubGetRiskCategoriesForPerson(nomisNumber: String, body: String, status: HttpStatus = HttpStatus.OK) { + stubFor( + get("/api/offenders/$nomisNumber") + .withHeader("Authorization", matching("Bearer ${HmppsAuthMockServer.TOKEN}")) + .willReturn( + aResponse() + .withHeader("Content-Type", "application/json") + .withStatus(status.value()) + .withBody(body.trimIndent()), + ), + ) + } } diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskCategoriesForPersonServiceTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskCategoriesForPersonServiceTest.kt new file mode 100644 index 000000000..d25db0b5a --- /dev/null +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskCategoriesForPersonServiceTest.kt @@ -0,0 +1,99 @@ +package uk.gov.justice.digital.hmpps.hmppsintegrationapi.services + +import io.kotest.core.spec.style.DescribeSpec +import io.kotest.matchers.collections.shouldHaveSize +import io.kotest.matchers.shouldBe +import org.mockito.Mockito +import org.mockito.internal.verification.VerificationModeFactory +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever +import org.springframework.boot.test.context.ConfigDataApplicationContextInitializer +import org.springframework.boot.test.mock.mockito.MockBean +import org.springframework.test.context.ContextConfiguration +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.NomisGateway +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Identifiers +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Person +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Response +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.RiskAssessment +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.RiskCategory +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApi +import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError + +@ContextConfiguration( + initializers = [ConfigDataApplicationContextInitializer::class], + classes = [GetRiskCategoriesForPersonService::class], +) +internal class GetRiskCategoriesForPersonServiceTest( + @MockBean val nomisGateway: NomisGateway, + @MockBean val getPersonService: GetPersonService, + private val getRiskCategoriesForPersonService: GetRiskCategoriesForPersonService, +) : DescribeSpec( + { + val hmppsId = "1234/56789B" + val deliusCrn = "X123456" + + val personFromProbationOffenderSearch = + Person(firstName = "Phoebe", lastName = "Buffay", identifiers = Identifiers(deliusCrn = deliusCrn)) + + beforeEach { + Mockito.reset(getPersonService) + Mockito.reset(nomisGateway) + + whenever(getPersonService.execute(hmppsId = hmppsId)).thenReturn( + Response( + data = personFromProbationOffenderSearch, + ), + ) + + whenever(nomisGateway.getRiskCategoriesForPerson(deliusCrn)).thenReturn(Response(data = RiskCategory())) + } + + it("gets a person from getPersonService") { + getRiskCategoriesForPersonService.execute(hmppsId) + + verify(getPersonService, VerificationModeFactory.times(1)).execute(hmppsId = hmppsId) + } + + it("gets a risk category for a person from ARN API using CRN") { + getRiskCategoriesForPersonService.execute(hmppsId) + + verify(nomisGateway, VerificationModeFactory.times(1)).getRiskCategoriesForPerson(deliusCrn) + } + + it("returns a risk category for a person") { + val riskCategory = RiskCategory(offenderNo = "123", assessments = listOf(RiskAssessment(classificationCode = "987"))) + + whenever(nomisGateway.getRiskCategoriesForPerson(deliusCrn)).thenReturn( + Response(data = riskCategory), + ) + + val response = getRiskCategoriesForPersonService.execute(hmppsId) + + response.data.shouldBe(riskCategory) + } + + describe("when an upstream API returns an error") { + + it("returns error from ARN API when person/crn cannot be found in ARN") { + + whenever(nomisGateway.getRiskCategoriesForPerson(deliusCrn)).thenReturn( + Response( + data = RiskCategory(), + errors = listOf( + UpstreamApiError( + causedBy = UpstreamApi.NOMIS, + type = UpstreamApiError.Type.ENTITY_NOT_FOUND, + ), + ), + ), + ) + + val response = getRiskCategoriesForPersonService.execute(hmppsId) + + response.errors.shouldHaveSize(1) + response.errors.first().causedBy.shouldBe(UpstreamApi.NOMIS) + response.errors.first().type.shouldBe(UpstreamApiError.Type.ENTITY_NOT_FOUND) + } + } + }, +) From 769cdbd5230f01288783d0d8af8a64f47960307a Mon Sep 17 00:00:00 2001 From: Chiara Date: Fri, 1 Mar 2024 13:24:55 +0000 Subject: [PATCH 02/15] Cleanup --- .../controllers/v1/person/RiskCategoriesController.kt | 2 +- .../hmpps/hmppsintegrationapi/gateways/NomisGateway.kt | 2 +- .../hmpps/hmppsintegrationapi/models/hmpps/RiskAssessment.kt | 4 ++-- .../hmpps/hmppsintegrationapi/models/hmpps/RiskCategory.kt | 2 +- .../hmpps/hmppsintegrationapi/models/nomis/NomisAssessment.kt | 4 ++-- .../hmppsintegrationapi/models/nomis/NomisInmateDetail.kt | 4 ++-- .../services/GetRiskCategoriesForPersonService.kt | 4 ++-- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/RiskCategoriesController.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/RiskCategoriesController.kt index ae8b9b9d4..06ffdb887 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/RiskCategoriesController.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/RiskCategoriesController.kt @@ -23,7 +23,7 @@ class RiskCategoriesController( fun getPersonRiskCategories( @PathVariable encodedHmppsId: String, - ): Map { + ): Map { val hmppsId = encodedHmppsId.decodeUrlCharacters() val response = getRiskCategoriesForPersonService.execute(hmppsId) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/NomisGateway.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/NomisGateway.kt index 9b8a62846..1bd88d69c 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/NomisGateway.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/NomisGateway.kt @@ -217,7 +217,7 @@ class NomisGateway(@Value("\${services.prison-api.base-url}") baseUrl: String) { } } - fun getRiskCategoriesForPerson(id: String): Response { + fun getRiskCategoriesForPerson(id: String): Response { val result = webClient.request( HttpMethod.GET, "/api/offenders/$id", diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/RiskAssessment.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/RiskAssessment.kt index 1e4791fb4..e7439ac0e 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/RiskAssessment.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/RiskAssessment.kt @@ -1,5 +1,5 @@ package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps -class RiskAssessment( - val classificationCode: String? = null, +data class RiskAssessment( + val classificationCode: String?, ) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/RiskCategory.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/RiskCategory.kt index 733fe49c4..1398b24e5 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/RiskCategory.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/RiskCategory.kt @@ -2,5 +2,5 @@ package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps data class RiskCategory( val offenderNo: String? = null, - val assessments: List = emptyList(), + val assessments: List = emptyList(), ) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/nomis/NomisAssessment.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/nomis/NomisAssessment.kt index f57098198..e519d99a7 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/nomis/NomisAssessment.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/nomis/NomisAssessment.kt @@ -3,9 +3,9 @@ package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.nomis import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.RiskAssessment data class NomisAssessment( - val classificationCode: String? = null, + val classificationCode: String, ) { - fun toRiskAssessment(): RiskAssessment = RiskAssessment( + fun toRiskAssessment() = RiskAssessment( classificationCode = this.classificationCode, ) } diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/nomis/NomisInmateDetail.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/nomis/NomisInmateDetail.kt index 17095dd03..69ff9c3f6 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/nomis/NomisInmateDetail.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/nomis/NomisInmateDetail.kt @@ -4,10 +4,10 @@ import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.RiskCategor data class NomisInmateDetail( val offenderNo: String? = null, - val assessments: List = emptyList(), + val assessments: List = emptyList(), ) { fun toRiskCategory(): RiskCategory = RiskCategory( offenderNo = this.offenderNo, - assessments = this.assessments.mapNotNull { it?.toRiskAssessment() }, + assessments = this.assessments.map { it.toRiskAssessment() }, ) } diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskCategoriesForPersonService.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskCategoriesForPersonService.kt index 074d62b4a..e2d1226ca 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskCategoriesForPersonService.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskCategoriesForPersonService.kt @@ -11,11 +11,11 @@ class GetRiskCategoriesForPersonService( @Autowired val nomisGateway: NomisGateway, @Autowired val getPersonService: GetPersonService, ) { - fun execute(hmppsId: String): Response { + fun execute(hmppsId: String): Response { val personResponse = getPersonService.execute(hmppsId = hmppsId) val deliusCrn = personResponse.data?.identifiers?.deliusCrn - var personRiskCategories: Response = Response(data = RiskCategory()) + var personRiskCategories: Response = Response(data = RiskCategory()) if (deliusCrn != null) { personRiskCategories = nomisGateway.getRiskCategoriesForPerson(id = deliusCrn) From 55c8333694c59bac8b19c555090b676071d38ae9 Mon Sep 17 00:00:00 2001 From: Chiara Date: Fri, 1 Mar 2024 13:48:01 +0000 Subject: [PATCH 03/15] Fixed JSON --- .../hmppsintegrationapi/models/nomis/NomisAssessment.kt | 2 +- .../gateways/nomis/GetRiskCategoriesForPersonTest.kt | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/nomis/NomisAssessment.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/nomis/NomisAssessment.kt index e519d99a7..0fe2ac875 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/nomis/NomisAssessment.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/nomis/NomisAssessment.kt @@ -3,7 +3,7 @@ package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.nomis import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.RiskAssessment data class NomisAssessment( - val classificationCode: String, + val classificationCode: String? = null, ) { fun toRiskAssessment() = RiskAssessment( classificationCode = this.classificationCode, diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/nomis/GetRiskCategoriesForPersonTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/nomis/GetRiskCategoriesForPersonTest.kt index c0f68fb25..3d7c817cd 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/nomis/GetRiskCategoriesForPersonTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/nomis/GetRiskCategoriesForPersonTest.kt @@ -40,8 +40,11 @@ class GetRiskCategoriesForPersonTest( offenderNo, """ { + "offenderNo": "123", "assessments": [ - "classificationCode": "C" + { + "classificationCode": "C" + } ] } """.removeWhitespaceAndNewlines(), From d3dd255cc194b6965492c16da153efc3098cd2c4 Mon Sep 17 00:00:00 2001 From: Chiara Date: Fri, 1 Mar 2024 15:20:31 +0000 Subject: [PATCH 04/15] Smoke test --- .../smoke/person/RisksSmokeTest.kt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/RisksSmokeTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/RisksSmokeTest.kt index 110e4b38f..e6a329ab0 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/RisksSmokeTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/RisksSmokeTest.kt @@ -59,6 +59,23 @@ class RisksSmokeTest : DescribeSpec( ) } + it("returns risk categories for a person") { + val response = httpClient.performAuthorised("$basePath/categories") + + response.statusCode().shouldBe(HttpStatus.OK.value()) + response.body().shouldEqualJson( + """ + { + "data": { + "offenderNo": null, + "assessments": [] + } + } + + """.removeWhitespaceAndNewlines(), + ) + } + it("returns rosh risks for a person") { val response = httpClient.performAuthorised(basePath) From 329069dc4f82fc26a21633578f95ae2468d20623 Mon Sep 17 00:00:00 2001 From: Chiara Date: Fri, 1 Mar 2024 15:41:07 +0000 Subject: [PATCH 05/15] Trying to kick pipelines off --- .../hmpps/hmppsintegrationapi/smoke/person/RisksSmokeTest.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/RisksSmokeTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/RisksSmokeTest.kt index e6a329ab0..163319339 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/RisksSmokeTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/RisksSmokeTest.kt @@ -72,6 +72,7 @@ class RisksSmokeTest : DescribeSpec( } } + """.removeWhitespaceAndNewlines(), ) } From 34e112e97bc56167dd3a6541d40f187b3a1aa795 Mon Sep 17 00:00:00 2001 From: Chiara Date: Mon, 4 Mar 2024 15:16:05 +0000 Subject: [PATCH 06/15] Smoke Test WIP, waiting for Upstream API response to give us some data complying with regex --- .../gateways/NomisGateway.kt | 12 ++++++++++- .../v1/person/RiskCategoriesControllerTest.kt | 4 ++-- .../nomis/GetRiskCategoriesForPersonTest.kt | 4 ++-- .../mockservers/NomisApiMockServer.kt | 20 +++---------------- .../GetRiskCategoriesForPersonServiceTest.kt | 2 +- .../smoke/person/RisksSmokeTest.kt | 2 +- 6 files changed, 20 insertions(+), 24 deletions(-) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/NomisGateway.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/NomisGateway.kt index 1bd88d69c..be66404a4 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/NomisGateway.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/NomisGateway.kt @@ -221,7 +221,7 @@ class NomisGateway(@Value("\${services.prison-api.base-url}") baseUrl: String) { val result = webClient.request( HttpMethod.GET, "/api/offenders/$id", - authenticationHeader(), + authenticationHeaderForCategories(), UpstreamApi.NOMIS, ) @@ -246,4 +246,14 @@ class NomisGateway(@Value("\${services.prison-api.base-url}") baseUrl: String) { "Authorization" to "Bearer $token", ) } + + private fun authenticationHeaderForCategories(): Map { + val token = hmppsAuthGateway.getClientToken("NOMIS") + val version = "1.0" + + return mapOf( + "Authorization" to "Bearer $token", + "version" to version, + ) + } } diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/RiskCategoriesControllerTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/RiskCategoriesControllerTest.kt index 397f9b854..a2fe79186 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/RiskCategoriesControllerTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/RiskCategoriesControllerTest.kt @@ -44,7 +44,7 @@ internal class RiskCategoriesControllerTest( whenever(getRiskCategoriesForPersonService.execute(hmppsId)).thenReturn( Response( data = RiskCategory( - offenderNo = "123", + offenderNo = "A1234AA", assessments = listOf(RiskAssessment(classificationCode = "C")), ), ), @@ -76,7 +76,7 @@ internal class RiskCategoriesControllerTest( result.response.contentAsString.shouldContain( """ "data": { - "offenderNo": "123", + "offenderNo": "A1234AA", "assessments": [ { "classificationCode": "C" diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/nomis/GetRiskCategoriesForPersonTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/nomis/GetRiskCategoriesForPersonTest.kt index 3d7c817cd..cac7f5b41 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/nomis/GetRiskCategoriesForPersonTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/nomis/GetRiskCategoriesForPersonTest.kt @@ -32,7 +32,7 @@ class GetRiskCategoriesForPersonTest( DescribeSpec( { val nomisApiMockServer = NomisApiMockServer() - val offenderNo = "123" + val offenderNo = "A1234AA" beforeEach { nomisApiMockServer.start() @@ -40,7 +40,7 @@ class GetRiskCategoriesForPersonTest( offenderNo, """ { - "offenderNo": "123", + "offenderNo": "A1234AA", "assessments": [ { "classificationCode": "C" diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/mockservers/NomisApiMockServer.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/mockservers/NomisApiMockServer.kt index ccb4bbaa6..90e7778ef 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/mockservers/NomisApiMockServer.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/mockservers/NomisApiMockServer.kt @@ -11,21 +11,6 @@ class NomisApiMockServer : WireMockServer(WIREMOCK_PORT) { private const val WIREMOCK_PORT = 4000 } - fun stubGetOffender(offenderNo: String, body: String, status: HttpStatus = HttpStatus.OK) { - stubFor( - get("/api/offenders/$offenderNo") - .withHeader( - "Authorization", - matching("Bearer ${HmppsAuthMockServer.TOKEN}"), - ).willReturn( - aResponse() - .withHeader("Content-Type", "application/json") - .withStatus(status.value()) - .withBody(body.trimIndent()), - ), - ) - } - fun stubGetOffenderImageDetails(offenderNo: String, body: String, status: HttpStatus = HttpStatus.OK) { stubFor( get("/api/images/offenders/$offenderNo") @@ -161,10 +146,11 @@ class NomisApiMockServer : WireMockServer(WIREMOCK_PORT) { ) } - fun stubGetRiskCategoriesForPerson(nomisNumber: String, body: String, status: HttpStatus = HttpStatus.OK) { + fun stubGetRiskCategoriesForPerson(offenderNo: String, body: String, status: HttpStatus = HttpStatus.OK) { stubFor( - get("/api/offenders/$nomisNumber") + get("/api/offenders/$offenderNo") .withHeader("Authorization", matching("Bearer ${HmppsAuthMockServer.TOKEN}")) + .withHeader("version", matching("1.0")) .willReturn( aResponse() .withHeader("Content-Type", "application/json") diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskCategoriesForPersonServiceTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskCategoriesForPersonServiceTest.kt index d25db0b5a..0c12fbf4a 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskCategoriesForPersonServiceTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskCategoriesForPersonServiceTest.kt @@ -61,7 +61,7 @@ internal class GetRiskCategoriesForPersonServiceTest( } it("returns a risk category for a person") { - val riskCategory = RiskCategory(offenderNo = "123", assessments = listOf(RiskAssessment(classificationCode = "987"))) + val riskCategory = RiskCategory(offenderNo = "A1234AA", assessments = listOf(RiskAssessment(classificationCode = "987"))) whenever(nomisGateway.getRiskCategoriesForPerson(deliusCrn)).thenReturn( Response(data = riskCategory), diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/RisksSmokeTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/RisksSmokeTest.kt index 163319339..564425b4b 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/RisksSmokeTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/RisksSmokeTest.kt @@ -11,7 +11,7 @@ import java.nio.charset.StandardCharsets class RisksSmokeTest : DescribeSpec( { - val hmppsId = "2004/13116M" + val hmppsId = "A1234AA" val encodedHmppsId = URLEncoder.encode(hmppsId, StandardCharsets.UTF_8) val basePath = "v1/persons/$encodedHmppsId/risks" From 8c05345d62a9d4dbd189d072ee930ae8fbc203ac Mon Sep 17 00:00:00 2001 From: Chiara Date: Mon, 4 Mar 2024 16:10:37 +0000 Subject: [PATCH 07/15] Changing from using CRN to Delius --- .../services/GetRiskCategoriesForPersonService.kt | 6 +++--- .../hmppsintegrationapi/smoke/person/RisksSmokeTest.kt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskCategoriesForPersonService.kt b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskCategoriesForPersonService.kt index e2d1226ca..cd581a06f 100644 --- a/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskCategoriesForPersonService.kt +++ b/src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskCategoriesForPersonService.kt @@ -13,12 +13,12 @@ class GetRiskCategoriesForPersonService( ) { fun execute(hmppsId: String): Response { val personResponse = getPersonService.execute(hmppsId = hmppsId) - val deliusCrn = personResponse.data?.identifiers?.deliusCrn + val nomisNumber = personResponse.data?.identifiers?.nomisNumber var personRiskCategories: Response = Response(data = RiskCategory()) - if (deliusCrn != null) { - personRiskCategories = nomisGateway.getRiskCategoriesForPerson(id = deliusCrn) + if (nomisNumber != null) { + personRiskCategories = nomisGateway.getRiskCategoriesForPerson(id = nomisNumber) } return Response( diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/RisksSmokeTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/RisksSmokeTest.kt index 564425b4b..1d5cbe831 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/RisksSmokeTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/RisksSmokeTest.kt @@ -67,7 +67,7 @@ class RisksSmokeTest : DescribeSpec( """ { "data": { - "offenderNo": null, + "offenderNo": "A1234AA", "assessments": [] } } From c5190a09e5775dd015f3210881720bc6737e86d7 Mon Sep 17 00:00:00 2001 From: Chiara Date: Mon, 4 Mar 2024 16:25:07 +0000 Subject: [PATCH 08/15] Changed Tests now that we switched to Nomis --- .../nomis/GetRiskCategoriesForPersonTest.kt | 4 ++-- .../GetRiskCategoriesForPersonServiceTest.kt | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/nomis/GetRiskCategoriesForPersonTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/nomis/GetRiskCategoriesForPersonTest.kt index cac7f5b41..cc13734a6 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/nomis/GetRiskCategoriesForPersonTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/nomis/GetRiskCategoriesForPersonTest.kt @@ -32,7 +32,7 @@ class GetRiskCategoriesForPersonTest( DescribeSpec( { val nomisApiMockServer = NomisApiMockServer() - val offenderNo = "A1234AA" + val offenderNo = "A7796DY" beforeEach { nomisApiMockServer.start() @@ -40,7 +40,7 @@ class GetRiskCategoriesForPersonTest( offenderNo, """ { - "offenderNo": "A1234AA", + "offenderNo": "A7796DY", "assessments": [ { "classificationCode": "C" diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskCategoriesForPersonServiceTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskCategoriesForPersonServiceTest.kt index 0c12fbf4a..05768874c 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskCategoriesForPersonServiceTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetRiskCategoriesForPersonServiceTest.kt @@ -30,10 +30,10 @@ internal class GetRiskCategoriesForPersonServiceTest( ) : DescribeSpec( { val hmppsId = "1234/56789B" - val deliusCrn = "X123456" + val nomisNumber = "A7796DY" val personFromProbationOffenderSearch = - Person(firstName = "Phoebe", lastName = "Buffay", identifiers = Identifiers(deliusCrn = deliusCrn)) + Person(firstName = "Phoebe", lastName = "Buffay", identifiers = Identifiers(nomisNumber = nomisNumber)) beforeEach { Mockito.reset(getPersonService) @@ -45,7 +45,7 @@ internal class GetRiskCategoriesForPersonServiceTest( ), ) - whenever(nomisGateway.getRiskCategoriesForPerson(deliusCrn)).thenReturn(Response(data = RiskCategory())) + whenever(nomisGateway.getRiskCategoriesForPerson(nomisNumber)).thenReturn(Response(data = RiskCategory())) } it("gets a person from getPersonService") { @@ -54,16 +54,16 @@ internal class GetRiskCategoriesForPersonServiceTest( verify(getPersonService, VerificationModeFactory.times(1)).execute(hmppsId = hmppsId) } - it("gets a risk category for a person from ARN API using CRN") { + it("gets a risk category for a person from ARN API using Nomis") { getRiskCategoriesForPersonService.execute(hmppsId) - verify(nomisGateway, VerificationModeFactory.times(1)).getRiskCategoriesForPerson(deliusCrn) + verify(nomisGateway, VerificationModeFactory.times(1)).getRiskCategoriesForPerson(nomisNumber) } it("returns a risk category for a person") { - val riskCategory = RiskCategory(offenderNo = "A1234AA", assessments = listOf(RiskAssessment(classificationCode = "987"))) + val riskCategory = RiskCategory(offenderNo = "A7796DY", assessments = listOf(RiskAssessment(classificationCode = "987"))) - whenever(nomisGateway.getRiskCategoriesForPerson(deliusCrn)).thenReturn( + whenever(nomisGateway.getRiskCategoriesForPerson(nomisNumber)).thenReturn( Response(data = riskCategory), ) @@ -74,9 +74,9 @@ internal class GetRiskCategoriesForPersonServiceTest( describe("when an upstream API returns an error") { - it("returns error from ARN API when person/crn cannot be found in ARN") { + it("returns error from ARN API when person cannot be found in ARN") { - whenever(nomisGateway.getRiskCategoriesForPerson(deliusCrn)).thenReturn( + whenever(nomisGateway.getRiskCategoriesForPerson(nomisNumber)).thenReturn( Response( data = RiskCategory(), errors = listOf( From bfd9ba89109c23dd931d01d582675a18ecbf2ea1 Mon Sep 17 00:00:00 2001 From: Chiara Date: Tue, 5 Mar 2024 09:53:44 +0000 Subject: [PATCH 09/15] Changed value for offenderNo smoke test --- .../hmpps/hmppsintegrationapi/smoke/person/RisksSmokeTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/RisksSmokeTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/RisksSmokeTest.kt index 1d5cbe831..04c4745f1 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/RisksSmokeTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/RisksSmokeTest.kt @@ -67,7 +67,7 @@ class RisksSmokeTest : DescribeSpec( """ { "data": { - "offenderNo": "A1234AA", + "offenderNo": "AA1234A", "assessments": [] } } From 092e0d677969e3817061b4840d5b591223ad45b3 Mon Sep 17 00:00:00 2001 From: Chiara Date: Tue, 5 Mar 2024 10:29:31 +0000 Subject: [PATCH 10/15] Changing name to rekick upstream pulling --- Dockerfile.setup-prison-api | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile.setup-prison-api b/Dockerfile.setup-prison-api index 24ddc76a5..69b068c66 100644 --- a/Dockerfile.setup-prison-api +++ b/Dockerfile.setup-prison-api @@ -2,7 +2,7 @@ FROM node:current-alpine3.17 RUN apk update && apk add bash curl -RUN curl https://prison-api-dev.prison.service.justice.gov.uk/v3/api-docs > prison-api.json && \ +RUN curl https://prison-api-dev.prison.service.justice.gov.uk/v3/api-docs > prison-api-2.json && \ npm install -g @stoplight/prism-cli -CMD prism mock -p 4010 -h 0.0.0.0 /prison-api.json +CMD prism mock -p 4010 -h 0.0.0.0 /prison-api-2.json From 533db31adb5adf1a91b40c82d8964203df604af5 Mon Sep 17 00:00:00 2001 From: Chiara Date: Tue, 5 Mar 2024 11:53:55 +0000 Subject: [PATCH 11/15] Changed data as it changes from upstream --- Dockerfile.setup-prison-api | 4 ++-- Dockerfile.setup-probation-offender-search | 4 ++-- .../smoke/person/PersonSmokeTest.kt | 10 +++++----- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Dockerfile.setup-prison-api b/Dockerfile.setup-prison-api index 69b068c66..24ddc76a5 100644 --- a/Dockerfile.setup-prison-api +++ b/Dockerfile.setup-prison-api @@ -2,7 +2,7 @@ FROM node:current-alpine3.17 RUN apk update && apk add bash curl -RUN curl https://prison-api-dev.prison.service.justice.gov.uk/v3/api-docs > prison-api-2.json && \ +RUN curl https://prison-api-dev.prison.service.justice.gov.uk/v3/api-docs > prison-api.json && \ npm install -g @stoplight/prism-cli -CMD prism mock -p 4010 -h 0.0.0.0 /prison-api-2.json +CMD prism mock -p 4010 -h 0.0.0.0 /prison-api.json diff --git a/Dockerfile.setup-probation-offender-search b/Dockerfile.setup-probation-offender-search index d362a8b30..6ba6b720c 100644 --- a/Dockerfile.setup-probation-offender-search +++ b/Dockerfile.setup-probation-offender-search @@ -2,7 +2,7 @@ FROM node:current-alpine3.17 RUN apk update && apk add bash curl -RUN curl https://probation-offender-search-dev.hmpps.service.justice.gov.uk/v3/api-docs > probation-offender-search.json && \ +RUN curl https://probation-offender-search-dev.hmpps.service.justice.gov.uk/v3/api-docs > probation-offender-search-2.json && \ npm install -g @stoplight/prism-cli -CMD prism mock -p 4010 -h 0.0.0.0 /probation-offender-search.json +CMD prism mock -p 4010 -h 0.0.0.0 /probation-offender-search-2.json diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/PersonSmokeTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/PersonSmokeTest.kt index ad047d0af..191523af2 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/PersonSmokeTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/PersonSmokeTest.kt @@ -63,12 +63,12 @@ class PersonSmokeTest : DescribeSpec( } ], "identifiers": { - "nomisNumber": "string", - "croNumber": "string", - "deliusCrn": "string" + "nomisNumber": "AA1234A", + "croNumber": "123456/24A", + "deliusCrn": "A123456" }, - "pncId": "string", - "hmppsId": "string", + "pncId": "2012/0052494Q", + "hmppsId": "A123456", "contactDetails": { "addresses": [ { From fa6151c050875a4fd78a078a0f9001e36d3d1bb8 Mon Sep 17 00:00:00 2001 From: Chiara Date: Tue, 5 Mar 2024 13:39:19 +0000 Subject: [PATCH 12/15] Rekicking --- Dockerfile.setup-probation-offender-search | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile.setup-probation-offender-search b/Dockerfile.setup-probation-offender-search index 6ba6b720c..d362a8b30 100644 --- a/Dockerfile.setup-probation-offender-search +++ b/Dockerfile.setup-probation-offender-search @@ -2,7 +2,7 @@ FROM node:current-alpine3.17 RUN apk update && apk add bash curl -RUN curl https://probation-offender-search-dev.hmpps.service.justice.gov.uk/v3/api-docs > probation-offender-search-2.json && \ +RUN curl https://probation-offender-search-dev.hmpps.service.justice.gov.uk/v3/api-docs > probation-offender-search.json && \ npm install -g @stoplight/prism-cli -CMD prism mock -p 4010 -h 0.0.0.0 /probation-offender-search-2.json +CMD prism mock -p 4010 -h 0.0.0.0 /probation-offender-search.json From f763a4278b5607c9236ed1b68f238b296ac1b592 Mon Sep 17 00:00:00 2001 From: Chiara Date: Tue, 5 Mar 2024 13:46:44 +0000 Subject: [PATCH 13/15] Fix test data --- .../smoke/person/RisksSmokeTest.kt | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/RisksSmokeTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/RisksSmokeTest.kt index 04c4745f1..8c6e10d80 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/RisksSmokeTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/RisksSmokeTest.kt @@ -66,13 +66,15 @@ class RisksSmokeTest : DescribeSpec( response.body().shouldEqualJson( """ { - "data": { - "offenderNo": "AA1234A", - "assessments": [] - } + "data": { + "offenderNo": "A1234AA", + "assessments": [ + { + "classificationCode": "C" + } + ] } - - + } """.removeWhitespaceAndNewlines(), ) } From f90b4de6b7c619afcadb37db28d37b7cc126b370 Mon Sep 17 00:00:00 2001 From: Chiara Date: Tue, 5 Mar 2024 14:13:43 +0000 Subject: [PATCH 14/15] Fix test data pt 2' --- .../hmpps/hmppsintegrationapi/smoke/person/PersonSmokeTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/PersonSmokeTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/PersonSmokeTest.kt index 191523af2..2e40d0e72 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/PersonSmokeTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/PersonSmokeTest.kt @@ -68,7 +68,7 @@ class PersonSmokeTest : DescribeSpec( "deliusCrn": "A123456" }, "pncId": "2012/0052494Q", - "hmppsId": "A123456", + "hmppsId": "G5555TT", "contactDetails": { "addresses": [ { From 80551a9504ce633f244c46eae0369229ce73b01e Mon Sep 17 00:00:00 2001 From: Chiara Date: Tue, 5 Mar 2024 14:24:21 +0000 Subject: [PATCH 15/15] Changing nomis number --- .../hmpps/hmppsintegrationapi/smoke/person/PersonSmokeTest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/PersonSmokeTest.kt b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/PersonSmokeTest.kt index 2e40d0e72..7a3ebd89f 100644 --- a/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/PersonSmokeTest.kt +++ b/src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/PersonSmokeTest.kt @@ -63,12 +63,12 @@ class PersonSmokeTest : DescribeSpec( } ], "identifiers": { - "nomisNumber": "AA1234A", + "nomisNumber": "G5555TT", "croNumber": "123456/24A", "deliusCrn": "A123456" }, "pncId": "2012/0052494Q", - "hmppsId": "G5555TT", + "hmppsId": "A123456", "contactDetails": { "addresses": [ {