This repository was archived by the owner on Sep 21, 2022. It is now read-only.
Repository navigation
Expand file tree
/
Copy pathrunner.js
More file actions
125 lines (109 loc) Β· 4.02 KB
/
Copy pathrunner.js
File metadata and controls
125 lines (109 loc) Β· 4.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
'use strict';
var EventEmitter = require('events').EventEmitter,
q = require('q'),
inherit = require('inherit'),
promiseUtils = require('./promise-util'),
GeminiError = require('./errors/gemini-error'),
StateError = require('./errors/state-error'),
BrowserLauncher = require('./browser/launcher'),
exec = q.denodeify(require('child_process').exec);
module.exports = inherit(EventEmitter, {
__constructor: function(config, browserLauncher) {
this.config = config;
this.browserLauncher = browserLauncher || new BrowserLauncher(config);
},
run: function(suites) {
var _this = this;
return this._checkGM()
.then(function() {
_this.emit('begin');
return q(_this._prepare());
})
.then(function() {
return _this._runSuites(suites);
})
.then(function() {
_this.emit('end');
});
},
_runSuites: function(suites) {
return promiseUtils.seqMap(suites, this._runSuite.bind(this));
},
_prepare: function() {
},
_checkGM: function() {
return exec('gm -version')
.then(function() {
return true;
})
.fail(function() {
return q.reject(new GeminiError(
'Unable to find required package: GraphicsMagick',
'Make sure that GraphicsMagick is installed and availiable in your PATH.\n' +
'Additonal info and installation instructions:\nhttp://www.graphicsmagick.org/'
));
});
},
_runSuite: function(suite) {
var _this = this;
this.emit('beginSuite', suite.name);
return this._runSuiteStates(suite)
.then(function() {
return _this._runSuites(suite.children);
})
.then(function() {
_this.emit('endSuite', suite.name);
});
},
_runSuiteStates: function(suite) {
var _this = this;
return q.fcall(function() {
if (!suite.hasStates) {
return;
}
return q.all(_this.config.browsers.map(function(browserName) {
var browser = _this.browserLauncher.launch(browserName);
return _this._runSuiteInBrowser(suite, browser)
.fin(function() {
return _this.browserLauncher.stop(browser);
});
}));
});
},
_runSuiteInBrowser: function(suite, browser) {
var _this = this;
return browser.open(this.config.getAbsoluteUrl(suite.url))
.then(function() {
return browser.buildElementsMap(
suite.elementsSelectors,
suite.dynamicElementsSelectors
);
})
.then(function(elements) {
return promiseUtils.seqMap(suite.states, function(state) {
_this.emit('beginState', suite.name, state.name, browser.fullName);
return browser.captureState(state, elements)
.then(function(image) {
return q(_this._processCapture({
suite: suite,
state: state,
browser: browser,
image: image
}));
})
.fail(function(e) {
if (e instanceof StateError) {
_this.emit('error', e);
} else {
return q.reject(e);
}
})
.fin(function() {
_this.emit('endState', suite.name, state.name, browser.fullName);
});
});
});
},
_processCapture: function() {
}
});