Package

org.scalatestplus

play

Permalink

package play

Visibility
  1. Public
  2. All

Type Members

  1. trait AllBrowsersPerSuite extends SuiteMixin with WebBrowser with Eventually with IntegrationPatience

    Permalink

    Trait that uses a shared test approach to enable you to run the same tests on multiple browsers in a ScalaTest Suite, where each kind of browser is started and stopped just once for the whole Suite.

    Trait that uses a shared test approach to enable you to run the same tests on multiple browsers in a ScalaTest Suite, where each kind of browser is started and stopped just once for the whole Suite.

    Note: the difference between this trait and AllBrowsersPerTest is that this trait will allow you to write tests that rely on maintaining browser state between the tests. This is a good fit for integration tests in which each test builds on actions taken by the previous tests.

    This trait overrides Suite's withFixture lifecycle method to create a new WebDriver instance the first time it is needed by each test, and close it the first time it is not needed (thus allowing multiple tests to share the same browser), and overrides the tags lifecycle method to tag the shared tests so you can filter them by browser type. This trait's self-type, ServerProvider, will ensure a TestServer and Application are available to each test. The self-type will require that you mix in either OneServerPerSuite, OneServerPerTest, ConfiguredServer before you mix in this trait. Your choice among these three ServerProviders will determine the extent to which a TestServer is shared by multiple tests.

    You'll need to place any tests that you want executed by multiple browsers in a sharedTests method. Because all tests in a ScalaTest Suite must have unique names, you'll need to append the browser name (available from the BrowserInfo passed to sharedTests) to each test name:

    def sharedTests(browser: BrowserInfo) {
      "The blog app home page" must {
        "have the correct title " + browser.name in {
           go to (host + "index.html")
           pageTitle must be ("Awesome Blog")
        }
    

    All tests registered via sharedTests will be registered for each desired WebDriver, as specified by the browsers field. When running, any tests for browser drivers that are unavailable on the current platform will be canceled. All tests registered under sharedTests will be tagged automatically if they end with a browser name in square brackets. For example, if a test name ends with [Firefox], it will be automatically tagged with "org.scalatest.tags.FirefoxBrowser". This will allow you can include or exclude the shared tests by browser type using ScalaTest's regular tagging feature.

    You can use tagging to include or exclude browsers that you sometimes want to test with, but not always. If you never want to test with a particular browser, you can prevent tests for it from being registered at all by overriding browsers and excluding its BrowserInfo in the returned Seq. For example, to disable registration of tests for HtmlUnit, you'd write:

    override lazy val browsers: IndexedSeq[BrowserInfo] =
      Vector(
        FirefoxInfo,
        SafariInfo,
        InternetExplorerInfo,
        ChromeInfo
      )
    

    Note that this trait can only be mixed into traits that register tests as functions, as the shared tests technique is not possible in style traits that declare tests as methods, such as org.scalatest.Spec. Attempting to do so will become a type error once we release ScalaTest 2.2.0.

    package org.scalatestplus.play.examples.allbrowserspersuite
    
    import play.api.test._
    import org.scalatestplus.play._
    import play.api.{Play, Application}
    import play.api.inject.guice._
    import play.api.routing._
    import play.api.cache.EhCacheModule
    
    class ExampleSpec extends PlaySpec with OneServerPerSuite with AllBrowsersPerSuite {
    
      // Override app if you need an Application with other than
      // default parameters.
      implicit override lazy val app = new GuiceApplicationBuilder()
        .disable[EhCacheModule]
        .configure("foo" -> "bar")
        .router(Router.from(TestRoute))
        .build()
    
      // Place tests you want run in different browsers in the `sharedTests` method:
      def sharedTests(browser: BrowserInfo) = {
    
        "The AllBrowsersPerSuite trait" must {
          "provide a web driver " + browser.name in {
            go to ("http://localhost:" + port + "/testing")
            pageTitle mustBe "Test Page"
            click on find(name("b")).value
            eventually { pageTitle mustBe "scalatest" }
          }
        }
      }
    
      // Place tests that don't need a WebDriver outside the `sharedTests` method
      // in the constructor, the usual place for tests in a `PlaySpec`
      "The AllBrowsersPerSuite trait" must {
        "provide an Application" in {
          app.configuration.getString("foo") mustBe Some("bar")
        }
        "make the Application available implicitly" in {
          def getConfig(key: String)(implicit app: Application) = app.configuration.getString(key)
          getConfig("foo") mustBe Some("bar")
        }
        "start the Application" in {
          Play.maybeApplication mustBe Some(app)
        }
        "provide the port" in {
          port mustBe Helpers.testServerPort
        }
        "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()
        }
      }
    }
    

    Here's how the output would look if you ran the above test class in sbt on a platform that did not support Selenium drivers for Internet Explorer or Chrome:

    > test-only *allbrowserspersharedsuite*
    [info] ExampleSpec:
    [info] The AllBrowsersPerSuite trait
    [info] - must provide a web driver [Firefox]
    [info] The AllBrowsersPerSuite trait
    [info] - must provide a web driver [Safari]
    [info] The AllBrowsersPerSuite trait
    [info] - must provide a web driver [InternetExplorer] !!! CANCELED !!!
    [info]   Was unable to create a Selenium InternetExplorerDriver on this platform. (AllBrowsersPerSuite.scala:257)
    [info] The AllBrowsersPerSuite trait
    [info] - must provide a web driver [Chrome] !!! CANCELED !!!
    [info]   Was unable to create a Selenium ChromeDriver on this platform. (AllBrowsersPerSuite.scala:257)
    [info] The AllBrowsersPerSuite trait
    [info] - must provide a web driver [HtmlUnit]
    [info] The AllBrowsersPerSuite trait
    [info] - must provide a Application
    [info] - must make the Application available implicitly
    [info] - must start the Application
    [info] - must provide the port
    [info] - must provide an actual running server
    

    Because the shared tests will be tagged according to browser, you can include or exclude tests based on the browser they use. For example, here's how the output would look if you ran the above test class with sbt and ask to include only Firefox:

    > test-only *allbrowserspersharedtest* -- -n org.scalatest.tags.FirefoxBrowser
    [info] ExampleSpec:
    [info] The AllBrowsersPerSuite trait
    [info] - must provide a web driver [Firefox]
    [info] The AllBrowsersPerSuite trait
    [info] The AllBrowsersPerSuite trait
    [info] The AllBrowsersPerSuite trait
    [info] The AllBrowsersPerSuite trait
    [info] The AllBrowsersPerSuite trait
    

  2. trait AllBrowsersPerTest extends SuiteMixin with WebBrowser with Eventually with IntegrationPatience

    Permalink

    Trait that uses a shared test approach to enable you to run the same tests on multiple browsers in a ScalaTest Suite, where a new browser is started before each test that needs a browser, and stopped after.

    Trait that uses a shared test approach to enable you to run the same tests on multiple browsers in a ScalaTest Suite, where a new browser is started before each test that needs a browser, and stopped after.

    Note: the difference between this trait and AllBrowsersPerSuite is that AllBrowsersPerSuite will allow you to write tests that rely on maintaining browser state between the tests. Thus, AllBrowsersPerSuite is a good fit for integration tests in which each test builds on actions taken by the previous tests. This trait is good if your tests each need a brand new browser.

    This trait overrides Suite's withFixture lifecycle method to create a new WebDriver instance before executing each test that needs a browser, closing it after the test completes, and overrides the tags lifecycle method to tag the shared tests so you can filter them by browser type. This trait's self-type, ServerProvider, will ensure a TestServer and Application are available to each test. The self-type will require that you mix in either OneServerPerSuite, OneServerPerTest, ConfiguredServer before you mix in this trait. Your choice among these three ServerProviders will determine the extent to which a TestServer is shared by multiple tests.

    You'll need to place any tests that you want executed by multiple browsers in a sharedTests method. Because all tests in a ScalaTest Suite must have unique names, you'll need to append the browser name (available from the BrowserInfo passed to sharedTests) to each test name:

    def sharedTests(browser: BrowserInfo) {
      "The blog app home page" must {
        "have the correct title " + browser.name in {
           go to (host + "index.html")
           pageTitle must be ("Awesome Blog")
        }
    

    All tests registered via sharedTests will be registered for each desired WebDriver, as specified by the browsers field. When running, any tests for browser drivers that are unavailable on the current platform will be canceled. All tests registered under sharedTests will be tagged automatically if they end with a browser name in square brackets. For example, if a test name ends with [Firefox], it will be automatically tagged with "org.scalatest.tags.FirefoxBrowser". This will allow you can include or exclude the shared tests by browser type using ScalaTest's regular tagging feature.

    You can use tagging to include or exclude browsers that you sometimes want to test with, but not always. If you never want to test with a particular browser, you can prevent tests for it from being registered at all by overriding browsers and excluding its BrowserInfo in the returned Seq. For example, to disable registration of tests for HtmlUnit, you'd write:

    override lazy val browsers: IndexedSeq[BrowserInfo] =
      Vector(
        FirefoxInfo,
        SafariInfo,
        InternetExplorerInfo,
        ChromeInfo
      )
    

    Note that this trait can only be mixed into traits that register tests as functions, as the shared tests technique is not possible in style traits that declare tests as methods, such as org.scalatest.Spec. Attempting to do so will become a type error once we release ScalaTest 2.2.0.

    package org.scalatestplus.play.examples.allbrowserspertest
    
    import play.api.test._
    import org.scalatest._
    import org.scalatestplus.play._
    import play.api.{Play, Application}
    import play.api.inject.guice._
    import play.api.routing._
    import play.api.cache.EhCacheModule
    
    class ExampleSpec extends PlaySpec with OneServerPerTest with AllBrowsersPerTest {
    
      // Override newAppForTest if you need a Application with other than non-default parameters.
      override def newAppForTest(testData: TestData): Application = new GuiceApplicationBuilder()
        .disable[EhCacheModule]
        .configure("foo" -> "bar")
        .router(Router.from(TestRoute))
        .build()
    
      // Place tests you want run in different browsers in the `sharedTests` method:
      def sharedTests(browser: BrowserInfo) = {
    
        "The AllBrowsersPerTest trait" must {
          "provide a web driver " + browser.name in {
            go to ("http://localhost:" + port + "/testing")
            pageTitle mustBe "Test Page"
            click on find(name("b")).value
            eventually { pageTitle mustBe "scalatest" }
          }
        }
      }
    
      // Place tests you want run just once outside the `sharedTests` method
      // in the constructor, the usual place for tests in a `PlaySpec`
      "The AllBrowsersPerTest trait" must {
        "provide a FakeApplication" in {
          app.configuration.getString("foo") mustBe Some("bar")
        }
        "make the FakeApplication available implicitly" in {
           def getConfig(key: String)(implicit app: Application) = app.configuration.getString(key)
          getConfig("foo") mustBe Some("bar")
        }
        "start the FakeApplication" in {
          Play.maybeApplication mustBe Some(app)
        }
        "provide the port" in {
          port mustBe Helpers.testServerPort
        }
        "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()
        }
      }
    }
    

    Here's how the output would look if you ran the above test class in sbt on a platform that did not support Selenium drivers for Internet Explorer or Chrome:

    > test-only *allbrowserspersharedtest*
    [info] ExampleSpec:
    [info] The AllBrowsersPerTest trait
    [info] - must provide a web driver [Firefox]
    [info] The AllBrowsersPerTest trait
    [info] - must provide a web driver [Safari]
    [info] The AllBrowsersPerTest trait
    [info] - must provide a web driver [InternetExplorer] !!! CANCELED !!!
    [info]   Was unable to create a Selenium InternetExplorerDriver on this platform. (AllBrowsersPerTest.scala:257)
    [info] The AllBrowsersPerTest trait
    [info] - must provide a web driver [Chrome] !!! CANCELED !!!
    [info]   Was unable to create a Selenium ChromeDriver on this platform. (AllBrowsersPerTest.scala:257)
    [info] The AllBrowsersPerTest trait
    [info] - must provide a web driver [HtmlUnit]
    [info] The AllBrowsersPerTest trait
    [info] - must provide a Application
    [info] - must make the Application available implicitly
    [info] - must start the Application
    [info] - must provide the port
    [info] - must provide an actual running server
    

    Because the shared tests will be tagged according to browser, you can include or exclude tests based on the browser they use. For example, here's how the output would look if you ran the above test class with sbt and ask to include only Firefox:

    > test-only *allbrowserspersharedtest* -- -n org.scalatest.tags.FirefoxBrowser
    [info] ExampleSpec:
    [info] The AllBrowsersPerTest trait
    [info] - must provide a web driver [Firefox]
    [info] The AllBrowsersPerTest trait
    [info] The AllBrowsersPerTest trait
    [info] The AllBrowsersPerTest trait
    [info] The AllBrowsersPerTest trait
    [info] The AllBrowsersPerTest trait
    

  3. trait BrowserFactory extends AnyRef

    Permalink

    Trait that defines an abstract createWebDriver method for creating a new Selenium WebDriver and an abstract unableToCreateDriverErrorMessage method that provides an appropriate error message if the driver is not available on the current platform.

    Trait that defines an abstract createWebDriver method for creating a new Selenium WebDriver and an abstract unableToCreateDriverErrorMessage method that provides an appropriate error message if the driver is not available on the current platform.

    Traits OneBrowserPerSuite and OneBrowserPerTest extend BrowserFactory and therefore require you to fill in the createWebDriver method, usually by mixing in one of the BrowserFactory subtraits.

  4. abstract class BrowserInfo extends AnyRef

    Permalink

    Abstract class that encapsulates a browser name, tag name, and Selenium WebDriver factory method.

    Abstract class that encapsulates a browser name, tag name, and Selenium WebDriver factory method.

    This class is used by AllBrowsersPerSuite and AllBrowsersPerTest: an IndexedSeq[BrowserInfo] is returned from the browsers field of these traits to specify the browsers to share between tests. When tests are registered, AllBrowsersPerSuite and AllBrowsersPerTest use the browser name to ensure the tests shared by multiple browsers have unique names (the name of each shared test is appended with a browser name). When the tests run, these traits use the BrowserInfo's factory method to create WebDrivers as needed. The AllBrowsersPerSuite and AllBrowsersPerTest traits use the tag name to automatically tag any tests that use a particular WebDriver with the appropriate tag so that tests can be dynamically filtered by the browser the use.

    BrowserInfo is not sealed so that you can extend it if you need other Browser types, for example, Firefox browsers with different profiles (English, Japanese, etc.).

  5. trait ChromeFactory extends BrowserFactory

    Permalink

    Factory whose createWebDriver method will either return a new Selenium ChromeDriver, or UnavailableDriver, if Chrome is not available on the host platform.

    Factory whose createWebDriver method will either return a new Selenium ChromeDriver, or UnavailableDriver, if Chrome is not available on the host platform.

    Traits OneBrowserPerSuite and OneBrowserPerTest extend BrowserFactory and therefore require you to fill in the createWebDriver method, usually by mixing in one of the BrowserFactory subtraits such as ChromeFactory.

  6. trait ConfiguredApp extends SuiteMixin

    Permalink

    Trait that provides a configured Application to the suite into which it is mixed.

    Trait that provides a configured Application to the suite into which it is mixed.

    The purpose of this trait is to allow nested suites of an enclosing suite that extends OneAppPerSuite to make use of the Application provided by OneAppPerSuite. Trait OneAppPerSuite will ensure the Application is placed in the ConfigMap under the key org.scalatestplus.play.app before nested suites are invoked. This represents the "configured application" that is passed from the enclosing suite to the nested suites. Trait ConfiguredApp extracts the Application from the ConfigMap and makes it available via the app method it provides.

    To prevent discovery of nested suites you can annotate them with @DoNotDiscover. Here's an example, taken from OneAppPerSuite's documentation:

    package org.scalatestplus.play.examples.oneapppersuite
    
    import org.scalatestplus.play._
    import play.api.{Play, Application}
    import play.api.inject.guice._
    
    class ExampleSpec extends PlaySpec with OneAppPerSuite {
    
      // Override app if you need an Application with other than non-default parameters.
      implicit override lazy val app: Application =
        new GuiceApplicationBuilder().configure(Map("ehcacheplugin" -> "disabled")).build()
    
      "The OneAppPerSuite trait" must {
        "provide a FakeApplication" in {
          app.configuration.getString("ehcacheplugin") mustBe Some("disabled")
        }
        "make the FakeApplication available implicitly" in {
          def getConfig(key: String)(implicit app: Application) = app.configuration.getString(key)
          getConfig("ehcacheplugin") mustBe Some("disabled")
        }
        "start the FakeApplication" in {
          Play.maybeApplication mustBe Some(app)
        }
      }
    }
    

  7. trait ConfiguredBrowser extends SuiteMixin with WebBrowser with Eventually with IntegrationPatience

    Permalink

    Trait that provides a configured Application, server port number, and Selenium WebDriver to the suite into which it is mixed.

    Trait that provides a configured Application, server port number, and Selenium WebDriver to the suite into which it is mixed.

    The purpose of this trait is to allow nested suites of an enclosing suite that extends OneBrowserPerSuite to make use of the WebDriver provided by OneBrowserPerSuite. Trait OneBrowserPerSuite will ensure the WebDriver is placed in the ConfigMap under the key org.scalatestplus.play.webDriver before nested suites are invoked. This information represents the "configured browser" that is passed from the enclosing suite to the nested suites. Trait ConfiguredBrowser extracts this information from from the ConfigMap and makes the WebDriver available implicitly from the webDriver method.

    This trait's self-type, ServerProvider, will ensure a TestServer and Application are available to each test. The self-type will require that you mix in either OneServerPerSuite, OneServerPerTest, ConfiguredServer before you mix in this trait. Your choice among these three ServerProviders will determine the extent to which one or more TestServers are shared by multiple tests.

    To prevent discovery of nested suites you can annotate them with @DoNotDiscover. Here's an example taken from the documentation for trait OneBrowserPerSuite:

    package org.scalatestplus.play.examples.onebrowserpersuite
    
    import play.api.test.Helpers
    import org.scalatest.tags.FirefoxBrowser
    import org.scalatestplus.play._
    import play.api.{Play, Application}
    import play.api.inject.guice._
    import play.api.routing._
    
    @FirefoxBrowser
    class ExampleSpec extends PlaySpec with OneServerPerSuite with OneBrowserPerSuite with FirefoxFactory {
    
      // Override app if you need a Application with other than non-default parameters.
      implicit override lazy val app: Application = new GuiceApplicationBuilder()
          .configure("foo" -> "bar", "ehcacheplugin" -> "disabled")
          .router(Router.from(TestRoute))
          .build()
    
      "The OneBrowserPerSuite trait" must {
        "provide an Application" in {
          app.configuration.getString("ehcacheplugin") mustBe Some("disabled")
        }
        "make the Application available implicitly" in {
          def getConfig(key: String)(implicit app: Application) = app.configuration.getString(key)
          getConfig("ehcacheplugin") mustBe Some("disabled")
        }
        "start the Application" in {
          Play.maybeApplication mustBe Some(app)
        }
        "provide the port number" in {
          port mustBe Helpers.testServerPort
        }
        "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()
        }
        "provide a web driver" in {
          go to ("http://localhost:" + port + "/testing")
          pageTitle mustBe "Test Page"
          click on find(name("b")).value
          eventually { pageTitle mustBe "scalatest" }
        }
      }
    }
    

  8. trait ConfiguredServer extends SuiteMixin with ServerProvider

    Permalink

    Trait that provides a configured Application and server port number to the suite into which it is mixed.

    Trait that provides a configured Application and server port number to the suite into which it is mixed.

    The purpose of this trait is to allow nested suites of an enclosing suite that extends OneServerPerSuite to make use of the Application and port number provided by OneServerPerSuite. Trait OneServerPerSuite will ensure the Application is placed in the ConfigMap under the key org.scalatestplus.play.app and the port number under the key org.scalatestplus.play.port before nested suites are invoked. This information represents the "configured server" that is passed from the enclosing suite to the nested suites. Trait ConfiguredServer extracts this information from from the ConfigMap and makes the Application available via the app method, the port number available as an Int from the port method, and also the port number wrapped in a PortNumber available as implicit method portNumber (for use with trait WsScalaTestClient).

    To prevent discovery of nested suites you can annotate them with @DoNotDiscover. Here's an example, taken from OneAppPerSuite's documentation:

    package org.scalatestplus.play.examples.oneserverpersuite
    
    import play.api.test._
    import org.scalatestplus.play._
    import play.api.{Play, Application}
    import play.api.inject.guice._
    
    class ExampleSpec extends PlaySpec with OneServerPerSuite {
    
      // Override app if you need a Application with other than non-default parameters.
      implicit override lazy val app: Application =
        new GuiceApplicationBuilder().configure("ehcacheplugin" -> "disabled").build()
    
      "The OneServerPerSuite trait" must {
        "provide an Application" in {
          app.configuration.getString("ehcacheplugin") mustBe Some("disabled")
        }
        "make the Application available implicitly" in {
          def getConfig(key: String)(implicit app: Application) = app.configuration.getString(key)
          getConfig("ehcacheplugin") mustBe Some("disabled")
        }
        "start the Application" in {
          Play.maybeApplication mustBe Some(app)
        }
        "provide the port number" in {
          port mustBe Helpers.testServerPort
        }
        "provide an actual running server" in {
          import Helpers._
          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()
        }
      }
    }
    

  9. trait FirefoxFactory extends BrowserFactory

    Permalink

    Factory whose createWebDriver method will either return a new Selenium FirefoxDriver (created using the profile specified by firefoxProfile), or UnavailableDriver, if Firefox is not available on the host platform.

    Factory whose createWebDriver method will either return a new Selenium FirefoxDriver (created using the profile specified by firefoxProfile), or UnavailableDriver, if Firefox is not available on the host platform.

    Traits OneBrowserPerSuite and OneBrowserPerTest extend BrowserFactory and therefore require you to fill in the createWebDriver method, usually by mixing in one of the BrowserFactory subtraits such as FirefoxFactory.

  10. case class FirefoxInfo(firefoxProfile: FirefoxProfile) extends BrowserInfo with Product with Serializable

    Permalink

    Firefox browser info, which encapsulates the browser name, "[Firefox]"; tag name, org.scalatest.tags.FirefoxBrowser; and a factory method that produces a Selenium FirefoxDriver.

    Firefox browser info, which encapsulates the browser name, "[Firefox]"; tag name, org.scalatest.tags.FirefoxBrowser; and a factory method that produces a Selenium FirefoxDriver.

    This class's superclass, BrowserInfo, is used by AllBrowsersPerSuite and AllBrowsersPerTest: an IndexedSeq[BrowserInfo] is returned from the browsers field of these traits to specify the browsers to share between tests. When tests are registered, AllBrowsersPerSuite and AllBrowsersPerTest use the browser name to ensure the tests shared by multiple browsers have unique names (the name of each shared test is appended with a browser name). When the tests run, these traits use the BrowserInfo's factory method to create WebDrivers as needed. The AllBrowsersPerSuite and AllBrowsersPerTest traits use the tag name to automatically tag any tests that use a particular WebDriver with the appropriate tag so that tests can be dynamically filtered by the browser the use.

    firefoxProfile

    the FirefoxProfile to use when creating new FirefoxDrivers in the createWebDriver factory method.

  11. trait HtmlUnitFactory extends BrowserFactory

    Permalink

    Factory whose createWebDriver method will either return a new Selenium HtmlUnitDriver, or UnavailableDriver, if HtmlUnit is not available on the host platform.

    Factory whose createWebDriver method will either return a new Selenium HtmlUnitDriver, or UnavailableDriver, if HtmlUnit is not available on the host platform.

    Traits OneBrowserPerSuite and OneBrowserPerTest extend BrowserFactory and therefore require you to fill in the createWebDriver method, usually by mixing in one of the BrowserFactory subtraits such as HtmlUnitFactory.

  12. case class HtmlUnitInfo(enableJavascript: Boolean) extends BrowserInfo with Product with Serializable

    Permalink

    HtmlUnit browser info, which encapsulates the browser name, "[HtmlUnit]"; tag name, org.scalatest.tags.HtmlUnitBrowser; and a factory method that produces a Selenium HtmlUnitDriver.

    HtmlUnit browser info, which encapsulates the browser name, "[HtmlUnit]"; tag name, org.scalatest.tags.HtmlUnitBrowser; and a factory method that produces a Selenium HtmlUnitDriver.

    This object's superclass, BrowserInfo, is used by AllBrowsersPerSuite and AllBrowsersPerTest: an IndexedSeq[BrowserInfo] is returned from the browsers field of these traits to specify the browsers to share between tests. When tests are registered, AllBrowsersPerSuite and AllBrowsersPerTest use the browser name to ensure the tests shared by multiple browsers have unique names (the name of each shared test is appended with a browser name). When the tests run, these traits use the BrowserInfo's factory method to create WebDrivers as needed. The AllBrowsersPerSuite and AllBrowsersPerTest traits use the tag name to automatically tag any tests that use a particular WebDriver with the appropriate tag so that tests can be dynamically filtered by the browser the use.

  13. trait InternetExplorerFactory extends BrowserFactory

    Permalink

    Factory whose createWebDriver method will either return a new Selenium InternetExplorerDriver, or UnavailableDriver, if Internet Explorer is not available on the host platform.

    Factory whose createWebDriver method will either return a new Selenium InternetExplorerDriver, or UnavailableDriver, if Internet Explorer is not available on the host platform.

    Traits OneBrowserPerSuite and OneBrowserPerTest extend BrowserFactory and therefore require you to fill in the createWebDriver method, usually by mixing in one of the BrowserFactory subtraits such as InternetExplorerFactory.

  14. trait MixedFixtures extends SuiteMixin with UnitFixture

    Permalink

    Trait that helps you provide different fixtures to different tests: a Application, a TestServer, or one of the Selenium WebDriverss.

    Trait that helps you provide different fixtures to different tests: a Application, a TestServer, or one of the Selenium WebDriverss.

    Trait MixedFixtures can be mixed into any fixture.Suite. For convenience it is mixed into MixedPlaySpec. In a fixture.Suite, tests can take a no-arg function. MixedFixtures provides several no-arg function classes (classes extending Function0) that can be used to provide different fixtures for different tests.

    If a test needs a Application, use the App function, like this:

    "provide an Application" in new App(fakeApp("ehcacheplugin" -> "disabled")) {
      app.configuration.getString("ehcacheplugin") mustBe Some("disabled")
    }
    

    If a test needs an Application and running TestServer, use the Server function, like this:

    "send 404 on a bad request" in new Server {
      import java.net._
      val url = new URL("http://localhost:" + port + "/boom")
      val con = url.openConnection().asInstanceOf[HttpURLConnection]
      try con.getResponseCode mustBe 404
      finally con.disconnect()
    }
    

    If a test needs an Application, running TestServer, and Selenium driver, use one of functions Chrome, Firefox, HtmlUnit, InternetExplorer, or Safari. If the chosen Selenium driver is unavailable on the host platform, the test will be automatically canceled. Here's an example that uses the Safari function:

    "provide a web driver" in new Safari(fakeApp()) {
      go to ("http://localhost:" + port + "/testing")
      pageTitle mustBe "Test Page"
      click on find(name("b")).value
      eventually { pageTitle mustBe "scalatest" }
    }
    

    Here's a complete example:

    package org.scalatestplus.play.examples.mixedfixtures
    
    import play.api.test._
    import org.scalatestplus.play._
    import play.api.{Play, Application}
    import play.api.inject.guice._
    import play.api.routing._
    
    class ExampleSpec extends MixedPlaySpec {
    
      // Some helper methods
      def buildApp[A](elems: (String, String)*) = new GuiceApplicationBuilder()
        .configure(Map(elems:_*))
        .router(Router.from(TestRoute))
        .build()
    
      def getConfig(key: String)(implicit app: Application) = app.configuration.getString(key)
    
      "The App function" must {
        "provide an Application" in new App(buildApp("ehcacheplugin" -> "disabled")) {
          app.configuration.getString("ehcacheplugin") mustBe Some("disabled")
        }
        "make the Application available implicitly" in new App(buildApp("ehcacheplugin" -> "disabled")) {
          getConfig("ehcacheplugin") mustBe Some("disabled")
        }
        "start the Application" in new App(buildApp("ehcacheplugin" -> "disabled")) {
          Play.maybeApplication mustBe Some(app)
        }
      }
      "The Server function" must {
        "provide an Application" in new Server(buildApp("ehcacheplugin" -> "disabled")) {
          app.configuration.getString("ehcacheplugin") mustBe Some("disabled")
        }
        "make the Application available implicitly" in new Server(buildApp("ehcacheplugin" -> "disabled")) {
          getConfig("ehcacheplugin") mustBe Some("disabled")
        }
        "start the Application" in new Server(buildApp("ehcacheplugin" -> "disabled")) {
          Play.maybeApplication mustBe Some(app)
        }
        import Helpers._
        "send 404 on a bad request" in new Server {
          import java.net._
          val url = new URL("http://localhost:" + port + "/boom")
          val con = url.openConnection().asInstanceOf[HttpURLConnection]
          try con.getResponseCode mustBe 404
          finally con.disconnect()
        }
      }
      "The HtmlUnit function" must {
        "provide an Application" in new HtmlUnit(buildApp("ehcacheplugin" -> "disabled")) {
          app.configuration.getString("ehcacheplugin") mustBe Some("disabled")
        }
        "make the Application available implicitly" in new HtmlUnit(buildApp("ehcacheplugin" -> "disabled")) {
          getConfig("ehcacheplugin") mustBe Some("disabled")
        }
        "start the Application" in new HtmlUnit(buildApp("ehcacheplugin" -> "disabled")) {
          Play.maybeApplication mustBe Some(app)
        }
        import Helpers._
        "send 404 on a bad request" in new HtmlUnit {
          import java.net._
          val url = new URL("http://localhost:" + port + "/boom")
          val con = url.openConnection().asInstanceOf[HttpURLConnection]
          try con.getResponseCode mustBe 404
          finally con.disconnect()
        }
        "provide a web driver" in new HtmlUnit(buildApp()) {
          go to ("http://localhost:" + port + "/testing")
          pageTitle mustBe "Test Page"
          click on find(name("b")).value
          eventually { pageTitle mustBe "scalatest" }
        }
      }
      "The Firefox function" must {
        "provide an Application" in new Firefox(buildApp("ehcacheplugin" -> "disabled")) {
          app.configuration.getString("ehcacheplugin") mustBe Some("disabled")
        }
        "make the Application available implicitly" in new Firefox(buildApp("ehcacheplugin" -> "disabled")) {
          getConfig("ehcacheplugin") mustBe Some("disabled")
        }
        "start the Application" in new Firefox(buildApp("ehcacheplugin" -> "disabled")) {
          Play.maybeApplication mustBe Some(app)
        }
        import Helpers._
        "send 404 on a bad request" in new Firefox {
          import java.net._
          val url = new URL("http://localhost:" + port + "/boom")
          val con = url.openConnection().asInstanceOf[HttpURLConnection]
          try con.getResponseCode mustBe 404
          finally con.disconnect()
        }
        "provide a web driver" in new Firefox(buildApp()) {
          go to ("http://localhost:" + port + "/testing")
          pageTitle mustBe "Test Page"
          click on find(name("b")).value
          eventually { pageTitle mustBe "scalatest" }
        }
      }
      "The Safari function" must {
        "provide an Application" in new Safari(buildApp("ehcacheplugin" -> "disabled")) {
          app.configuration.getString("ehcacheplugin") mustBe Some("disabled")
        }
        "make the Application available implicitly" in new Safari(buildApp("ehcacheplugin" -> "disabled")) {
          getConfig("ehcacheplugin") mustBe Some("disabled")
        }
        "start the Application" in new Safari(buildApp("ehcacheplugin" -> "disabled")) {
          Play.maybeApplication mustBe Some(app)
        }
        import Helpers._
        "send 404 on a bad request" in new Safari {
          import java.net._
          val url = new URL("http://localhost:" + port + "/boom")
          val con = url.openConnection().asInstanceOf[HttpURLConnection]
          try con.getResponseCode mustBe 404
          finally con.disconnect()
        }
        "provide a web driver" in new Safari(buildApp()) {
          go to ("http://localhost:" + port + "/testing")
          pageTitle mustBe "Test Page"
          click on find(name("b")).value
          eventually { pageTitle mustBe "scalatest" }
        }
      }
      "The Chrome function" must {
        "provide an Application" in new Chrome(buildApp("ehcacheplugin" -> "disabled")) {
          app.configuration.getString("ehcacheplugin") mustBe Some("disabled")
        }
        "make the Application available implicitly" in new Chrome(buildApp("ehcacheplugin" -> "disabled")) {
          getConfig("ehcacheplugin") mustBe Some("disabled")
        }
        "start the Application" in new Chrome(buildApp("ehcacheplugin" -> "disabled")) {
          Play.maybeApplication mustBe Some(app)
        }
        import Helpers._
        "send 404 on a bad request" in new Chrome {
          import java.net._
          val url = new URL("http://localhost:" + port + "/boom")
          val con = url.openConnection().asInstanceOf[HttpURLConnection]
          try con.getResponseCode mustBe 404
          finally con.disconnect()
        }
        "provide a web driver" in new Chrome(buildApp()) {
          go to ("http://localhost:" + port + "/testing")
          pageTitle mustBe "Test Page"
          click on find(name("b")).value
          eventually { pageTitle mustBe "scalatest" }
        }
      }
      "The InternetExplorer function" must {
        "provide an Application" in new InternetExplorer(buildApp("ehcacheplugin" -> "disabled")) {
          app.configuration.getString("ehcacheplugin") mustBe Some("disabled")
        }
        "make the Application available implicitly" in new InternetExplorer(buildApp("ehcacheplugin" -> "disabled")) {
          getConfig("ehcacheplugin") mustBe Some("disabled")
        }
        "start the Application" in new InternetExplorer(buildApp("ehcacheplugin" -> "disabled")) {
          Play.maybeApplication mustBe Some(app)
        }
        import Helpers._
        "send 404 on a bad request" in new InternetExplorer {
          import java.net._
          val url = new URL("http://localhost:" + port + "/boom")
          val con = url.openConnection().asInstanceOf[HttpURLConnection]
          try con.getResponseCode mustBe 404
          finally con.disconnect()
        }
        "provide a web driver" in new InternetExplorer(buildApp()) {
          go to ("http://localhost:" + port + "/testing")
          pageTitle mustBe "Test Page"
          click on find(name("b")).value
          eventually { pageTitle mustBe "scalatest" }
        }
      }
      "Any old thing" must {
        "be doable without much boilerplate" in { () =>
           1 + 1 mustEqual 2
         }
      }
    }
    

  15. abstract class MixedPlaySpec extends WordSpec with MustMatchers with OptionValues with MixedFixtures with Eventually with IntegrationPatience with WsScalaTestClient

    Permalink

    Convenience "super Suite" class for "mixed fixture" Play tests.

    Convenience "super Suite" class for "mixed fixture" Play tests.

    This class mixes in trait MixedFixtures, and is therefore convenient when different tests in the same test class need different kinds of fixtures. When different tests in the same class need the same fixture, you're probably better of extending PlaySpec instead.

  16. trait OneAppPerSuite extends SuiteMixin

    Permalink

    Trait that provides a new Application instance per ScalaTest Suite.

    Trait that provides a new Application instance per ScalaTest Suite.

    By default, this trait creates a new Application for the Suite using default parameter values, which is made available via the app field defined in this trait. If your Suite needs a Application with non-default parameters, override app to create it the way you need it.

    This SuiteMixin trait's overridden run method calls Play.start, passing in the Application provided by app, before executing the Suite via a call to super.run. In addition, it places a reference to the Application provided by app into the ConfigMap under the key org.scalatestplus.play.app. This allows any nested Suites to access the Suite's Application as well, most easily by having the nested Suites mix in the ConfiguredApp trait. On the status returned by super.run, this trait's overridden run method registers a call to Play.stop to be executed when the Status completes, and returns the same Status. This ensure the Application will continue to execute until all nested suites have completed, after which the Application will be stopped.

    Here's an example that demonstrates some of the services provided by this trait:

    package org.scalatestplus.play.examples.oneapppersuite
    
    import org.scalatestplus.play._
    import play.api.{Play, Application}
    import play.api.inject.guice._
    
    class ExampleSpec extends PlaySpec with OneAppPerSuite {
    
      // Override app if you need an Application with other than non-default parameters.
      implicit override lazy val app: Application =
        new GuiceApplicationBuilder().configure(Map("ehcacheplugin" -> "disabled")).build()
    
      "The OneAppPerSuite trait" must {
        "provide a FakeApplication" in {
          app.configuration.getString("ehcacheplugin") mustBe Some("disabled")
        }
        "make the FakeApplication available implicitly" in {
          def getConfig(key: String)(implicit app: Application) = app.configuration.getString(key)
          getConfig("ehcacheplugin") mustBe Some("disabled")
        }
        "start the FakeApplication" in {
          Play.maybeApplication mustBe Some(app)
        }
      }
    }
    

    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 different Suite classes. These will be your nested suites. Create a master suite that extends OneAppPerSuite and declares the nested Suites. Annotate the nested suites with @DoNotDiscover and have them extend ConfiguredApp. Here's an example:

    package org.scalatestplus.play.examples.oneapppersuite
    
    import play.api.test._
    import org.scalatest._
    import org.scalatestplus.play._
    import play.api.{Play, Application}
    import play.api.inject.guice._
    
    // This is the "master" suite
    class NestedExampleSpec extends Suites(
      new OneSpec,
      new TwoSpec,
      new RedSpec,
      new BlueSpec
    ) with OneAppPerSuite {
      // Override app if you need an Application with other than non-default parameters.
      implicit override lazy val app: Application =
        new GuiceApplicationBuilder().configure(Map("ehcacheplugin" -> "disabled")).build()
    }
    
    // These are the nested suites
    @DoNotDiscover class OneSpec extends PlaySpec with ConfiguredApp
    @DoNotDiscover class TwoSpec extends PlaySpec with ConfiguredApp
    @DoNotDiscover class RedSpec extends PlaySpec with ConfiguredApp
    
    @DoNotDiscover
    class BlueSpec extends PlaySpec with ConfiguredApp {
    
      "The OneAppPerSuite trait" must {
        "provide an Application" in {
          app.configuration.getString("ehcacheplugin") mustBe Some("disabled")
        }
        "make the Application available implicitly" in {
          def getConfig(key: String)(implicit app: Application) = app.configuration.getString(key)
          getConfig("ehcacheplugin") mustBe Some("disabled")
        }
        "start the Application" in {
          Play.maybeApplication mustBe Some(app)
        }
      }
    }
    

  17. trait OneAppPerTest extends SuiteMixin

    Permalink

    Trait that provides a new Application instance for each test.

    Trait that provides a new Application instance for each test.

    This SuiteMixin trait's overridden withFixture method creates a new Application before each test and ensures it is cleaned up after the test has completed. You can access the Application from your tests as method app (which is marked implicit).

    By default, this trait creates a new Application for each test using default parameter values, which is returned by the newAppForTest method defined in this trait. If your tests need a Application with non-default parameters, override newAppForTest to return it.

    Here's an example that demonstrates some of the services provided by this trait:

    package org.scalatestplus.play.examples.oneapppertest
    
    import org.scalatest._
    import org.scalatestplus.play._
    import play.api.{Play, Application}
    import play.api.inject.guice._
    
    class ExampleSpec extends PlaySpec with OneAppPerTest {
    
      // Override newAppForTest if you need a FakeApplication with other than non-default parameters.
      implicit override def newAppForTest(testData: TestData): Application =
        new GuiceApplicationBuilder().configure(Map("ehcacheplugin" -> "disabled")).build()
    
      "The OneAppPerTest trait" must {
        "provide an Application" in {
          app.configuration.getString("ehcacheplugin") mustBe Some("disabled")
        }
        "make the Application available implicitly" in {
          def getConfig(key: String)(implicit app: Application) = app.configuration.getString(key)
          getConfig("ehcacheplugin") mustBe Some("disabled")
        }
        "start the Application" in {
          Play.maybeApplication mustBe Some(app)
        }
      }
    }
    

  18. trait OneBrowserPerSuite extends SuiteMixin with WebBrowser with Eventually with IntegrationPatience with BrowserFactory

    Permalink

    Trait that provides a new Selenium WebDriver instance per ScalaTest Suite.

    Trait that provides a new Selenium WebDriver instance per ScalaTest Suite.

    This SuiteMixin trait's overridden run method places a reference to the WebDriver provided by webDriver under the key org.scalatestplus.play.webDriver. This allows any nested Suites to access the Suite's WebDriver as well, most easily by having the nested Suites mix in the ConfiguredBrowser trait. On the status returned by super.run, this trait's overridden run method registers a block of code to close the WebDriver to be executed when the Status completes, and returns the same Status. This ensures the WebDriver will continue to be available until all nested suites have completed, after which the WebDriver will be closed. This trait also overrides Suite.withFixture to cancel tests automatically if the related WebDriver is not available on the host platform.

    This trait's self-type, ServerProvider, will ensure a TestServer and Application are available to each test. The self-type will require that you mix in either OneServerPerSuite, OneServerPerTest, ConfiguredServer before you mix in this trait. Your choice among these three ServerProviders will determine the extent to which one or more TestServers are shared by multiple tests.

    Here's an example that shows demonstrates of the services provided by this trait. Note that to use this trait, you must mix in one of the driver factories (this example mixes in FirefoxFactory):

    package org.scalatestplus.play.examples.onebrowserpersuite
    
    import play.api.test.Helpers
    import org.scalatest.tags.FirefoxBrowser
    import org.scalatestplus.play._
    import play.api.{Play, Application}
    import play.api.inject.guice._
    import play.api.routing._
    
    @FirefoxBrowser
    class ExampleSpec extends PlaySpec with OneServerPerSuite with OneBrowserPerSuite with FirefoxFactory {
    
      // Override app if you need a Application with other than non-default parameters.
      implicit override lazy val app: Application = new GuiceApplicationBuilder()
        .configure("foo" -> "bar", "ehcacheplugin" -> "disabled")
        .router(Router.from(TestRoute))
        .build()
    
      "The OneBrowserPerSuite trait" must {
        "provide an Application" in {
          app.configuration.getString("ehcacheplugin") mustBe Some("disabled")
        }
        "make the Application available implicitly" in {
          def getConfig(key: String)(implicit app: Application) = app.configuration.getString(key)
          getConfig("ehcacheplugin") mustBe Some("disabled")
        }
        "start the Application" in {
          Play.maybeApplication mustBe Some(app)
        }
        "provide the port number" in {
          port mustBe Helpers.testServerPort
        }
        "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()
        }
        "provide a web driver" in {
          go to ("http://localhost:" + port + "/testing")
          pageTitle mustBe "Test Page"
          click on find(name("b")).value
          eventually { pageTitle mustBe "scalatest" }
        }
      }
    }
    

    If you have many tests that can share the same Application, TestServer, and WebDriver, and you don't want to put them all into one test class, you can place them into different "nested" Suite classes. Create a master suite that extends OneServerPerSuite and declares the nested Suites. Annotate the nested suites with @DoNotDiscover and have them extend ConfiguredBrowser. Here's an example:

    package org.scalatestplus.play.examples.onebrowserpersuite
    
    import play.api.test._
    import org.scalatest._
    import tags.FirefoxBrowser
    import org.scalatestplus.play._
    import play.api.{Play, Application}
    
    // This is the "master" suite
    class NestedExampleSpec extends Suites(
      new OneSpec,
      new TwoSpec,
      new RedSpec,
      new BlueSpec
    ) with OneServerPerSuite with OneBrowserPerSuite with FirefoxFactory {
      // Override app if you need a Application with other than non-default parameters.
      implicit override lazy val app: Application =
        FakeApplication(
          additionalConfiguration = Map("ehcacheplugin" -> "disabled"),
          withRoutes = TestRoute
        )
    }
    
    // These are the nested suites
    @DoNotDiscover class OneSpec extends PlaySpec with ConfiguredServer with ConfiguredBrowser
    @DoNotDiscover class TwoSpec extends PlaySpec with ConfiguredServer with ConfiguredBrowser
    @DoNotDiscover class RedSpec extends PlaySpec with ConfiguredServer with ConfiguredBrowser
    
    @DoNotDiscover
    class BlueSpec extends PlaySpec with ConfiguredServer with ConfiguredBrowser {
    
      "The OneBrowserPerSuite trait" must {
        "provide an Application" in {
          app.configuration.getString("ehcacheplugin") mustBe Some("disabled")
        }
        "make the Application available implicitly" in {
          def getConfig(key: String)(implicit app: Application) = app.configuration.getString(key)
          getConfig("ehcacheplugin") mustBe Some("disabled")
        }
        "start the Application" in {
          Play.maybeApplication mustBe Some(app)
        }
        "provide the port number" in {
          port mustBe Helpers.testServerPort
        }
        "provide an actual running server" in {
          import Helpers._
          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()
        }
      }
    }
    

    It is possible to use OneBrowserPerSuite to run the same tests in more than one browser. Nevertheless, you should consider the approach taken by AllBrowsersPerSuite and AllBrowsersPerTest instead, as it requires a bit less boilerplate code than OneBrowserPerSuite to test in multiple browsers. If you prefer to use OneBrowserPerSuite, however, simply place your tests in an abstract superclass, then define concrete subclasses for each browser you wish to test against. Here's an example:

    package org.scalatestplus.play.examples.onebrowserpersuite
    
    import play.api.test._
    import org.scalatest._
    import tags._
    import org.scalatestplus.play._
    import play.api.{Play, Application}
    
    // Place your tests in an abstract class
    abstract class MultiBrowserExampleSpec extends PlaySpec with OneServerPerSuite with OneBrowserPerSuite {
    
      // Override app if you need an Application with other than non-default parameters.
      implicit override lazy val app: Application =
        FakeApplication(
          additionalConfiguration = Map("ehcacheplugin" -> "disabled"),
          withRoutes = TestRoute
        )
    
      "The OneBrowserPerSuite trait" must {
        "provide an Application" in {
          app.configuration.getString("ehcacheplugin") mustBe Some("disabled")
        }
        "make the Application available implicitly" in {
          def getConfig(key: String)(implicit app: Application) = app.configuration.getString(key)
          getConfig("ehcacheplugin") mustBe Some("disabled")
        }
        "start the Application" in {
          Play.maybeApplication mustBe Some(app)
        }
        "provide the port number" in {
          port mustBe Helpers.testServerPort
        }
        "provide an actual running server" in {
          import Helpers._
          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()
        }
        "provide a web driver" in {
          go to ("http://localhost:" + port + "/testing")
          pageTitle mustBe "Test Page"
          click on find(name("b")).value
          eventually { pageTitle mustBe "scalatest" }
        }
      }
    }
    
    // Then make a subclass that mixes in the factory for each
    // Selenium driver you want to test with.
    @FirefoxBrowser class FirefoxExampleSpec extends MultiBrowserExampleSpec with FirefoxFactory
    @SafariBrowser class SafariExampleSpec extends MultiBrowserExampleSpec with SafariFactory
    @InternetExplorerBrowser class InternetExplorerExampleSpec extends MultiBrowserExampleSpec with InternetExplorerFactory
    @ChromeBrowser class ChromeExampleSpec extends MultiBrowserExampleSpec with ChromeFactory
    @HtmlUnitBrowser class HtmlUnitExampleSpec extends MultiBrowserExampleSpec with HtmlUnitFactory
    

    The concrete subclasses include tag annotations describing the browser used to make it easier to include or exclude browsers in specific runs. This is not strictly necessary since if a browser is not supported on the host platform the tests will be automatically canceled. For example, here's how the output would look if you ran the above tests on a platform that did not support Selenium drivers for Chrome or Internet Explorer using sbt:

    > test-only *onebrowserpersuite*
    [info] FirefoxExampleSpec:
    [info] The OneBrowserPerSuite trait
    [info] - must provide an Application
    [info] - must make the Application available implicitly
    [info] - must start the Application
    [info] - must provide the port number
    [info] - must provide an actual running server
    [info] - must provide a web driver
    [info] SafariExampleSpec:
    [info] The OneBrowserPerSuite trait
    [info] - must provide an Application
    [info] - must make the Application available implicitly
    [info] - must start the Application
    [info] - must provide the port number
    [info] - must provide an actual running server
    [info] - must provide a web driver
    [info] InternetExplorerExampleSpec:
    [info] The OneBrowserPerSuite trait
    [info] - must provide an Application !!! CANCELED !!!
    [info]   Was unable to create a Selenium InternetExplorerDriver on this platform. (OneBrowserPerSuite.scala:201)
    [info] - must make the Application available implicitly !!! CANCELED !!!
    [info]   Was unable to create a Selenium InternetExplorerDriver on this platform. (OneBrowserPerSuite.scala:201)
    [info] - must start the Application !!! CANCELED !!!
    [info]   Was unable to create a Selenium InternetExplorerDriver on this platform. (OneBrowserPerSuite.scala:201)
    [info] - must provide the port number !!! CANCELED !!!
    [info]   Was unable to create a Selenium InternetExplorerDriver on this platform. (OneBrowserPerSuite.scala:201)
    [info] - must provide an actual running server !!! CANCELED !!!
    [info]   Was unable to create a Selenium InternetExplorerDriver on this platform. (OneBrowserPerSuite.scala:201)
    [info] - must provide a web driver !!! CANCELED !!!
    [info]   Was unable to create a Selenium InternetExplorerDriver on this platform. (OneBrowserPerSuite.scala:201)
    [info] ChromeExampleSpec:
    [info] The OneBrowserPerSuite trait
    [info] - must provide an Application !!! CANCELED !!!
    [info]   Was unable to create a Selenium ChromeDriver on this platform. (OneBrowserPerSuite.scala:201)
    [info] - must make the Application available implicitly !!! CANCELED !!!
    [info]   Was unable to create a Selenium ChromeDriver on this platform. (OneBrowserPerSuite.scala:201)
    [info] - must start the Application !!! CANCELED !!!
    [info]   Was unable to create a Selenium ChromeDriver on this platform. (OneBrowserPerSuite.scala:201)
    [info] - must provide the port number !!! CANCELED !!!
    [info]   Was unable to create a Selenium ChromeDriver on this platform. (OneBrowserPerSuite.scala:201)
    [info] - must provide an actual running server !!! CANCELED !!!
    [info]   Was unable to create a Selenium ChromeDriver on this platform. (OneBrowserPerSuite.scala:201)
    [info] - must provide a web driver !!! CANCELED !!!
    [info]   Was unable to create a Selenium ChromeDriver on this platform. (OneBrowserPerSuite.scala:201)
    [info] HtmlUnitExampleSpec:
    [info] The OneBrowserPerSuite trait
    [info] - must provide an Application
    [info] - must make the Application available implicitly
    [info] - must start the Application
    [info] - must provide the port number
    [info] - must provide an actual running server
    [info] - must provide a web driver
    

    For comparison, here is what the output would look like if you just selected tests tagged with FirefoxBrowser in sbt:

    > test-only *onebrowserpersuite* -- -n org.scalatest.tags.FirefoxBrowser
    [info] FirefoxExampleSpec:
    [info] The OneBrowserPerSuite trait
    [info] - must provide an Application
    [info] - must make the Application available implicitly
    [info] - must start the Application
    [info] - must provide the port number
    [info] - must provide an actual running server
    [info] - must provide a web driver
    [info] SafariExampleSpec:
    [info] The OneBrowserPerSuite trait
    [info] InternetExplorerExampleSpec:
    [info] The OneBrowserPerSuite trait
    [info] ChromeExampleSpec:
    [info] The OneBrowserPerSuite trait
    [info] HtmlUnitExampleSpec:
    [info] The OneBrowserPerSuite trait
    

  19. trait OneBrowserPerTest extends SuiteMixin with WebBrowser with Eventually with IntegrationPatience with BrowserFactory

    Permalink

    Trait that provides a new Selenium WebDriver instance for each test executed in a ScalaTest Suite.

    Trait that provides a new Selenium WebDriver instance for each test executed in a ScalaTest Suite.

    This trait overrides ScalaTest's withFixture method to create a new WebDriver instance before each test, and ensure it is closed after the test has completed. The WebDriver is available (implicitly) from method webDriver.

    This trait's self-type, ServerProvider, will ensure a TestServer and Application are available to each test. The self-type will require that you mix in either OneServerPerSuite, OneServerPerTest, ConfiguredServer before you mix in this trait. Your choice among these three ServerProviders will determine the extent to which one or more TestServers are shared by multiple tests.

    Here's an example that shows demonstrates of the services provided by this trait. Note that to use this trait, you must mix in one of the driver factories (this example mixes in FirefoxFactory):

    package org.scalatestplus.play.examples.onebrowserpertest
    
    import play.api.test._
    import org.scalatest._
    import org.scalatest.tags.FirefoxBrowser
    import org.scalatestplus.play._
    import play.api.{Play, Application}
    import play.api.inject.guice._
    import play.api.routing._
    
    @FirefoxBrowser
    class ExampleSpec extends PlaySpec with OneServerPerTest with OneBrowserPerTest with FirefoxFactory {
    
      // Override newAppForTest if you need an Application with other than non-default parameters.
      override def newAppForTest(testData: TestData): Application = new GuiceApplicationBuilder()
        .configure(Map("ehcacheplugin" -> "disabled"))
        .router(Router.from(TestRoute))
        .build()
    
      "The OneBrowserPerTest trait" must {
        "provide an Application" in {
          app.configuration.getString("ehcacheplugin") mustBe Some("disabled")
        }
        "make the Application available implicitly" in {
          def getConfig(key: String)(implicit app: Application) = app.configuration.getString(key)
          getConfig("ehcacheplugin") mustBe Some("disabled")
        }
        "start the Application" in {
          Play.maybeApplication mustBe Some(app)
        }
        "provide the port number" in {
          port mustBe Helpers.testServerPort
        }
        "provide an actual running server" in {
          import Helpers._
          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()
        }
        "provide a web driver" in {
          go to ("http://localhost:" + port + "/testing")
          pageTitle mustBe "Test Page"
          click on find(name("b")).value
          eventually { pageTitle mustBe "scalatest" }
        }
      }
    }
    

  20. trait OneServerPerSuite extends SuiteMixin with ServerProvider

    Permalink

    Trait that provides a new Application and running TestServer instance per ScalaTest Suite.

    Trait that provides a new Application and running TestServer instance per ScalaTest Suite.

    By default, this trait creates a new FakeApplication for the Suite using default parameter values, which is made available via the app field defined in this trait and a new TestServer for the Suite using the port number provided by its port field and the Application provided by its app field. If your Suite needs a Application with non-default parameters, override app. If it needs a different port number, override port.

    This SuiteMixin trait's overridden run method calls start on the TestServer before executing the Suite via a call to super.run. In addition, it places a reference to the Application provided by app into the ConfigMap under the key org.scalatestplus.play.app and to the port number provided by port under the key org.scalatestplus.play.port. This allows any nested Suites to access the Suite's Application and port number as well, most easily by having the nested Suites mix in the ConfiguredServer trait. On the status returned by super.run, this trait's overridden run method registers a call to stop on the TestServer to be executed when the Status completes, and returns the same Status. This ensure the TestServer will continue to execute until all nested suites have completed, after which the TestServer will be stopped.

    Here's an example that demonstrates some of the services provided by this trait:

    package org.scalatestplus.play.examples.oneserverpersuite
    
    import play.api.test._
    import org.scalatestplus.play._
    import play.api.{Play, Application}
    import play.api.inject.guice._
    
    class ExampleSpec extends PlaySpec with OneServerPerSuite {
    
      // Override app if you need a Application with other than non-default parameters.
      implicit override lazy val app: Application =
        new GuiceApplicationBuilder().configure("ehcacheplugin" -> "disabled").build()
    
      "The OneServerPerSuite trait" must {
        "provide an Application" in {
          app.configuration.getString("ehcacheplugin") mustBe Some("disabled")
        }
        "make the Application available implicitly" in {
          def getConfig(key: String)(implicit app: Application) = app.configuration.getString(key)
          getConfig("ehcacheplugin") mustBe Some("disabled")
        }
        "start the Application" in {
          Play.maybeApplication mustBe Some(app)
        }
        "provide the port number" in {
          port mustBe Helpers.testServerPort
        }
        "provide an actual running server" in {
          import Helpers._
          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()
        }
      }
    }
    

    If you have many tests that can share the same Application and TestServer, and you don't want to put them all into one test class, you can place them into different Suite classes. These will be your nested suites. Create a master suite that extends OneServerPerSuite and declares the nested Suites. Annotate the nested suites with @DoNotDiscover and have them extend ConfiguredServer. Here's an example:

    package org.scalatestplus.play.examples.oneserverpersuite
    
    import play.api.test._
    import org.scalatest._
    import org.scalatestplus.play._
    import play.api.{Play, Application}
    import play.api.inject.guice._
    
    // This is the "master" suite
    class NestedExampleSpec extends Suites(
      new OneSpec,
      new TwoSpec,
      new RedSpec,
      new BlueSpec
    ) with OneServerPerSuite {
      // Override app if you need an Application with other than non-default parameters.
      implicit override lazy val app: Application =
        new GuiceApplicationBuilder().configure(Map("ehcacheplugin" -> "disabled")).build()
    }
    
    // These are the nested suites
    
    @DoNotDiscover class OneSpec extends PlaySpec with ConfiguredServer
    @DoNotDiscover class TwoSpec extends PlaySpec with ConfiguredServer
    @DoNotDiscover class RedSpec extends PlaySpec with ConfiguredServer
    @DoNotDiscover
    class BlueSpec extends PlaySpec with ConfiguredServer {
    
      "The OneServerPerSuite trait" must {
        "provide an Application" in {
          app.configuration.getString("ehcacheplugin") mustBe Some("disabled")
        }
        "make the Application available implicitly" in {
          def getConfig(key: String)(implicit app: Application) = app.configuration.getString(key)
          getConfig("ehcacheplugin") mustBe Some("disabled")
        }
        "start the Application" in {
          Play.maybeApplication mustBe Some(app)
        }
        "provide the port number" in {
          port mustBe Helpers.testServerPort
        }
        "provide an actual running server" in {
          import Helpers._
          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()
        }
      }
    }
    

  21. trait OneServerPerTest extends SuiteMixin with ServerProvider

    Permalink

    Trait that provides a new Application and running TestServer instance for each test executed in a ScalaTest Suite.

    Trait that provides a new Application and running TestServer instance for each test executed in a ScalaTest Suite.

    This SuiteMixin trait overrides ScalaTest's withFixture method to create a new Application and TestServer before each test, and ensure they are cleaned up after the test has completed. The Application is available (implicitly) from method app. The TestServer's port number is available as port (and implicitly available as portNumber, wrapped in a PortNumber).

    By default, this trait creates a new FakeApplication for each test using default parameter values, which is returned by the newAppForTest method defined in this trait. If your tests need an Application with non-default parameters, override newAppForTest to return it.

    Here's an example that demonstrates some of the services provided by this trait:

    package org.scalatestplus.play.examples.oneserverpertest
    
    import play.api.test._
    import org.scalatest._
    import org.scalatestplus.play._
    import play.api.{Play, Application}
    import play.api.inject.guice._
    import play.api.routing._
    
    class ExampleSpec extends PlaySpec with OneServerPerTest {
    
      // Override newAppForTest if you need a FakeApplication with other than non-default parameters.
      implicit override def newAppForTest(testData: TestData): Application = new GuiceApplicationBuilder()
        .configure(Map("ehcacheplugin" -> "disabled"))
        .router(Router.from(TestRoute))
        .build()
    
      "The OneServerPerTest trait" must {
        "provide a FakeApplication" in {
          app.configuration.getString("ehcacheplugin") mustBe Some("disabled")
        }
        "make the FakeApplication available implicitly" in {
          def getConfig(key: String)(implicit app: Application) = app.configuration.getString(key)
          getConfig("ehcacheplugin") mustBe Some("disabled")
        }
        "start the FakeApplication" in {
          Play.maybeApplication mustBe Some(app)
        }
        "provide the port number" in {
          port mustBe Helpers.testServerPort
        }
        "provide an actual running server" in {
          import Helpers._
          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()
        }
      }
    }
    

  22. abstract class PlaySpec extends WordSpec with MustMatchers with OptionValues with WsScalaTestClient

    Permalink

    Convenience "super Suite" base class for Play tests.

    Convenience "super Suite" base class for Play tests.

    Extend this class by default for testing Play apps with the ScalaTest + Play library. You can mix other traits into it to access needed fixtures, such as OneAppPerSuite, OneAppPerTest, OneServerPerSuite, OneServerPerTest, OneBrowserPerSuite, OneBrowserPerTest, AllBrowsersPerSuite, or AllBrowsersPerTest mix If you want to use trait MixedFixtures, extend MixedPlaySpec instead.

  23. case class PortNumber(value: Int) extends Product with Serializable

    Permalink

    Wraps a port number of a provided TestServer so that it can be made available as an implicit without making an Int implicit.

    Wraps a port number of a provided TestServer so that it can be made available as an implicit without making an Int implicit.

    An implicit PortNumber is made available by traits that provide a play.api.test.TestServer: MixedFixtures, OneBrowserPerSuite, OneBrowserPerTest, OneServerPerSuite, and OneServerPerTest.

    The implicit PortNumber is taken by the methods of WsScalaTestClient.

  24. trait SafariFactory extends BrowserFactory

    Permalink

    Factory whose createWebDriver method will either return a new Selenium SafariDriver, or UnavailableDriver, if Safari is not available on the host platform.

    Factory whose createWebDriver method will either return a new Selenium SafariDriver, or UnavailableDriver, if Safari is not available on the host platform.

    Traits OneBrowserPerSuite and OneBrowserPerTest extend BrowserFactory and therefore require you to fill in the createWebDriver method, usually by mixing in one of the BrowserFactory subtraits such as SafariFactory.

  25. trait ServerProvider extends AnyRef

    Permalink

    Trait that defines abstract methods that providing a port number and implicit Application and a concrete method that provides an implicit PortNumber that wraps the port number.

    Trait that defines abstract methods that providing a port number and implicit Application and a concrete method that provides an implicit PortNumber that wraps the port number.

    This trait is implemented by OneServerPerSuite, OneServerPerTest, and ConfiguredServer, each of which use a different strategy to provide TestServers to tests. This trait is included in the self-type of OneBrowserPerSuite, and OneBrowserPerTest, and AllBrowsersPerTest, allowing you to select the WebDriver strategy (i.e., the extent to which WebDrivers are shared between tests) independently from the TestServer strategy (the extent to which TestServers are shared between tests).

  26. trait WsScalaTestClient extends AnyRef

    Permalink

    Trait providing convenience methods to create WS requests in tests.

