-
Notifications
You must be signed in to change notification settings - Fork 8
/
compile.js
135 lines (128 loc) · 4.2 KB
/
compile.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
130
131
132
133
134
135
/**
* Runs UI tests for Bibliograph
*/
const fs = require("fs");
qx.Class.define("bibliograph.CompilerApi", {
extend: qx.tool.cli.api.CompilerApi,
members: {
/**
* Load the compiler data from a compile*.json file and sets the
* "app.version" environment key from package.json
* @return {Promise<{environment}|*>}
*/
async load() {
let data = await this.base(arguments);
let packageJson = await qx.tool.utils.Json.loadJsonAsync("package.json");
data.environment["app.version"] = packageJson.version;
return data;
},
async beforeTests(command) {
command.addTest(new qx.tool.cli.api.Test("Browser tests", async function() {
let app = this.getTestApp("qxl.testtapper.Application");
let result = {};
await this.runTest(app, result);
this.setExitCode(result.errorCode);
})).setNeedsServer(false);
},
afterDeploy(data) {
//
},
runTest : async function (app, result) {
return new qx.Promise(async resolve => {
const puppeteer = this.require("puppeteer");
const pti = this.require("puppeteer-to-istanbul");
let outputDir = "";
if (this.getCompilerApi().getCommand().showStartpage()) {
let target = app.maker.getTarget();
outputDir = target.getOutputDir();
}
let href = `http://localhost:${app.port}/${outputDir}${app.name}/`;
const { URL } = require("url");
let url = new URL(href);
let s = "";
if (app.argv.method) {
s += "method=" + app.argv.method;
}
if (app.argv.class) {
if (s.length > 0) {
s += "&";
}
s += "class=" + app.argv.class;
}
if (s.length > 0) {
url.search = s;
}
qx.tool.compiler.Console.log("CALL "+ url.href);
let notOk = 0;
let Ok = 0;
let browser = await puppeteer.launch();
let page = await browser.newPage();
page.on("console", async (msg) => {
let val = msg.text();
// value is serializable
if (val.match(/^\d+\.\.\d+$/)) {
qx.tool.compiler.Console.info(`DONE testing ${Ok} ok, ${notOk} not ok`);
let jsCoverage = await page.coverage.stopJSCoverage();
qx.tool.compiler.Console.info("writing coverage information ...");
await pti.write(jsCoverage);
await browser.close();
result.errorCode += notOk;
result[app.name] = {
notOk: notOk,
ok: Ok
};
resolve(result[app.name]);
} else if (val.match(/^not ok /)) {
notOk++;
qx.tool.compiler.Console.log(val);
} else if (val.match(/^ok\s/)) {
Ok++;
if (!app.argv.terse) {
qx.tool.compiler.Console.log(val);
}
} else if (val.match(/^#/) && app.argv.diag) {
qx.tool.compiler.Console.log(val);
} else if (app.argv.verbose) {
qx.tool.compiler.Console.log(val);
}
});
await page.coverage.startJSCoverage();
await page.goto(url.href);
});
},
getTestApp: function(classname) {
let command = this.getCompilerApi().getCommand();
let maker = null;
let app = null;
command.getMakers().forEach(tmp => {
let apps = tmp.getApplications().filter(app => (app.getClassName() === classname) && app.isBrowserApp());
if (apps.length) {
if (maker) {
qx.tool.compiler.Console.print("qx.tool.cli.test.tooManyMakers");
return null;
}
if (apps.length !== 1) {
qx.tool.compiler.Console.print("qx.tool.cli.test.tooManyApplications");
return null;
}
maker = tmp;
app = apps[0];
}
});
if (!app) {
qx.tool.compiler.Console.print("qx.tool.cli.test.noAppName");
return null;
}
var config = command._getConfig();
return {
name: app.getName(),
port: config.serve.listenPort,
argv: command.argv,
maker: maker
};
}
}
});
module.exports = {
CompilerApi: bibliograph.CompilerApi
};