Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

assets are not loaded in functional test mode

The answer to my problem is probably very simple and stupid but, can't find it by myself so far. Using Play Framework, emberjs and FluentLenium, I wrote a very simple functional test but can't make it works under IntelliJ IDEA 13. For some reason, every assets located in the public/ and app/ folders are not found when I run the test with IntelliJ.

Here's my code :

import org.junit.Test;
import play.libs.F.Callback;
import play.test.TestBrowser;
import play.test.WithApplication;

import static org.fest.assertions.Assertions.assertThat;
import static play.test.Helpers.*;

public class HomePageTest extends FluentTests {

    @Test
    public void hello_world_test() {
        running(testServer(3333, fakeApplication(inMemoryDatabase())), FIREFOX, new Callback<TestBrowser>() {
            public void invoke(TestBrowser browser) {
                HomePage homePage = new HomePage(browser.getDriver());
                homePage.go();
                homePage.isAt();
                assertThat(browser.pageSource()).contains("Hello world!");
            }
        });
    }
}

public class HomePage extends BaseFluentPage {

    public HomePage(WebDriver driver) {
        super(driver);
    }

    @Override
    public String getUrl() {
        return BASE_URL;
    }

    @Override
    public void isAt() {
        await().atMost(TIMEOUT).until(".ember-application").isPresent();
    }
}

public abstract class BaseFluentPage extends FluentPage {

    protected static final String BASE_URL = "http://localhost:3333/#/";
    protected static final int TIMEOUT = 5000;

    protected BaseFluentPage(WebDriver driver) {
        super(driver);
    }
}

Here's the error message I receive in IntelliJ IDEA logs :

[[36mdebug[0m] application - Unforseen error for lib/jquery/jquery.js at /public
java.lang.RuntimeException: no resource
    at controllers.Assets$$anonfun$controllers$Assets$$assetInfoFromResource$1$$anonfun$10.apply(Assets.scala:214) ~[play_2.11-2.3.0.jar:na]
    at controllers.Assets$$anonfun$controllers$Assets$$assetInfoFromResource$1$$anonfun$10.apply(Assets.scala:214) ~[play_2.11-2.3.0.jar:na]
    at scala.Option.getOrElse(Option.scala:120) [scala-library-2.11.1.jar:na]
    at controllers.Assets$$anonfun$controllers$Assets$$assetInfoFromResource$1.apply(Assets.scala:214) ~[play_2.11-2.3.0.jar:na]
    at controllers.Assets$$anonfun$controllers$Assets$$assetInfoFromResource$1.apply(Assets.scala:213) ~[play_2.11-2.3.0.jar:na]

Thanks!

UPDATE:

My config is almost brand new. I used the activator command line to create the project and generate the idea config files. Here's a look to my current folder structure (I list only the ones missing when I run my integration tests) :

app >>
    assets >>
        javascripts >>
            app.js
public >>
    stylesheets >>
        style.css
    images >>
        favicon.ico

Everything is working when I run my test with the command line

activator test

UPDATE 2

Since I didn't find the solution yet, I provide more code and infos on my configuration so maybe someone will spot the problem.

index.scala.html :

<html>
    <head>
        <title>Facebook-API</title>

        <link rel="stylesheet" media="screen" href="@routes.Assets.at("lib/bootstrap/css/bootstrap.min.css")">
        <link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/style.css")">
        <link rel="shortcut icon" type="image/png" href="@routes.Assets.at("images/favicon.png")">

        <script src="@routes.Assets.at("lib/jquery/jquery.js")"  type="text/javascript"></script>
        <script src="@routes.Assets.at("lib/bootstrap/js/bootstrap.min.js")"></script>
        <script src="@routes.Assets.at("lib/handlebars/handlebars.js")"  type="text/javascript")"></script>
        <script src="@routes.Assets.at("lib/emberjs/ember.js")"  type="text/javascript"></script>
        <script src="@routes.Assets.at("lib/emberjs-data/ember-data.js")"  type="text/javascript")"></script>
        <script src="@routes.Assets.at("javascripts/app.js")"  type="text/javascript")"></script>
    </head>
    <body>
        @ember_content
    </body>
</html>

plugins.sbt :

resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"

// The Play plugin
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.3.2")

