gremlins-ts
Version:
A monkey testing library written in JavaScript, for Node.js and the browser. Use it to check the robustness of web applications by unleashing a horde of undisciplined gremlins.
83 lines (75 loc) • 2.21 kB
text/typescript
import { configurable } from "../utils";
/**
* Gizmo is a special mogwai who can stop the gremlins when they go too far
*
* The gizmo mogwai monitors the JavaScript alerts and the calls to
* console.alert(), and stops the stress test execution once the number of
* errors pass a certain threshold (10 errors by default).
*
* var gizmoMogwai = gremlins.mogwais.gizmo();
* horde.mogwai(gizmoMogwai);
*
* The gizmo mogwai can be customized as follows:
*
* gizmoMogwai.maxErrors(10); // the number of errors after which the test stops
* gizmoMogwai.logger(loggerObject); // inject a logger
*
* Example usage:
*
* horde.mogwai(gremlins.mogwais.gizmo()
* .maxErrors(5)
* );
*/
type Config = {
maxErrors: number;
logger: typeof console;
};
export function gizmo() {
const config: Config = {
maxErrors: 10,
logger: console
};
let realOnError: Window["onerror"];
let realLoggerError: typeof console["error"];
function gizmoMogwai() {
let nbErrors = 0;
// @ts-ignore
let horde = this; // this is exceptional - don't use 'this' for mogwais in general
function incrementNbErrors() {
nbErrors++;
if (nbErrors >= config.maxErrors) {
horde.stop();
if (!config.logger) return;
window.setTimeout(function() {
// display the mogwai error after the caught error
config.logger.warn(
"mogwai ",
"gizmo ",
"stopped test execution after ",
config.maxErrors,
"errors"
);
}, 4);
}
}
// general JavaScript errors
realOnError = window.onerror;
window.onerror = function(message, url, linenumber) {
incrementNbErrors();
return realOnError ? realOnError(message, url, linenumber) : false;
};
// console errors
realLoggerError = console.error;
console.error = (...args: string[]) => {
incrementNbErrors();
realLoggerError.call(console, ...args);
};
}
gizmoMogwai.cleanUp = () => {
window.onerror = realOnError;
console.error = realLoggerError.bind(console);
return gizmoMogwai;
};
configurable(gizmoMogwai, config);
return gizmoMogwai;
}