'use strict';
-const sinon = require('sinon'); // eslint-disable-line node/no-unpublished-require
-
-const nop = () => { /* */ };
+const assert = require('node:assert');
class StubLogger {
- constructor(verbose = false) {
- const logger = (process.env.VERBOSE_TESTS || verbose) ? console : StubLogger._nullLogger;
- Object.keys(StubLogger._nullLogger).forEach((level) => {
- this[level] = logger[level]; // eslint-disable-line security/detect-object-injection
- });
+ constructor(sinon, verbose = false) {
+ assert.strictEqual(sinon?.constructor?.name, 'Sandbox', 'sinon dependency not recognized');
+ this.sinon = sinon;
+ const logger = (process.env.VERBOSE_TESTS || verbose) ? console : this.constructor._nullLogger;
+ // eslint-disable-next-line security/detect-object-injection
+ this.constructor._levels.forEach((level) => this[level] = logger[level]);
+ this._spy();
}
+ /**
+ * Default log levels are nop.
+ * @returns {object} nop log levels
+ */
static get _nullLogger() {
return {
- error: nop,
- warn: nop,
- info: nop,
- log: nop,
- debug: nop,
+ error: () => undefined,
+ warn: () => undefined,
+ info: () => undefined,
+ log: () => undefined,
+ debug: () => undefined,
};
}
+ /**
+ * Returns names of all log levels.
+ * @returns {string[]} list of log level names
+ */
static get _levels() {
- return Object.keys(StubLogger._nullLogger);
+ return Object.keys(this._nullLogger);
+ }
+
+ /**
+ * Install spies on all log levels.
+ */
+ _spy() {
+ this.constructor._levels.forEach((level) => this.sinon.spy(this, level));
}
+ /**
+ * Reset spies on all log levels.
+ */
_reset() {
- Object.keys(StubLogger._nullLogger).forEach((level) => sinon.spy(this, level));
+ this.constructor._levels.forEach((level) => this[level].resetHistory()); // eslint-disable-line security/detect-object-injection
}
}