@@ -1,299 +1,311 @@
11const compileToString = require("node-elm-compiler").compileToString;
2−const { Builder, By, Key, until } = require('selenium-webdriver');
3−const chrome = require('selenium-webdriver/chrome');
4−const firefox = require('selenium-webdriver/firefox');
5−const fs = require('fs');
6−const program = require('commander');
2+const { Builder, By, Key, until } = require("selenium-webdriver");
3+const chrome = require("selenium-webdriver/chrome");
4+const firefox = require("selenium-webdriver/firefox");
5+const fs = require("fs");
6+const program = require("commander");
77const path = require("path");
8−const chalk = require('chalk');
9−const childProcess = require('child_process')
10−
11−program.option('-s, --sauce', 'run tests on sauce labs')
12− .option('--chrome', 'run chrome tests (default)')
13− .option('--firefox', 'run firefox tests')
14− .option('--ie', 'run ie tests')
15− .option('--edge', 'run edge tests')
16− .option('--build [value]', 'Set build number for sauce labs')
17− .option('--name [value]', 'Set run name for sauce labs')
18− .option('--verbose', 'Print out all test results')
19− .parse(process.argv)
20−
8+const chalk = require("chalk");
9+const childProcess = require("child_process");
10+
11+program
12+ .option("-s, --sauce", "run tests on sauce labs")
13+ .option("--chrome", "run chrome tests (default)")
14+ .option("--firefox", "run firefox tests")
15+ .option("--ie", "run ie tests")
16+ .option("--edge", "run edge tests")
17+ .option("--build [value]", "Set build number for sauce labs")
18+ .option("--name [value]", "Set run name for sauce labs")
19+ .option("--verbose", "Print out all test results")
20+ .parse(process.argv);
2121
2222// 'Windows 10'
2323
24−
2524const windows = {
26− chrome: {
27− platform: "Windows 10"
28− , browser: "chrome"
29− , browserVersion: "latest"
30− },
31− firefox: {
32− platform: "Windows 10"
33− , browser: "firefox"
34− , browserVersion: "latest"
35− },
36− edge: {
37− platform: "Windows 10"
38− , browser: "MicrosoftEdge"
39− , browserVersion: "latest"
40− },
41− ie: {
42− platform: "Windows 10"
43− , browser: "internet explorer"
44− , browserVersion: "latest"
45− }
46−}
25+ chrome: {
26+ platform: "Windows 10",
27+ browser: "chrome",
28+ browserVersion: "latest",
29+ },
30+ firefox: {
31+ platform: "Windows 10",
32+ browser: "firefox",
33+ browserVersion: "latest",
34+ },
35+ edge: {
36+ platform: "Windows 10",
37+ browser: "MicrosoftEdge",
38+ browserVersion: "latest",
39+ },
40+ ie: {
41+ platform: "Windows 10",
42+ browser: "internet explorer",
43+ browserVersion: "latest",
44+ },
45+};
4746
4847const all_windows = [
49− windows.chrome
50− , windows.firefox
51− , windows.edge
52− // i.e. takes forever and seems to make selenium timeout :/
53− // not really sure how to extend the timeout.
54− // , windows.ie
55−]
48+ windows.chrome,
49+ windows.firefox,
50+ windows.edge,
51+ // i.e. takes forever and seems to make selenium timeout :/
52+ // not really sure how to extend the timeout.
53+ // , windows.ie
54+];
5655
5756// "macOS 10.14"
5857const osx = {
59− chrome: {
60− platform: "macOS 10.14"
61− , browser: "chrome"
62− , browserVersion: "latest"
63− },
64− firefox: {
65− platform: "macOS 10.14"
66− , browser: "firefox"
67− , browserVersion: "latest"
68− },
69− safari: {
70− platform: "macOS 10.14"
71− , browser: "safari"
72− , browserVersion: "latest"
73− }
74−}
75−
76−const all_osx = [
77− osx.chrome
78− , osx.firefox
79− , osx.safari
80−]
81−
82−const all_browsers =
83− all_windows.concat(all_osx)
58+ chrome: {
59+ platform: "macOS 10.14",
60+ browser: "chrome",
61+ browserVersion: "latest",
62+ },
63+ firefox: {
64+ platform: "macOS 10.14",
65+ browser: "firefox",
66+ browserVersion: "latest",
67+ },
68+ safari: {
69+ platform: "macOS 10.14",
70+ browser: "safari",
71+ browserVersion: "latest",
72+ },
73+};
74+
75+const all_osx = [osx.safari];
76+
77+const all_browsers = all_windows.concat(all_osx);
8478
8579function prepare_all_envs(config) {
86− var envs = []
87−
88− for (i = 0; i < all_windows.length; i++) {
89− envs.push({
90− browser: all_windows[i].browser,
91− browserVersion: all_windows[i].browserVersion,
92− platform: all_windows[i].platform,
93− build: config.build,
94− name: config.name
95− })
96− }
97−
98− // for (i = 0; i < osx.length; i++) {
99− // envs.push({
100− // browser: osx[i].browser,
101− // browserVersion: osx[i].browserVersion,
102− // platform: "macOS 10.14",
103− // build: config.build,
104− // name: config.name
105− // })
106− // }
107−
108− return envs
80+ var envs = [];
81+
82+ for (i = 0; i < all_browsers.length; i++) {
83+ envs.push({
84+ browser: all_browsers[i].browser,
85+ browserVersion: all_browsers[i].browserVersion,
86+ platform: all_browsers[i].platform,
87+ build: config.build,
88+ name: config.name,
89+ });
90+ }
91+
92+ // for (i = 0; i < osx.length; i++) {
93+ // envs.push({
94+ // browser: osx[i].browser,
95+ // browserVersion: osx[i].browserVersion,
96+ // platform: "macOS 10.14",
97+ // build: config.build,
98+ // name: config.name,
99+ // });
100+ // }
101+
102+ return envs;
109103}
110104
111105async function compile_and_embed(config) {
112− var template = fs.readFileSync(config.template)
113− // we embed the compiled js to avoid having to start a server to read the app.
114− await compileToString(config.elm, config.elmOptions).then(function (compiled_elm_code) {
115− const compiled = eval(`\`${template}\``)
116− fs.writeFileSync(config.target, compiled)
117− });
106+ var template = fs.readFileSync(config.template);
107+ // we embed the compiled js to avoid having to start a server to read the app.
108+ await compileToString(config.elm, config.elmOptions).then(function (
109+ compiled_elm_code
110+ ) {
111+ const compiled = eval(`\`${template}\``);
112+ fs.writeFileSync(config.target, compiled);
113+ });
118114}
119115
120−
121−
122−
123116function prepare_sauce_driver(env) {
124− const username = process.env.SAUCE_USERNAME;
125− const accessKey = process.env.SAUCE_ACCESS_KEY;
126−
127− driver = new Builder().withCapabilities({
128− 'browserName': env.browser,
129− 'platformName': env.platform,
130− 'browserVersion': env.browserVersion,
131− /* Pass Sauce User Name and Access Key */
132− 'sauce:options': {
133− 'username': username,
134− 'accessKey': accessKey,
135− 'build': env.build,
136− 'name': env.name
137− }
138− }).usingServer("https://@ondemand.saucelabs.com:443/wd/hub").build();
117+ const username = process.env.SAUCE_USERNAME;
118+ const accessKey = process.env.SAUCE_ACCESS_KEY;
119+
120+ driver = new Builder()
121+ .withCapabilities({
122+ browserName: env.browser,
123+ platformName: env.platform,
124+ browserVersion: env.browserVersion,
125+ /* Pass Sauce User Name and Access Key */
126+ "sauce:options": {
127+ username: username,
128+ accessKey: accessKey,
129+ build: env.build,
130+ name: env.name,
131+ },
132+ })
133+ .usingServer("https://@ondemand.saucelabs.com:443/wd/hub")
134+ .build();
139135
140− return driver;
136+ return driver;
141137}
142138
143139async function prepare_local_driver(env) {
144− const firefoxOptions = new firefox.Options().headless()
145− const chromeOptions = new chrome.Options().headless()
140+ const firefoxOptions = new firefox.Options().headless();
141+ const chromeOptions = new chrome.Options().headless();
146142
147− let driver = await new Builder()
148− .forBrowser(env.browser)
149− .setChromeOptions(chromeOptions)
150− .setFirefoxOptions(firefoxOptions)
151− .build();
143+ let driver = await new Builder()
144+ .forBrowser(env.browser)
145+ .setChromeOptions(chromeOptions)
146+ .setFirefoxOptions(firefoxOptions)
147+ .build();
152148
153− return driver;
149+ return driver;
154150}
155151
156152async function run_test(driver, url) {
157− var results = null
158− try {
159− await driver.manage().window().setRect({ width: 1200, height: 800, x: 0, y: 0 });
160− await driver.get(url);
161− await driver.wait(until.titleIs('tests finished'), 240 * 1000);
162− results = await driver.executeScript("return test_results")
163− } finally {
164− await driver.quit();
165− }
166− return results
153+ var results = null;
154+ try {
155+ await driver
156+ .manage()
157+ .window()
158+ .setRect({ width: 1200, height: 800, x: 0, y: 0 });
159+ await driver.get(url);
160+ await driver.wait(until.titleIs("tests finished"), 240 * 1000);
161+ results = await driver.executeScript("return test_results");
162+ } finally {
163+ await driver.quit();
164+ }
165+ return results;
167166}
168167
169−
170−
171168(async () => {
172− var dir = "tmp"
173− if (!fs.existsSync(dir)) {
174− fs.mkdirSync(dir);
169+ var dir = "tmp";
170+ if (!fs.existsSync(dir)) {
171+ fs.mkdirSync(dir);
172+ }
173+ console.log("Compiling tests");
174+ await compile_and_embed({
175+ template: "./tests-rendering/automation/templates/gather-styles.html",
176+ target: "./tmp/test.html",
177+ elm: ["src/Tests/Run.elm"],
178+ elmOptions: { cwd: "./tests-rendering" },
179+ });
180+ console.log("Done compiling");
181+
182+ if (program.sauce) {
183+ const build = program.build;
184+ const name = program.name;
185+
186+ if (build == null || name == null) {
187+ throw "A Build and a Name must be specified.";
175188 }
176− console.log("Compiling tests")
177− await compile_and_embed({
178− template: "./tests-rendering/automation/templates/gather-styles.html",
179− target: "./tmp/test.html",
180− elm: ["src/Tests/Run.elm"],
181− elmOptions: { cwd: "./tests-rendering" }
182− })
183− console.log("Done compiling")
184189
185− if (program.sauce) {
186− const build = program.build
187− const name = program.name
188−
189− if (build == null || name == null) {
190− throw ("A Build and a Name must be specified.");
191− }
192−
193− var results = []
194−
195− // Publish to netlify
196− childProcess.execSync("sh tests-rendering/automation/publish-file.sh", {
197− env: {
198− FILE: "test.html",
199− BUILD: program.build,
200− NAME: program.name,
201− GIT_EMAIL: "automation@elm-ui.com",
202− GIT_NAME: "Elm UI Automation",
203− HOME: process.env.HOME,
204− SSH_AUTH_SOCK: process.env.SSH_AUTH_SOCK,
205− SSH_AGENT_PID: process.env.SSH_AGENT_PID
206− }
207− })
208−
209− var url = `http://elm-ui-testing.netlify.com/tests/${program.build}/${program.name}/`
210− console.log(`Running sauce labs test:`)
211− console.log(` ${url}`)
212−
213− const envs = prepare_all_envs({ build: build, name: name })
214− var test_runs = []
215− var test_labels = []
216− for (i = 0; i < envs.length; i++) {
217− var driver = prepare_sauce_driver(envs[i])
218− test_runs.push(run_test(driver, url))
219− test_labels.push(envs[i])
220−
221− }
222− var results = await Promise.all(test_runs)
223− for (i = 0; i < results.length; i++) {
224− print_results(renderEnvName(test_labels[i]), results[i]);
225− }
190+ var results = [];
191+
192+ // Publish to netlify
193+ childProcess.execSync("sh tests-rendering/automation/publish-file.sh", {
194+ env: {
195+ FILE: "test.html",
196+ BUILD: program.build,
197+ NAME: program.name,
198+ GIT_EMAIL: "automation@elm-ui.com",
199+ GIT_NAME: "Elm UI Automation",
200+ HOME: process.env.HOME,
201+ SSH_AUTH_SOCK: process.env.SSH_AUTH_SOCK,
202+ SSH_AGENT_PID: process.env.SSH_AGENT_PID,
203+ },
204+ });
226205
227− } else {
228− // Run chrome if nothing else is selected
229− if (program.chrome || (!program.chrome && !program.firefox)) {
230− console.log("Running locally on Chrome...")
231− const driver = await prepare_local_driver(osx.chrome)
232− var results = await run_test(driver, "file://" + path.resolve('./tmp/test.html'))
233− print_results("Local Chrome", results);
234− }
235− if (program.firefox) {
236− console.log("Running locally on Firefox...")
237− const driver = await prepare_local_driver(osx.firefox)
238− var results = await run_test(driver, "file://" + path.resolve('./tmp/test.html'))
239− print_results("Local Firefox", results);
240− }
241− if (program.ie) {
242− console.log("Running locally on IE...")
243− const driver = await prepare_local_driver(windows.ie)
244− var results = await run_test(driver, "file://" + path.resolve('./tmp/test.html'))
245− print_results("Local IE", results);
246− }
247− if (program.edge) {
248− console.log("Running locally on Edge...")
249− const driver = await prepare_local_driver(windows.edge)
250− var results = await run_test(driver, "file://" + path.resolve('./tmp/test.html'))
251− print_results("Local Edge", results);
252− }
206+ var url = `http://elm-ui-testing.netlify.com/tests/${program.build}/${program.name}/`;
207+ console.log(`Running sauce labs test:`);
208+ console.log(` ${url}`);
209+
210+ const envs = prepare_all_envs({ build: build, name: name });
211+ console.log(envs);
212+ var test_runs = [];
213+ var test_labels = [];
214+ for (i = 0; i < envs.length; i++) {
215+ var driver = prepare_sauce_driver(envs[i]);
216+ test_runs.push(run_test(driver, url));
217+ test_labels.push(envs[i]);
218+ }
219+ var results = await Promise.all(test_runs);
220+ for (i = 0; i < results.length; i++) {
221+ print_results(renderEnvName(test_labels[i]), results[i]);
222+ }
223+ } else {
224+ // Run chrome if nothing else is selected
225+ if (program.chrome || (!program.chrome && !program.firefox)) {
226+ console.log("Running locally on Chrome...");
227+ const driver = await prepare_local_driver(osx.chrome);
228+ var results = await run_test(
229+ driver,
230+ "file://" + path.resolve("./tmp/test.html")
231+ );
232+ print_results("Local Chrome", results);
233+ }
234+ if (program.firefox) {
235+ console.log("Running locally on Firefox...");
236+ const driver = await prepare_local_driver(osx.firefox);
237+ var results = await run_test(
238+ driver,
239+ "file://" + path.resolve("./tmp/test.html")
240+ );
241+ print_results("Local Firefox", results);
242+ }
243+ if (program.ie) {
244+ console.log("Running locally on IE...");
245+ const driver = await prepare_local_driver(windows.ie);
246+ var results = await run_test(
247+ driver,
248+ "file://" + path.resolve("./tmp/test.html")
249+ );
250+ print_results("Local IE", results);
253251 }
252+ if (program.edge) {
253+ console.log("Running locally on Edge...");
254+ const driver = await prepare_local_driver(windows.edge);
255+ var results = await run_test(
256+ driver,
257+ "file://" + path.resolve("./tmp/test.html")
258+ );
259+ print_results("Local Edge", results);
260+ }
261+ }
254262})();
255263
256264function renderEnvName(env) {
257− return `${env.platform}, ${env.browser} ${env.browserVersion}`
265+ return `${env.platform}, ${env.browser} ${env.browserVersion}`;
258266}
259267
260268function print_results(label, results) {
261− var total_passed = 0
262− var total_failed = 0
263− var i;
264− if (program.verbose) {
265− console.log(label)
266− }
267− for (i = 0; i < results.length; i++) {
268− var passed = 0
269− var failed = 0
270− for (j = 0; j < results[i].results.length; j++) {
271− if (results[i].results[j][1] == null) {
272− passed = passed + 1
273− } else {
274− if (failed == 0) {
275− if (!program.verbose) {
276− console.log(label)
277− }
278− console.log(results[i].label)
279− }
280− failed = failed + 1
281− console.log(" " + chalk.red("fail") + " -> " + results[i].results[j][0])
282− console.log(" " + results[i].results[j][1].description)
283− }
284− }
285− total_passed = total_passed + passed
286− total_failed = total_failed + failed
287−
288− if (failed != 0) {
289− console.log(chalk.green(` ${passed} tests passed`))
290− console.log(chalk.red(` ${failed} tests failed`))
291− console.log()
292− } else if (program.verbose) {
293− console.log(results[i].label + chalk.green(` ${passed} tests passed`))
269+ var total_passed = 0;
270+ var total_failed = 0;
271+ var i;
272+ if (program.verbose) {
273+ console.log(label);
274+ }
275+ for (i = 0; i < results.length; i++) {
276+ var passed = 0;
277+ var failed = 0;
278+ for (j = 0; j < results[i].results.length; j++) {
279+ if (results[i].results[j][1] == null) {
280+ passed = passed + 1;
281+ } else {
282+ if (failed == 0) {
283+ if (!program.verbose) {
284+ console.log(label);
285+ }
286+ console.log(results[i].label);
294287 }
288+ failed = failed + 1;
289+ console.log(
290+ " " + chalk.red("fail") + " -> " + results[i].results[j][0]
291+ );
292+ console.log(" " + results[i].results[j][1].description);
293+ }
295294 }
296− if (total_failed == 0) {
297− console.log(`${label} -> ` + chalk.green(`All ${total_passed} tests passed`))
295+ total_passed = total_passed + passed;
296+ total_failed = total_failed + failed;
297+
298+ if (failed != 0) {
299+ console.log(chalk.green(` ${passed} tests passed`));
300+ console.log(chalk.red(` ${failed} tests failed`));
301+ console.log();
302+ } else if (program.verbose) {
303+ console.log(results[i].label + chalk.green(` ${passed} tests passed`));
298304 }
299−}
305+ }
306+ if (total_failed == 0) {
307+ console.log(
308+ `${label} -> ` + chalk.green(`All ${total_passed} tests passed`)
309+ );
310+ }
311+}