summaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
authorJean Helou <jhe@codamens.fr>2019-02-15 17:07:57 +0100
committerTobias Roeser <le.petit.fou@web.de>2019-03-11 07:41:03 +0100
commit9da90531dbc8d8dd8f7630376cbfc3bfafdac2ef (patch)
treed05f3a455ba8e6179e9f2add70ab061ff75faa8f /contrib
parent1b2e42c1aab0a7ab02056e6d9e2aa65b137adc83 (diff)
downloadmill-9da90531dbc8d8dd8f7630376cbfc3bfafdac2ef.tar.gz
mill-9da90531dbc8d8dd8f7630376cbfc3bfafdac2ef.tar.bz2
mill-9da90531dbc8d8dd8f7630376cbfc3bfafdac2ef.zip
Adds tests for the PlayModule and SingleModule
Diffstat (limited to 'contrib')
-rw-r--r--contrib/playlib/test/resources/playmulti/core/app/controllers/HomeController.scala24
-rw-r--r--contrib/playlib/test/resources/playmulti/core/app/views/index.scala.html5
-rw-r--r--contrib/playlib/test/resources/playmulti/core/app/views/main.scala.html25
-rw-r--r--contrib/playlib/test/resources/playmulti/core/conf/application.conf2
-rw-r--r--contrib/playlib/test/resources/playmulti/core/conf/routes10
-rw-r--r--contrib/playlib/test/resources/playmulti/core/test/controllers/HomeControllerSpec.scala45
-rw-r--r--contrib/playlib/test/resources/playsingle/app/controllers/HomeController.scala24
-rw-r--r--contrib/playlib/test/resources/playsingle/app/views/index.scala.html5
-rw-r--r--contrib/playlib/test/resources/playsingle/app/views/main.scala.html25
-rw-r--r--contrib/playlib/test/resources/playsingle/conf/application.conf2
-rw-r--r--contrib/playlib/test/resources/playsingle/conf/routes10
-rw-r--r--contrib/playlib/test/resources/playsingle/test/controllers/HomeControllerSpec.scala45
-rw-r--r--contrib/playlib/test/src/mill/playlib/PlayModuleTests.scala102
-rw-r--r--contrib/playlib/test/src/mill/playlib/PlaySingleModuleTests.scala98
-rw-r--r--contrib/playlib/test/src/mill/playlib/RouterModuleTests.scala (renamed from contrib/playlib/test/src/mill/playlib/HelloWorldTests.scala)2
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('.')