package components
Type Members
-
trait
OneAppPerSuiteWithComponents extends BaseOneAppPerSuite with WithApplicationComponents with FakeApplicationFactory
An extension of BaseOneAppPerSuite providing Compile-time DI.
An extension of BaseOneAppPerSuite providing Compile-time DI.
Provides a new
Applicationinstance per ScalaTestSuite.By default, this trait creates a new
Applicationfor theSuiteaccording to the components defined in the test.This
TestSuiteMixintrait's overriddenrunmethod callsPlay.start, passing in theApplicationprovided byapp, before executing theSuitevia a call tosuper.run. In addition, it places a reference to theApplicationprovided byappinto theConfigMapunder the keyorg.scalatestplus.play.app. This allows any nestedSuites to access theSuite'sApplicationas well, most easily by having the nestedSuites mix in the ConfiguredApp trait. On the status returned bysuper.run, this trait's overriddenrunmethod registers a call toPlay.stopto be executed when theStatuscompletes, and returns the sameStatus. This ensure theApplicationwill continue to execute until all nested suites have completed, after which theApplicationwill be stopped.Here's an example that demonstrates some of the services provided by this trait:
import org.scalatestplus.play.PlaySpec import org.scalatestplus.play.components.OneServerPerSuiteWithComponents import play.api._ import play.api.mvc.Result import play.api.test.Helpers._ import play.api.test.{FakeRequest, Helpers} import scala.concurrent.Future class ExampleComponentsSpec extends PlaySpec with OneServerPerSuiteWithComponents { override def components: BuiltInComponents = new BuiltInComponentsFromContext(context) with NoHttpFiltersComponents { import play.api.mvc.Results import play.api.routing.Router import play.api.routing.sird._ lazy val router: Router = Router.from({ case GET(p"/") => defaultActionBuilder { Results.Ok("success!") } }) override lazy val configuration: Configuration = context.initialConfiguration ++ Configuration("foo" -> "bar", "ehcacheplugin" -> "disabled") } "The OneServerPerSuiteWithComponents trait" must { "provide an Application" in { import play.api.test.Helpers.{GET, route} val Some(result): Option[Future[Result]] = route(app, FakeRequest(GET, "/")) Helpers.contentAsString(result) must be("success!") } "override the configuration" in { app.configuration.getOptional[String]("foo") mustBe Some("bar") } } }If you have many tests that can share the same
Application, and you don't want to put them all into one test class, you can place them into differentSuiteclasses. These will be your nested suites. Create a master suite that extendsOneAppPerSuiteWithComponentsand declares the nestedSuites. Annotate the nested suites with@DoNotDiscoverand have them extendConfiguredApp. Here's an example:import org.scalatest.{DoNotDiscover, Suites, TestSuite} import org.scalatestplus.play.components.OneAppPerSuiteWithComponents import org.scalatestplus.play.{ConfiguredApp, PlaySpec} import play.api._ import play.api.mvc.Result import play.api.test.Helpers._ import play.api.test.{FakeRequest, Helpers} import scala.concurrent.Future class NestedExampleSpec extends Suites( new OneSpec, new TwoSpec, new RedSpec, new BlueSpec ) with OneAppPerSuiteWithComponents with TestSuite { // Override fakeApplication if you need an Application with other than non-default parameters. override def components: BuiltInComponents = new BuiltInComponentsFromContext(context) with NoHttpFiltersComponents { import play.api.mvc.Results import play.api.routing.Router import play.api.routing.sird._ lazy val router: Router = Router.from({ case GET(p"/") => defaultActionBuilder { Results.Ok("success!") } }) override lazy val configuration: Configuration = context.initialConfiguration ++ Configuration("ehcacheplugin" -> "disabled") } } // These are the nested suites @DoNotDiscover class OneSpec extends PlaySpec with ConfiguredApp { "OneSpec" must { "make the Application available implicitly" in { def getConfig(key: String)(implicit app: Application) = app.configuration.getOptional[String](key) getConfig("ehcacheplugin") mustBe Some("disabled") } } } @DoNotDiscover class TwoSpec extends PlaySpec with ConfiguredApp @DoNotDiscover class RedSpec extends PlaySpec with ConfiguredApp @DoNotDiscover class BlueSpec extends PlaySpec with ConfiguredApp { "The NestedExampleSpec" must { "provide an Application" in { import play.api.test.Helpers.{ GET, route } val Some(result): Option[Future[Result]] = route(app, FakeRequest(GET, "/")) Helpers.contentAsString(result) must be("success!") } } } -
trait
OneAppPerTestWithComponents extends BaseOneAppPerTest with WithApplicationComponents with FakeApplicationFactory with TestSuiteMixin
An extension of BaseOneAppPerTest providing Compile-time DI.
An extension of BaseOneAppPerTest providing Compile-time DI.
Trait that provides a new
Applicationinstance for each test.This
TestSuiteMixintrait's overriddenwithFixturemethod creates a newApplicationbefore each test and ensures it is cleaned up after the test has completed. You can access theApplicationfrom your tests as methodapp(which is marked implicit).By default, this trait creates a new
Applicationfor each test according to the components defined in the test.Here's an example that demonstrates some of the services provided by this trait:
import org.scalatestplus.play.PlaySpec import org.scalatestplus.play.components.OneAppPerTestWithComponents import play.api._ import play.api.mvc.Result import play.api.test.Helpers._ import play.api.test.{FakeRequest, Helpers} import scala.concurrent.Future class ExampleComponentsSpec extends PlaySpec with OneAppPerTestWithComponents { override def components: BuiltInComponents = new BuiltInComponentsFromContext(context) with NoHttpFiltersComponents { import play.api.mvc.Results import play.api.routing.Router import play.api.routing.sird._ lazy val router: Router = Router.from({ case GET(p"/") => defaultActionBuilder { Results.Ok("success!") } }) override lazy val configuration: Configuration = context.initialConfiguration ++ Configuration("foo" -> "bar", "ehcacheplugin" -> "disabled") } "The OneAppPerTestWithComponents trait" must { "provide an Application" in { import play.api.test.Helpers.{GET, route} val Some(result): Option[Future[Result]] = route(app, FakeRequest(GET, "/")) Helpers.contentAsString(result) must be("success!") } "override the configuration" in { app.configuration.getOptional[String]("foo") mustBe Some("bar") } } } -
trait
OneServerPerSuiteWithComponents extends BaseOneServerPerSuite with WithApplicationComponents with FakeApplicationFactory
An extension of BaseOneServerPerSuite providing Compile-time DI.
An extension of BaseOneServerPerSuite providing Compile-time DI.
Trait that provides a new
Applicationand runningTestServerinstance per ScalaTestSuite.By default, this trait creates a new
Applicationfor theSuiteaccording to the components defined in the test, this is made available via theappfield defined in this trait and a newTestServerfor theSuiteusing the port number provided by itsportfield and theApplicationprovided by itsappfield. If yourSuiteneeds a different port number, overrideport.This
TestSuiteMixintrait's overriddenrunmethod callsstarton theTestServerbefore executing theSuitevia a call tosuper.run. In addition, it places a reference to theApplicationprovided byappinto theConfigMapunder the keyorg.scalatestplus.play.appand to the port number provided byportunder the keyorg.scalatestplus.play.port. This allows any nestedSuites to access theSuite'sApplicationand port number as well, most easily by having the nestedSuites mix in the ConfiguredServer trait. On the status returned bysuper.run, this trait's overriddenrunmethod registers a call tostopon theTestServerto be executed when theStatuscompletes, and returns the sameStatus. This ensure theTestServerwill continue to execute until all nested suites have completed, after which theTestServerwill be stopped.Here's an example that demonstrates some of the services provided by this trait:
import org.scalatestplus.play.PlaySpec import org.scalatestplus.play.components.OneServerPerSuiteWithComponents import play.api._ import play.api.mvc.Result import play.api.test.Helpers._ import play.api.test.{FakeRequest, Helpers} import scala.concurrent.Future class ExampleComponentsSpec extends PlaySpec with OneServerPerSuiteWithComponents { override def components: BuiltInComponents = new BuiltInComponentsFromContext(context) with NoHttpFiltersComponents { import play.api.mvc.Results import play.api.routing.Router import play.api.routing.sird._ lazy val router: Router = Router.from({ case GET(p"/") => defaultActionBuilder { Results.Ok("success!") } }) override lazy val configuration: Configuration = context.initialConfiguration ++ Configuration("foo" -> "bar", "ehcacheplugin" -> "disabled") } "The OneServerPerSuiteWithComponents trait" must { "provide an Application" in { import play.api.test.Helpers.{GET, route} val Some(result): Option[Future[Result]] = route(app, FakeRequest(GET, "/")) Helpers.contentAsString(result) must be("success!") } "override the configuration" in { app.configuration.getOptional[String]("foo") mustBe Some("bar") } } }If you have many tests that can share the same
ApplicationandTestServer, and you don't want to put them all into one test class, you can place them into differentSuiteclasses. These will be your nested suites. Create a master suite that extendsOneServerPerSuiteand declares the nestedSuites. Annotate the nested suites with@DoNotDiscoverand have them extendConfiguredServer. Here's an example:import org.scalatest.{ DoNotDiscover, Suites, TestSuite } import org.scalatestplus.play.components._ import org.scalatestplus.play.{ ConfiguredServer, PlaySpec } import play.api._ import play.api.mvc.Result import play.api.test.Helpers._ import play.api.test.{ FakeRequest, Helpers } import scala.concurrent.Future class NestedExampleSpec extends Suites( new OneSpec, new TwoSpec, new RedSpec, new BlueSpec ) with OneServerPerSuiteWithComponents with TestSuite { // Override fakeApplication if you need an Application with other than non-default parameters. override def components: BuiltInComponents = new BuiltInComponentsFromContext(context) with NoHttpFiltersComponents { import play.api.mvc.Results import play.api.routing.Router import play.api.routing.sird._ lazy val router: Router = Router.from({ case GET(p"/") => defaultActionBuilder { Results.Ok("success!") } }) override lazy val configuration: Configuration = context.initialConfiguration ++ Configuration("ehcacheplugin" -> "disabled") } } // These are the nested suites @DoNotDiscover class OneSpec extends PlaySpec with ConfiguredServer { "OneSpec" must { "make the Application available implicitly" in { def getConfig(key: String)(implicit app: Application) = app.configuration.getOptional[String](key) getConfig("ehcacheplugin") mustBe Some("disabled") } } } @DoNotDiscover class TwoSpec extends PlaySpec with ConfiguredServer @DoNotDiscover class RedSpec extends PlaySpec with ConfiguredServer @DoNotDiscover class BlueSpec extends PlaySpec with ConfiguredServer { "The NestedExampleSpeccc" must { "provide an Application" in { import play.api.test.Helpers.{ GET, route } val Some(result): Option[Future[Result]] = route(app, FakeRequest(GET, "/")) Helpers.contentAsString(result) must be("success!") } "provide an actual running server" in { import java.net._ val url = new URL("http://localhost:" + port + "/boum") val con = url.openConnection().asInstanceOf[HttpURLConnection] try con.getResponseCode mustBe 404 finally con.disconnect() } } } -
trait
OneServerPerTestWithComponents extends BaseOneServerPerTest with WithApplicationComponents with FakeApplicationFactory
An extension of BaseOneServerPerTest providing Compile-time DI.
An extension of BaseOneServerPerTest providing Compile-time DI.
Trait that provides a new
Applicationand runningTestServerinstance for each test executed in a ScalaTestSuiteThis
TestSuiteMixintrait overrides ScalaTest'swithFixturemethod to create a newApplicationandTestServerbefore each test, and ensure they are cleaned up after the test has completed. TheApplicationis available (implicitly) from methodapp. TheTestServer's port number is available asport(and implicitly available asportNumber, wrapped in a PortNumber).By default, this trait creates a new
Applicationfor each test according to the components defined in the test.Here's an example that demonstrates some of the services provided by this trait:
import org.scalatestplus.play.PlaySpec import org.scalatestplus.play.components.OneServerPerTestWithComponents import play.api._ import play.api.mvc.Result import play.api.test.Helpers._ import play.api.test.{FakeRequest, Helpers} import scala.concurrent.Future class ExampleComponentsSpec extends PlaySpec with OneServerPerTestWithComponents { override def components: BuiltInComponents = new BuiltInComponentsFromContext(context) with NoHttpFiltersComponents { import play.api.mvc.Results import play.api.routing.Router import play.api.routing.sird._ lazy val router: Router = Router.from({ case GET(p"/") => defaultActionBuilder { Results.Ok("success!") } }) override lazy val configuration: Configuration = context.initialConfiguration ++ Configuration("foo" -> "bar", "ehcacheplugin" -> "disabled") } "The OneServerPerTestWithComponents trait" must { "provide an Application" in { import play.api.test.Helpers.{GET, route} val Some(result): Option[Future[Result]] = route(app, FakeRequest(GET, "/")) Helpers.contentAsString(result) must be("success!") } "override the configuration" in { app.configuration.getOptional[String]("foo") mustBe Some("bar") } } } -
trait
WithApplicationComponents extends AnyRef
A trait that provides a components in scope and returns them when newApplication is called.
A trait that provides a components in scope and returns them when newApplication is called.
Mixin one of the public traits in this package to provide the desired functionality.
This class has several methods that can be used to customize the behavior in specific ways.
This is targeted at functional tests requiring a running application that is bootstrapped using Macwire/Compile time DI. This is provided as an alternative to the GuiceApplicationBuilder which requires guice bootstrapping.
- See also
https://www.playframework.com/documentation/2.5.x/ScalaFunctionalTestingWithScalaTest#Creating-Application-instances-for-testing