bump package version to 3.0.2
[squeep-test-helper] / lib / stub-logger.js
index 6df2b94f97e4d932f53d9afca1f300d4b6acc0be..aa053a9eeeab801f2aca49e45a992c25e78fb9b7 100644 (file)
@@ -1,33 +1,51 @@
 '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
   }
 }