summaryrefslogtreecommitdiff
path: root/contrib/playlib/test/src/mill/playlib/RouterModuleTests.scala
blob: dbab30ca5766b7f4751e494dcc13801df0961ffc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package mill.playlib

import ammonite.ops.{Path, cp, ls, mkdir, pwd, rm, _}
import mill.T
import mill.api.Result.Failure
import mill.util.{TestEvaluator, TestUtil}
import utest.framework.TestPath
import utest.{TestSuite, Tests, assert, _}

object RouterModuleTests extends TestSuite {

  trait HelloBase extends TestUtil.BaseModule {
    override def millSourcePath: Path = TestUtil.getSrcPathBase() / millOuterCtx.enclosing.split('.')
  }

  trait HelloWorldModule extends mill.playlib.RouterModule {
    def playVersion = "2.6.15"
  }

  object HelloWorld extends HelloBase {

    object core extends HelloWorldModule {
      override def playVersion = "2.6.14"

      /**
        * What version of Scala to use
        */
      override def scalaVersion: T[String] = "2.12.8"
    }

  }

  val resourcePath: Path = pwd / 'contrib / 'playlib / 'test / 'resources / "hello-world"
  val invalidResourcePath: Path = pwd / 'contrib / 'playlib / 'test / 'resources / "invalid"
  val invalidSubResourcePath: Path = pwd / 'contrib / 'playlib / 'test / 'resources / "invalidsub"

  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 {
    test("playVersion"){

      test("fromBuild") - workspaceTest(HelloWorld) { eval =>
        val Right((result, evalCount)) = eval.apply(HelloWorld.core.playVersion)

        assert(
          result == "2.6.14",
          evalCount > 0
        )
      }
    }
    test("compileRouter") - workspaceTest(HelloWorld) { eval =>
      val eitherResult = eval.apply(HelloWorld.core.compileRouter)
      val Right((result, evalCount)) = eitherResult
      val outputFiles = ls.rec(result.classes.path).filter(_.isFile)
      val expectedClassfiles = Seq[RelPath](
        RelPath("controllers/ReverseRoutes.scala"),
        RelPath("controllers/routes.java"),
        RelPath("router/Routes.scala"),
        RelPath("router/RoutesPrefix.scala"),
        RelPath("sub/Routes.scala"),
        RelPath("sub/RoutesPrefix.scala"),
        RelPath("controllers/javascript/JavaScriptReverseRoutes.scala")
      ).map(
        eval.outPath / 'core / 'compileRouter / 'dest / _
      )
      assert(
        result.classes.path == eval.outPath / 'core / 'compileRouter / 'dest,
        outputFiles.nonEmpty,
        outputFiles.forall(expectedClassfiles.contains),
        outputFiles.size == 7,
        evalCount > 0
      )

      // don't recompile if nothing changed
      val Right((_, unchangedEvalCount)) = eval.apply(HelloWorld.core.compileRouter)

      assert(unchangedEvalCount == 0)
    }
    "compileRouter invalid routes"- workspaceTest(HelloWorld, resourcePath = invalidResourcePath) {
      eval =>
      val eitherResult = eval.apply(HelloWorld.core.compileRouter)
      val Left(Failure(message, x)) = eitherResult
      val expectedMessage = "Unable to compile play routes\ncompilation error in " +
        HelloWorld.core.millSourcePath.toIO.getAbsolutePath + "/routes/routes at line 4, " +
        "column" +
        " 1: HTTP Verb (GET, POST, ...), include (->), comment (#), or modifier line (+) expected"
      assert(
        message == expectedMessage
      )
    }
    "compileRouter invalid sub.routes " - workspaceTest(HelloWorld, resourcePath = invalidSubResourcePath) {
      eval =>
      val eitherResult = eval.apply(HelloWorld.core.compileRouter)
      val Left(Failure(message, x)) = eitherResult
      val expectedMessage = "Unable to compile play routes\ncompilation error in " +
        HelloWorld.core.millSourcePath.toIO.getAbsolutePath + "/routes/sub.routes at line 3, column" +
        " 1: HTTP Verb (GET, POST, ...), include (->), comment (#), or modifier line (+) expected"
      assert(
        message == expectedMessage
      )
    }
  }
}