Initial commit
[squeep-logger-json-console] / test / lib / json-replacers.js
diff --git a/test/lib/json-replacers.js b/test/lib/json-replacers.js
new file mode 100644 (file)
index 0000000..1c26250
--- /dev/null
@@ -0,0 +1,88 @@
+/* eslint-env mocha */
+'use strict';
+
+const assert = require('assert');
+const sinon = require('sinon'); // eslint-disable-line node/no-unpublished-require
+const http = require('http');
+const jsonReplacers = require('../../lib/json-replacers');
+
+describe('JSON Replacers', function () {
+  let key;
+  beforeEach(function () {
+    key = 'key';
+  });
+  afterEach(function () {
+    sinon.restore();
+  });
+
+  /**
+   * Helper to check non-replacement.
+   * @param {(key, value)=>{result, value}} replacer
+   * @param {*} value
+   */
+  function shouldNotReplace(replacer, value) {
+    const result = replacer(key, value);
+    assert.strictEqual(result.replaced, false);
+    assert.strictEqual(result.value, value);
+  }
+
+  describe('replacerError', function () {
+    it('ignores other values', function () {
+      shouldNotReplace(jsonReplacers.replacerError, 100);
+    });
+    it('renders an Error as an Object', function () {
+      const value = new Error('oh no');
+      const result = jsonReplacers.replacerError(key, value);
+      assert.strictEqual(result.replaced, true);
+      assert.strictEqual(result.value.message, 'oh no');
+      assert('stack' in result.value);
+    });
+  }); // replacerError
+
+  describe('replacerBigInt', function () {
+    it('ignores other values', function () {
+      shouldNotReplace(jsonReplacers.replacerBigInt, 100);
+    });
+    it('renders a BigInt as a String', function () {
+      const value = 100n;
+      const result = jsonReplacers.replacerBigInt(key, value);
+      assert.strictEqual(result.replaced, true);
+      assert.strictEqual(result.value, '100');
+    });
+  }); // replacerBigInt
+
+  describe('replacerHttpIncomingMessage', function () {
+    it('ignores other values', function () {
+      shouldNotReplace(jsonReplacers.replacerHttpIncomingMessage, { foo: 'bar' });
+    });
+    it('renders a ClientRequest as an Object', function () {
+      const value = new http.IncomingMessage();
+      value.method = 'GET';
+      value.url = new URL('http://example.com/');
+      const result = jsonReplacers.replacerHttpIncomingMessage(key, value);
+      assert.strictEqual(result.replaced, true);
+      assert.strictEqual(result.value.method, 'GET');
+      assert.strictEqual(result.value.url.href, 'http://example.com/');
+    });
+    it('scrubs auth header from IncomingMessage Object', function () {
+      const value = new http.IncomingMessage();
+      value.headers.authorization = 'Super secret scheme';
+      const result = jsonReplacers.replacerHttpIncomingMessage(key, value);
+      assert.strictEqual(result.replaced, true);
+      assert.strictEqual(result.value.headers.authorization, 'Super *************');
+    });
+  }); // replacerHttpIncomingMessage
+
+  describe('replacerHttpServerResponse', function () {
+    it('ignores other values', function () {
+      shouldNotReplace(jsonReplacers.replacerHttpServerResponse, { foo: 'bar' });
+    });
+    it('renders a ServerResponse as an Object', function () {
+      const value = Object.create(http.ServerResponse.prototype);
+      const result = jsonReplacers.replacerHttpServerResponse(key, value);
+      assert.strictEqual(result.replaced, true);
+      assert.strictEqual(result.value.statusCode, 200);
+    });
+  }); // replacerHttpServerResponse
+
+}); // JSON Replacers
\ No newline at end of file