1284169a43
This adds support for Travis CI and SauceLabs testing. Testing on SauceLabs in done via the Karma test runner. Note that encrypted Sauce username and access key values need to be inserted into .travis.yml as global environment variables. Additionally, the local test runner (which is still useful for debugging tests and code) was updated to reflect that the 'node_modules' folder now gets placed in the root directory.
103 lines
3.5 KiB
JavaScript
103 lines
3.5 KiB
JavaScript
var Spooky = require('spooky');
|
|
var path = require('path');
|
|
|
|
var phantom_path = require('phantomjs').path;
|
|
var casper_path = path.resolve(__dirname, '../node_modules/casperjs/bin/casperjs');
|
|
process.env.PHANTOMJS_EXECUTABLE = phantom_path;
|
|
var casper_opts = {
|
|
child: {
|
|
transport: 'http',
|
|
command: casper_path
|
|
},
|
|
casper: {
|
|
logLevel: 'debug',
|
|
verbose: true
|
|
}
|
|
};
|
|
|
|
var provide_emitter = function(file_paths) {
|
|
var spooky = new Spooky(casper_opts, function(err) {
|
|
if (err) {
|
|
if (err.stack) console.warn(err.stack);
|
|
else console.warn(err);
|
|
return;
|
|
}
|
|
spooky.start('about:blank');
|
|
|
|
file_paths.forEach(function(file_path, path_ind) {
|
|
spooky.thenOpen('file://'+file_path);
|
|
spooky.waitFor(function() {
|
|
return this.getGlobal('__mocha_done') === true;
|
|
},
|
|
[{ path_ind: path_ind }, function() {
|
|
var res_json = {
|
|
file_ind: path_ind
|
|
};
|
|
|
|
res_json.num_tests = this.evaluate(function() { return document.querySelectorAll('li.test').length; });
|
|
res_json.num_passes = this.evaluate(function() { return document.querySelectorAll('li.test.pass').length; });
|
|
res_json.num_fails = this.evaluate(function() { return document.querySelectorAll('li.test.fail').length; });
|
|
res_json.num_slow = this.evaluate(function() { return document.querySelectorAll('li.test.pass:not(.fast):not(.pending)').length; });
|
|
res_json.num_skipped = this.evaluate(function () { return document.querySelectorAll('li.test.pending').length; });
|
|
res_json.duration = this.evaluate(function() { return document.querySelector('li.duration em').textContent; });
|
|
|
|
res_json.suites = this.evaluate(function() {
|
|
var traverse_node = function(elem) {
|
|
var res;
|
|
if (elem.classList.contains('suite')) {
|
|
res = {
|
|
type: 'suite',
|
|
name: elem.querySelector('h1').textContent,
|
|
has_subfailures: elem.querySelectorAll('li.test.fail').length > 0,
|
|
};
|
|
|
|
var child_elems = elem.querySelector('ul').children;
|
|
res.children = Array.prototype.map.call(child_elems, traverse_node);
|
|
return res;
|
|
}
|
|
else {
|
|
var h2_content = elem.querySelector('h2').childNodes;
|
|
res = {
|
|
type: 'test',
|
|
text: h2_content[0].textContent,
|
|
};
|
|
|
|
if (elem.classList.contains('pass')) {
|
|
res.pass = true;
|
|
if (elem.classList.contains('pending')) {
|
|
res.slow = false;
|
|
res.skipped = true;
|
|
}
|
|
else {
|
|
res.slow = !elem.classList.contains('fast');
|
|
res.skipped = false;
|
|
res.duration = h2_content[1].textContent;
|
|
}
|
|
}
|
|
else {
|
|
res.error = elem.querySelector('pre.error').textContent;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
};
|
|
var top_suites = document.querySelectorAll('#mocha-report > li.suite');
|
|
return Array.prototype.map.call(top_suites, traverse_node);
|
|
});
|
|
|
|
res_json.replay = this.evaluate(function() { return document.querySelector('a.replay').textContent; });
|
|
|
|
this.emit('test_ready', res_json);
|
|
}]);
|
|
});
|
|
spooky.run();
|
|
});
|
|
|
|
return spooky;
|
|
};
|
|
|
|
module.exports = {
|
|
provide_emitter: provide_emitter,
|
|
name: 'SpookyJS (CapserJS on PhantomJS)'
|
|
};
|