change replacer function signatures to match that of stringify, detect circular refer...
[squeep-logger-json-console] / test / lib / json-replacers.js
1 /* eslint-env mocha */
2 'use strict';
3
4 const assert = require('assert');
5 const sinon = require('sinon'); // eslint-disable-line node/no-unpublished-require
6 const http = require('http');
7 const jsonReplacers = require('../../lib/json-replacers');
8
9 describe('JSON Replacers', function () {
10 let key;
11 beforeEach(function () {
12 key = 'key';
13 });
14 afterEach(function () {
15 sinon.restore();
16 });
17
18 /**
19 * Helper to check non-replacement.
20 * @param {(key, value)=>{result, value}} replacer
21 * @param {*} value
22 */
23 function shouldNotReplace(replacer, value) {
24 const result = replacer(key, value);
25 assert.deepStrictEqual(result, value);
26 }
27
28 describe('replacerError', function () {
29 it('ignores other values', function () {
30 shouldNotReplace(jsonReplacers.replacerError, 100);
31 });
32 it('renders an Error as an Object', function () {
33 const value = new Error('oh no');
34 const result = jsonReplacers.replacerError(key, value);
35 assert.strictEqual(result.message, 'oh no');
36 assert('stack' in result);
37 });
38 }); // replacerError
39
40 describe('replacerBigInt', function () {
41 it('ignores other values', function () {
42 shouldNotReplace(jsonReplacers.replacerBigInt, 100);
43 });
44 it('renders a BigInt as a String', function () {
45 const value = 100n;
46 const result = jsonReplacers.replacerBigInt(key, value);
47 assert.strictEqual(result, '100');
48 });
49 }); // replacerBigInt
50
51 describe('replacerHttpIncomingMessage', function () {
52 it('ignores other values', function () {
53 shouldNotReplace(jsonReplacers.replacerHttpIncomingMessage, { foo: 'bar' });
54 });
55 it('renders a ClientRequest as an Object', function () {
56 const value = new http.IncomingMessage();
57 value.method = 'GET';
58 value.url = new URL('http://example.com/');
59 const result = jsonReplacers.replacerHttpIncomingMessage(key, value);
60 assert.strictEqual(result.method, 'GET');
61 assert.strictEqual(result.url.href, 'http://example.com/');
62 });
63 it('scrubs auth header from IncomingMessage Object', function () {
64 const value = new http.IncomingMessage();
65 value.headers.authorization = 'Super secret scheme';
66 const result = jsonReplacers.replacerHttpIncomingMessage(key, value);
67 assert.strictEqual(result.headers.authorization, 'Super *************');
68 });
69 }); // replacerHttpIncomingMessage
70
71 describe('replacerHttpServerResponse', function () {
72 it('ignores other values', function () {
73 shouldNotReplace(jsonReplacers.replacerHttpServerResponse, { foo: 'bar' });
74 });
75 it('renders a ServerResponse as an Object', function () {
76 const value = Object.create(http.ServerResponse.prototype);
77 const result = jsonReplacers.replacerHttpServerResponse(key, value);
78 assert.strictEqual(result.statusCode, 200);
79 });
80 }); // replacerHttpServerResponse
81
82 }); // JSON Replacers