run_from_console.zombie.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. var Browser = require('zombie');
  2. var path = require('path');
  3. var EventEmitter = require('events').EventEmitter;
  4. var Q = require('q');
  5. var provide_emitter = function(file_paths) {
  6. var emitter = new EventEmitter();
  7. file_paths.reduce(function(prom, file_path, path_ind) {
  8. return prom.then(function(browser) {
  9. browser.visit('file://'+file_path, function() {
  10. if (browser.error) throw new Error(browser.errors);
  11. var res_json = {};
  12. res_json.file_ind = path_ind;
  13. res_json.num_tests = browser.querySelectorAll('li.test').length;
  14. res_json.num_fails = browser.querySelectorAll('li.test.fail').length;
  15. res_json.num_passes = browser.querySelectorAll('li.test.pass').length;
  16. res_json.num_slow = browser.querySelectorAll('li.test.pass:not(.fast)').length;
  17. res_json.duration = browser.text('li.duration em');
  18. var traverse_node = function(elem) {
  19. var classList = elem.className.split(' ');
  20. if (classList.indexOf('suite') > -1) {
  21. var res = {
  22. type: 'suite',
  23. name: elem.querySelector('h1').textContent,
  24. has_subfailures: elem.querySelectorAll('li.test.fail').length > 0
  25. }
  26. var child_elems = elem.querySelector('ul').children;
  27. res.children = Array.prototype.map.call(child_elems, traverse_node);
  28. return res;
  29. }
  30. else {
  31. var h2_content = elem.querySelector('h2').childNodes;
  32. var res = {
  33. type: 'test',
  34. text: h2_content[0].textContent
  35. }
  36. if (classList.indexOf('pass') > -1) {
  37. res.pass = true;
  38. res.slow = classList.indexOf('fast') < 0;
  39. res.duration = h2_content[1].textContent;
  40. }
  41. else {
  42. res.error = elem.querySelector('pre.error').textContent;
  43. }
  44. return res;
  45. }
  46. }
  47. var top_suites = browser.querySelectorAll('#mocha-report > li.suite');
  48. res_json.suites = Array.prototype.map.call(top_suites, traverse_node);
  49. res_json.replay = browser.querySelector('a.replay').textContent;
  50. emitter.emit('test_ready', res_json);
  51. });
  52. return new Browser();
  53. });
  54. }, Q(new Browser()));
  55. return emitter;
  56. }
  57. module.exports = {
  58. provide_emitter: provide_emitter,
  59. name: 'ZombieJS'
  60. }