From a63c80dd247a8fbb9e4481917ccf506d3bd8e1a1 Mon Sep 17 00:00:00 2001 From: Tom Dudley Date: Mon, 23 Dec 2019 11:07:09 +0000 Subject: [PATCH] refactored BirthDateVerification to not throw exception whebn invalid value is present --- .../request/BirthDateVerification.scala | 29 +++++++---- .../request/BirthDateVerificationSpec.scala | 51 +++++++++++++++++-- 2 files changed, 65 insertions(+), 15 deletions(-) diff --git a/app/v1/models/request/BirthDateVerification.scala b/app/v1/models/request/BirthDateVerification.scala index 41c4b2d..931530a 100644 --- a/app/v1/models/request/BirthDateVerification.scala +++ b/app/v1/models/request/BirthDateVerification.scala @@ -17,29 +17,36 @@ package v1.models.request import play.api.Logger -import play.api.libs.json.{JsString, Reads, Writes, __} +import play.api.libs.json._ -sealed trait BirthDateVerification{ +sealed trait BirthDateVerification { val value: String } object BirthDateVerification { - private def valueCheck(input: String): BirthDateVerification = { - input match { + + private[models] def birthDateValidation: String => Boolean = { + case Unverified.value => true + case Verified.value => true + case VerificationNotKnown.value => true + case CoegConfirmed.value => true + case _ => + Logger.warn("[BirthDateVerification][valueCheck] birthDateVerification field is invalid") + false + } + + implicit val reads: Reads[BirthDateVerification] = for { + birthDateValue <- __.read[String].filter(JsonValidationError("Invalid Birth Date verification"))(birthDateValidation) + } yield { + birthDateValue match { case Unverified.value => Unverified case Verified.value => Verified case VerificationNotKnown.value => VerificationNotKnown case CoegConfirmed.value => CoegConfirmed - case _ => - Logger.debug(s"[BirthDateVerification][valueCheck] birthDateVerification field is invalid: $input") - Logger.warn("[BirthDateVerification][valueCheck] birthDateVerification field is invalid") - throw new IllegalArgumentException(s"birthDateVerification field is invalid") } } - implicit val reads: Reads[BirthDateVerification] = __.read[String] map valueCheck - - implicit val writes: Writes[BirthDateVerification] = Writes[BirthDateVerification] ( verificationValue => JsString(verificationValue.value) ) + implicit val writes: Writes[BirthDateVerification] = Writes[BirthDateVerification](verificationValue => JsString(verificationValue.value)) } case object Unverified extends BirthDateVerification { diff --git a/test/v1/models/request/BirthDateVerificationSpec.scala b/test/v1/models/request/BirthDateVerificationSpec.scala index f71f81e..12a7b8c 100644 --- a/test/v1/models/request/BirthDateVerificationSpec.scala +++ b/test/v1/models/request/BirthDateVerificationSpec.scala @@ -26,30 +26,39 @@ class BirthDateVerificationSpec extends UnitSpec { val coegConfirmedString = JsString("COEG CONFIRMED") "BirthDateVerification" should { + "correctly parse from Json" when { + "value provided is VERIFIED" in { verifiedString.as[BirthDateVerification] shouldBe Verified } + "value provided is UNVERIFIED" in { unverifiedString.as[BirthDateVerification] shouldBe Unverified } + "value provided is NOT KNOWN" in { notKnownString.as[BirthDateVerification] shouldBe VerificationNotKnown } + "value provided is COEG CONFIRMED" in { coegConfirmedString.as[BirthDateVerification] shouldBe CoegConfirmed } } + "correctly parse to Json" when { "value provided is VERIFIED" in { Json.toJson(Verified) shouldBe verifiedString } + "value provided is UNVERIFIED" in { Json.toJson(Unverified) shouldBe unverifiedString } + "value provided is NOT KNOWN" in { Json.toJson(VerificationNotKnown) shouldBe notKnownString } + "value provided is COEG CONFIRMED" in { Json.toJson(CoegConfirmed) shouldBe coegConfirmedString } @@ -57,11 +66,45 @@ class BirthDateVerificationSpec extends UnitSpec { "fail to parse from json" when { "the value provided is not one of the valid values" in { - val expectedException = intercept[IllegalArgumentException] { - JsString("I SAID SO").as[BirthDateVerification] - } + JsString("Incorrect value").validate[BirthDateVerification].isError shouldBe true + } + } + } + + "BirthDateVerification .birthDateValidation" when { + + "provided with VERIFIED" should { + + "return true" in { + BirthDateVerification.birthDateValidation(Verified.value) shouldBe true + } + } + + "provided with UNVERIFIED" should { + + "return true" in { + BirthDateVerification.birthDateValidation(Unverified.value) shouldBe true + } + } + + "provided with NOT KNOWN" should { + + "return true" in { + BirthDateVerification.birthDateValidation(VerificationNotKnown.value) shouldBe true + } + } + + "provided with COEG CONFIRMED" should { + + "return true" in { + BirthDateVerification.birthDateValidation(CoegConfirmed.value) shouldBe true + } + } + + "provided with an invalid value" should { - expectedException.getMessage shouldBe "birthDateVerification field is invalid" + "return false" in { + BirthDateVerification.birthDateValidation("Invalid value") shouldBe false } } }