stryker-mocha-runner
Version:
A plugin to use the mocha test runner in Stryker, the JavaScript mutation testing framework
122 lines • 5.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var path = require("path");
var test_runner_1 = require("stryker-api/test_runner");
var LibWrapper_1 = require("./LibWrapper");
var StrykerMochaReporter_1 = require("./StrykerMochaReporter");
var MochaRunnerOptions_1 = require("./MochaRunnerOptions");
var utils_1 = require("./utils");
var plugin_1 = require("stryker-api/plugin");
var DEFAULT_TEST_PATTERN = 'test/**/*.js';
var MochaTestRunner = /** @class */ (function () {
function MochaTestRunner(log, allFileNames, options) {
this.log = log;
this.allFileNames = allFileNames;
this.mochaRunnerOptions = options[MochaRunnerOptions_1.mochaOptionsKey];
this.additionalRequires();
StrykerMochaReporter_1.StrykerMochaReporter.log = log;
}
MochaTestRunner.prototype.init = function () {
var globPatterns = this.mochaFileGlobPatterns();
var globPatternsAbsolute = globPatterns.map(function (glob) { return path.resolve(glob); });
this.testFileNames = LibWrapper_1.default.multimatch(this.allFileNames.slice(), globPatternsAbsolute);
if (this.testFileNames.length) {
this.log.debug("Using files: " + JSON.stringify(this.testFileNames, null, 2));
}
else {
this.log.debug("Tried " + JSON.stringify(globPatternsAbsolute, null, 2) + " on files: " + JSON.stringify(this.allFileNames, null, 2) + ".");
throw new Error("[" + MochaTestRunner.name + "] No files discovered (tried pattern(s) " + JSON.stringify(globPatterns, null, 2) + "). Please specify the files (glob patterns) containing your tests in " + MochaRunnerOptions_1.mochaOptionsKey + ".files in your stryker.conf.js file.");
}
};
MochaTestRunner.prototype.mochaFileGlobPatterns = function () {
if (typeof this.mochaRunnerOptions.files === 'string') {
return [this.mochaRunnerOptions.files];
}
else {
return this.mochaRunnerOptions.files || [DEFAULT_TEST_PATTERN];
}
};
MochaTestRunner.prototype.run = function (_a) {
var _this = this;
var testHooks = _a.testHooks;
return new Promise(function (resolve, reject) {
try {
_this.purgeFiles();
var mocha_1 = new LibWrapper_1.default.Mocha({ reporter: StrykerMochaReporter_1.StrykerMochaReporter, bail: true });
_this.configure(mocha_1);
_this.addTestHooks(mocha_1, testHooks);
_this.addFiles(mocha_1);
try {
mocha_1.run(function () {
var reporter = StrykerMochaReporter_1.StrykerMochaReporter.currentInstance;
if (reporter) {
var result = reporter.runResult;
resolve(result);
}
else {
var errorMsg = 'The StrykerMochaReporter was not instantiated properly. Could not retrieve the RunResult.';
_this.log.error(errorMsg);
resolve({
errorMessages: [errorMsg],
status: test_runner_1.RunStatus.Error,
tests: []
});
}
});
}
catch (error) {
resolve({
errorMessages: [error],
status: test_runner_1.RunStatus.Error,
tests: []
});
}
}
catch (error) {
_this.log.error(error);
reject(error);
}
});
};
MochaTestRunner.prototype.purgeFiles = function () {
this.allFileNames.forEach(function (fileName) { return delete require.cache[fileName]; });
};
MochaTestRunner.prototype.addFiles = function (mocha) {
this.testFileNames.forEach(function (fileName) {
mocha.addFile(fileName);
});
};
MochaTestRunner.prototype.addTestHooks = function (mocha, testHooks) {
if (testHooks) {
var suite_1 = mocha.suite;
suite_1.emit('pre-require', global, '', mocha);
suite_1.emit('require', utils_1.evalGlobal(testHooks), '', mocha);
suite_1.emit('post-require', global, '', mocha);
}
};
MochaTestRunner.prototype.configure = function (mocha) {
var options = this.mochaRunnerOptions;
function setIfDefined(value, operation) {
if (typeof value !== 'undefined') {
operation.apply(mocha, [value]);
}
}
if (options) {
setIfDefined(options.asyncOnly, mocha.asyncOnly);
setIfDefined(options.timeout, mocha.timeout);
setIfDefined(options.ui, mocha.ui);
setIfDefined(options.grep, mocha.grep);
}
};
MochaTestRunner.prototype.additionalRequires = function () {
if (this.mochaRunnerOptions.require) {
var modulesToRequire = this.mochaRunnerOptions.require
.map(function (moduleName) { return moduleName.startsWith('.') ? path.resolve(moduleName) : moduleName; });
modulesToRequire.forEach(LibWrapper_1.default.require);
}
};
MochaTestRunner.inject = plugin_1.tokens(plugin_1.commonTokens.logger, plugin_1.commonTokens.sandboxFileNames, plugin_1.commonTokens.options);
return MochaTestRunner;
}());
exports.default = MochaTestRunner;
//# sourceMappingURL=MochaTestRunner.js.map