@stryker-mutator/mocha-runner
Version:
A plugin to use the mocha test runner in Stryker, the JavaScript mutation testing framework
72 lines (62 loc) • 2.35 kB
text/typescript
import path from 'path';
import fs from 'fs';
import { tokens, commonTokens } from '@stryker-mutator/api/plugin';
import { Logger } from '@stryker-mutator/api/logging';
import { RootHookObject } from 'mocha';
import { MochaOptions } from '../src-generated/mocha-runner-options.js';
import { LibWrapper } from './lib-wrapper.js';
/**
* A class that contains polyfills for different versions of mocha.
* Tries to mimic the functionality of mocha's latest api.
*
* Currently supports mocha < 6
*/
export class MochaAdapter {
public static readonly inject = tokens(commonTokens.logger);
constructor(private readonly log: Logger) {}
public create(options: Mocha.MochaOptions): Mocha {
return new LibWrapper.Mocha(options);
}
public collectFiles(options: MochaOptions): string[] {
const originalProcessExit = process.exit;
try {
// process.exit unfortunate side effect: https://github.com/mochajs/mocha/blob/07ea8763c663bdd3fe1f8446cdb62dae233f4916/lib/cli/run-helpers.js#L174
(process as any).exit = () => {};
const files = LibWrapper.collectFiles!(options);
if (Array.isArray(files)) {
return files;
} else {
return files.files;
}
} finally {
process.exit = originalProcessExit;
}
}
public async handleRequires(requires: string[]): Promise<RootHookObject | undefined> {
this.log.trace('Resolving requires %s', requires);
if (LibWrapper.handleRequires) {
this.log.trace('Using `handleRequires`');
const rawRootHooks = await LibWrapper.handleRequires(requires);
if (rawRootHooks) {
if (LibWrapper.loadRootHooks) {
// `loadRootHooks` made a brief appearance in mocha 8, removed in mocha 8.2
return await LibWrapper.loadRootHooks(rawRootHooks);
} else {
return (rawRootHooks as { rootHooks: RootHookObject }).rootHooks;
}
}
} else {
const modulesToRequire = requires.map((moduleName) => {
const maybeSetupFileName = path.resolve(moduleName);
if (fs.existsSync(maybeSetupFileName)) {
return maybeSetupFileName;
} else {
return moduleName;
}
});
this.log.trace('Requiring %s manually', modulesToRequire);
modulesToRequire.forEach(LibWrapper.require);
}
return undefined;
}
}