Skip to content

Commit

Permalink
MTDSA-19002: CreateMarrigeAllowance: implemented date range validation
Browse files Browse the repository at this point in the history
  • Loading branch information
GauravJai committed Sep 12, 2023
1 parent 6ac9616 commit 714ea6a
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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._
Expand All @@ -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,
Expand All @@ -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))

}
Original file line number Diff line number Diff line change
Expand Up @@ -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"))
Expand Down Expand Up @@ -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 {
Expand Down

0 comments on commit 714ea6a

Please sign in to comment.