Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ class SaveGovBodyMemberStepConfig : AbstractInternalStepConfig<Complete, Landlor
?: throw PrsdbWebException("Governing body member date of birth is invalid")

val address = state.govBodyMemberAddressTask.getAddress()
val lookupFormModel = state.govBodyMemberAddressTask.lookupAddressStep.formModelOrNull
val selectFormModel = state.govBodyMemberAddressTask.selectAddressStep.formModelOrNull
val manualFormModel = state.govBodyMemberAddressTask.manualAddressStep.formModelOrNull

val currentMap = state.governingBodyMembersMap?.toMutableMap() ?: mutableMapOf()

Expand All @@ -46,6 +49,14 @@ class SaveGovBodyMemberStepConfig : AbstractInternalStepConfig<Complete, Landlor
type = type,
dateOfBirth = dateOfBirth,
address = address,
addressSearchPostcode = lookupFormModel?.postcode,
addressSearchHouseNameOrNumber = lookupFormModel?.houseNameOrNumber,
selectedAddress = selectFormModel?.address,
manualAddressLineOne = manualFormModel?.addressLineOne,
manualAddressLineTwo = manualFormModel?.addressLineTwo,
manualTownOrCity = manualFormModel?.townOrCity,
manualCounty = manualFormModel?.county,
manualPostcode = manualFormModel?.postcode,
)

currentMap[targetKey] = member
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -277,15 +277,51 @@ class OrgLandlordRegistrationTask(
duplicableTask(journey.govBodyMemberAddressTask, GovBodyMemberAddressTask.ROUTE_SEGMENT) {
parents { journey.orgGovBodyMemberDobStep.isComplete() }
nextStep { journey.saveGovBodyMemberStep }
}
step(journey.saveGovBodyMemberStep) {
parents { journey.govBodyMemberAddressTask.isComplete() }
nextStep { journey.orgGovBodyMemberListStep }
configureStep(journey.govBodyMemberAddressTask.lookupAddressStep) {
withAdditionalContentProperties {
val editingMember =
journey.editingGovBodyMemberId?.let { journey.governingBodyMembersMap?.get(it) }
if (editingMember != null) {
mapOf(
"prefillPostcode" to editingMember.addressSearchPostcode,
"prefillHouseNameOrNumber" to editingMember.addressSearchHouseNameOrNumber,
)
} else {
emptyMap()
}
}
}
configureStep(journey.govBodyMemberAddressTask.selectAddressStep) {
withAdditionalContentProperties {
mapOf("fieldSetHeading" to "forms.selectAddress.govBodyMemberRegistration.fieldSetHeading")
val editingMember =
journey.editingGovBodyMemberId?.let { journey.governingBodyMembersMap?.get(it) }
mapOf(
"fieldSetHeading" to "forms.selectAddress.govBodyMemberRegistration.fieldSetHeading",
"prefillSelectedAddress" to editingMember?.selectedAddress,
)
}
}
configureStep(journey.govBodyMemberAddressTask.manualAddressStep) {
withAdditionalContentProperties {
val editingMember =
journey.editingGovBodyMemberId?.let { journey.governingBodyMembersMap?.get(it) }
if (editingMember?.manualAddressLineOne != null) {
mapOf(
"prefillAddressLineOne" to editingMember.manualAddressLineOne,
"prefillAddressLineTwo" to editingMember.manualAddressLineTwo,
"prefillTownOrCity" to editingMember.manualTownOrCity,
"prefillCounty" to editingMember.manualCounty,
"prefillPostcode" to editingMember.manualPostcode,
)
} else {
emptyMap()
}
}
}
}
step(journey.saveGovBodyMemberStep) {
parents { journey.govBodyMemberAddressTask.isComplete() }
nextStep { journey.orgGovBodyMemberListStep }
}
step(journey.orgGovBodyMemberListStep) {
routeSegment(OrgGovBodyMemberListStep.ROUTE_SEGMENT)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package uk.gov.communities.prsdb.webapp.journeys.shared.stepConfig

import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFrameworkComponent
import uk.gov.communities.prsdb.webapp.constants.FORM_MODEL_ATTR_NAME
import uk.gov.communities.prsdb.webapp.exceptions.NotNullFormModelValueIsNullException.Companion.notNullValue
import uk.gov.communities.prsdb.webapp.journeys.AbstractRequestableStepConfig
import uk.gov.communities.prsdb.webapp.journeys.JourneyStep.RequestableStep
Expand All @@ -25,6 +26,18 @@ class LookupAddressStepConfig(

override fun chooseTemplate(state: AddressSearchState) = "forms/lookupAddressForm"

override fun resolvePageContent(
state: AddressSearchState,
defaultContent: Map<String, Any?>,
): Map<String, Any?> {
val prefillPostcode = defaultContent["prefillPostcode"] as? String ?: return defaultContent
val formModel = defaultContent[FORM_MODEL_ATTR_NAME] as? LookupAddressFormModel ?: return defaultContent
if (!formModel.postcode.isNullOrBlank()) return defaultContent
formModel.postcode = prefillPostcode
formModel.houseNameOrNumber = defaultContent["prefillHouseNameOrNumber"] as? String
return defaultContent + (FORM_MODEL_ATTR_NAME to formModel)
}

override fun mode(state: AddressSearchState) =
state.cachedAddresses?.let {
when (it.isEmpty()) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package uk.gov.communities.prsdb.webapp.journeys.shared.stepConfig

import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFrameworkComponent
import uk.gov.communities.prsdb.webapp.constants.FORM_MODEL_ATTR_NAME
import uk.gov.communities.prsdb.webapp.journeys.AbstractRequestableStepConfig
import uk.gov.communities.prsdb.webapp.journeys.JourneyStep.RequestableStep
import uk.gov.communities.prsdb.webapp.journeys.shared.Complete
Expand All @@ -24,6 +25,21 @@ class ManualAddressStepConfig : AbstractRequestableStepConfig<Complete, ManualAd

override fun chooseTemplate(state: AddressState) = "forms/manualAddressForm"

override fun resolvePageContent(
state: AddressState,
defaultContent: Map<String, Any?>,
): Map<String, Any?> {
val prefillAddressLineOne = defaultContent["prefillAddressLineOne"] as? String ?: return defaultContent
val formModel = defaultContent[FORM_MODEL_ATTR_NAME] as? ManualAddressFormModel ?: return defaultContent
if (!formModel.addressLineOne.isNullOrBlank()) return defaultContent
formModel.addressLineOne = prefillAddressLineOne
formModel.addressLineTwo = defaultContent["prefillAddressLineTwo"] as? String
formModel.townOrCity = defaultContent["prefillTownOrCity"] as? String
formModel.county = defaultContent["prefillCounty"] as? String
formModel.postcode = defaultContent["prefillPostcode"] as? String
return defaultContent + (FORM_MODEL_ATTR_NAME to formModel)
}

override fun mode(state: AddressState) = getFormModelFromStateOrNull(state)?.let { Complete.COMPLETE }
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package uk.gov.communities.prsdb.webapp.journeys.shared.stepConfig

import org.springframework.validation.BindingResult
import uk.gov.communities.prsdb.webapp.annotations.webAnnotations.JourneyFrameworkComponent
import uk.gov.communities.prsdb.webapp.constants.FORM_MODEL_ATTR_NAME
import uk.gov.communities.prsdb.webapp.constants.MANUAL_ADDRESS_CHOSEN
import uk.gov.communities.prsdb.webapp.exceptions.NotNullFormModelValueIsNullException
import uk.gov.communities.prsdb.webapp.exceptions.NotNullFormModelValueIsNullException.Companion.notNullValue
Expand Down Expand Up @@ -51,6 +52,17 @@ class SelectAddressStepConfig(

override fun chooseTemplate(state: AddressState) = "forms/selectAddressForm"

override fun resolvePageContent(
state: AddressState,
defaultContent: Map<String, Any?>,
): Map<String, Any?> {
val prefillSelectedAddress = defaultContent["prefillSelectedAddress"] as? String ?: return defaultContent
val formModel = defaultContent[FORM_MODEL_ATTR_NAME] as? SelectAddressFormModel ?: return defaultContent
if (!formModel.address.isNullOrBlank()) return defaultContent
formModel.address = prefillSelectedAddress
return defaultContent + (FORM_MODEL_ATTR_NAME to formModel)
}

override fun mode(state: AddressState) =
getFormModelFromStateOrNull(state)?.address?.let { selectedAddress ->
when {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,12 @@ data class GoverningBodyMemberDataModel(
val type: GoverningBodyMemberType,
val dateOfBirth: LocalDate,
val address: AddressDataModel,
val addressSearchPostcode: String? = null,
val addressSearchHouseNameOrNumber: String? = null,
val selectedAddress: String? = null,
val manualAddressLineOne: String? = null,
val manualAddressLineTwo: String? = null,
val manualTownOrCity: String? = null,
val manualCounty: String? = null,
val manualPostcode: String? = null,
)
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ import uk.gov.communities.prsdb.webapp.integration.pageObjects.pages.landlordReg
import uk.gov.communities.prsdb.webapp.integration.pageObjects.pages.landlordRegistrationJourneyPages.OrgGovBodyMemberDobFormPageLandlordRegistration
import uk.gov.communities.prsdb.webapp.integration.pageObjects.pages.landlordRegistrationJourneyPages.OrgGovBodyMemberListFormPageLandlordRegistration
import uk.gov.communities.prsdb.webapp.integration.pageObjects.pages.landlordRegistrationJourneyPages.OrgGovBodyMemberLookupAddressFormPageLandlordRegistration
import uk.gov.communities.prsdb.webapp.integration.pageObjects.pages.landlordRegistrationJourneyPages.OrgGovBodyMemberManualAddressFormPageLandlordRegistration
import uk.gov.communities.prsdb.webapp.integration.pageObjects.pages.landlordRegistrationJourneyPages.OrgGovBodyMemberNameFormPageLandlordRegistration
import uk.gov.communities.prsdb.webapp.integration.pageObjects.pages.landlordRegistrationJourneyPages.OrgGovBodyMemberSelectAddressFormPageLandlordRegistration
import uk.gov.communities.prsdb.webapp.integration.pageObjects.pages.landlordRegistrationJourneyPages.OrgGovBodyWhoToProvideFormPageLandlordRegistration
Expand Down Expand Up @@ -579,13 +580,144 @@ class LandlordRegistrationJourneyTests : IntegrationTestWithMutableData("data-mo
assertThat(updatedListPage.summaryList.getRowByIndex(1).value).containsText("Bob Jones")
}

private fun createTestGovBodyMember(name: String) =
uk.gov.communities.prsdb.webapp.models.dataModels.GoverningBodyMemberDataModel(
name = name,
type = GoverningBodyMemberType.DIRECTOR,
dateOfBirth = kotlinx.datetime.LocalDate(1970, 1, 1),
address =
uk.gov.communities.prsdb.webapp.models.dataModels
.AddressDataModel(singleLineAddress = "Test Address"),
)
@Test
fun `editing a governing body member pre-fills all questions including looked-up address`(page: Page) {
featureFlagManager.enable(ORGANISATION_LANDLORD_REGISTRATION)

val memberListPage =
navigator.skipToOrgLandlordRegistrationGovBodyMemberListPage(
mapOf(
1 to
createTestGovBodyMember(
name = "Alice Smith",
type = GoverningBodyMemberType.TRUSTEE,
dateOfBirth = kotlinx.datetime.LocalDate(1985, 3, 15),
addressSearchPostcode = "EG1 2AA",
addressSearchHouseNameOrNumber = "1",
selectedAddress = "1 PRSDB Square, EG1 2AA",
),
),
)

memberListPage.summaryList
.getRowByIndex(0)
.actions
.getActionLink("Change")
.clickAndWait()

val whoToProvidePage = assertPageIs(page, OrgGovBodyWhoToProvideFormPageLandlordRegistration::class)
assertEquals("TRUSTEE", whoToProvidePage.form.radios.selectedValue)
whoToProvidePage.form.submit()

val namePage = assertPageIs(page, OrgGovBodyMemberNameFormPageLandlordRegistration::class)
assertThat(namePage.form.nameInput).hasValue("Alice Smith")
namePage.form.submit()

val dobPage = assertPageIs(page, OrgGovBodyMemberDobFormPageLandlordRegistration::class)
assertThat(dobPage.form.dayInput).hasValue("15")
assertThat(dobPage.form.monthInput).hasValue("3")
assertThat(dobPage.form.yearInput).hasValue("1985")
dobPage.form.submit()

val lookupAddressPage = assertPageIs(page, OrgGovBodyMemberLookupAddressFormPageLandlordRegistration::class)
assertThat(lookupAddressPage.form.postcodeInput).hasValue("EG1 2AA")
assertThat(lookupAddressPage.form.houseNameOrNumberInput).hasValue("1")
lookupAddressPage.form.submit()

val selectAddressPage = assertPageIs(page, OrgGovBodyMemberSelectAddressFormPageLandlordRegistration::class)
assertEquals("1 PRSDB Square, EG1 2AA", selectAddressPage.form.addressRadios.selectedValue)
selectAddressPage.form.submit()

val updatedListPage = assertPageIs(page, OrgGovBodyMemberListFormPageLandlordRegistration::class)
assertThat(updatedListPage.summaryList.getRowByIndex(0).value).containsText("Alice Smith")
}

@Test
fun `editing a governing body member pre-fills manual address`(page: Page) {
featureFlagManager.enable(ORGANISATION_LANDLORD_REGISTRATION)

val memberListPage =
navigator.skipToOrgLandlordRegistrationGovBodyMemberListPage(
mapOf(
1 to
createTestGovBodyMember(
name = "Bob Jones",
type = GoverningBodyMemberType.DIRECTOR,
dateOfBirth = kotlinx.datetime.LocalDate(1990, 7, 20),
addressSearchPostcode = "EG1 2AA",
addressSearchHouseNameOrNumber = "1",
selectedAddress = MANUAL_ADDRESS_CHOSEN,
manualAddressLineOne = "123 Main Street",
manualAddressLineTwo = "Flat 4",
manualTownOrCity = "London",
manualCounty = "Greater London",
manualPostcode = "EG1 2AA",
),
),
)

memberListPage.summaryList
.getRowByIndex(0)
.actions
.getActionLink("Change")
.clickAndWait()

val whoToProvidePage = assertPageIs(page, OrgGovBodyWhoToProvideFormPageLandlordRegistration::class)
whoToProvidePage.form.submit()

val namePage = assertPageIs(page, OrgGovBodyMemberNameFormPageLandlordRegistration::class)
namePage.form.submit()

val dobPage = assertPageIs(page, OrgGovBodyMemberDobFormPageLandlordRegistration::class)
dobPage.form.submit()

val lookupAddressPage = assertPageIs(page, OrgGovBodyMemberLookupAddressFormPageLandlordRegistration::class)
assertThat(lookupAddressPage.form.postcodeInput).hasValue("EG1 2AA")
assertThat(lookupAddressPage.form.houseNameOrNumberInput).hasValue("1")
lookupAddressPage.form.submit()

val selectAddressPage = assertPageIs(page, OrgGovBodyMemberSelectAddressFormPageLandlordRegistration::class)
assertEquals(MANUAL_ADDRESS_CHOSEN, selectAddressPage.form.addressRadios.selectedValue)
selectAddressPage.form.submit()

val manualAddressPage = assertPageIs(page, OrgGovBodyMemberManualAddressFormPageLandlordRegistration::class)
assertThat(manualAddressPage.form.addressLineOneInput).hasValue("123 Main Street")
assertThat(manualAddressPage.form.addressLineTwoInput).hasValue("Flat 4")
assertThat(manualAddressPage.form.townOrCityInput).hasValue("London")
assertThat(manualAddressPage.form.countyInput).hasValue("Greater London")
assertThat(manualAddressPage.form.postcodeInput).hasValue("EG1 2AA")
manualAddressPage.form.submit()

val updatedListPage = assertPageIs(page, OrgGovBodyMemberListFormPageLandlordRegistration::class)
assertThat(updatedListPage.summaryList.getRowByIndex(0).value).containsText("Bob Jones")
}

private fun createTestGovBodyMember(
name: String,
type: GoverningBodyMemberType = GoverningBodyMemberType.DIRECTOR,
dateOfBirth: kotlinx.datetime.LocalDate = kotlinx.datetime.LocalDate(1970, 1, 1),
addressSearchPostcode: String? = null,
addressSearchHouseNameOrNumber: String? = null,
selectedAddress: String? = null,
manualAddressLineOne: String? = null,
manualAddressLineTwo: String? = null,
manualTownOrCity: String? = null,
manualCounty: String? = null,
manualPostcode: String? = null,
) = uk.gov.communities.prsdb.webapp.models.dataModels.GoverningBodyMemberDataModel(
name = name,
type = type,
dateOfBirth = dateOfBirth,
address =
uk.gov.communities.prsdb.webapp.models.dataModels
.AddressDataModel(singleLineAddress = "Test Address"),
addressSearchPostcode = addressSearchPostcode,
addressSearchHouseNameOrNumber = addressSearchHouseNameOrNumber,
selectedAddress = selectedAddress,
manualAddressLineOne = manualAddressLineOne,
manualAddressLineTwo = manualAddressLineTwo,
manualTownOrCity = manualTownOrCity,
manualCounty = manualCounty,
manualPostcode = manualPostcode,
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package uk.gov.communities.prsdb.webapp.integration.pageObjects.pages.landlordRegistrationJourneyPages

import com.microsoft.playwright.Page
import uk.gov.communities.prsdb.webapp.controllers.RegisterLandlordController.Companion.LANDLORD_REGISTRATION_ROUTE
import uk.gov.communities.prsdb.webapp.integration.pageObjects.pages.basePages.ManualAddressFormPage
import uk.gov.communities.prsdb.webapp.journeys.shared.stepConfig.ManualAddressStep
import uk.gov.communities.prsdb.webapp.journeys.shared.tasks.GovBodyMemberAddressTask

class OrgGovBodyMemberManualAddressFormPageLandlordRegistration(
page: Page,
) : ManualAddressFormPage(
page,
"$LANDLORD_REGISTRATION_ROUTE/${GovBodyMemberAddressTask.ROUTE_SEGMENT}/${ManualAddressStep.ROUTE_SEGMENT}",
)
Loading
Loading