forked from practicalmeteor/meteor-mocha-console-runner
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ConsoleReporter.js
130 lines (106 loc) · 4.23 KB
/
ConsoleReporter.js
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
126
127
128
129
/*
* decaffeinate suggestions:
* DS001: Remove Babel/TypeScript constructor workaround
* DS102: Remove unnecessary code created because of implicit returns
* DS206: Consider reworking classes to avoid initClass
* DS207: Consider shorter variations of null checks
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
const ObjectLogger = require("./loglevel");
const {MochaRunner, ClientServerBaseReporter} = require("meteor/hubroedu:mocha");
const log = new ObjectLogger('ConsoleReporter', 'info');
class ConsoleReporter extends ClientServerBaseReporter {
static initClass() {
this.VERSION = "3.0.0";
}
constructor(clientRunner, serverRunner, options){
{
// Hack: trick Babel/TypeScript into allowing this before super.
if (false) { super(); }
let thisFn = (() => { return this; }).toString();
let thisName = thisFn.slice(thisFn.indexOf('return') + 6 + 1, thisFn.indexOf(';')).trim();
eval(`${thisName} = this;`);
}
this.printReporterHeader = this.printReporterHeader.bind(this);
this.finishAndPrintTestsSummary = this.finishAndPrintTestsSummary.bind(this);
this.clientRunner = clientRunner;
this.serverRunner = serverRunner;
this.options = options;
try {
log.enter('constructor');
super(this.clientRunner, this.serverRunner, this.options);
MochaRunner.on("end all", () => this.finishAndPrintTestsSummary());
} finally {
log.return();
}
}
/*
Overwriting from ClientServerBaseReporter
*/
registerRunnerEvents(where){
try {
log.enter("registerRunnerEvents");
// Call super.registerRunnerEvents to register events from ClientServerBaseReporter first
super.registerRunnerEvents(where);
this[`${where}Runner`].on("start", () => this.printReporterHeader(where));
this[`${where}Runner`].on('test end', test=> this.printTest(test, where));
// Log for errors with hooks
return this[`${where}Runner`].on("fail", hook=> { if (hook.type === 'hook') { return this.printTest(hook, where); } });
} finally {
log.return();
}
}
printReporterHeader(where){
try {
log.enter("printReporterHeader", where);
if (this.options.runOrder !== 'serial') { return; }
// i.e client = Client
where = where[0].toUpperCase() + where.substr(1);
console.log("\n--------------------------------------------------");
console.log(`------------------ ${where} tests ------------------`);
return console.log("--------------------------------------------------\n");
} finally {
log.return();
}
}
printTest(test, where){
try {
log.enter("prinTest", test);
const state = test.state || (test.pending ? "pending" : undefined);
// Since the test are running in parallel we don't need
// to specify where they are client or server tests.
if (this.options.runOrder === 'serial') {
where = "";
} else {
// Get first chart 's' or 'c' for client/server
where = where[0].toUpperCase() + ": ";
}
console.log(`${where}${test.fullTitle()} : ${state}`);
if (test.state === "failed") {
console.log(` ${test.err.stack || test.err}`);
}
return console.log("");
} finally {
log.return();
}
}
finishAndPrintTestsSummary(){
try {
log.enter("finishAndPrintTestsSummary");
if (((this.clientStats != null ? this.clientStats.total : undefined) == null) || ((this.serverStats != null ? this.serverStats.total : undefined) == null)) { return; }
console.log("\n--------------------------------------------------");
console.log("---------------------RESULTS----------------------");
console.log("PASSED:", this.stats.passes);
console.log("FAILED:", this.stats.failures);
console.log("SKIPPED:", this.stats.pending);
console.log("TOTAL:", this.stats.total);
console.log("--------------------------------------------------");
return console.log("--------------------------------------------------\n");
} finally {
log.return();
}
}
}
ConsoleReporter.initClass();
module.exports.ConsoleReporter = ConsoleReporter;
module.exports.runTests = () => MochaRunner.setReporter(ConsoleReporter);