--- /dev/null
+/* 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