summaryrefslogtreecommitdiff
path: root/contrib/playlib/test/src/mill/playlib/PlayModuleTests.scala
blob: f6313589dfbfb1c8d6994423e0e1ac870360e2db (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
113
114
115
116
117
118
119
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
      override def ivyDeps = T { super.ivyDeps() ++ Agg(ws())}
    }
  }

  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.map(_.path.relativeTo(playmulti.millSourcePath).toString()).contains("core/conf"),
          testSources.map(_.path.relativeTo(playmulti.millSourcePath).toString()) == Seq("core/test"),
          testResources.map(_.path.relativeTo(playmulti.millSourcePath).toString()) == Seq("core/test/resources")
        )
      }
    }
    'dependencies - {
      'fromBuild - workspaceTest(playmulti) { eval =>
        val Right((deps, evalCount)) = eval.apply(playmulti.core.ivyDeps)
        val expectedModules = Seq[String](
          "play",
          "play-guice",
          "play-server",
          "play-logback",
          "play-ahc-ws"
        )
        val outputModules = deps.map(_.dep.module.name)
        assert(
          outputModules.forall(expectedModules.contains),
          evalCount > 0
        )
      }
    }
    '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)
    }
  }
}