Source code

Revision control

Copy as Markdown

Other Tools

#! /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 || process.env.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;
}
default: {
printHelp(`Invalid browser "${BROWSER}", choices are: "safari", "firefox", "chrome"`);
}
}
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);