run_from_console.zombie.js 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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.num_skipped = browser.querySelectorAll('li.test.pending').length;
  18. res_json.duration = browser.text('li.duration em');
  19. var traverse_node = function(elem) {
  20. var classList = elem.className.split(' ');
  21. var res;
  22. if (classList.indexOf('suite') > -1) {
  23. res = {
  24. type: 'suite',
  25. name: elem.querySelector('h1').textContent,
  26. has_subfailures: elem.querySelectorAll('li.test.fail').length > 0
  27. };
  28. var child_elems = elem.querySelector('ul').children;
  29. res.children = Array.prototype.map.call(child_elems, traverse_node);
  30. return res;
  31. }
  32. else {
  33. var h2_content = elem.querySelector('h2').childNodes;
  34. res = {
  35. type: 'test',
  36. text: h2_content[0].textContent
  37. };
  38. if (classList.indexOf('pass') > -1) {
  39. res.pass = true;
  40. if (classList.indexOf('pending') > -1) {
  41. res.slow = false;
  42. res.skipped = true;
  43. }
  44. else {
  45. res.slow = classList.indexOf('fast') < 0;
  46. res.skipped = false;
  47. res.duration = h2_content[1].textContent;
  48. }
  49. }
  50. else {
  51. res.error = elem.querySelector('pre.error').textContent;
  52. }
  53. return res;
  54. }
  55. };
  56. var top_suites = browser.querySelectorAll('#mocha-report > li.suite');
  57. res_json.suites = Array.prototype.map.call(top_suites, traverse_node);
  58. res_json.replay = browser.querySelector('a.replay').textContent;
  59. emitter.emit('test_ready', res_json);
  60. });
  61. return new Browser();
  62. });
  63. }, Q(new Browser()));
  64. return emitter;
  65. };
  66. module.exports = {
  67. provide_emitter: provide_emitter,
  68. name: 'ZombieJS'
  69. };