// web plugins

addSbtPlugin("com.typesafe.sbt" % "sbt-less" % "1.0.0")

addSbtPlugin("com.typesafe.sbt" % "sbt-jshint" % "1.0.0")

addSbtPlugin("com.typesafe.sbt" % "sbt-rjs" % "1.0.1")

addSbtPlugin("com.typesafe.sbt" % "sbt-digest" % "1.0.0")

addSbtPlugin("com.typesafe.sbt" % "sbt-mocha" % "1.0.0")

addSbtPlugin("com.typesafe.sbt" % "sbt-web" % "1.0.2")

build.sbt :

name := """facebook-api"""

version := "1.0-SNAPSHOT"

lazy val root = (project in file(".")).enablePlugins(PlayJava, SbtWeb)

scalaVersion := "2.11.1"

libraryDependencies ++= Seq(
  javaJdbc,
  javaEbean,
  cache,
  javaWs,
  "org.webjars" % "bootstrap" % "3.2.0",
  "org.webjars" % "jquery" % "2.1.1",
  "org.webjars" % "handlebars" % "1.3.0",
  "org.webjars" % "emberjs" % "1.5.0",
  "org.webjars" % "emberjs-data" % "1.0.0-beta.8"
)

UPDATE 3:

I updated again my post to reflect my current project structure and code (see above). I modified my code to use WebJars instead of manually downloaded js libs, followed the steps of migration to Play 2.3.X, updated to the last Play version and followed the steps to correctly import a SBT & Play project in IntelliJ specified in Play documentation. Now, when I run my tests from IntelliJ, I still get the same error but, I can see that there's a web/ folder generated in target/ containing a folder test/ which contains every assets I have in my project with the correct folder structure. I added this folder as a Resource/Test Resource folder in IntelliJ but still no success. I also added my public folder with the same result.

I really feel I'm getting closer to the solution. In fact, I tried many things and found that if I remove the sbt-rjs plugin (which is RequireJS), running code in dev (activator run) crashed with the same error. I didn't set yet RequireJS (add the main.js file) for my JS files and don't want to do it until I really need it except if it solves my problem. Any thoughts about it?

like image 349
Jeep87c Avatar asked Jul 16 '14 22:07

Jeep87c


2 Answers

Finally, here's the solution to this problem.

I added this line to my build.sbt file :

For SBT 0.x:

unmanagedResourceDirectories in Test <+=  baseDirectory ( _ /"target/web/public/test" )

For SBT 1.x:

unmanagedResourceDirectories in Test +=  baseDirectory ( _ /"target/web/public/test" ).value

Thanks to @MarkVedder and @JarmoPertman for their great comments who put me on this solution!

like image 63
Jeep87c Avatar answered Oct 23 '22 22:10

Jeep87c


For others that come looking for a solution to this, we were having problems getting assets to load properly in our functional test run under Scala 2.12 and Play Framework 2.6. Following the advice on the accepted answer here, we tried adding:

unmanagedResourceDirectories in FunctionalTest += 
  baseDirectory ( _ /"target/web/public/test" ).value

And that appeared to work - at least locally. However, things were still failing on our CI side. Mentioned in another comment here was this old Play Framework issue: https://github.com/playframework/playframework/issues/3234, we tried adding the web-test:assets command prior to running our functional test suite, and that also appeared to fix it as we could see locally that the assets got moved into the target/web/public/test directory. Still having problems though getting it to consistently pass or pass at all on our CI side.

Knowing that sbt-web was involved in this process, going back over the sbt-web docs there was a little hidden item in the readme on https://github.com/sbt/sbt-web:

To automatically add the production-ready assets to classpath, the following might be useful:

(managedClasspath in Runtime) += (packageBin in Assets).value

Modifying that line slighty to work with our FunctionalTest config:

(managedClasspath in FunctionalTest) += (packageBin in Assets).value

and now it is passing ALL THE TIME both locally and on CI. No other SBT lines were needed, and we REMOVED the

unmanagedResourceDirectories in FunctionalTest +=
  baseDirectory ( _ /"target/web/public/test" ).value

line as it was no longer needed.

like image 23
rmmeans Avatar answered Oct 24 '22 00:10

rmmeans