run_from_console.zombie.js 2.67 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
var Browser = require('zombie');
var path = require('path');
var EventEmitter = require('events').EventEmitter;
var Q = require('q');

var provide_emitter = function(file_paths) {
  var emitter = new EventEmitter();

  file_paths.reduce(function(prom, file_path, path_ind) {
    return prom.then(function(browser) {
      browser.visit('file://'+file_path, function() {
        if (browser.error) throw new Error(browser.errors);

        var res_json = {};
        res_json.file_ind = path_ind;

        res_json.num_tests = browser.querySelectorAll('li.test').length;
        res_json.num_fails = browser.querySelectorAll('li.test.fail').length;
        res_json.num_passes = browser.querySelectorAll('li.test.pass').length;
        res_json.num_slow = browser.querySelectorAll('li.test.pass:not(.fast)').length;
21
        res_json.num_skipped = browser.querySelectorAll('li.test.pending').length;
22 23 24 25
        res_json.duration = browser.text('li.duration em');

        var traverse_node = function(elem) {
          var classList = elem.className.split(' ');
26
          var res;
27
          if (classList.indexOf('suite') > -1) {
28
            res = {
29 30 31
              type: 'suite',
              name: elem.querySelector('h1').textContent,
              has_subfailures: elem.querySelectorAll('li.test.fail').length > 0
32
            };
33 34 35 36 37 38 39

            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;
40
            res = {
41 42
              type: 'test',
              text: h2_content[0].textContent
43
            };
44 45 46

            if (classList.indexOf('pass') > -1) {
              res.pass = true;
47 48 49 50 51 52 53 54 55
              if (classList.indexOf('pending') > -1) {
                res.slow = false;
                res.skipped = true;
              }
              else {
                res.slow = classList.indexOf('fast') < 0;
                res.skipped = false;
                res.duration = h2_content[1].textContent;
              }
56 57 58 59 60 61 62
            }
            else {
              res.error = elem.querySelector('pre.error').textContent;
            }

            return res;
          }
63
        };
64 65 66 67 68 69 70 71 72 73 74 75 76

        var top_suites = browser.querySelectorAll('#mocha-report > li.suite');
        res_json.suites = Array.prototype.map.call(top_suites, traverse_node);
        res_json.replay = browser.querySelector('a.replay').textContent;

        emitter.emit('test_ready', res_json);
      });

      return new Browser();
    });
  }, Q(new Browser()));

  return emitter;
77
};
78 79 80 81

module.exports = {
  provide_emitter: provide_emitter,
  name: 'ZombieJS'
82
};