104 lines
2.8 KiB
JavaScript
104 lines
2.8 KiB
JavaScript
#! /usr/bin/env node
|
|
/* eslint-disable-next-line no-unused-vars */
|
|
import { argv } from "node:process";
|
|
import serve from "./server.mjs";
|
|
import { Builder, Capabilities } from "selenium-webdriver";
|
|
import commandLineArgs from "command-line-args";
|
|
import commandLineUsage from "command-line-usage";
|
|
import assert from "assert";
|
|
|
|
const optionDefinitions = [
|
|
{ name: "browser", type: String, description: "Set the browser to test, choices are [safari, firefox, chrome]. By default the $BROWSER env variable is used." },
|
|
{ name: "port", type: Number, defaultValue: 8010, description: "Set the test-server port, The default value is 8010." },
|
|
{ name: "help", alias: "h", description: "Print this help text." },
|
|
];
|
|
|
|
function printHelp(message = "") {
|
|
const usage = commandLineUsage([
|
|
{
|
|
header: "Run all tests",
|
|
},
|
|
{
|
|
header: "Options",
|
|
optionList: optionDefinitions,
|
|
},
|
|
]);
|
|
if (!message) {
|
|
console.log(usage);
|
|
process.exit(0);
|
|
} else {
|
|
console.error(message);
|
|
console.error();
|
|
console.error(usage);
|
|
process.exit(1);
|
|
}
|
|
}
|
|
|
|
const options = commandLineArgs(optionDefinitions);
|
|
|
|
if ("help" in options)
|
|
printHelp();
|
|
|
|
const BROWSER = options?.browser;
|
|
if (!BROWSER)
|
|
printHelp("No browser specified, use $BROWSER or --browser");
|
|
|
|
let capabilities;
|
|
switch (BROWSER) {
|
|
case "safari":
|
|
capabilities = Capabilities.safari();
|
|
break;
|
|
|
|
case "firefox": {
|
|
capabilities = Capabilities.firefox();
|
|
break;
|
|
}
|
|
case "chrome": {
|
|
capabilities = Capabilities.chrome();
|
|
break;
|
|
}
|
|
case "edge": {
|
|
capabilities = Capabilities.edge();
|
|
break;
|
|
}
|
|
default: {
|
|
printHelp(`Invalid browser "${BROWSER}", choices are: "safari", "firefox", "chrome", "edge"`);
|
|
}
|
|
}
|
|
|
|
const PORT = options.port;
|
|
const server = serve(PORT);
|
|
|
|
let driver;
|
|
|
|
async function test() {
|
|
driver = await new Builder().withCapabilities(capabilities).build();
|
|
|
|
try {
|
|
await driver.get(`http://localhost:${PORT}/tests/index.html`);
|
|
console.log("Waiting for tests to finish");
|
|
const stats = await driver.executeAsyncScript(function (callback) {
|
|
window.addEventListener("complete", () => callback(window.mochaResults.stats), { once: true });
|
|
});
|
|
console.log("stats", stats);
|
|
console.log("Checking for passed tests");
|
|
assert(stats.passes > 0);
|
|
console.log("Checking for failed tests");
|
|
assert(stats.failures === 0);
|
|
} finally {
|
|
console.log("Tests complete");
|
|
driver.quit();
|
|
server.close();
|
|
}
|
|
}
|
|
|
|
process.on("unhandledRejection", (err) => {
|
|
console.error(err);
|
|
process.exit(1);
|
|
});
|
|
process.once("uncaughtException", (err) => {
|
|
console.error(err);
|
|
process.exit(1);
|
|
});
|
|
|
|
setImmediate(test);
|