|
Play Framework/Scala example source code file (FiltersSpec.scala)
The FiltersSpec.scala Play Framework example source code
/*
* Copyright (C) 2009-2013 Typesafe Inc. <http://www.typesafe.com>
*/
package play.it.mvc
import org.specs2.mutable.Specification
import play.api.mvc._
import play.api.test._
import scala.concurrent.duration.Duration
import scala.concurrent._
import play.api.libs.concurrent.Execution.{defaultContext => ec}
object FiltersSpec extends Specification with WsTestClient {
"filters" should {
"handle errors" in {
object ErrorHandlingFilter extends Filter {
def apply(next: RequestHeader => Future[Result])(request: RequestHeader): Future[Result] = {
try {
next(request).recover { case t: Throwable =>
Results.InternalServerError(t.getMessage)
}(play.api.libs.concurrent.Execution.Implicits.defaultContext)
} catch {
case t: Throwable => Future.successful(Results.InternalServerError(t.getMessage))
}
}
}
object SkipNextFilter extends Filter {
val expectedText = "This filter does not call next"
def apply(next: RequestHeader => Future[Result])(request: RequestHeader): Future[Result] = {
Future.successful(Results.Ok(expectedText))
}
}
object SkipNextWithErrorFilter extends Filter {
val expectedText = "This filter does not call next and throws an exception"
def apply(next: RequestHeader => Future[Result])(request: RequestHeader): Future[Result] = {
Future.failed(new RuntimeException(expectedText))
}
}
object ThrowExceptionFilter extends Filter {
val expectedText = "This filter calls next and throws an exception afterwords"
override def apply(next: (RequestHeader) => Future[Result])(rh: RequestHeader): Future[Result] = {
next(rh).map { _ =>
throw new RuntimeException(expectedText)
}(ec)
}
}
object ErrorHandlingGlobal extends WithFilters(ErrorHandlingFilter)
object SkipNextGlobal extends WithFilters(ErrorHandlingFilter, SkipNextFilter)
object SkipNextWithErrorGlobal extends WithFilters(ErrorHandlingFilter, SkipNextWithErrorFilter)
object GlobalWithThrowExceptionFilter extends WithFilters(ErrorHandlingFilter, ThrowExceptionFilter)
val expectedOkText = "Hello World"
val expectedErrorText = "Error"
val routerForTest: PartialFunction[(String, String), Handler] = {
case ("GET", "/ok") => Action { request => Results.Ok(expectedOkText) }
case ("POST", "/ok") => Action { request => Results.Ok(request.body.asText.getOrElse("")) }
case ("GET", "/error") => Action { request => throw new RuntimeException(expectedErrorText) }
case ("POST", "/error") => Action { request => throw new RuntimeException(request.body.asText.getOrElse("")) }
case ("GET", "/error-async") => Action.async { request => Future { throw new RuntimeException(expectedErrorText) }(ec) }
case ("POST", "/error-async") => Action.async { request => Future { throw new RuntimeException(request.body.asText.getOrElse("")) }(ec) }
}
"ErrorHandlingFilter has no effect on a GET that returns a 200 OK" in new WithServer(FakeApplication(withGlobal = Some(ErrorHandlingGlobal), withRoutes = routerForTest)) {
val response = Await.result(wsUrl("/ok").get(), Duration.Inf)
response.status must_== 200
response.body must_== expectedOkText
}
"ErrorHandlingFilter has no effect on a POST that returns a 200 OK" in new WithServer(FakeApplication(withGlobal = Some(ErrorHandlingGlobal), withRoutes = routerForTest)) {
val response = Await.result(wsUrl("/ok").post(expectedOkText), Duration.Inf)
response.status must_== 200
response.body must_== expectedOkText
}
"ErrorHandlingFilter recovers from a GET that throws a synchronous exception" in new WithServer(FakeApplication(withGlobal = Some(ErrorHandlingGlobal), withRoutes = routerForTest)) {
val response = Await.result(wsUrl("/error").get(), Duration.Inf)
response.status must_== 500
response.body must_== expectedErrorText
}
"ErrorHandlingFilter recovers from a GET that throws an asynchronous exception" in new WithServer(FakeApplication(withGlobal = Some(ErrorHandlingGlobal), withRoutes = routerForTest)) {
val response = Await.result(wsUrl("/error-async").get(), Duration.Inf)
response.status must_== 500
response.body must_== expectedErrorText
}
"ErrorHandlingFilter recovers from a POST that throws a synchronous exception" in new WithServer(FakeApplication(withGlobal = Some(ErrorHandlingGlobal), withRoutes = routerForTest)) {
val response = Await.result(wsUrl("/error").post(expectedOkText), Duration.Inf)
response.status must_== 500
response.body must_== expectedOkText
}
"ErrorHandlingFilter recovers from a POST that throws an asynchronous exception" in new WithServer(FakeApplication(withGlobal = Some(ErrorHandlingGlobal), withRoutes = routerForTest)) {
val response = Await.result(wsUrl("/error-async").post(expectedOkText), Duration.Inf)
response.status must_== 500
response.body must_== expectedOkText
}
"Filters work even if one of them does not call next" in new WithServer(FakeApplication(withGlobal = Some(SkipNextGlobal), withRoutes = routerForTest)) {
val response = Await.result(wsUrl("/ok").get(), Duration.Inf)
response.status must_== 200
response.body must_== SkipNextFilter.expectedText
}
"ErrorHandlingFilter can recover from an exception throw by another filter in the filter chain, even if that Filter does not call next" in new WithServer(FakeApplication(withGlobal = Some(SkipNextWithErrorGlobal), withRoutes = routerForTest)) {
val response = Await.result(wsUrl("/ok").get(), Duration.Inf)
response.status must_== 500
response.body must_== SkipNextWithErrorFilter.expectedText
}
"ErrorHandlingFilter can recover from an exception throw by another filter in the filter chain when that filter calls next and asynchronously throws an exception" in new WithServer(FakeApplication(withGlobal = Some(GlobalWithThrowExceptionFilter), withRoutes = routerForTest)) {
val response = Await.result(wsUrl("/ok").get(), Duration.Inf)
response.status must_== 500
response.body must_== ThrowExceptionFilter.expectedText
}
}
}
}
Other Play Framework source code examplesHere is a short list of links related to this Play Framework FiltersSpec.scala source code file: |
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.