UNPKG

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
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