Skip to content

Commit

Permalink
MAN-172: Added personal contact details update (#4599)
Browse files Browse the repository at this point in the history
* MAN-172: Added personal contact details update
  • Loading branch information
pmcphee77 authored Jan 30, 2025
1 parent a5c238b commit 9e2e63b
Show file tree
Hide file tree
Showing 15 changed files with 719 additions and 58 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ database:
password_key: /manage-supervision-and-delius/db-password
tables:
- contact
- offender
- offender_address

audit:
username: ManageSupervisionAndDelius
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,19 @@ import uk.gov.justice.digital.hmpps.data.generator.*
import uk.gov.justice.digital.hmpps.data.generator.CourtAppearanceGenerator.COURT_APPEARANCE
import uk.gov.justice.digital.hmpps.data.generator.personalDetails.PersonDetailsGenerator
import uk.gov.justice.digital.hmpps.integrations.delius.audit.BusinessInteractionCode
import uk.gov.justice.digital.hmpps.user.AuditUserRepository
import uk.gov.justice.digital.hmpps.integrations.delius.user.entity.UserRepository
import java.time.ZonedDateTime

@Component
@ConditionalOnProperty("seed.database")
class DataLoader(
private val entityManager: EntityManager,
private val auditUserRepository: AuditUserRepository
private val userRepository: UserRepository
) : ApplicationListener<ApplicationReadyEvent> {

@PostConstruct
fun saveAuditUser() {
auditUserRepository.save(UserGenerator.AUDIT_USER)
userRepository.save(UserGenerator.AUDIT_USER)
}

@Transactional
Expand All @@ -46,6 +46,7 @@ class DataLoader(
ContactGenerator.DEFAULT_TEAM,
ContactGenerator.LOCATION_BRK_1,
)

entityManager.persist(ContactGenerator.USER)

entityManager.persist(ContactGenerator.USER_1)
Expand Down Expand Up @@ -195,6 +196,8 @@ class DataLoader(

fun personalDetailsData() {
entityManager.persistAll(
PersonDetailsGenerator.ADDRESS_TYPE,
PersonDetailsGenerator.ADDRESS_STATUS,
PersonDetailsGenerator.GENDER_FEMALE,
PersonDetailsGenerator.RELIGION_DEFAULT,
PersonDetailsGenerator.SEXUAL_ORIENTATION,
Expand Down Expand Up @@ -223,6 +226,7 @@ class DataLoader(
PersonDetailsGenerator.CONTACT_ADDRESS,
PersonDetailsGenerator.PERSONAL_CONTACT_1,
PersonDetailsGenerator.PERSON_ADDRESS_STATUS_1,
PersonDetailsGenerator.PERSON_PREVIOUS_ADDRESS_STATUS,
PersonDetailsGenerator.PERSON_ADDRESS_TYPE_1,
PersonDetailsGenerator.PERSON_ADDRESS_1,
PersonDetailsGenerator.PERSON_ADDRESS_STATUS_2,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package uk.gov.justice.digital.hmpps.data.generator

import uk.gov.justice.digital.hmpps.user.AuditUser
import uk.gov.justice.digital.hmpps.integrations.delius.user.entity.User

object UserGenerator {
val AUDIT_USER = AuditUser(IdGenerator.getAndIncrement(), "ManageSupervisionAndDelius")
val AUDIT_USER = User(IdGenerator.getAndIncrement(), null, "ManageSupervisionAndDelius", "Manage", "Supervisions")
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import uk.gov.justice.digital.hmpps.integrations.delius.personalDetails.entity.C
import uk.gov.justice.digital.hmpps.integrations.delius.personalDetails.entity.PersonAddress
import uk.gov.justice.digital.hmpps.integrations.delius.personalDetails.entity.PersonDocument
import uk.gov.justice.digital.hmpps.integrations.delius.personalDetails.entity.PersonalContactEntity
import uk.gov.justice.digital.hmpps.integrations.delius.referencedata.entity.Dataset
import uk.gov.justice.digital.hmpps.integrations.delius.referencedata.entity.ReferenceData
import java.time.LocalDate
import java.time.ZonedDateTime
Expand Down Expand Up @@ -153,10 +154,16 @@ object PersonDetailsGenerator {
USER
)

val PERSON_ADDRESS_STATUS_1 = ReferenceData(IdGenerator.getAndIncrement(), "M", "Main Address")
val PERSON_ADDRESS_STATUS_2 = ReferenceData(IdGenerator.getAndIncrement(), "A", "Another Address")
val PERSON_ADDRESS_TYPE_1 = ReferenceData(IdGenerator.getAndIncrement(), "T1", "Address type 1")
val PERSON_ADDRESS_TYPE_2 = ReferenceData(IdGenerator.getAndIncrement(), "T2", "Address type 2")
val ADDRESS_TYPE = Dataset(IdGenerator.getAndIncrement(), "ADDRESS TYPE")
val ADDRESS_STATUS = Dataset(IdGenerator.getAndIncrement(), "ADDRESS STATUS")

val PERSON_ADDRESS_STATUS_1 = ReferenceData(IdGenerator.getAndIncrement(), "M", "Main Address", ADDRESS_STATUS.id)
val PERSON_PREVIOUS_ADDRESS_STATUS =
ReferenceData(IdGenerator.getAndIncrement(), "P", "Previous Address", ADDRESS_STATUS.id)
val PERSON_ADDRESS_STATUS_2 =
ReferenceData(IdGenerator.getAndIncrement(), "A", "Another Address", ADDRESS_STATUS.id)
val PERSON_ADDRESS_TYPE_1 = ReferenceData(IdGenerator.getAndIncrement(), "T1", "Address type 1", ADDRESS_TYPE.id)
val PERSON_ADDRESS_TYPE_2 = ReferenceData(IdGenerator.getAndIncrement(), "T2", "Address type 2", ADDRESS_TYPE.id)
val PERSON_ADDRESS_1 = generatePersonAddress(
"31",
"Test Street",
Expand Down Expand Up @@ -188,13 +195,14 @@ object PersonDetailsGenerator {
"Test County",
"NE4 END",
PERSONAL_DETAILS.id,
PERSON_ADDRESS_STATUS_2,
PERSON_PREVIOUS_ADDRESS_STATUS,
PERSON_ADDRESS_TYPE_2,
endDate = LocalDate.now().minusYears(1)
)

val NULL_ADDRESS = PersonAddress(
PERSONAL_DETAILS.id,
0L,
PERSON_ADDRESS_STATUS_2,
PERSON_ADDRESS_TYPE_2,
null,
Expand All @@ -204,15 +212,19 @@ object PersonDetailsGenerator {
null,
null,
null,
telephoneNumber = null,
null,
LocalDate.now(),
null,
true,
false,
LocalDate.now(),
USER.id,
USER,
LocalDate.now(),
0,
false,
"Some Notes",
IdGenerator.getAndIncrement(),
null,
)

val DOCUMENT_1 = generateDocument(PERSONAL_DETAILS.id, "A001", "induction.doc", "DOCUMENT")
Expand Down Expand Up @@ -254,7 +266,7 @@ object PersonDetailsGenerator {

) = PersonAddress(
personId = personId,
id = IdGenerator.getAndIncrement(),
id = null,
buildingName = null,
buildingNumber = addressNumber,
county = county,
Expand All @@ -270,6 +282,7 @@ object PersonDetailsGenerator {
type = type,
typeVerified = verified,
telephoneNumber = "0191876865",
lastUpdatedUserId = USER.id,
lastUpdatedUser = USER,
notes = notes,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,19 @@ import org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDO
import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.MvcResult
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post
import org.springframework.test.web.servlet.result.MockMvcResultMatchers
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status
import org.springframework.transaction.PlatformTransactionManager
import org.springframework.transaction.annotation.Transactional
import org.springframework.transaction.support.TransactionTemplate
import org.springframework.util.ResourceUtils
import uk.gov.justice.digital.hmpps.advice.ErrorResponse
import uk.gov.justice.digital.hmpps.api.model.Name
import uk.gov.justice.digital.hmpps.api.model.PersonSummary
import uk.gov.justice.digital.hmpps.api.model.personalDetails.*
import uk.gov.justice.digital.hmpps.data.generator.UserGenerator.AUDIT_USER
import uk.gov.justice.digital.hmpps.data.generator.personalDetails.PersonDetailsGenerator
import uk.gov.justice.digital.hmpps.data.generator.personalDetails.PersonDetailsGenerator.ALIAS_1
import uk.gov.justice.digital.hmpps.data.generator.personalDetails.PersonDetailsGenerator.DISABILITY_1
import uk.gov.justice.digital.hmpps.data.generator.personalDetails.PersonDetailsGenerator.DISABILITY_2
Expand All @@ -29,6 +36,7 @@ import uk.gov.justice.digital.hmpps.data.generator.personalDetails.PersonDetails
import uk.gov.justice.digital.hmpps.data.generator.personalDetails.PersonDetailsGenerator.PROVISION_2
import uk.gov.justice.digital.hmpps.service.*
import uk.gov.justice.digital.hmpps.test.MockMvcExtensions.contentAsJson
import uk.gov.justice.digital.hmpps.test.MockMvcExtensions.withJson
import uk.gov.justice.digital.hmpps.test.MockMvcExtensions.withToken
import java.time.LocalDate

Expand All @@ -38,6 +46,11 @@ internal class PersonalDetailsIntegrationTest {
@Autowired
lateinit var mockMvc: MockMvc

@Autowired
lateinit var transactionManager: PlatformTransactionManager

lateinit var transactionTemplate: TransactionTemplate

@Test
fun `personal details are returned`() {

Expand Down Expand Up @@ -249,4 +262,198 @@ internal class PersonalDetailsIntegrationTest {
.perform(get("/personal-details/X999999/provisions").withToken())
.andExpect(status().isNotFound)
}

@Test
@Transactional
fun `main address updated with valid end date results in no main address and more previous addresses`() {
transactionTemplate = TransactionTemplate(transactionManager)
transactionTemplate.execute {
val person = PERSONAL_DETAILS
mockMvc
.perform(
post("/personal-details/${person.crn}").withToken()
.withJson(
PersonalContactEditRequest(
postcode = "NE1 UPD",
startDate = LocalDate.now().minusDays(10),
endDate = LocalDate.now()

)
)
)
.andExpect(status().isOk)
.andReturn().response.contentAsJson<PersonalDetails>()
val res = mockMvc
.perform(get("/personal-details/${person.crn}/addresses").withToken())
.andExpect(status().isOk)
.andReturn().response.contentAsJson<AddressOverview>()
assertThat(res.personSummary, equalTo(person.toSummary()))
assertThat(res.mainAddress, equalTo(null))
assertThat(res.previousAddresses.size, equalTo(2))
}
}

@Test
@Transactional
fun `when no main address new main address is created`() {
transactionTemplate = TransactionTemplate(transactionManager)
transactionTemplate.execute {
val person = PERSONAL_DETAILS
mockMvc
.perform(
post("/personal-details/${person.crn}").withToken()
.withJson(
PersonalContactEditRequest(
postcode = "NE1 UPD",
startDate = LocalDate.now().minusDays(10),
endDate = LocalDate.now()

)
)
)
.andExpect(status().isOk)
.andReturn().response.contentAsJson<PersonalDetails>()
mockMvc
.perform(
post("/personal-details/${person.crn}").withToken()
.withJson(
PersonalContactEditRequest(
postcode = "NE1 NEW",
startDate = LocalDate.now().minusDays(9),
endDate = null

)
)
)
.andExpect(status().isOk)
.andReturn().response.contentAsJson<PersonalDetails>()
val res = mockMvc
.perform(get("/personal-details/${person.crn}/addresses").withToken())
.andExpect(status().isOk)
.andReturn().response.contentAsJson<AddressOverview>()
assertThat(res.personSummary, equalTo(person.toSummary()))
assertThat(res.mainAddress?.postcode, equalTo("NE1 NEW"))
assertThat(res.previousAddresses.size, equalTo(2))
}
}

@Test
@Transactional
fun `when all fields are posted for an existing main address all are updated`() {
val request = PersonalContactEditRequest(
phoneNumber = "0191255446",
mobileNumber = "077989988",
emailAddress = "updated@test.none",
buildingName = "Building",
buildingNumber = "23",
streetName = "The Street",
town = "Town",
county = "County",
postcode = "NE1 UPD",
addressTypeCode = PersonDetailsGenerator.PERSON_ADDRESS_TYPE_1.code,
verified = false,
noFixedAddress = false,
startDate = LocalDate.now().minusDays(10),
notes = "This has been updated for testing"
)
transactionTemplate = TransactionTemplate(transactionManager)
transactionTemplate.execute {
val person = PERSONAL_DETAILS
val updateResponse = mockMvc
.perform(
post("/personal-details/${person.crn}").withToken()
.withJson(request)
)
.andExpect(status().isOk)
.andReturn().response.contentAsJson<PersonalDetails>()
val res = mockMvc
.perform(get("/personal-details/${person.crn}/addresses").withToken())
.andExpect(status().isOk)
.andReturn().response.contentAsJson<AddressOverview>()
assertThat(res.personSummary, equalTo(person.toSummary()))

assertThat(updateResponse.telephoneNumber, equalTo(request.phoneNumber))
assertThat(updateResponse.mobileNumber, equalTo(request.mobileNumber))
assertThat(updateResponse.email, equalTo(request.emailAddress))
assertThat(updateResponse.lastUpdated, equalTo(LocalDate.now()))
assertThat(
updateResponse.lastUpdatedBy,
equalTo(Name(forename = AUDIT_USER.forename, surname = AUDIT_USER.surname))
)

assertThat(res.mainAddress?.buildingName, equalTo(request.buildingName))
assertThat(res.mainAddress?.buildingNumber, equalTo(request.buildingNumber))
assertThat(res.mainAddress?.streetName, equalTo(request.streetName))
assertThat(res.mainAddress?.town, equalTo(request.town))
assertThat(res.mainAddress?.county, equalTo(request.county))
assertThat(res.mainAddress?.postcode, equalTo(request.postcode))
assertThat(res.mainAddress?.type, equalTo(PersonDetailsGenerator.PERSON_ADDRESS_TYPE_1.description))
assertThat(res.mainAddress?.verified, equalTo(request.verified))
assertThat(res.mainAddress?.noFixedAddress, equalTo(request.noFixedAddress))
assertThat(res.mainAddress?.lastUpdated, equalTo(LocalDate.now()))
assertThat(
res.mainAddress?.lastUpdatedBy,
equalTo(Name(forename = AUDIT_USER.forename, surname = AUDIT_USER.surname))
)

assertThat(res.previousAddresses.size, equalTo(1))
}
}

@Test
fun `when personal details update request does not have a start date`() {
val request = PersonalContactEditRequest()
val res = mockMvc.perform(
post("/personal-details/X000001").withToken()
.withJson(request)
)
.andExpect(status().isBadRequest)
.andReturn().response.contentAsJson<ErrorResponse>()

assertThat(res.message, equalTo("Start date must be provided"))
}

@Test
fun `when personal details update request has a start date later than today`() {
val request = PersonalContactEditRequest(startDate = LocalDate.now().plusDays(1))
val res = mockMvc.perform(
post("/personal-details/X000001").withToken()
.withJson(request)
)
.andExpect(status().isBadRequest)
.andReturn().response.contentAsJson<ErrorResponse>()

assertThat(res.message, equalTo("Start date must not be later than today"))
}

@Test
fun `when personal details update request has an date later than today`() {
val request = PersonalContactEditRequest(startDate = LocalDate.now(), endDate = LocalDate.now().plusDays(1))
val res = mockMvc.perform(
post("/personal-details/X000001").withToken()
.withJson(request)
)
.andExpect(status().isBadRequest)
.andReturn().response.contentAsJson<ErrorResponse>()

assertThat(res.message, equalTo("End date must not be later than today"))
}

@Test
fun `when street name greater than 35 chars`() {
val request = PersonalContactEditRequest(
startDate = LocalDate.now(),
streetName = "U".repeat(100),
emailAddress = "X".repeat(257)
)
val res = mockMvc.perform(
post("/personal-details/X000001").withToken()
.withJson(request)
)
.andExpect(status().isBadRequest)
.andReturn().response.contentAsJson<ErrorResponse>()

assertThat(res.message, equalTo("Validation failure"))
assertThat(res.fields?.size, equalTo(2))
}
}
Loading

0 comments on commit 9e2e63b

Please sign in to comment.