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