aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZach Smith <zach@driver.xyz>2017-11-01 09:24:16 -0700
committerZach Smith <zach@driver.xyz>2017-11-01 09:24:16 -0700
commit595d199f5e41c8e48131cec98b23452bc7ed6ef1 (patch)
treea444fbafefccf232e68e72b3f592cd3e0bca3396
parent2c80cea86c0c322aad86303e5da5e2c382b20871 (diff)
downloaddriver-core-595d199f5e41c8e48131cec98b23452bc7ed6ef1.tar.gz
driver-core-595d199f5e41c8e48131cec98b23452bc7ed6ef1.tar.bz2
driver-core-595d199f5e41c8e48131cec98b23452bc7ed6ef1.zip
Add DriverRouteTest
-rw-r--r--src/main/scala/xyz/driver/core/rest/DriverRoute.scala3
-rw-r--r--src/main/scala/xyz/driver/core/rest/errors/serviceException.scala4
-rw-r--r--src/test/scala/xyz/driver/core/rest/DriverRouteTest.scala89
-rw-r--r--src/test/scala/xyz/driver/core/rest/RestTest.scala (renamed from src/test/scala/xyz/driver/core/RestTest.scala)3
4 files changed, 95 insertions, 4 deletions
diff --git a/src/main/scala/xyz/driver/core/rest/DriverRoute.scala b/src/main/scala/xyz/driver/core/rest/DriverRoute.scala
index 9af6657..eb9a31a 100644
--- a/src/main/scala/xyz/driver/core/rest/DriverRoute.scala
+++ b/src/main/scala/xyz/driver/core/rest/DriverRoute.scala
@@ -82,6 +82,9 @@ trait DriverRoute {
case e: ResourceNotFoundException =>
log.info("Resource not found error", e)
StatusCodes.NotFound
+ case e: ExternalServiceException =>
+ log.error("Error while calling another service", e)
+ StatusCodes.InternalServerError
case e: ExternalServiceTimeoutException =>
log.error("Service timeout error", e)
StatusCodes.GatewayTimeout
diff --git a/src/main/scala/xyz/driver/core/rest/errors/serviceException.scala b/src/main/scala/xyz/driver/core/rest/errors/serviceException.scala
index ca1f759..e91a3c2 100644
--- a/src/main/scala/xyz/driver/core/rest/errors/serviceException.scala
+++ b/src/main/scala/xyz/driver/core/rest/errors/serviceException.scala
@@ -1,6 +1,6 @@
package xyz.driver.core.rest.errors
-abstract class ServiceException extends Exception {
+sealed abstract class ServiceException extends Exception {
def message: String
}
@@ -13,7 +13,7 @@ final case class ResourceNotFoundException(override val message: String = "Resou
extends ServiceException
final case class ExternalServiceException(serviceName: String, serviceMessage: String) extends ServiceException {
- override def message = s"Error while calling another service: $serviceMessage"
+ override def message = s"Error while calling '$serviceName': $serviceMessage"
}
final case class ExternalServiceTimeoutException(serviceName: String) extends ServiceException {
diff --git a/src/test/scala/xyz/driver/core/rest/DriverRouteTest.scala b/src/test/scala/xyz/driver/core/rest/DriverRouteTest.scala
new file mode 100644
index 0000000..c239fb6
--- /dev/null
+++ b/src/test/scala/xyz/driver/core/rest/DriverRouteTest.scala
@@ -0,0 +1,89 @@
+package xyz.driver.core.rest
+
+import akka.http.scaladsl.model.StatusCodes
+import akka.http.scaladsl.server.Directives.{complete => akkaComplete}
+import akka.http.scaladsl.server.Route
+import akka.http.scaladsl.testkit.ScalatestRouteTest
+import com.typesafe.scalalogging.Logger
+import org.scalatest.{AsyncFlatSpec, Matchers}
+import xyz.driver.core.logging.NoLogger
+import xyz.driver.core.rest.errors._
+
+import scala.concurrent.Future
+
+class DriverRouteTest extends AsyncFlatSpec with ScalatestRouteTest with Matchers {
+ class TestRoute(override val route: Route) extends DriverRoute {
+ override def log: Logger = NoLogger
+ }
+
+ "DriverRoute" should "respond with 200 OK for a basic route" in {
+ val route = new TestRoute(akkaComplete(StatusCodes.OK))
+
+ Get("/api/v1/foo/bar") ~> route.routeWithDefaults ~> check {
+ handled shouldBe true
+ status shouldBe StatusCodes.OK
+ }
+ }
+
+ it should "respond with a 400 for an InvalidInputException" in {
+ val route = new TestRoute(akkaComplete(Future.failed[String](InvalidInputException())))
+
+ Post("/api/v1/foo/bar") ~> route.routeWithDefaults ~> check {
+ handled shouldBe true
+ status shouldBe StatusCodes.BadRequest
+ responseAs[String] shouldBe "Invalid input"
+ }
+ }
+
+ it should "respond with a 400 for InvalidActionException" in {
+ val route = new TestRoute(akkaComplete(Future.failed[String](InvalidActionException())))
+
+ Post("/api/v1/foo/bar") ~> route.routeWithDefaults ~> check {
+ handled shouldBe true
+ status shouldBe StatusCodes.Forbidden
+ responseAs[String] shouldBe "This action is not allowed"
+ }
+ }
+
+ it should "respond with a 404 for ResourceNotFoundException" in {
+ val route = new TestRoute(akkaComplete(Future.failed[String](ResourceNotFoundException())))
+
+ Post("/api/v1/foo/bar") ~> route.routeWithDefaults ~> check {
+ handled shouldBe true
+ status shouldBe StatusCodes.NotFound
+ responseAs[String] shouldBe "Resource not found"
+ }
+ }
+
+ it should "respond with a 500 for ExternalServiceException" in {
+ val error = ExternalServiceException("GET /api/v1/users/", "Permission denied")
+ val route = new TestRoute(akkaComplete(Future.failed[String](error)))
+
+ Post("/api/v1/foo/bar") ~> route.routeWithDefaults ~> check {
+ handled shouldBe true
+ status shouldBe StatusCodes.InternalServerError
+ responseAs[String] shouldBe "Error while calling 'GET /api/v1/users/': Permission denied"
+ }
+ }
+
+ it should "respond with a 503 for ExternalServiceTimeoutException" in {
+ val error = ExternalServiceTimeoutException("GET /api/v1/users/")
+ val route = new TestRoute(akkaComplete(Future.failed[String](error)))
+
+ Post("/api/v1/foo/bar") ~> route.routeWithDefaults ~> check {
+ handled shouldBe true
+ status shouldBe StatusCodes.GatewayTimeout
+ responseAs[String] shouldBe "GET /api/v1/users/ took too long to respond"
+ }
+ }
+
+ it should "respond with a 500 for DatabaseException" in {
+ val route = new TestRoute(akkaComplete(Future.failed[String](DatabaseException())))
+
+ Post("/api/v1/foo/bar") ~> route.routeWithDefaults ~> check {
+ handled shouldBe true
+ status shouldBe StatusCodes.InternalServerError
+ responseAs[String] shouldBe "Database access error"
+ }
+ }
+}
diff --git a/src/test/scala/xyz/driver/core/RestTest.scala b/src/test/scala/xyz/driver/core/rest/RestTest.scala
index efb9d07..2c3fb7f 100644
--- a/src/test/scala/xyz/driver/core/RestTest.scala
+++ b/src/test/scala/xyz/driver/core/rest/RestTest.scala
@@ -1,8 +1,7 @@
package xyz.driver.core.rest
-import org.scalatest.{FlatSpec, Matchers}
-
import akka.util.ByteString
+import org.scalatest.{FlatSpec, Matchers}
class RestTest extends FlatSpec with Matchers {
"`escapeScriptTags` function" should "escap script tags properly" in {