From 55dfee4187431bb5acb0b898ffb60111a47d9705 Mon Sep 17 00:00:00 2001 From: Kseniya Tomskikh Date: Tue, 6 Mar 2018 14:28:54 +0700 Subject: Created directive for optional pagination --- src/main/scala/xyz/driver/core/rest/package.scala | 10 ++++++++++ src/test/scala/xyz/driver/core/rest/RestTest.scala | 23 ++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/main/scala/xyz/driver/core/rest/package.scala b/src/main/scala/xyz/driver/core/rest/package.scala index 19752a1..fb5f4ec 100644 --- a/src/main/scala/xyz/driver/core/rest/package.scala +++ b/src/main/scala/xyz/driver/core/rest/package.scala @@ -219,6 +219,16 @@ object `package` { val paginated: Directive1[Pagination] = parameters(("pageSize".as[Int] ? 100, "pageNumber".as[Int] ? 1)).as(Pagination) + private def extractPagination(pageSizeOpt: Option[Int], pageNumberOpt: Option[Int]): Option[Pagination] = + (pageSizeOpt, pageNumberOpt) match { + case (Some(size), Some(number)) => Option(Pagination(size, number)) + case (None, None) => Option.empty[Pagination] + case (_, _) => throw new IllegalArgumentException("Pagination's parameters are incorrect") + } + + val optionalPaginated: Directive1[Option[Pagination]] = + parameters(("pageSize".as[Int].?, "pageNumber".as[Int].?)).as(extractPagination) + def paginationQuery(pagination: Pagination) = Seq("pageNumber" -> pagination.pageNumber.toString, "pageSize" -> pagination.pageSize.toString) } diff --git a/src/test/scala/xyz/driver/core/rest/RestTest.scala b/src/test/scala/xyz/driver/core/rest/RestTest.scala index d36e04d..80e4fd5 100644 --- a/src/test/scala/xyz/driver/core/rest/RestTest.scala +++ b/src/test/scala/xyz/driver/core/rest/RestTest.scala @@ -47,4 +47,27 @@ class RestTest extends WordSpec with Matchers with ScalatestRouteTest with Direc } } } + + "optional paginated directive" should { + val route: Route = rest.optionalPaginated { paginated => + complete(StatusCodes.OK -> paginated.map(p => s"${p.pageNumber},${p.pageSize}").getOrElse("no pagination")) + } + "accept a pagination" in { + Get("/?pageNumber=2&pageSize=42") ~> route ~> check { + assert(status == StatusCodes.OK) + assert(entityAs[String] == "2,42") + } + } + "without pagination" in { + Get("/") ~> route ~> check { + assert(status == StatusCodes.OK) + assert(entityAs[String] == "no pagination") + } + } + "reject an invalid pagination" in { + Get("/?pageNumber=1") ~> route ~> check { + assert(rejection.isInstanceOf[ValidationRejection]) + } + } + } } -- cgit v1.2.3 From cfea2749380d367f4a525c90792b66241df42273 Mon Sep 17 00:00:00 2001 From: Kseniya Tomskikh Date: Wed, 7 Mar 2018 11:28:08 +0700 Subject: Review fix --- src/main/scala/xyz/driver/core/rest/package.scala | 2 +- src/test/scala/xyz/driver/core/rest/RestTest.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/scala/xyz/driver/core/rest/package.scala b/src/main/scala/xyz/driver/core/rest/package.scala index fb5f4ec..e3c0c40 100644 --- a/src/main/scala/xyz/driver/core/rest/package.scala +++ b/src/main/scala/xyz/driver/core/rest/package.scala @@ -226,7 +226,7 @@ object `package` { case (_, _) => throw new IllegalArgumentException("Pagination's parameters are incorrect") } - val optionalPaginated: Directive1[Option[Pagination]] = + val optionalPagination: Directive1[Option[Pagination]] = parameters(("pageSize".as[Int].?, "pageNumber".as[Int].?)).as(extractPagination) def paginationQuery(pagination: Pagination) = diff --git a/src/test/scala/xyz/driver/core/rest/RestTest.scala b/src/test/scala/xyz/driver/core/rest/RestTest.scala index 80e4fd5..68fe419 100644 --- a/src/test/scala/xyz/driver/core/rest/RestTest.scala +++ b/src/test/scala/xyz/driver/core/rest/RestTest.scala @@ -49,7 +49,7 @@ class RestTest extends WordSpec with Matchers with ScalatestRouteTest with Direc } "optional paginated directive" should { - val route: Route = rest.optionalPaginated { paginated => + val route: Route = rest.optionalPagination { paginated => complete(StatusCodes.OK -> paginated.map(p => s"${p.pageNumber},${p.pageSize}").getOrElse("no pagination")) } "accept a pagination" in { -- cgit v1.2.3