Value Members

  1. object BrowserFactory

    Permalink

    Companion object to trait BrowserFactory that holds a UnavailableDriver object that implements the Selenium WebDriver interface by throwing UnsupportedOperationException.

    Companion object to trait BrowserFactory that holds a UnavailableDriver object that implements the Selenium WebDriver interface by throwing UnsupportedOperationException. This is used as a placeholder when a driver is not available on the host platform.

  2. object ChromeFactory extends ChromeFactory

    Permalink

    Companion object to trait ChromeFactory that mixes in the trait.

  3. object ChromeInfo extends BrowserInfo with Product with Serializable

    Permalink

    Chrome browser info, which encapsulates the browser name, "[Chrome]"; tag name, org.scalatest.tags.ChromeBrowser; and a factory method that produces a Selenium ChromeDriver.

    Chrome browser info, which encapsulates the browser name, "[Chrome]"; tag name, org.scalatest.tags.ChromeBrowser; and a factory method that produces a Selenium ChromeDriver.

    This object's superclass, BrowserInfo, is used by AllBrowsersPerSuite and AllBrowsersPerTest: an IndexedSeq[BrowserInfo] is returned from the browsers field of these traits to specify the browsers to share between tests. When tests are registered, AllBrowsersPerSuite and AllBrowsersPerTest use the browser name to ensure the tests shared by multiple browsers have unique names (the name of each shared test is appended with a browser name). When the tests run, these traits use the BrowserInfo's factory method to create WebDrivers as needed. The AllBrowsersPerSuite and AllBrowsersPerTest traits use the tag name to automatically tag any tests that use a particular WebDriver with the appropriate tag so that tests can be dynamically filtered by the browser the use.

  4. object FirefoxFactory extends FirefoxFactory

    Permalink

    Companion object to trait FirefoxFactory that mixes in the trait.

  5. object HtmlUnitFactory extends HtmlUnitFactory

    Permalink

    Companion object to trait HtmlUnitFactory that mixes in the trait.

  6. object InternetExplorerFactory extends InternetExplorerFactory

    Permalink

    Companion object to trait InternetExplorerFactory that mixes in the trait.

  7. object InternetExplorerInfo extends BrowserInfo with Product with Serializable

    Permalink

    Internet Explorer browser info, which encapsulates the browser name, "[InternetExplorer]"; tag name, org.scalatest.tags.InternetExplorerBrowser; and a factory method that produces a Selenium InternetExplorerDriver.

    Internet Explorer browser info, which encapsulates the browser name, "[InternetExplorer]"; tag name, org.scalatest.tags.InternetExplorerBrowser; and a factory method that produces a Selenium InternetExplorerDriver.

    This object's superclass, BrowserInfo, is used by AllBrowsersPerSuite and AllBrowsersPerTest: an IndexedSeq[BrowserInfo] is returned from the browsers field of these traits to specify the browsers to share between tests. When tests are registered, AllBrowsersPerSuite and AllBrowsersPerTest use the browser name to ensure the tests shared by multiple browsers have unique names (the name of each shared test is appended with a browser name). When the tests run, these traits use the BrowserInfo's factory method to create WebDrivers as needed. The AllBrowsersPerSuite and AllBrowsersPerTest traits use the tag name to automatically tag any tests that use a particular WebDriver with the appropriate tag so that tests can be dynamically filtered by the browser the use.

  8. object SafariFactory extends SafariFactory

    Permalink

    Companion object to trait SafariFactory that mixes in the trait.

  9. object SafariInfo extends BrowserInfo with Product with Serializable

    Permalink

    Safari browser info, which encapsulates the browser name, "[Safari]"; tag name, org.scalatest.tags.SafariBrowser; and a factory method that produces a Selenium SafariDriver.

    Safari browser info, which encapsulates the browser name, "[Safari]"; tag name, org.scalatest.tags.SafariBrowser; and a factory method that produces a Selenium SafariDriver.

    This object's superclass, BrowserInfo, is used by AllBrowsersPerSuite and AllBrowsersPerTest: an IndexedSeq[BrowserInfo] is returned from the browsers field of these traits to specify the browsers to share between tests. When tests are registered, AllBrowsersPerSuite and AllBrowsersPerTest use the browser name to ensure the tests shared by multiple browsers have unique names (the name of each shared test is appended with a browser name). When the tests run, these traits use the BrowserInfo's factory method to create WebDrivers as needed. The AllBrowsersPerSuite and AllBrowsersPerTest traits use the tag name to automatically tag any tests that use a particular WebDriver with the appropriate tag so that tests can be dynamically filtered by the browser the use.

Ungrouped