123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- 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, debug_port) {
- if (debug_port) {
- casper_opts.child['remote-debugger-port'] = debug_port;
- var debug_url = ('https://localhost:' + debug_port +
- '/webkit/inspector/inspector.html?page=');
- console.info('[remote-debugger] Navigate to ' + debug_url + '1 and ' +
- 'run `__run();` in the console to continue loading.' +
- '\n[remote-debugger] Navigate to ' + debug_url + '2 to ' +
- 'view the actual page source.\n' +
- '[remote-debugger] Use the `debugger;` statement to ' +
- 'trigger an initial breakpoint.');
- }
- 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)'
- };
|