Skip to content

Commit fa4d817

Browse files
authored
PI-2488 Add "underActiveSupervision" flag to probation person response (#477)
* PI-2488 Add "underActiveSupervision" flag to probation person response * Fix smoke tests
1 parent 66e920c commit fa4d817

File tree

12 files changed

+63
-27
lines changed

12 files changed

+63
-27
lines changed

src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/gateways/ProbationOffenderSearchGateway.kt

+3-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import uk.gov.justice.digital.hmpps.hmppsintegrationapi.extensions.WebClientWrap
88
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.extensions.WebClientWrapper.WebClientWrapperResponse
99
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Address
1010
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Person
11+
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PersonOnProbation
1112
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Response
1213
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApi
1314
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError
@@ -72,9 +73,9 @@ class ProbationOffenderSearchGateway(
7273
}
7374
}
7475

75-
fun getPerson(id: String? = null): Response<Person?> {
76+
fun getPerson(id: String? = null): Response<PersonOnProbation?> {
7677
val offender = getOffender(id)
77-
return Response(data = offender.data?.toPerson(), errors = offender.errors)
78+
return Response(data = offender.data?.toPersonOnProbation(), errors = offender.errors)
7879
}
7980

8081
fun getPersons(

src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/OffenderSearchResponse.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps
22

33
data class OffenderSearchResponse(
44
val prisonerOffenderSearch: Person?,
5-
val probationOffenderSearch: Person?,
5+
val probationOffenderSearch: PersonOnProbation?,
66
)

src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/hmpps/Person.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonAlias
44
import io.swagger.v3.oas.annotations.media.Schema
55
import java.time.LocalDate
66

7-
data class Person(
7+
open class Person(
88
@Schema(description = "First name", example = "John")
99
val firstName: String,
1010
@JsonAlias("surname")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps
2+
3+
class PersonOnProbation(
4+
person: Person,
5+
val underActiveSupervision: Boolean,
6+
) : Person(
7+
firstName = person.firstName,
8+
lastName = person.lastName,
9+
middleName = person.middleName,
10+
dateOfBirth = person.dateOfBirth,
11+
gender = person.gender,
12+
ethnicity = person.ethnicity,
13+
aliases = person.aliases,
14+
identifiers = person.identifiers,
15+
pncId = person.pncId,
16+
hmppsId = person.hmppsId,
17+
contactDetails = person.contactDetails,
18+
)

src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/models/probationoffendersearch/Offender.kt

+9-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.probationoffende
22

33
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Identifiers
44
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Person
5+
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PersonOnProbation
56
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PersonProtectedCharacteristics
67
import java.time.LocalDate
78

@@ -16,8 +17,9 @@ data class Offender(
1617
val contactDetails: ContactDetails? = null,
1718
val otherIds: OtherIds = OtherIds(),
1819
val age: Number = 0,
20+
val activeProbationManagedSentence: Boolean = false,
1921
) {
20-
fun toPerson(): Person =
22+
fun toPerson() =
2123
Person(
2224
firstName = this.firstName,
2325
lastName = this.surname,
@@ -37,6 +39,12 @@ data class Offender(
3739
contactDetails = this.contactDetails?.toContactDetails(),
3840
)
3941

42+
fun toPersonOnProbation() =
43+
PersonOnProbation(
44+
toPerson(),
45+
underActiveSupervision = this.activeProbationManagedSentence,
46+
)
47+
4048
fun toPersonProtectedCharacteristics(): PersonProtectedCharacteristics =
4149
PersonProtectedCharacteristics(
4250
this.age,

src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/controllers/v1/person/PersonControllerTest.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.ImageMetada
2525
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.OffenderSearchResponse
2626
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Person
2727
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PersonName
28+
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PersonOnProbation
2829
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PhoneNumber
2930
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Response
3031
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApi
@@ -228,7 +229,7 @@ internal class PersonControllerTest(
228229
}
229230

230231
describe("GET $basePath/{id}") {
231-
val probationOffenderSearch = Person("Sam", "Smith", identifiers = Identifiers(nomisNumber = "1234ABC"))
232+
val probationOffenderSearch = PersonOnProbation(Person("Sam", "Smith", identifiers = Identifiers(nomisNumber = "1234ABC")), underActiveSupervision = true)
232233
val prisonOffenderSearch = POSPrisoner("Kim", "Kardashian")
233234
val prisonResponse = Response(data = prisonOffenderSearch, errors = emptyList())
234235

@@ -285,7 +286,7 @@ internal class PersonControllerTest(
285286
it("does not return a 404 status code when a person was found in one upstream API") {
286287
whenever(getPersonService.getCombinedDataForPerson(idThatDoesNotExist)).thenReturn(
287288
Response(
288-
data = OffenderSearchResponse(prisonerOffenderSearch = null, probationOffenderSearch = Person("someFirstName", "someLastName")),
289+
data = OffenderSearchResponse(prisonerOffenderSearch = null, probationOffenderSearch = PersonOnProbation(Person("someFirstName", "someLastName"), underActiveSupervision = false)),
289290
errors =
290291
listOf(
291292
UpstreamApiError(
@@ -336,6 +337,7 @@ internal class PersonControllerTest(
336337
"contactDetails":null
337338
},
338339
"probationOffenderSearch":{
340+
"underActiveSupervision":true,
339341
"firstName":"Sam",
340342
"lastName":"Smith",
341343
"middleName":null,
@@ -362,9 +364,7 @@ internal class PersonControllerTest(
362364
}
363365

364366
describe("GET $basePath/$encodedHmppsId/name") {
365-
val probationOffenderSearch = Person("Sam", "Smith", identifiers = Identifiers(nomisNumber = "1234ABC"))
366367
val prisonOffenderSearch = POSPrisoner("Sam", "Smith")
367-
val prisonResponse = Response(data = prisonOffenderSearch, errors = emptyList())
368368

369369
beforeTest {
370370
Mockito.reset(getNameForPersonService)

src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetImageMetadataForPersonServiceTest.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.ProbationOffend
1515
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Identifiers
1616
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.ImageMetadata
1717
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Person
18+
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PersonOnProbation
1819
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Response
1920
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApi
2021
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError
@@ -36,7 +37,7 @@ internal class GetImageMetadataForPersonServiceTest(
3637
Mockito.reset(nomisGateway)
3738

3839
whenever(probationOffenderSearchGateway.getPerson(id = hmppsId)).thenReturn(
39-
Response(data = Person(firstName = "Joey", lastName = "Tribbiani", identifiers = Identifiers(nomisNumber = prisonerNumber))),
40+
Response(data = PersonOnProbation(Person(firstName = "Joey", lastName = "Tribbiani", identifiers = Identifiers(nomisNumber = prisonerNumber)), false)),
4041
)
4142
whenever(nomisGateway.getImageMetadataForPerson(prisonerNumber)).thenReturn(Response(data = emptyList()))
4243
}

src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetLatestSentenceKeyDatesAndAdjustmentsForPersonServiceTest.kt

+15-8
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.HomeDetenti
1717
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Identifiers
1818
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.NonDtoDate
1919
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Person
20+
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PersonOnProbation
2021
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.ReleaseDate
2122
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Response
2223
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.SentenceAdjustment
@@ -48,10 +49,13 @@ internal class GetLatestSentenceKeyDatesAndAdjustmentsForPersonServiceTest(
4849
whenever(probationOffenderSearchGateway.getPerson(id = hmppsId)).thenReturn(
4950
Response(
5051
data =
51-
Person(
52-
firstName = "Baylan",
53-
lastName = "Skoll",
54-
identifiers = Identifiers(nomisNumber = nomisNumber),
52+
PersonOnProbation(
53+
Person(
54+
firstName = "Baylan",
55+
lastName = "Skoll",
56+
identifiers = Identifiers(nomisNumber = nomisNumber),
57+
),
58+
false,
5559
),
5660
),
5761
)
@@ -268,10 +272,13 @@ internal class GetLatestSentenceKeyDatesAndAdjustmentsForPersonServiceTest(
268272
whenever(probationOffenderSearchGateway.getPerson(id = hmppsId)).thenReturn(
269273
Response(
270274
data =
271-
Person(
272-
firstName = "Shin",
273-
lastName = "Hati",
274-
identifiers = Identifiers(nomisNumber = null),
275+
PersonOnProbation(
276+
Person(
277+
firstName = "Shin",
278+
lastName = "Hati",
279+
identifiers = Identifiers(nomisNumber = null),
280+
),
281+
false,
275282
),
276283
errors = emptyList(),
277284
),

src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/services/GetPersonServiceTest.kt

+6-7
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import uk.gov.justice.digital.hmpps.hmppsintegrationapi.gateways.ProbationOffend
1414
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Identifiers
1515
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.OffenderSearchResponse
1616
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Person
17+
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.PersonOnProbation
1718
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.Response
1819
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApi
1920
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.hmpps.UpstreamApiError
@@ -38,7 +39,7 @@ internal class GetPersonServiceTest(
3839
Response(data = listOf(Person(firstName = "Qui-gon", lastName = "Jin", identifiers = Identifiers(nomisNumber = "A1234AA")))),
3940
)
4041
whenever(probationOffenderSearchGateway.getPerson(id = hmppsId)).thenReturn(
41-
Response(data = Person(firstName = "Qui-gon", lastName = "Jin", identifiers = Identifiers(nomisNumber = "A1234AA"))),
42+
Response(data = PersonOnProbation(Person(firstName = "Qui-gon", lastName = "Jin", identifiers = Identifiers(nomisNumber = "A1234AA")), underActiveSupervision = true)),
4243
)
4344
whenever(prisonerOffenderSearchGateway.getPrisonOffender(nomsNumber = "A1234AA")).thenReturn(
4445
Response(data = POSPrisoner(firstName = "Sam", lastName = "Mills")),
@@ -52,17 +53,15 @@ internal class GetPersonServiceTest(
5253
}
5354

5455
it("returns a person") {
55-
val personFromProbationOffenderSearch = Person("Molly", "Mob")
56+
val personFromProbationOffenderSearch = PersonOnProbation(Person("Molly", "Mob"), underActiveSupervision = true)
5657

5758
whenever(probationOffenderSearchGateway.getPerson(hmppsId)).thenReturn(
5859
Response(personFromProbationOffenderSearch),
5960
)
6061

6162
val result = getPersonService.execute(hmppsId)
6263

63-
val expectedResult = Person("Molly", "Mob")
64-
65-
result.data.shouldBe(expectedResult)
64+
result.data.shouldBe(personFromProbationOffenderSearch)
6665
}
6766

6867
it("returns null when a person isn't found in probation offender search") {
@@ -75,7 +74,7 @@ internal class GetPersonServiceTest(
7574
}
7675

7776
it("returns a person with both probation and prison data when prison data exists") {
78-
val personFromProbationOffenderSearch = Person("Paula", "First", identifiers = Identifiers(nomisNumber = "A1234AA"))
77+
val personFromProbationOffenderSearch = PersonOnProbation(Person("Paula", "First", identifiers = Identifiers(nomisNumber = "A1234AA")), underActiveSupervision = true)
7978
val personFromPrisonOffenderSearch = POSPrisoner("Sam", "Mills")
8079

8180
whenever(probationOffenderSearchGateway.getPerson(hmppsId)).thenReturn(
@@ -93,7 +92,7 @@ internal class GetPersonServiceTest(
9392
}
9493

9594
it("returns errors when unable to retrieve prison data and data when probation data is available") {
96-
val personFromProbationOffenderSearch = Person("Paula", "First", identifiers = Identifiers(nomisNumber = "A1234AA"))
95+
val personFromProbationOffenderSearch = PersonOnProbation(Person("Paula", "First", identifiers = Identifiers(nomisNumber = "A1234AA")), underActiveSupervision = true)
9796

9897
whenever(probationOffenderSearchGateway.getPerson(hmppsId)).thenReturn(Response(data = personFromProbationOffenderSearch))
9998
whenever(prisonerOffenderSearchGateway.getPrisonOffender("A1234AA")).thenReturn(Response(data = null, errors = listOf(UpstreamApiError(UpstreamApi.PRISONER_OFFENDER_SEARCH, UpstreamApiError.Type.ENTITY_NOT_FOUND, "MockError"))))

src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/NeedsSmokeTest.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class NeedsSmokeTest : DescribeSpec(
4848
"type": "DRUG_MISUSE",
4949
"riskOfHarm": false,
5050
"riskOfReoffending": false,
51-
"severity": "SEVERE"
51+
"severity": "NO_NEED"
5252
}
5353
]
5454
}

src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/PersonSmokeTest.kt

+2
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ class PersonSmokeTest : DescribeSpec(
112112
"contactDetails": null
113113
},
114114
"probationOffenderSearch": {
115+
"underActiveSupervision": true,
115116
"firstName": "string",
116117
"lastName": "string",
117118
"middleName": "string",
@@ -190,6 +191,7 @@ class PersonSmokeTest : DescribeSpec(
190191
"contactDetails": null
191192
},
192193
"probationOffenderSearch": {
194+
"underActiveSupervision": true,
193195
"firstName": "string",
194196
"lastName": "string",
195197
"middleName": "string",

src/test/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/smoke/person/SentencesSmokeTest.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ class SentencesSmokeTest : DescribeSpec(
137137
},
138138
"nonDto": {
139139
"date": "2020-04-01",
140-
"releaseDateType": "CRD"
140+
"releaseDateType": "ARD"
141141
},
142142
"nonParole": {
143143
"date": "2020-02-03",

0 commit comments

Comments
 (0)