Travis CI setup

Specs are run with PhantomJS via phantom-jasmine:
https://github.com/jcarver989/phantom-jasmine
This commit is contained in:
John Firebaugh
2012-12-03 09:42:22 -05:00
parent 7c7f64f41a
commit 65357a09c0
5 changed files with 202 additions and 21 deletions
+1
View File
@@ -0,0 +1 @@
script: cd test && phantomjs lib/run_jasmine_test.coffee index.html
+25 -21
View File
@@ -7,6 +7,8 @@
<link rel="stylesheet" type="text/css" href="lib/jasmine-1.2.0/jasmine.css">
<script type="text/javascript" src="lib/jasmine-1.2.0/jasmine.js"></script>
<script type="text/javascript" src="lib/jasmine-1.2.0/jasmine-html.js"></script>
<script type="text/javascript" src="lib/console-runner.js"></script>
<script type="text/javascript" src="lib/bind-shim.js"></script>
<script type="text/javascript" src="lib/happen.js"></script>
<!-- include source files here... -->
@@ -18,31 +20,31 @@
<script type='text/javascript' src='../js/lib/ohauth.js'></script>
<script type='text/javascript' src='../js/lib/jxon.js'></script>
<script type='text/javascript' src='../js/iD/id.js'></script>
<script type='text/javascript' src='../js/iD/util.js'></script>
<script type='text/javascript' src='../js/iD/oauth.js'></script>
<script type='text/javascript' src='../js/iD/renderer/style.js'></script>
<script type='text/javascript' src='../js/id/id.js'></script>
<script type='text/javascript' src='../js/id/util.js'></script>
<script type='text/javascript' src='../js/id/oauth.js'></script>
<script type='text/javascript' src='../js/id/renderer/style.js'></script>
<script type='text/javascript' src='../js/iD/renderer/background.js'></script>
<script type='text/javascript' src='../js/iD/renderer/map.js'></script>
<script type='text/javascript' src='../js/iD/renderer/hash.js'></script>
<script type='text/javascript' src='../js/iD/renderer/markers.js'></script>
<script type='text/javascript' src='../js/iD/ui/inspector.js'></script>
<script type='text/javascript' src='../js/id/renderer/background.js'></script>
<script type='text/javascript' src='../js/id/renderer/map.js'></script>
<script type='text/javascript' src='../js/id/renderer/hash.js'></script>
<script type='text/javascript' src='../js/id/renderer/markers.js'></script>
<script type='text/javascript' src='../js/id/ui/inspector.js'></script>
<script type='text/javascript' src='../js/iD/actions/modes.js'></script>
<script type='text/javascript' src='../js/iD/actions/actions.js'></script>
<script type='text/javascript' src='../js/id/actions/modes.js'></script>
<script type='text/javascript' src='../js/id/actions/actions.js'></script>
<script type='text/javascript' src='../js/iD/controller/controller.js'></script>
<script type='text/javascript' src='../js/id/controller/controller.js'></script>
<script type='text/javascript' src='../js/iD/format/format.js'></script>
<script type='text/javascript' src='../js/iD/format/geojson.js'></script>
<script type='text/javascript' src='../js/iD/format/xml.js'></script>
<script type='text/javascript' src='../js/id/format/format.js'></script>
<script type='text/javascript' src='../js/id/format/geojson.js'></script>
<script type='text/javascript' src='../js/id/format/xml.js'></script>
<script type='text/javascript' src='../js/iD/graph/entity.js'></script>
<script type='text/javascript' src='../js/iD/graph/way.js'></script>
<script type='text/javascript' src='../js/iD/graph/graph.js'></script>
<script type='text/javascript' src='../js/iD/graph/history.js'></script>
<script type='text/javascript' src='../js/iD/connection.js'></script>
<script type='text/javascript' src='../js/id/graph/entity.js'></script>
<script type='text/javascript' src='../js/id/graph/way.js'></script>
<script type='text/javascript' src='../js/id/graph/graph.js'></script>
<script type='text/javascript' src='../js/id/graph/history.js'></script>
<script type='text/javascript' src='../js/id/connection.js'></script>
<!-- include spec files here... -->
<script type="text/javascript" src="spec/util.js"></script>
@@ -66,9 +68,11 @@
jasmineEnv.updateInterval = 1000;
var htmlReporter = new jasmine.HtmlReporter();
jasmineEnv.addReporter(htmlReporter);
window.console_reporter = new jasmine.ConsoleReporter();
jasmineEnv.addReporter(console_reporter);
jasmineEnv.specFilter = function (spec) {
return htmlReporter.specFilter(spec);
};
+26
View File
@@ -0,0 +1,26 @@
// PhantomJS is missing Function.prototype.bind:
// http://code.google.com/p/phantomjs/issues/detail?id=522
if (!Function.prototype.bind) {
Function.prototype.bind = function (oThis) {
if (typeof this !== "function") {
// closest thing possible to the ECMAScript 5 internal IsCallable function
throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
}
var aArgs = Array.prototype.slice.call(arguments, 1),
fToBind = this,
fNOP = function () {},
fBound = function () {
return fToBind.apply(this instanceof fNOP && oThis
? this
: oThis,
aArgs.concat(Array.prototype.slice.call(arguments)));
};
fNOP.prototype = this.prototype;
fBound.prototype = new fNOP();
return fBound;
};
}
+104
View File
@@ -0,0 +1,104 @@
/**
Jasmine Reporter that outputs test results to the browser console.
Useful for running in a headless environment such as PhantomJs, ZombieJs etc.
Usage:
// From your html file that loads jasmine:
jasmine.getEnv().addReporter(new jasmine.ConsoleReporter());
jasmine.getEnv().execute();
*/
(function(jasmine, console) {
if (!jasmine) {
throw "jasmine library isn't loaded!";
}
var ANSI = {}
ANSI.color_map = {
"green" : 32,
"red" : 31
}
ANSI.colorize_text = function(text, color) {
var color_code = this.color_map[color];
return "\033[" + color_code + "m" + text + "\033[0m";
}
var ConsoleReporter = function() {
if (!console || !console.log) { throw "console isn't present!"; }
this.status = this.statuses.stopped;
};
var proto = ConsoleReporter.prototype;
proto.statuses = {
stopped : "stopped",
running : "running",
fail : "fail",
success : "success"
};
proto.reportRunnerStarting = function(runner) {
this.status = this.statuses.running;
this.start_time = (new Date()).getTime();
this.executed_specs = 0;
this.passed_specs = 0;
this.log("Starting...");
};
proto.reportRunnerResults = function(runner) {
var failed = this.executed_specs - this.passed_specs;
var spec_str = this.executed_specs + (this.executed_specs === 1 ? " spec, " : " specs, ");
var fail_str = failed + (failed === 1 ? " failure in " : " failures in ");
var color = (failed > 0)? "red" : "green";
var dur = (new Date()).getTime() - this.start_time;
this.log("");
this.log("Finished");
this.log("-----------------");
this.log(spec_str + fail_str + (dur/1000) + "s.", color);
this.status = (failed > 0)? this.statuses.fail : this.statuses.success;
/* Print something that signals that testing is over so that headless browsers
like PhantomJs know when to terminate. */
this.log("");
this.log("ConsoleReporter finished");
};
proto.reportSpecStarting = function(spec) {
this.executed_specs++;
};
proto.reportSpecResults = function(spec) {
if (spec.results().passed()) {
this.passed_specs++;
return;
}
var resultText = spec.suite.description + " : " + spec.description;
this.log(resultText, "red");
var items = spec.results().getItems()
for (var i = 0; i < items.length; i++) {
var trace = items[i].trace.stack || items[i].trace;
this.log(trace, "red");
}
};
proto.reportSuiteResults = function(suite) {
if (!suite.parentSuite) { return; }
var results = suite.results();
var failed = results.totalCount - results.passedCount;
var color = (failed > 0)? "red" : "green";
this.log(suite.description + ": " + results.passedCount + " of " + results.totalCount + " passed.", color);
};
proto.log = function(str, color) {
var text = (color != undefined)? ANSI.colorize_text(str, color) : str;
console.log(text)
};
jasmine.ConsoleReporter = ConsoleReporter;
})(jasmine, console);
+46
View File
@@ -0,0 +1,46 @@
#!/usr/local/bin/phantomjs
# Runs a Jasmine Suite from an html page
# @page is a PhantomJs page object
# @exit_func is the function to call in order to exit the script
class PhantomJasmineRunner
constructor: (@page, @exit_func = phantom.exit) ->
@tries = 0
@max_tries = 10
get_status: -> @page.evaluate(-> console_reporter.status)
terminate: ->
switch @get_status()
when "success" then @exit_func 0
when "fail" then @exit_func 1
else @exit_func 2
# Script Begin
if phantom.args.length == 0
console.log "Need a url as the argument"
phantom.exit 1
page = new WebPage()
runner = new PhantomJasmineRunner(page)
# Don't supress console output
page.onConsoleMessage = (msg) ->
console.log msg
# Terminate when the reporter singals that testing is over.
# We cannot use a callback function for this (because page.evaluate is sandboxed),
# so we have to *observe* the website.
if msg == "ConsoleReporter finished"
runner.terminate()
address = phantom.args[0]
page.open address, (status) ->
if status != "success"
console.log "can't load the address!"
phantom.exit 1
# Now we wait until onConsoleMessage reads the termination signal from the log.