floss
Version:
Unit-testing for those hard to reach places
197 lines • 13.8 kB
JavaScript
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcmVuZGVyZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxpQ0FBaUM7QUFDakMseUJBQXlCO0FBQ3pCLG1DQUFtQztBQUNuQyx1Q0FBK0M7QUFDL0MsMkNBQTJDO0FBQzNDLDZCQUE2QjtBQUc3QiwwRUFBMEU7QUFDMUUsMEJBQTBCO0FBRTFCLElBQUksT0FBVyxDQUFDO0FBRWhCLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQzFCO0lBQ0ksc0NBQXNDO0lBQ3RDLElBQ0E7UUFDSSw4RUFBOEU7UUFDOUUsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLElBQUksTUFBTSxHQUFPLEVBQUUsQ0FBQztRQUVwQixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVTtZQUFFLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDeEUsTUFBTSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFFN0IsTUFBTSxDQUFDLFlBQVksR0FBRztZQUNsQixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7WUFDaEIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ2xCLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsSUFBSSxJQUFJO1lBQzFDLElBQUksRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVc7U0FDaEMsQ0FBQztRQUNGLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsRUFDM0M7WUFDSSxNQUFNLENBQUMsWUFBWSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDO1lBQ3pFLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQztTQUNsRDtRQUVELE9BQU8sR0FBRyxJQUFJLEdB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
;