diff --git a/app/models/AddressLookup.scala b/app/models/AddressLookup.scala index ad7c620..b8b3d9c 100644 --- a/app/models/AddressLookup.scala +++ b/app/models/AddressLookup.scala @@ -27,7 +27,8 @@ case class AddressLookup(addressLine1: Option[String], addressLine4: Option[String], town: String, county: Option[String], - postcode: String + postcode: String, + country: Option[String] ) { val toAddress: Address = { @@ -35,14 +36,16 @@ case class AddressLookup(addressLine1: Option[String], val line1 = addressLine1.getOrElse("") val line2 = addressLine2 val line3 = addressLine3 - .map( - l => s"$l $town" - ) .getOrElse(town) - val line4 = addressLine4 - val safePostcode = Option(postcode) + val line4 = (addressLine3.isEmpty, addressLine4.isEmpty) match { + case (true, true) => county + case (false, true) => Some(town) + case (_, _) => addressLine4 + } + val safePostcode = Option(postcode) + val ctry: Country = Country("", "", country.getOrElse("")) - Address(line1, line2, line3, line4, safePostcode, Country.GB) + Address(line1, line2, line3, line4, safePostcode, ctry) } } @@ -62,19 +65,22 @@ object AddressLookup { "lines" -> lines, "town" -> addressLookup.town, "county" -> addressLookup.county, - "postcode" -> addressLookup.postcode + "postcode" -> addressLookup.postcode, + "country" -> addressLookup.country ) ) } implicit val addressLookupReads: Reads[AddressLookup] = - ( - (JsPath \ "address" \ "lines").read[List[String]] and - (JsPath \ "address" \ "town").read[String] and - (JsPath \ "address" \ "county").readNullable[String] and - (JsPath \ "address" \ "postcode").read[String] - ) { - (lines, town, county, postcode) => + ((JsPath \ "address" \ "lines").read[List[String]] and + (JsPath \ "address" \ "town").read[String] and + (JsPath \ "address" \ "county").readNullable[String] and + (JsPath \ "address" \ "postcode").read[String] and + ( + (JsPath \ "address" \ "country").readNullable[String] orElse + (JsPath \ "address" \ "country" \ "name").readNullable[String] + )) { + (lines, town, county, postcode, countryName) => val addressLines: (Option[String], Option[String], Option[String], Option[String]) = lines.size match { case 0 => @@ -87,7 +93,16 @@ object AddressLookup { (Some(lines.head), Some(lines(1)), Some(lines(2)), None) case numberOfLines if numberOfLines >= 4 => (Some(lines.head), Some(lines(1)), Some(lines(2)), Some(lines(3))) } - AddressLookup(addressLines._1, addressLines._2, addressLines._3, addressLines._4, town, county, postcode) + AddressLookup( + addressLines._1, + addressLines._2, + addressLines._3, + addressLines._4, + town, + county, + postcode, + countryName + ) } implicit val addressesLookupReads: Reads[Seq[AddressLookup]] = Reads { diff --git a/app/utils/AddressHelper.scala b/app/utils/AddressHelper.scala index ea26385..3c0dfe5 100644 --- a/app/utils/AddressHelper.scala +++ b/app/utils/AddressHelper.scala @@ -29,7 +29,8 @@ object AddressHelper { address.addressLine4, address.town, address.postcode, - address.county + address.county, + address.country ) .collect { case s: String => s @@ -62,7 +63,8 @@ object AddressHelper { address.addressLine4, address.town, address.postcode, - address.county + address.county, + address.country ) toFormattedAddress(lines) } diff --git a/test-utils/generators/ModelGenerators.scala b/test-utils/generators/ModelGenerators.scala index cd7a3ec..cd63b31 100644 --- a/test-utils/generators/ModelGenerators.scala +++ b/test-utils/generators/ModelGenerators.scala @@ -63,7 +63,8 @@ trait ModelGenerators extends RegexConstants with Generators { postCode <- arbitrary[String] town <- arbitrary[String] county <- arbitrary[Option[String]] - } yield AddressLookup(addressLine1, addressLine2, addressLine3, addressLine4, town, county, postCode) + country <- arbitrary[Option[String]] + } yield AddressLookup(addressLine1, addressLine2, addressLine3, addressLine4, town, county, postCode, country) } implicit val arbitraryAddressResponse: Arbitrary[AddressResponse] = Arbitrary { diff --git a/test/base/SpecBase.scala b/test/base/SpecBase.scala index 9669810..f585937 100644 --- a/test/base/SpecBase.scala +++ b/test/base/SpecBase.scala @@ -207,7 +207,7 @@ trait SpecBase extends AnyFreeSpec with Matchers with TryValues with OptionValue val testAddress: Address = Address("value 1", Some("value 2"), "value 3", Some("value 4"), Some("XX9 9XX"), Country.GB) val testAddressResponse: AddressResponse = AddressResponse("value 1", Some("value 2"), Some("value 3"), Some("value 4"), Some("XX9 9XX"), Country.GB.code) - val testAddressLookup: AddressLookup = AddressLookup(Some("1 Address line 1"), None, None, None, "Town", None, "ZZ1 1ZZ") + val testAddressLookup: AddressLookup = AddressLookup(Some("1 Address line 1"), None, None, None, "Town", None, "ZZ1 1ZZ", Some("United Kingdom")) implicit val hc: HeaderCarrier = HeaderCarrier() def emptyUserAnswers: UserAnswers = UserAnswers(userAnswersId) diff --git a/test/connectors/AddressLookupConnectorSpec.scala b/test/connectors/AddressLookupConnectorSpec.scala index fc11703..88b3d40 100644 --- a/test/connectors/AddressLookupConnectorSpec.scala +++ b/test/connectors/AddressLookupConnectorSpec.scala @@ -21,7 +21,7 @@ import com.github.tomakehurst.wiremock.client.WireMock.{aResponse, post, urlEqua import com.github.tomakehurst.wiremock.stubbing.StubMapping import generators.Generators import helpers.WireMockServerHandler -import models.AddressLookup +import models.{AddressLookup, Country} import org.scalatestplus.scalacheck.ScalaCheckPropertyChecks import play.api.Application import play.api.http.Status._ @@ -88,7 +88,7 @@ class AddressLookupConnectorSpec extends SpecBase with WireMockServerHandler wit stubResponse(addressLookupUrl, OK, addressJson) val addressLookupResult = Seq( - AddressLookup(Some("1 Address line 1 Road"), None, Some("Address line 2 Road"), None, "Town", Some("County"), postcode) + AddressLookup(Some("1 Address line 1 Road"), None, Some("Address line 2 Road"), None, "Town", Some("County"), postcode, Some("United Kingdom")) ) val result = connector.addressLookupByPostcode(postcode) @@ -918,31 +918,71 @@ class AddressLookupConnectorSpec extends SpecBase with WireMockServerHandler wit stubResponse(addressLookupUrl, OK, addressesJson) val addressLookupResult = Vector( - AddressLookup(Some("2 Other place"), None, Some("Some District"), None, "Town", Some("County"), postcode), - AddressLookup(Some("3 Other place"), None, Some("Some District"), None, "Town", Some("County"), postcode), - AddressLookup(Some("4 Other place"), None, Some("Some District"), None, "Town", Some("County"), postcode), - AddressLookup(Some("5 Other place"), None, Some("Some District"), None, "Town", Some("County"), postcode), - AddressLookup(Some("6 Other place"), None, Some("Some District"), None, "Town", Some("County"), postcode), - AddressLookup(Some("Flat 1"), Some("7 Other place"), Some("Some District"), None, "Town", Some("County"), postcode), - AddressLookup(Some("Flat 2"), Some("7 Other place"), Some("Some District"), None, "Town", Some("County"), postcode), - AddressLookup(Some("Flat 3"), Some("7 Other place"), Some("Some District"), None, "Town", Some("County"), postcode), - AddressLookup(Some("8 Other place"), None, Some("Some District"), None, "Town", Some("County"), postcode), - AddressLookup(Some("9 Other place"), None, Some("Some District"), None, "Town", Some("County"), postcode), - AddressLookup(Some("10 Other place"), None, Some("Some District"), None, "Town", Some("County"), postcode), - AddressLookup(Some("Suite 1"), Some("11 Waterloo Street"), Some("Some District"), None, "Town", Some("County"), postcode), - AddressLookup(Some("Unit 1"), Some("11 Waterloo Street"), Some("Some District"), None, "Town", Some("County"), postcode), - AddressLookup(Some("Suite 2"), Some("11 Waterloo Street"), Some("Some District"), None, "Town", Some("County"), postcode), - AddressLookup(Some("Unit 2"), Some("11 Waterloo Street"), Some("Some District"), None, "Town", Some("County"), postcode), - AddressLookup(Some("Suite 3"), Some("11 Waterloo Street"), Some("Some District"), None, "Town", Some("County"), postcode), - AddressLookup(Some("Apartment 301"), Some("11 Waterloo Street"), Some("Some District"), None, "Town", Some("County"), postcode), - AddressLookup(Some("Apartment 302"), Some("11 Waterloo Street"), Some("Some District"), None, "Town", Some("County"), postcode), - AddressLookup(Some("Apartment 400"), Some("11 Waterloo Street"), Some("Some District"), None, "Town", Some("County"), postcode), - AddressLookup(Some("99-99a"), Some("Back High Street"), Some("Gosforth"), None, "Newcastle upon Tyne", Some("County"), postcode), - AddressLookup(Some("135 Back High Street"), None, Some("Gosforth"), None, "Newcastle upon Tyne", Some("County"), postcode), - AddressLookup(Some("Efer House 137a"), Some("Back High Street"), Some("Gosforth"), None, "Newcastle upon Tyne", Some("County"), postcode), - AddressLookup(Some("141 Back High Street"), None, Some("Gosforth"), None, "Newcastle upon Tyne", Some("County"), postcode), - AddressLookup(Some("143 Back High Street"), None, Some("Gosforth"), None, "Newcastle upon Tyne", Some("County"), postcode), - AddressLookup(Some("153 Back High Street"), None, Some("Gosforth"), None, "Newcastle upon Tyne", Some("County"), postcode) + AddressLookup(Some("2 Other place"), None, Some("Some District"), None, "Town", Some("County"), postcode, Some("United Kingdom")), + AddressLookup(Some("3 Other place"), None, Some("Some District"), None, "Town", Some("County"), postcode, Some("United Kingdom")), + AddressLookup(Some("4 Other place"), None, Some("Some District"), None, "Town", Some("County"), postcode, Some("United Kingdom")), + AddressLookup(Some("5 Other place"), None, Some("Some District"), None, "Town", Some("County"), postcode, Some("United Kingdom")), + AddressLookup(Some("6 Other place"), None, Some("Some District"), None, "Town", Some("County"), postcode, Some("United Kingdom")), + AddressLookup(Some("Flat 1"), Some("7 Other place"), Some("Some District"), None, "Town", Some("County"), postcode, Some("United Kingdom")), + AddressLookup(Some("Flat 2"), Some("7 Other place"), Some("Some District"), None, "Town", Some("County"), postcode, Some("United Kingdom")), + AddressLookup(Some("Flat 3"), Some("7 Other place"), Some("Some District"), None, "Town", Some("County"), postcode, Some("United Kingdom")), + AddressLookup(Some("8 Other place"), None, Some("Some District"), None, "Town", Some("County"), postcode, Some("United Kingdom")), + AddressLookup(Some("9 Other place"), None, Some("Some District"), None, "Town", Some("County"), postcode, Some("United Kingdom")), + AddressLookup(Some("10 Other place"), None, Some("Some District"), None, "Town", Some("County"), postcode, Some("United Kingdom")), + AddressLookup(Some("Suite 1"), Some("11 Waterloo Street"), Some("Some District"), None, "Town", Some("County"), postcode, Some("United Kingdom")), + AddressLookup(Some("Unit 1"), Some("11 Waterloo Street"), Some("Some District"), None, "Town", Some("County"), postcode, Some("United Kingdom")), + AddressLookup(Some("Suite 2"), Some("11 Waterloo Street"), Some("Some District"), None, "Town", Some("County"), postcode, Some("United Kingdom")), + AddressLookup(Some("Unit 2"), Some("11 Waterloo Street"), Some("Some District"), None, "Town", Some("County"), postcode, Some("United Kingdom")), + AddressLookup(Some("Suite 3"), Some("11 Waterloo Street"), Some("Some District"), None, "Town", Some("County"), postcode, Some("United Kingdom")), + AddressLookup(Some("Apartment 301"), + Some("11 Waterloo Street"), + Some("Some District"), + None, + "Town", + Some("County"), + postcode, + Some("United Kingdom") + ), + AddressLookup(Some("Apartment 302"), + Some("11 Waterloo Street"), + Some("Some District"), + None, + "Town", + Some("County"), + postcode, + Some("United Kingdom") + ), + AddressLookup(Some("Apartment 400"), + Some("11 Waterloo Street"), + Some("Some District"), + None, + "Town", + Some("County"), + postcode, + Some("United Kingdom") + ), + AddressLookup(Some("99-99a"), + Some("Back High Street"), + Some("Gosforth"), + None, + "Newcastle upon Tyne", + Some("County"), + postcode, + Some("United Kingdom") + ), + AddressLookup(Some("135 Back High Street"), None, Some("Gosforth"), None, "Newcastle upon Tyne", Some("County"), postcode, Some("United Kingdom")), + AddressLookup(Some("Efer House 137a"), + Some("Back High Street"), + Some("Gosforth"), + None, + "Newcastle upon Tyne", + Some("County"), + postcode, + Some("United Kingdom") + ), + AddressLookup(Some("141 Back High Street"), None, Some("Gosforth"), None, "Newcastle upon Tyne", Some("County"), postcode, Some("United Kingdom")), + AddressLookup(Some("143 Back High Street"), None, Some("Gosforth"), None, "Newcastle upon Tyne", Some("County"), postcode, Some("United Kingdom")), + AddressLookup(Some("153 Back High Street"), None, Some("Gosforth"), None, "Newcastle upon Tyne", Some("County"), postcode, Some("United Kingdom")) ) val result = connector.addressLookupByPostcode(postcode) @@ -1205,14 +1245,38 @@ class AddressLookupConnectorSpec extends SpecBase with WireMockServerHandler wit stubResponse(addressLookupUrl, OK, addressesJsonv2) val addressLookupResult = Vector( - AddressLookup(Some("Suite 1"), Some("11 Waterloo Street"), Some("Some District"), None, "Town", Some("County"), postcode), - AddressLookup(Some("Unit 1"), Some("11 Waterloo Street"), Some("Some District"), None, "Town", Some("County"), postcode), - AddressLookup(Some("Suite 2"), Some("11 Waterloo Street"), Some("Some District"), None, "Town", Some("County"), postcode), - AddressLookup(Some("Unit 2"), Some("11 Waterloo Street"), Some("Some District"), None, "Town", Some("County"), postcode), - AddressLookup(Some("Suite 3"), Some("11 Waterloo Street"), Some("Some District"), None, "Town", Some("County"), postcode), - AddressLookup(Some("Apartment 301"), Some("11 Waterloo Street"), Some("Some District"), None, "Town", Some("County"), postcode), - AddressLookup(Some("Apartment 302"), Some("11 Waterloo Street"), Some("Some District"), None, "Town", Some("County"), postcode), - AddressLookup(Some("Apartment 400"), Some("11 Waterloo Street"), Some("Some District"), None, "Town", Some("County"), postcode) + AddressLookup(Some("Suite 1"), Some("11 Waterloo Street"), Some("Some District"), None, "Town", Some("County"), postcode, Some("United Kingdom")), + AddressLookup(Some("Unit 1"), Some("11 Waterloo Street"), Some("Some District"), None, "Town", Some("County"), postcode, Some("United Kingdom")), + AddressLookup(Some("Suite 2"), Some("11 Waterloo Street"), Some("Some District"), None, "Town", Some("County"), postcode, Some("United Kingdom")), + AddressLookup(Some("Unit 2"), Some("11 Waterloo Street"), Some("Some District"), None, "Town", Some("County"), postcode, Some("United Kingdom")), + AddressLookup(Some("Suite 3"), Some("11 Waterloo Street"), Some("Some District"), None, "Town", Some("County"), postcode, Some("United Kingdom")), + AddressLookup(Some("Apartment 301"), + Some("11 Waterloo Street"), + Some("Some District"), + None, + "Town", + Some("County"), + postcode, + Some("United Kingdom") + ), + AddressLookup(Some("Apartment 302"), + Some("11 Waterloo Street"), + Some("Some District"), + None, + "Town", + Some("County"), + postcode, + Some("United Kingdom") + ), + AddressLookup(Some("Apartment 400"), + Some("11 Waterloo Street"), + Some("Some District"), + None, + "Town", + Some("County"), + postcode, + Some("United Kingdom") + ) ) val result = connector.addressLookupByPostcode(postcode) diff --git a/test/controllers/addFinancialInstitution/IsThisAddressControllerSpec.scala b/test/controllers/addFinancialInstitution/IsThisAddressControllerSpec.scala index 76bcfc3..b5832c7 100644 --- a/test/controllers/addFinancialInstitution/IsThisAddressControllerSpec.scala +++ b/test/controllers/addFinancialInstitution/IsThisAddressControllerSpec.scala @@ -45,18 +45,20 @@ class IsThisAddressControllerSpec extends SpecBase with MockitoSugar { "1 address street", addressLine2 = None, addressLine3 = "Address town", - addressLine4 = None, + addressLine4 = Some("Wessex"), postCode = Some("postcode"), country = Country("valid", "GB", "United Kingdom") ) - val addressLookup: AddressLookup = AddressLookup(Some("1 address street"), - addressLine2 = None, - addressLine3 = None, - addressLine4 = None, - town = "Address town", - county = Some("Wessex"), - postcode = "postcode" + val addressLookup: AddressLookup = AddressLookup( + Some("1 address street"), + addressLine2 = None, + addressLine3 = None, + addressLine4 = None, + town = "Address town", + county = Some("Wessex"), + postcode = "postcode", + country = Some("United Kingdom") ) val userAnswers: UserAnswers = emptyUserAnswers.set(AddressLookupPage, Seq(addressLookup)).success.value diff --git a/test/controllers/addFinancialInstitution/PostcodeControllerSpec.scala b/test/controllers/addFinancialInstitution/PostcodeControllerSpec.scala index 7eb4593..9ec4d70 100644 --- a/test/controllers/addFinancialInstitution/PostcodeControllerSpec.scala +++ b/test/controllers/addFinancialInstitution/PostcodeControllerSpec.scala @@ -87,8 +87,8 @@ class PostcodeControllerSpec extends SpecBase with MockitoSugar { val mockAddressLookupConnector = mock[AddressLookupConnector] val addresses: Seq[AddressLookup] = Seq( - AddressLookup(Some("1 Address line 1"), None, None, None, "Town", None, "ZZ1 1ZZ"), - AddressLookup(Some("2 Address line 1"), None, None, None, "Town", None, "ZZ1 1ZZ") + AddressLookup(Some("1 Address line 1"), None, None, None, "Town", None, "ZZ1 1ZZ", Some("Jersey")), + AddressLookup(Some("2 Address line 1"), None, None, None, "Town", None, "ZZ1 1ZZ", None) ) when(mockSessionRepository.set(any())) thenReturn Future.successful(true) diff --git a/test/controllers/addFinancialInstitution/SelectAddressControllerSpec.scala b/test/controllers/addFinancialInstitution/SelectAddressControllerSpec.scala index 6c890f3..37339d4 100644 --- a/test/controllers/addFinancialInstitution/SelectAddressControllerSpec.scala +++ b/test/controllers/addFinancialInstitution/SelectAddressControllerSpec.scala @@ -48,8 +48,8 @@ class SelectAddressControllerSpec extends SpecBase with MockitoSugar { private val ua = emptyUserAnswers.set(NameOfFinancialInstitutionPage, contactName).get val addresses: Seq[AddressLookup] = Seq( - AddressLookup(Some("1 Address line 1"), None, None, None, "Town", None, "ZZ1 1ZZ"), - AddressLookup(Some("2 Address line 1"), None, None, None, "Town", None, "ZZ1 1ZZ") + AddressLookup(Some("1 Address line 1"), None, None, None, "Town", None, "ZZ1 1ZZ", None), + AddressLookup(Some("2 Address line 1"), None, None, None, "Town", None, "ZZ1 1ZZ", None) ) val addressOptions: Seq[RadioItem] = Seq( diff --git a/test/services/FinancialInstitutionsServiceSpec.scala b/test/services/FinancialInstitutionsServiceSpec.scala index a1b6755..fa4f0a6 100644 --- a/test/services/FinancialInstitutionsServiceSpec.scala +++ b/test/services/FinancialInstitutionsServiceSpec.scala @@ -19,9 +19,8 @@ package services import base.SpecBase import connectors.FinancialInstitutionsConnector import generators.{ModelGenerators, UserAnswersGenerator} -import models.FinancialInstitutions.{CreateFIDetails, FIDetail} +import models.FinancialInstitutions.FIDetail import models.UserAnswers -import models.response.ErrorDetails import org.mockito.ArgumentMatchers.any import org.mockito.MockitoSugar.when import org.scalatestplus.mockito.MockitoSugar._ diff --git a/test/utils/AddressHelperSpec.scala b/test/utils/AddressHelperSpec.scala index b2e191e..ac92463 100644 --- a/test/utils/AddressHelperSpec.scala +++ b/test/utils/AddressHelperSpec.scala @@ -45,9 +45,9 @@ class AddressHelperSpec extends SpecBase { } "format the address from AddressLookup correctly" in { - val address = AddressLookup(Some("line1"), Some("line2"), Some("line3"), Some("line4"), "town", Some("county"), "postcode") + val address = AddressLookup(Some("line1"), Some("line2"), Some("line3"), Some("line4"), "town", Some("county"), "postcode", Some("country")) val result = sut.formatAddress(address) - result mustBe "line1, line2, line3, line4, town, postcode, county" + result mustBe "line1, line2, line3, line4, town, postcode, county, country" } "format the address from AddressResponse correctly as html" in { @@ -66,22 +66,48 @@ class AddressHelperSpec extends SpecBase { } "must format AddressLookupBlock as html" in { - val addressLookup = AddressLookup(Some("line1"), Some("line2"), Some("line3"), Some("line4"), "town", Some("county"), "postcode") + val addressLookup = AddressLookup(Some("line1"), Some("line2"), Some("line3"), Some("line4"), "town", Some("county"), "postcode", Some("country")) val result = sut.formatAddressLookupBlock(addressLookup) val formattedAddress = HtmlContent( s"""|

${addressLookup.addressLine1.value}

- |

${addressLookup.addressLine2.value}

- |

${addressLookup.addressLine3.value}

- |

${addressLookup.addressLine4.value}

- |

${addressLookup.town}

- |

${addressLookup.postcode}

- |

${addressLookup.county.value}

- |""".stripMargin.replaceAll("\\n", "") + |

${addressLookup.addressLine2.value}

+ |

${addressLookup.addressLine3.value}

+ |

${addressLookup.addressLine4.value}

+ |

${addressLookup.town}

+ |

${addressLookup.postcode}

+ |

${addressLookup.county.value}

+ |

${addressLookup.country.value}

+ |""".stripMargin.replaceAll("\\n", "") ) result mustBe formattedAddress } + } + + "AddressLookup" - { + "toAddress must convert to Address class" in { + val addressLookup = AddressLookup(Some("line1"), Some("line2"), Some("line3"), Some("line4"), "town", Some("county"), "postcode", Some("country")) + val expectedAddress = Address("line1", Some("line2"), "line3", Some("line4"), Some("postcode"), Country("", "", "country")) + addressLookup.toAddress mustBe expectedAddress + } + "toAddress must populate from the town field correctly without line3" in { + val addressLookup = AddressLookup(Some("line1"), Some("line2"), None, Some("line4"), "town", Some("county"), "postcode", Some("country")) + val expectedAddress = Address("line1", Some("line2"), "town", Some("line4"), Some("postcode"), Country("", "", "country")) + addressLookup.toAddress mustBe expectedAddress + } + "toAddress must populate from the town field correctly without line4" in { + val addressLookup = AddressLookup(Some("line1"), Some("line2"), Some("line3"), None, "town", Some("county"), "postcode", Some("country")) + val expectedAddress = Address("line1", Some("line2"), "line3", Some("town"), Some("postcode"), Country("", "", "country")) + addressLookup.toAddress mustBe expectedAddress + + } + "toAddress must populate county field if there is space" in { + val addressLookup = AddressLookup(Some("line1"), Some("line2"), None, None, "town", Some("county"), "postcode", Some("country")) + val expectedAddress = Address("line1", Some("line2"), "town", Some("county"), Some("postcode"), Country("", "", "country")) + addressLookup.toAddress mustBe expectedAddress + + } }