Testing client side apps requires a couple of tedious steps: Organizing the git clone, the dependencies, wrangling up a web server, the test framework, etc.
When testing a plugin for jbrowse, the dependency tree is interesting because the plugin "depends" on JBrowse to run, but we will use travis-CI and bower inside the git repo for our plugin to accomplish this.
In this scenario, we will
Use bower to install jasmine and JBrowse (our platform that we write the plugin for)
Use nginx to launch a webserver on travis-CI
Use the phantomjs run-jasmine.js script to check jasmine test results
Without further ado
Here is the .travis.yml
sudo: false
addons:
apt:
packages:
- nginx
cache:
apt: true
directories:
- $HOME/.cache/bower
before_install:
- npm install -g jshint bower
install:
- bower install
before_script:
- cat test/travis.conf | envsubst > test/travis-envsubst.conf
- nginx -c `pwd`/test/travis-envsubst.conf
script:
- phantomjs test/run-jasmine.js http://localhost:9000/test/
- jshint js
Refer to http://searchvoidstar.tumblr.com/post/141858047213/running-nginx-on-containerised-travis-ci-pt-2 for details on the nginx setup
Here is the bower.json
{
"name": "sashimiplot",
"homepage": "https://github.com/cmdcolin/sashimiplot",
"description": "Sashimi track type for jbrowse",
"main": "js/main.js",
"keywords": ["bioinformatics", "jbrowse"],
"license": "MIT",
"ignore": [
"**/.*",
"node_modules",
"bower_components",
"src",
"test",
"tests"
],
"devDependencies": {
"jasmine-core": "jasmine#^2.4.1",
"jbrowse": "git://github.com/GMOD/jbrowse.git#master"
}
}
The key thing here is that it installs jasmine and JBrowse. I set .bowerrc to install both jasmine and JBrowse to the "test" directory
{
"directory": "test"
}
With this setup, bower will make a "flat dependency tree" in the test directory, so it will look like this
$ ls -1 test
FileSaver
dbind
dgrid
dijit
dojo
dojox
*index.html*
jDataView
jasmine-core
jbrowse
json-schema
jszlib
lazyload
put-selector
*run-jasmine.js*
*spec*
*travis.conf*
util
xstyle
Here the asterisks indicate things that are part of our app, other's are automatically installed by bower (jbrowse, jasmine-core, the dojo dependencies, and other things)
Then we can create the jasmine test/index.html to be something like this
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<meta />
Jasmine Spec Runner
<link rel="stylesheet" href="jasmine-core/lib/jasmine-core/jasmine.css" />
<script src="jasmine-core/lib/jasmine-core/jasmine.js"></script>
<script src="jasmine-core/lib/jasmine-core/boot.js"></script>
<script
type="text/javascript"
src="dojo/dojo.js"
data-dojo-config="async: 1"
></script>
<script type="text/javascript">
require({
baseUrl: '.',
packages: [
'dojo',
'dijit',
'dojox',
'jszlib',
{ name: 'lazyload', location: 'lazyload', main: 'lazyload' },
'dgrid',
'xstyle',
'put-selector',
'FileSaver',
{ name: 'jDataView', location: 'jDataView/src', main: 'jdataview' },
{ name: 'JBrowse', location: 'jbrowse/src/JBrowse' },
{ name: 'SashimiPlot', location: '../js' },
],
})
</script>
<script type="text/javascript" src="spec/SashimiPlot.spec.js"></script>
<div id="sandbox" style="overflow:hidden; height:1px;"></div>
The "packages" in the require statement puts all these packages in the right
"namespace" for the AMD includes, and the "specs" are defined like
<script type="text/javascript" src="spec/Projection.spec.js"></script>
Finally, run-jasmine.js is used to check the results of the jasmine tests (it is run via phantomjs in the travis-CI script). It is a special version for the most recent version of jasmine (2.4) https://gist.github.com/vmeln/b6cbb319d9a0efc816be
For an example of the project using this, see https://github.com/cmdcolin/sashimiplot