UNPKG

floss

Version:

Unit-testing for those hard to reach places

197 lines 13.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const pathNode = require("path"); const fs = require("fs"); const resolve = require("resolve"); const electron_1 = require("electron"); const querystring = require("querystring"); const glob = require("glob"); // enables the browser mocha support - the mocha global is properly set up // require('mocha/mocha'); let nycInst; if (process.env.NYC_CONFIG) { // do what nyc does in nyc/bin/wrap.js try { // eslint-disable-next-line @typescript-eslint/no-var-requires, global-require const NYC = require('nyc'); let config = {}; if (process.env.NYC_CONFIG) config = JSON.parse(process.env.NYC_CONFIG); config.isChildProcess = true; config._processInfo = { pid: process.pid, ppid: process.ppid, parent: process.env.NYC_PROCESS_ID || null, root: process.env.NYC_ROOT_ID }; if (process.env.NYC_PROCESSINFO_EXTERNAL_ID) { config._processInfo.externalId = process.env.NYC_PROCESSINFO_EXTERNAL_ID; delete process.env.NYC_PROCESSINFO_EXTERNAL_ID; } nycInst = new NYC(config); nycInst.wrap(); } catch (e) { console.log(e); } } class Renderer { constructor(linkId) { electron_1.ipcRenderer.on("floss-start" /* Start */, (_ev, data) => { this.options = global.options = JSON.parse(data); const { path, debug, quiet, require: additionalRequire, } = this.options; // Do this before to catch any errors outside mocha running // for instance errors on the page like test's requires this.setupConsoleOutput(quiet, !debug); // Include this AFTER the console binding because // mocha has a static console reference in the base reporter // eslint-disable-next-line global-require require('mocha/mocha'); if (additionalRequire) { // eslint-disable-next-line global-require require(additionalRequire); } const files = glob.sync(path); if (debug) { this.headful(files); } else { this.headless(files); } }); // Add the stylesheet const mochaPath = pathNode.dirname(resolve.sync('mocha', { basedir: __dirname })); const link = document.getElementById(linkId); link.href = pathNode.join(mochaPath, 'mocha.css'); } /** * Run tests using devtools and Electron window. */ headful(files) { mocha.setup({ ui: 'bdd', timeout: 0 }); files .map((file) => this.addFile(file)) .filter((file) => file !== null) // eslint-disable-next-line global-require .forEach((file) => require(file)); mocha.run(() => { // write the coverage file if we need to, as NYC won't do so in our setup if (nycInst) { nycInst.writeCoverageFile(); } }); } headless(files) { try { mocha.setup({ ui: 'bdd', }); // Format the reporter options let reporterOptions; // Parse string as an object if (typeof this.options.reporterOptions === 'string') { reporterOptions = querystring.parse(this.options.reporterOptions); } // eslint-disable-next-line global-require, @typescript-eslint/no-var-requires const Mocha = require('mocha'); const mochaInst = new Mocha({ reporter: this.options.reporter, reporterOptions, color: true, }); files.map((file) => this.addFile(file)) .filter((file) => file !== null) .forEach((file) => mochaInst.addFile(file)); mochaInst.run((errorCount) => { // write the coverage file if we need to, as NYC won't do so in our setup if (nycInst) { try { nycInst.writeCoverageFile(); } catch (e) { this.failed('Unable to write coverage file.'); return; } } if (errorCount > 0) { // No error needed, Mocha will report this this.failed(); } else { this.success(); } }); } catch (e) { // write the coverage file if we need to, as NYC won't do so in our setup if (nycInst) { nycInst.writeCoverageFile(); } this.failed(e.message); } } /** * Report when we're done, this will close floss. */ success() { electron_1.ipcRenderer.send("floss-done" /* Done */); } /** * Report if we failed, this will close floss with non-zero errorCode. */ failed(message) { electron_1.ipcRenderer.send("floss-error" /* Error */, message); } /** * Create new bindings for `console` functions * Use default console[name] and also send IPC * log so we can log to stdout */ setupConsoleOutput(isQuiet, isHeadless) { const remoteConsole = electron_1.remote.getGlobal('console'); if (!isQuiet && isHeadless) { for (const name in console) { const n = name; if (typeof console[n] === 'function') { console[n] = remoteConsole[n]; } } } // if we don't do this, we get socket errors and our tests crash Object.defineProperty(process, 'stdout', { value: { write: (str) => electron_1.remote.process.stdout.write(str), } }); } /** * Resolve test path into absolute path. * @param testPath - Path to test directory of file. */ addFile(testPath) { testPath = pathNode.resolve(testPath); if (!fs.existsSync(testPath)) { return null; } // if a single directory, find the index.js file and include that if (fs.statSync(testPath).isDirectory()) { const indexFile = pathNode.join(testPath, 'index.js'); const indexTs = pathNode.join(testPath, 'index.ts'); if (fs.existsSync(indexFile)) { return indexFile; } else if (fs.existsSync(indexTs)) { return indexTs; } console.error(`No index.js file found in directory: ${testPath}`); return null; } // if it is a single file, only include that file return testPath; } } module.exports = Renderer; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcmVuZGVyZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxpQ0FBaUM7QUFDakMseUJBQXlCO0FBQ3pCLG1DQUFtQztBQUNuQyx1Q0FBK0M7QUFDL0MsMkNBQTJDO0FBQzNDLDZCQUE2QjtBQUc3QiwwRUFBMEU7QUFDMUUsMEJBQTBCO0FBRTFCLElBQUksT0FBVyxDQUFDO0FBRWhCLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQzFCO0lBQ0ksc0NBQXNDO0lBQ3RDLElBQ0E7UUFDSSw4RUFBOEU7UUFDOUUsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLElBQUksTUFBTSxHQUFPLEVBQUUsQ0FBQztRQUVwQixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVTtZQUFFLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDeEUsTUFBTSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFFN0IsTUFBTSxDQUFDLFlBQVksR0FBRztZQUNsQixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7WUFDaEIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ2xCLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsSUFBSSxJQUFJO1lBQzFDLElBQUksRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVc7U0FDaEMsQ0FBQztRQUNGLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsRUFDM0M7WUFDSSxNQUFNLENBQUMsWUFBWSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDO1lBQ3pFLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQztTQUNsRDtRQUVELE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQixPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7S0FDbEI7SUFDRCxPQUFPLENBQUMsRUFDUjtRQUNJLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDbEI7Q0FDSjtBQUVELE1BQU0sUUFBUTtJQUdWLFlBQVksTUFBYztRQUV0QixzQkFBVyxDQUFDLEVBQUUsNEJBQW1CLENBQUMsR0FBVSxFQUFFLElBQVksRUFBRSxFQUFFO1lBRTFELElBQUksQ0FBQyxPQUFPLEdBQUksTUFBYyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFELE1BQU0sRUFDRixJQUFJLEVBQ0osS0FBSyxFQUNMLEtBQUssRUFDTCxPQUFPLEVBQUUsaUJBQWlCLEdBQzdCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUVqQiwyREFBMkQ7WUFDM0QsdURBQXVEO1lBQ3ZELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUV2QyxpREFBaUQ7WUFDakQsNERBQTREO1lBQzVELDBDQUEwQztZQUMxQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFdkIsSUFBSSxpQkFBaUIsRUFDckI7Z0JBQ0ksMENBQTBDO2dCQUMxQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQzthQUM5QjtZQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFOUIsSUFBSSxLQUFLLEVBQ1Q7Z0JBQ0ksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN2QjtpQkFFRDtnQkFDSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3hCO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxxQkFBcUI7UUFDckIsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbEYsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQW9CLENBQUM7UUFFaEUsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxPQUFPLENBQUMsS0FBZTtRQUUzQixLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ1IsRUFBRSxFQUFFLEtBQUs7WUFDVCxPQUFPLEVBQUUsQ0FBQztTQUNiLENBQUMsQ0FBQztRQUVILEtBQUs7YUFDQSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDakMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDO1lBQ2hDLDBDQUEwQzthQUN6QyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFjLENBQUMsQ0FBQyxDQUFDO1FBRWhELEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBRVgseUVBQXlFO1lBQ3pFLElBQUksT0FBTyxFQUNYO2dCQUNJLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2FBQy9CO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sUUFBUSxDQUFDLEtBQWM7UUFFM0IsSUFDQTtZQUNJLEtBQUssQ0FBQyxLQUFLLENBQUM7Z0JBQ1IsRUFBRSxFQUFFLEtBQUs7YUFDWixDQUFDLENBQUM7WUFFSCw4QkFBOEI7WUFDOUIsSUFBSSxlQUFtQixDQUFDO1lBRXhCLDRCQUE0QjtZQUM1QixJQUFJLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEtBQUssUUFBUSxFQUNwRDtnQkFDSSxlQUFlLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FDL0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQy9CLENBQUM7YUFDTDtZQUVELDhFQUE4RTtZQUM5RSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDL0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxLQUFLLENBQUM7Z0JBQ3hCLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVE7Z0JBQy9CLGVBQWU7Z0JBQ2YsS0FBSyxFQUFFLElBQUk7YUFDZCxDQUFDLENBQUM7WUFFSCxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNsQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUM7aUJBQy9CLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFjLENBQUMsQ0FBQyxDQUFDO1lBRTFELFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFrQixFQUFFLEVBQUU7Z0JBRWpDLHlFQUF5RTtnQkFDekUsSUFBSSxPQUFPLEVBQ1g7b0JBQ0ksSUFDQTt3QkFDSSxPQUFPLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztxQkFDL0I7b0JBQ0QsT0FBTyxDQUFDLEVBQ1I7d0JBQ0ksSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO3dCQUU5QyxPQUFPO3FCQUNWO2lCQUNKO2dCQUVELElBQUksVUFBVSxHQUFHLENBQUMsRUFDbEI7b0JBQ0ksMENBQTBDO29CQUMxQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7aUJBQ2pCO3FCQUVEO29CQUNJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztpQkFDbEI7WUFDTCxDQUFDLENBQUMsQ0FBQztTQUNOO1FBQ0QsT0FBTyxDQUFDLEVBQ1I7WUFDSSx5RUFBeUU7WUFDekUsSUFBSSxPQUFPLEVBQ1g7Z0JBQ0ksT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUM7YUFDL0I7WUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMxQjtJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLE9BQU87UUFFWCxzQkFBVyxDQUFDLElBQUkseUJBQWlCLENBQUM7SUFDdEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssTUFBTSxDQUFDLE9BQWdCO1FBRTNCLHNCQUFXLENBQUMsSUFBSSw0QkFBbUIsT0FBTyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxrQkFBa0IsQ0FBQyxPQUFlLEVBQUUsVUFBa0I7UUFFMUQsTUFBTSxhQUFhLEdBQUcsaUJBQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFbEQsSUFBSSxDQUFDLE9BQU8sSUFBSSxVQUFVLEVBQzFCO1lBQ0ksS0FBSyxNQUFNLElBQUksSUFBSSxPQUFPLEVBQzFCO2dCQUNJLE1BQU0sQ0FBQyxHQUFHLElBQXFCLENBQUM7Z0JBRWhDLElBQUksT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssVUFBVSxFQUNwQztvQkFDSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNqQzthQUNKO1NBQ0o7UUFFRCxnRUFBZ0U7UUFDaEUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFO1lBQ3JDLEtBQUssRUFBRTtnQkFDSCxLQUFLLEVBQUUsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLGlCQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO2FBQzNEO1NBQ0osQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7T0FHRztJQUNLLE9BQU8sQ0FBQyxRQUFlO1FBRTNCLFFBQVEsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXRDLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUM1QjtZQUNJLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxpRUFBaUU7UUFDakUsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUN2QztZQUNJLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3RELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBRXBELElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFDNUI7Z0JBQ0ksT0FBTyxTQUFTLENBQUM7YUFDcEI7aUJBQ0ksSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUMvQjtnQkFDSSxPQUFPLE9BQU8sQ0FBQzthQUNsQjtZQUVELE9BQU8sQ0FBQyxLQUFLLENBQUMsd0NBQXdDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFFbEUsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELGlEQUFpRDtRQUVqRCxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0NBQ0o7QUFFRCxNQUFNLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyJ9