From 714ea6a3cac86b311da94f6dbac9ef11a4b06aee Mon Sep 17 00:00:00 2001 From: Gaurav <41486966+GauravJai@users.noreply.github.com> Date: Tue, 12 Sep 2023 08:06:00 +0100 Subject: [PATCH] MTDSA-19002: CreateMarrigeAllowance: implemented date range validation --- .../CreateMarriageAllowanceValidator.scala | 14 +++++++++++--- ...teMarriageAllowanceValidatorFactorySpec.scala | 16 ++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/app/v1/controllers/validators/CreateMarriageAllowanceValidator.scala b/app/v1/controllers/validators/CreateMarriageAllowanceValidator.scala index 5f86ccd..6b0365d 100644 --- a/app/v1/controllers/validators/CreateMarriageAllowanceValidator.scala +++ b/app/v1/controllers/validators/CreateMarriageAllowanceValidator.scala @@ -20,12 +20,16 @@ import api.controllers.validators.RulesValidator import api.controllers.validators.resolvers.{ResolveIsoDate, ResolveNino} import api.models.errors.{MtdError, PartnerDoBFormatError, PartnerFirstNameFormatError, PartnerNinoFormatError, PartnerSurnameFormatError} import cats.data.Validated -import cats.data.Validated.Invalid +import cats.data.Validated.{Invalid, Valid} import v1.models.request.create.CreateMarriageAllowanceRequestData +import java.time.LocalDate + object CreateMarriageAllowanceValidator extends RulesValidator[CreateMarriageAllowanceRequestData] { private val nameRegex = "^[A-Za-z0-9 ,.()/&'-]{1,35}$" + private val minYear = 1900 + private val maxYear = 2100 override def validateBusinessRules(parsed: CreateMarriageAllowanceRequestData): Validated[Seq[MtdError], CreateMarriageAllowanceRequestData] = { import parsed.body._ @@ -36,8 +40,9 @@ object CreateMarriageAllowanceValidator extends RulesValidator[CreateMarriageAll val validatedPartnerFirstName = spouseOrCivilPartnerFirstName.map(validateName(PartnerFirstNameFormatError)).getOrElse(valid) - val validatedPartnerDateOfBirth = - spouseOrCivilPartnerDateOfBirth.map(dob => ResolveIsoDate(dob, Some(PartnerDoBFormatError), path = None)).getOrElse(valid) + val validatedPartnerDateOfBirth = spouseOrCivilPartnerDateOfBirth + .map(dob => ResolveIsoDate(dob, Some(PartnerDoBFormatError), path = None) andThen validatePartnerDoB) + .getOrElse(valid) combine( validatedPartnerNino, @@ -50,4 +55,7 @@ object CreateMarriageAllowanceValidator extends RulesValidator[CreateMarriageAll private def validateName(error: MtdError)(surname: String): Validated[Seq[MtdError], Unit] = if (surname.matches(nameRegex)) valid else Invalid(List(error)) + private def validatePartnerDoB(partnerDoB: LocalDate): Validated[Seq[MtdError], LocalDate] = + if (partnerDoB.getYear <= maxYear && partnerDoB.getYear >= minYear) Valid(partnerDoB) else Invalid(Seq(PartnerDoBFormatError)) + } diff --git a/test/v1/controllers/validators/CreateMarriageAllowanceValidatorFactorySpec.scala b/test/v1/controllers/validators/CreateMarriageAllowanceValidatorFactorySpec.scala index 3a0a7a9..2f1a88d 100644 --- a/test/v1/controllers/validators/CreateMarriageAllowanceValidatorFactorySpec.scala +++ b/test/v1/controllers/validators/CreateMarriageAllowanceValidatorFactorySpec.scala @@ -84,6 +84,15 @@ class CreateMarriageAllowanceValidatorFactorySpec extends UnitSpec { |} |""".stripMargin) + private val invalidDobRangeInBody = Json.parse( + """{ + | "spouseOrCivilPartnerNino": "AA123456B", + | "spouseOrCivilPartnerFirstName": "Marge", + | "spouseOrCivilPartnerSurname": "Simpson", + | "spouseOrCivilPartnerDateOfBirth": "0010-01-01" + |} + |""".stripMargin) + private val parsedNino = Nino(validNino) private val parsedBody = CreateMarriageAllowanceRequestBody("AA123456B", Some("Marge"), "Simpson", Some("1970-01-01")) @@ -148,6 +157,13 @@ class CreateMarriageAllowanceValidatorFactorySpec extends UnitSpec { result shouldBe Left(ErrorWrapper(correlationId, PartnerDoBFormatError)) } + + "passed a request body with an invalid range of Spouse or Civil Partner dob" in { + val result: Either[ErrorWrapper, CreateMarriageAllowanceRequestData] = + validator(validNino, invalidDobRangeInBody).validateAndWrapResult() + + result shouldBe Left(ErrorWrapper(correlationId, PartnerDoBFormatError)) + } } "return multiple errors" when {