From 574fbd72cea70a289c9c692edfa60511c243b9f4 Mon Sep 17 00:00:00 2001 From: ArtRand Date: Fri, 9 Feb 2018 10:05:38 -0800 Subject: add expectExistsAndValid --- src/main/scala/xyz/driver/core/database/Converters.scala | 5 +++++ src/test/scala/xyz/driver/core/database/DatabaseTest.scala | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/main/scala/xyz/driver/core/database/Converters.scala b/src/main/scala/xyz/driver/core/database/Converters.scala index f98d6b4..6faf627 100644 --- a/src/main/scala/xyz/driver/core/database/Converters.scala +++ b/src/main/scala/xyz/driver/core/database/Converters.scala @@ -10,4 +10,9 @@ trait Converters { def expectValid[ADT](mapper: String => Option[ADT], query: String)(implicit ct: ClassTag[ADT]): ADT = fromStringOrThrow[ADT](query, mapper, ct.toString()) + + def expectExistsAndValid[ADT](mapper: String => Option[ADT], query: Option[String], contextMsg: String = "")( + implicit ct: ClassTag[ADT]): ADT = { + expectValid[ADT](mapper, query.getOrElse(throw DatabaseException(contextMsg))) + } } diff --git a/src/test/scala/xyz/driver/core/database/DatabaseTest.scala b/src/test/scala/xyz/driver/core/database/DatabaseTest.scala index a5c65ea..bd72b68 100644 --- a/src/test/scala/xyz/driver/core/database/DatabaseTest.scala +++ b/src/test/scala/xyz/driver/core/database/DatabaseTest.scala @@ -17,12 +17,17 @@ class DatabaseTest extends FlatSpec with Matchers with Checkers { val validLength = nextInt(10) val valid = nextToken(validLength) + val validOp = Some(valid) val invalid = nextToken(validLength + nextInt(10, 1)) + val invalidOp = Some(invalid) def mapper(s: String): Option[String] = if (s.length == validLength) Some(s) else None TestConverter.fromStringOrThrow(valid, mapper, valid) should be(valid) TestConverter.expectValid(mapper, valid) should be(valid) + TestConverter.expectExistsAndValid(mapper, validOp) should be(valid) + an[DatabaseException] should be thrownBy TestConverter.fromStringOrThrow(invalid, mapper, invalid) + an[DatabaseException] should be thrownBy TestConverter.expectExistsAndValid(mapper, invalidOp) } } -- cgit v1.2.3 From a496d2b074ef4c4d9f9936d59c54a54f2571a35b Mon Sep 17 00:00:00 2001 From: ArtRand Date: Fri, 9 Feb 2018 14:36:08 -0800 Subject: added valid or empty semantics --- src/main/scala/xyz/driver/core/database/Converters.scala | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/scala/xyz/driver/core/database/Converters.scala b/src/main/scala/xyz/driver/core/database/Converters.scala index 6faf627..1a40c45 100644 --- a/src/main/scala/xyz/driver/core/database/Converters.scala +++ b/src/main/scala/xyz/driver/core/database/Converters.scala @@ -4,6 +4,9 @@ import xyz.driver.core.rest.errors.DatabaseException import scala.reflect.ClassTag +/** + * Helper methods for converting between table rows and Scala objects + */ trait Converters { def fromStringOrThrow[ADT](entityStr: String, mapper: (String => Option[ADT]), entityName: String): ADT = mapper(entityStr).getOrElse(throw DatabaseException(s"Invalid $entityName in database: $entityStr")) @@ -11,8 +14,13 @@ trait Converters { def expectValid[ADT](mapper: String => Option[ADT], query: String)(implicit ct: ClassTag[ADT]): ADT = fromStringOrThrow[ADT](query, mapper, ct.toString()) - def expectExistsAndValid[ADT](mapper: String => Option[ADT], query: Option[String], contextMsg: String = "")( - implicit ct: ClassTag[ADT]): ADT = { + def expectExistsAndValid[ADT](mapper: String => Option[ADT], query: Option[String], contextMsg: String = "") + (implicit ct: ClassTag[ADT]): ADT = { expectValid[ADT](mapper, query.getOrElse(throw DatabaseException(contextMsg))) } + + def expectValidOrEmpty[ADT](mapper: String => Option[ADT], query: Option[String], contextMsg: String = "") + (implicit ct: ClassTag[ADT]): Option[ADT] = { + if (query.isDefined) Some(expectValid[ADT](mapper, query.get)) else None + } } -- cgit v1.2.3 From 24ea431512ee17c8d3b96a488aaba9c2752db21c Mon Sep 17 00:00:00 2001 From: ArtRand Date: Fri, 9 Feb 2018 14:48:08 -0800 Subject: scalfmt, add a test --- src/main/scala/xyz/driver/core/database/Converters.scala | 8 ++++---- src/test/scala/xyz/driver/core/database/DatabaseTest.scala | 10 ++++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/scala/xyz/driver/core/database/Converters.scala b/src/main/scala/xyz/driver/core/database/Converters.scala index 1a40c45..f2f8c69 100644 --- a/src/main/scala/xyz/driver/core/database/Converters.scala +++ b/src/main/scala/xyz/driver/core/database/Converters.scala @@ -14,13 +14,13 @@ trait Converters { def expectValid[ADT](mapper: String => Option[ADT], query: String)(implicit ct: ClassTag[ADT]): ADT = fromStringOrThrow[ADT](query, mapper, ct.toString()) - def expectExistsAndValid[ADT](mapper: String => Option[ADT], query: Option[String], contextMsg: String = "") - (implicit ct: ClassTag[ADT]): ADT = { + def expectExistsAndValid[ADT](mapper: String => Option[ADT], query: Option[String], contextMsg: String = "")( + implicit ct: ClassTag[ADT]): ADT = { expectValid[ADT](mapper, query.getOrElse(throw DatabaseException(contextMsg))) } - def expectValidOrEmpty[ADT](mapper: String => Option[ADT], query: Option[String], contextMsg: String = "") - (implicit ct: ClassTag[ADT]): Option[ADT] = { + def expectValidOrEmpty[ADT](mapper: String => Option[ADT], query: Option[String], contextMsg: String = "")( + implicit ct: ClassTag[ADT]): Option[ADT] = { if (query.isDefined) Some(expectValid[ADT](mapper, query.get)) else None } } diff --git a/src/test/scala/xyz/driver/core/database/DatabaseTest.scala b/src/test/scala/xyz/driver/core/database/DatabaseTest.scala index bd72b68..f85dcad 100644 --- a/src/test/scala/xyz/driver/core/database/DatabaseTest.scala +++ b/src/test/scala/xyz/driver/core/database/DatabaseTest.scala @@ -23,11 +23,21 @@ class DatabaseTest extends FlatSpec with Matchers with Checkers { def mapper(s: String): Option[String] = if (s.length == validLength) Some(s) else None TestConverter.fromStringOrThrow(valid, mapper, valid) should be(valid) + TestConverter.expectValid(mapper, valid) should be(valid) + TestConverter.expectExistsAndValid(mapper, validOp) should be(valid) + TestConverter.expectValidOrEmpty(mapper, validOp) should be(Some(valid)) + TestConverter.expectValidOrEmpty(mapper, None) should be(None) + an[DatabaseException] should be thrownBy TestConverter.fromStringOrThrow(invalid, mapper, invalid) + + an[DatabaseException] should be thrownBy TestConverter.expectValid(mapper, invalid) + an[DatabaseException] should be thrownBy TestConverter.expectExistsAndValid(mapper, invalidOp) + + an[DatabaseException] should be thrownBy TestConverter.expectValidOrEmpty(mapper, invalidOp) } } -- cgit v1.2.3 From ec1d7f92fe23a5d928b4d579f3a49817a939f3c2 Mon Sep 17 00:00:00 2001 From: ArtRand Date: Fri, 9 Feb 2018 14:52:10 -0800 Subject: address comments --- src/main/scala/xyz/driver/core/database/Converters.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/xyz/driver/core/database/Converters.scala b/src/main/scala/xyz/driver/core/database/Converters.scala index f2f8c69..ad79abf 100644 --- a/src/main/scala/xyz/driver/core/database/Converters.scala +++ b/src/main/scala/xyz/driver/core/database/Converters.scala @@ -21,6 +21,6 @@ trait Converters { def expectValidOrEmpty[ADT](mapper: String => Option[ADT], query: Option[String], contextMsg: String = "")( implicit ct: ClassTag[ADT]): Option[ADT] = { - if (query.isDefined) Some(expectValid[ADT](mapper, query.get)) else None + query.map(expectValid[ADT](mapper, _)) } } -- cgit v1.2.3