wdio-qunit-service
Version:
WebdriverIO service for running QUnit browser-based tests and dinamically converting them to wdio test suites.
90 lines • 3.18 kB
JavaScript
import { join } from "node:path";
import { URL } from "node:url";
import logger from "@wdio/logger";
import { injectQUnitReport, getQUnitSuiteReport } from "./qunit-browser.js";
import { sharedContext } from "./sharedContext.js";
import { generateTestCases } from "./mapper.js";
const log = logger("wdio-qunit-service");
/**
* Get QUnit service configuration
*/
function getServiceConfig(services) {
return services
?.filter((service) => Array.isArray(service) && service?.find((option) => option === "qunit"))
.flat()
.filter((service) => service &&
service?.paths?.length > 0)?.[0];
}
/**
* Get path to the QUnit HTML files
*/
function getQUnitHtmlFiles(paths, baseUrl) {
return paths
.filter((path) => {
try {
new URL(path, baseUrl);
return true;
}
catch (err) {
const invalid = new Error(`Invalid URL: ${baseUrl} +++ ${path}`, {
cause: err,
});
log.warn(path, invalid?.message);
return false;
}
})
.flat();
}
/**
* Use QUnit events to get test results when QUnit run has ended
*/
async function getQunitResultsFromBrowser(browserInstance) {
log.debug("Waiting for QUnit...");
await browserInstance.waitUntil(() => {
return browserInstance.execute(() => window?._wdioQunitService?.results?.filter?.((result) => !result.completed).length === 0);
}, {
timeoutMsg: "QUnit took too long to complete. Consider increasing waitforTimeout in wdio.conf.js. See https://webdriver.io/docs/timeouts/#waitfor-timeout",
});
return browserInstance.execute(getQUnitSuiteReport);
}
/**
* Get QUnit results
*/
async function getQUnitResults() {
log.info("Getting QUnit results...");
const qunitResults = await getQunitResultsFromBrowser(this);
qunitResults.forEach((result) => {
generateTestCases(result);
});
return qunitResults;
}
export default class QUnitService {
async before(capabilities, specs, browserInstance) {
log.debug("Executing before hook...");
browserInstance.addCommand("getQUnitResults", getQUnitResults.bind(browserInstance));
const script = await browser.addInitScript(injectQUnitReport);
script.on("data", (href) => {
log.warn("QUnit reporter injected at", href);
});
}
beforeSession(config) {
log.debug("Executing beforeSession hook...");
const serviceConfig = getServiceConfig(config?.services ?? []);
const files = getQUnitHtmlFiles(serviceConfig?.paths ?? [], config?.baseUrl);
if (files.length > 0) {
sharedContext.qunitHtmlFiles = files;
}
}
}
class CustomLauncher {
onPrepare(config) {
log.debug("Executing onPrepare launcher...");
const serviceConfig = getServiceConfig(config?.services);
const files = getQUnitHtmlFiles(serviceConfig?.paths ?? [], config?.baseUrl);
if (files.length > 0) {
config.specs?.push(join(import.meta.dirname, "default.test.js"));
}
}
}
export const launcher = CustomLauncher;
//# sourceMappingURL=index.js.map