diff options
author | Jean Helou <jhe@codamens.fr> | 2019-02-15 17:07:57 +0100 |
---|---|---|
committer | Tobias Roeser <le.petit.fou@web.de> | 2019-03-11 07:41:03 +0100 |
commit | 9da90531dbc8d8dd8f7630376cbfc3bfafdac2ef (patch) | |
tree | d05f3a455ba8e6179e9f2add70ab061ff75faa8f | |
parent | 1b2e42c1aab0a7ab02056e6d9e2aa65b137adc83 (diff) | |
download | mill-9da90531dbc8d8dd8f7630376cbfc3bfafdac2ef.tar.gz mill-9da90531dbc8d8dd8f7630376cbfc3bfafdac2ef.tar.bz2 mill-9da90531dbc8d8dd8f7630376cbfc3bfafdac2ef.zip |
Adds tests for the PlayModule and SingleModule
15 files changed, 423 insertions, 1 deletions
diff --git a/contrib/playlib/test/resources/playmulti/core/app/controllers/HomeController.scala b/contrib/playlib/test/resources/playmulti/core/app/controllers/HomeController.scala new file mode 100644 index 00000000..818ec635 --- /dev/null +++ b/contrib/playlib/test/resources/playmulti/core/app/controllers/HomeController.scala @@ -0,0 +1,24 @@ +package controllers + +import javax.inject._ +import play.api._ +import play.api.mvc._ + +/** + * This controller creates an `Action` to handle HTTP requests to the + * application's home page. + */ +@Singleton +class HomeController @Inject()(cc: ControllerComponents) extends AbstractController(cc) { + + /** + * Create an Action to render an HTML page. + * + * The configuration in the `routes` file means that this method + * will be called when the application receives a `GET` request with + * a path of `/`. + */ + def index() = Action { implicit request: Request[AnyContent] => + Ok(views.html.index()) + } +} diff --git a/contrib/playlib/test/resources/playmulti/core/app/views/index.scala.html b/contrib/playlib/test/resources/playmulti/core/app/views/index.scala.html new file mode 100644 index 00000000..68d37fb1 --- /dev/null +++ b/contrib/playlib/test/resources/playmulti/core/app/views/index.scala.html @@ -0,0 +1,5 @@ +@() + +@main("Welcome to Play") { + <h1>Welcome to Play!</h1> +} diff --git a/contrib/playlib/test/resources/playmulti/core/app/views/main.scala.html b/contrib/playlib/test/resources/playmulti/core/app/views/main.scala.html new file mode 100644 index 00000000..808a8b89 --- /dev/null +++ b/contrib/playlib/test/resources/playmulti/core/app/views/main.scala.html @@ -0,0 +1,25 @@ +@* + * This template is called from the `index` template. This template + * handles the rendering of the page header and body tags. It takes + * two arguments, a `String` for the title of the page and an `Html` + * object to insert into the body of the page. + *@ +@(title: String)(content: Html) + +<!DOCTYPE html> +<html lang="en"> + <head> + @* Here's where we render the page title `String`. *@ + <title>@title</title> + <link rel="stylesheet" media="screen" href="@routes.Assets.versioned("stylesheets/main.css")"> + <link rel="shortcut icon" type="image/png" href="@routes.Assets.versioned("images/favicon.png")"> + + </head> + <body> + @* And here's where we render the `Html` object containing + * the page content. *@ + @content + + <script src="@routes.Assets.versioned("javascripts/main.js")" type="text/javascript"></script> + </body> +</html> diff --git a/contrib/playlib/test/resources/playmulti/core/conf/application.conf b/contrib/playlib/test/resources/playmulti/core/conf/application.conf new file mode 100644 index 00000000..233bcc90 --- /dev/null +++ b/contrib/playlib/test/resources/playmulti/core/conf/application.conf @@ -0,0 +1,2 @@ +# https://www.playframework.com/documentation/latest/Configuration +play.http.secret.key="foobarbaz" diff --git a/contrib/playlib/test/resources/playmulti/core/conf/routes b/contrib/playlib/test/resources/playmulti/core/conf/routes new file mode 100644 index 00000000..2ac6b336 --- /dev/null +++ b/contrib/playlib/test/resources/playmulti/core/conf/routes @@ -0,0 +1,10 @@ +# Routes +# This file defines all application routes (Higher priority routes first) +# https://www.playframework.com/documentation/latest/ScalaRouting +# ~~~~ + +# An example controller showing a sample home page +GET / controllers.HomeController.index + +# Map static resources from the /public folder to the /assets URL path +GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset) diff --git a/contrib/playlib/test/resources/playmulti/core/test/controllers/HomeControllerSpec.scala b/contrib/playlib/test/resources/playmulti/core/test/controllers/HomeControllerSpec.scala new file mode 100644 index 00000000..97947556 --- /dev/null +++ b/contrib/playlib/test/resources/playmulti/core/test/controllers/HomeControllerSpec.scala @@ -0,0 +1,45 @@ +package controllers + +import org.scalatestplus.play._ +import org.scalatestplus.play.guice._ +import play.api.test._ +import play.api.test.Helpers._ + +/** + * Add your spec here. + * You can mock out a whole application including requests, plugins etc. + * + * For more information, see https://www.playframework.com/documentation/latest/ScalaTestingWithScalaTest + */ +class HomeControllerSpec extends PlaySpec with GuiceOneAppPerTest with Injecting { + + "HomeController GET" should { + + "render the index page from a new instance of controller" in { + val controller = new HomeController(stubControllerComponents()) + val home = controller.index().apply(FakeRequest(GET, "/")) + + status(home) mustBe OK + contentType(home) mustBe Some("text/html") + contentAsString(home) must include ("Welcome to Play") + } + + "render the index page from the application" in { + val controller = inject[HomeController] + val home = controller.index().apply(FakeRequest(GET, "/")) + + status(home) mustBe OK + contentType(home) mustBe Some("text/html") + contentAsString(home) must include ("Welcome to Play") + } + + "render the index page from the router" in { + val request = FakeRequest(GET, "/") + val home = route(app, request).get + + status(home) mustBe OK + contentType(home) mustBe Some("text/html") + contentAsString(home) must include ("Welcome to Play") + } + } +} diff --git a/contrib/playlib/test/resources/playsingle/app/controllers/HomeController.scala b/contrib/playlib/test/resources/playsingle/app/controllers/HomeController.scala new file mode 100644 index 00000000..818ec635 --- /dev/null +++ b/contrib/playlib/test/resources/playsingle/app/controllers/HomeController.scala @@ -0,0 +1,24 @@ +package controllers + +import javax.inject._ +import play.api._ +import play.api.mvc._ + +/** + * This controller creates an `Action` to handle HTTP requests to the + * application's home page. + */ +@Singleton +class HomeController @Inject()(cc: ControllerComponents) extends AbstractController(cc) { + + /** + * Create an Action to render an HTML page. + * + * The configuration in the `routes` file means that this method + * will be called when the application receives a `GET` request with + * a path of `/`. + */ + def index() = Action { implicit request: Request[AnyContent] => + Ok(views.html.index()) + } +} diff --git a/contrib/playlib/test/resources/playsingle/app/views/index.scala.html b/contrib/playlib/test/resources/playsingle/app/views/index.scala.html new file mode 100644 index 00000000..68d37fb1 --- /dev/null +++ b/contrib/playlib/test/resources/playsingle/app/views/index.scala.html @@ -0,0 +1,5 @@ +@() + +@main("Welcome to Play") { + <h1>Welcome to Play!</h1> +} diff --git a/contrib/playlib/test/resources/playsingle/app/views/main.scala.html b/contrib/playlib/test/resources/playsingle/app/views/main.scala.html new file mode 100644 index 00000000..808a8b89 --- /dev/null +++ b/contrib/playlib/test/resources/playsingle/app/views/main.scala.html @@ -0,0 +1,25 @@ +@* + * This template is called from the `index` template. This template + * handles the rendering of the page header and body tags. It takes + * two arguments, a `String` for the title of the page and an `Html` + * object to insert into the body of the page. + *@ +@(title: String)(content: Html) + +<!DOCTYPE html> +<html lang="en"> + <head> + @* Here's where we render the page title `String`. *@ + <title>@title</title> + <link rel="stylesheet" media="screen" href="@routes.Assets.versioned("stylesheets/main.css")"> + <link rel="shortcut icon" type="image/png" href="@routes.Assets.versioned("images/favicon.png")"> + + </head> + <body> + @* And here's where we render the `Html` object containing + * the page content. *@ + @content + + <script src="@routes.Assets.versioned("javascripts/main.js")" type="text/javascript"></script> + </body> +</html> diff --git a/contrib/playlib/test/resources/playsingle/conf/application.conf b/contrib/playlib/test/resources/playsingle/conf/application.conf new file mode 100644 index 00000000..233bcc90 --- /dev/null +++ b/contrib/playlib/test/resources/playsingle/conf/application.conf @@ -0,0 +1,2 @@ +# https://www.playframework.com/documentation/latest/Configuration +play.http.secret.key="foobarbaz" diff --git a/contrib/playlib/test/resources/playsingle/conf/routes b/contrib/playlib/test/resources/playsingle/conf/routes new file mode 100644 index 00000000..2ac6b336 --- /dev/null +++ b/contrib/playlib/test/resources/playsingle/conf/routes @@ -0,0 +1,10 @@ +# Routes +# This file defines all application routes (Higher priority routes first) +# https://www.playframework.com/documentation/latest/ScalaRouting +# ~~~~ + +# An example controller showing a sample home page +GET / controllers.HomeController.index + +# Map static resources from the /public folder to the /assets URL path +GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset) diff --git a/contrib/playlib/test/resources/playsingle/test/controllers/HomeControllerSpec.scala b/contrib/playlib/test/resources/playsingle/test/controllers/HomeControllerSpec.scala new file mode 100644 index 00000000..97947556 --- /dev/null +++ b/contrib/playlib/test/resources/playsingle/test/controllers/HomeControllerSpec.scala @@ -0,0 +1,45 @@ +package controllers + +import org.scalatestplus.play._ +import org.scalatestplus.play.guice._ +import play.api.test._ +import play.api.test.Helpers._ + +/** + * Add your spec here. + * You can mock out a whole application including requests, plugins etc. + * + * For more information, see https://www.playframework.com/documentation/latest/ScalaTestingWithScalaTest + */ +class HomeControllerSpec extends PlaySpec with GuiceOneAppPerTest with Injecting { + + "HomeController GET" should { + + "render the index page from a new instance of controller" in { + val controller = new HomeController(stubControllerComponents()) + val home = controller.index().apply(FakeRequest(GET, "/")) + + status(home) mustBe OK + contentType(home) mustBe Some("text/html") + contentAsString(home) must include ("Welcome to Play") + } + + "render the index page from the application" in { + val controller = inject[HomeController] + val home = controller.index().apply(FakeRequest(GET, "/")) + + status(home) mustBe OK + contentType(home) mustBe Some("text/html") + contentAsString(home) must include ("Welcome to Play") + } + + "render the index page from the router" in { + val request = FakeRequest(GET, "/") + val home = route(app, request).get + + status(home) mustBe OK + contentType(home) mustBe Some("text/html") + contentAsString(home) must include ("Welcome to Play") + } + } +} diff --git a/contrib/playlib/test/src/mill/playlib/PlayModuleTests.scala b/contrib/playlib/test/src/mill/playlib/PlayModuleTests.scala new file mode 100644 index 00000000..a04df0bc --- /dev/null +++ b/contrib/playlib/test/src/mill/playlib/PlayModuleTests.scala @@ -0,0 +1,102 @@ +package mill +package playlib + +import ammonite.ops.{Path, cp, ls, mkdir, pwd, rm, _} +import mill.util.{TestEvaluator, TestUtil} +import utest.framework.TestPath +import utest.{TestSuite, Tests, assert, _} + +object PlayModuleTests extends TestSuite { + + object playmulti extends TestUtil.BaseModule{ + object core extends PlayModule { + override def playVersion = T{"2.7.0"} + override def twirlVersion = T{"1.4.0"} + override def scalaVersion = T{"2.12.8"} + object test extends PlayTests + + } + } + + val resourcePath: Path = pwd / 'contrib / 'playlib / 'test / 'resources / 'playmulti + + def workspaceTest[T, M <: TestUtil.BaseModule](m: M, resourcePath: Path = resourcePath) + (t: TestEvaluator => T) + (implicit tp: TestPath): T = { + val eval = new TestEvaluator(m) + rm(m.millSourcePath) + rm(eval.outPath) + mkdir(m.millSourcePath / up) + cp(resourcePath, m.millSourcePath) + t(eval) + } + + def tests: Tests = Tests { + 'playVersion - { + 'fromBuild - workspaceTest(playmulti) { eval => + val Right((result, evalCount)) = eval.apply(playmulti.core.playVersion) + assert( + result == "2.7.0", + evalCount > 0 + ) + } + } + 'layout - { + 'fromBuild - workspaceTest(playmulti) { eval => + val Right((conf, _)) = eval.apply(playmulti.core.conf) + val Right((app, _)) = eval.apply(playmulti.core.app) + val Right((sources, _)) = eval.apply(playmulti.core.sources) + val Right((resources, _)) = eval.apply(playmulti.core.resources) + val Right((testSources, _)) = eval.apply(playmulti.core.test.sources) + val Right((testResources, _)) = eval.apply(playmulti.core.test.resources) + assert( + conf.map(_.path.relativeTo(playmulti.millSourcePath).toString()) == Seq("core/conf"), + app.map(_.path.relativeTo(playmulti.millSourcePath).toString()) == Seq("core/app"), + sources== app, + resources== conf, + testSources.map(_.path.relativeTo(playmulti.millSourcePath).toString()) == Seq("core/test"), + testResources.map(_.path.relativeTo(playmulti.millSourcePath).toString()) == Seq("core/test/resources") + ) + } + } + 'compile - workspaceTest(playmulti) { eval => + val eitherResult = eval.apply(playmulti.core.compile) + val Right((result, evalCount)) = eitherResult + val outputFiles = ls.rec(result.classes.path).filter(_.isFile) + val expectedClassfiles = Seq[RelPath]( + RelPath("controllers/HomeController.class"), + RelPath("controllers/ReverseAssets.class"), + RelPath("controllers/ReverseHomeController.class"), + RelPath("controllers/routes.class"), + RelPath("controllers/routes$javascript.class"), + RelPath("controllers/javascript/ReverseHomeController.class"), + RelPath("controllers/javascript/ReverseAssets.class"), + RelPath("router/Routes$$anonfun$routes$1.class"), + RelPath("router/Routes.class"), + RelPath("router/RoutesPrefix$.class"), + RelPath("router/RoutesPrefix.class"), + RelPath("views/html/index$.class"), + RelPath("views/html/index.class"), + RelPath("views/html/main$.class"), + RelPath("views/html/main.class") + ).map( + eval.outPath / 'core / 'compile / 'dest / 'classes / _ + ) + assert( + result.classes.path == eval.outPath / 'core / 'compile / 'dest / 'classes, + outputFiles.nonEmpty, + outputFiles.forall(expectedClassfiles.contains), + outputFiles.size == 15, + evalCount > 0 + ) + + + // don't recompile if nothing changed + val Right((_, unchangedEvalCount)) = eval.apply(playmulti.core.compile) + + // FIXME the following test should be uncommented once + // https://github.com/lihaoyi/mill/issues/554 is resolved + // assert(unchangedEvalCount == 0) + } + } +} diff --git a/contrib/playlib/test/src/mill/playlib/PlaySingleModuleTests.scala b/contrib/playlib/test/src/mill/playlib/PlaySingleModuleTests.scala new file mode 100644 index 00000000..82e43930 --- /dev/null +++ b/contrib/playlib/test/src/mill/playlib/PlaySingleModuleTests.scala @@ -0,0 +1,98 @@ +package mill.playlib + +import ammonite.ops.{Path, cp, ls, mkdir, pwd, rm, _} +import mill.T +import mill.util.{TestEvaluator, TestUtil} +import utest.framework.TestPath +import utest.{TestSuite, Tests, assert, _} + +object PlaySingleModuleTests extends TestSuite { + + object playsingle extends TestUtil.BaseModule with PlayModule with SingleModule{ + override def playVersion = T{"2.7.0"} + def twirlVersion = T{"1.4.0"} + override def scalaVersion = T{"2.12.8"} + object test extends PlayTests + } + + val resourcePath: Path = pwd / 'contrib / 'playlib / 'test / 'resources / "playsingle" + + def workspaceTest[T, M <: TestUtil.BaseModule](m: M, resourcePath: Path = resourcePath) + (t: TestEvaluator => T) + (implicit tp: TestPath): T = { + val eval = new TestEvaluator(m) + rm(m.millSourcePath) + rm(eval.outPath) + mkdir(m.millSourcePath / up) + cp(resourcePath, m.millSourcePath) + t(eval) + } + + def tests: Tests = Tests { + 'playVersion - { + 'fromBuild - workspaceTest(playsingle) { eval => + val Right((result, evalCount)) = eval.apply(playsingle.playVersion) + assert( + result == "2.7.0", + evalCount > 0 + ) + } + } + 'layout - { + 'fromBuild - workspaceTest(playsingle) { eval => + val Right((conf, _)) = eval.apply(playsingle.conf) + val Right((app, _)) = eval.apply(playsingle.app) + val Right((sources, _)) = eval.apply(playsingle.sources) + val Right((resources, _)) = eval.apply(playsingle.resources) + val Right((testSources, _)) = eval.apply(playsingle.test.sources) + val Right((testResources, _)) = eval.apply(playsingle.test.resources) + assert( + conf.map(_.path.relativeTo(playsingle.millSourcePath).toString()) == Seq("conf"), + app.map(_.path.relativeTo(playsingle.millSourcePath).toString()) == Seq("app"), + sources== app, + resources== conf, + testSources.map(_.path.relativeTo(playsingle.millSourcePath).toString()) == Seq("test"), + testResources.map(_.path.relativeTo(playsingle.millSourcePath).toString()) == Seq("test/resources") + ) + } + } + 'compile - workspaceTest(playsingle) { eval => + val eitherResult = eval.apply(playsingle.compile) + val Right((result, evalCount)) = eitherResult + val outputFiles = ls.rec(result.classes.path).filter(_.isFile) + val expectedClassfiles = Seq[RelPath]( + RelPath("controllers/HomeController.class"), + RelPath("controllers/ReverseAssets.class"), + RelPath("controllers/ReverseHomeController.class"), + RelPath("controllers/routes.class"), + RelPath("controllers/routes$javascript.class"), + RelPath("controllers/javascript/ReverseHomeController.class"), + RelPath("controllers/javascript/ReverseAssets.class"), + RelPath("router/Routes$$anonfun$routes$1.class"), + RelPath("router/Routes.class"), + RelPath("router/RoutesPrefix$.class"), + RelPath("router/RoutesPrefix.class"), + RelPath("views/html/index$.class"), + RelPath("views/html/index.class"), + RelPath("views/html/main$.class"), + RelPath("views/html/main.class") + ).map( + eval.outPath / 'compile / 'dest / 'classes / _ + ) + assert( + result.classes.path == eval.outPath / 'compile / 'dest / 'classes, + outputFiles.nonEmpty, + outputFiles.forall(expectedClassfiles.contains), + outputFiles.size == 15, + evalCount > 0 + ) + + // don't recompile if nothing changed + val Right((_, unchangedEvalCount)) = eval.apply(playsingle.compile) + + // FIXME the following test should be uncommented once + // https://github.com/lihaoyi/mill/issues/554 is resolved + // assert(unchangedEvalCount == 0) + } + } +} diff --git a/contrib/playlib/test/src/mill/playlib/HelloWorldTests.scala b/contrib/playlib/test/src/mill/playlib/RouterModuleTests.scala index 54e8a057..1aeed019 100644 --- a/contrib/playlib/test/src/mill/playlib/HelloWorldTests.scala +++ b/contrib/playlib/test/src/mill/playlib/RouterModuleTests.scala @@ -7,7 +7,7 @@ import mill.util.{TestEvaluator, TestUtil} import utest.framework.TestPath import utest.{TestSuite, Tests, assert, _} -object HelloWorldTests extends TestSuite { +object RouterModuleTests extends TestSuite { trait HelloBase extends TestUtil.BaseModule { override def millSourcePath: Path = TestUtil.getSrcPathBase() / millOuterCtx.enclosing.split('.') |