Initial commit
[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.strictEqual(result.replaced, false);
26 assert.strictEqual(result.value, value);
27 }
28
29 describe('replacerError', function () {
30 it('ignores other values', function () {
31 shouldNotReplace(jsonReplacers.replacerError, 100);
32 });
33 it('renders an Error as an Object', function () {
34 const value = new Error('oh no');
35 const result = jsonReplacers.replacerError(key, value);
36 assert.strictEqual(result.replaced, true);
37 assert.strictEqual(result.value.message, 'oh no');
38 assert('stack' in result.value);
39 });
40 }); // replacerError
41
42 describe('replacerBigInt', function () {
43 it('ignores other values', function () {
44 shouldNotReplace(jsonReplacers.replacerBigInt, 100);
45 });
46 it('renders a BigInt as a String', function () {
47 const value = 100n;
48 const result = jsonReplacers.replacerBigInt(key, value);
49 assert.strictEqual(result.replaced, true);
50 assert.strictEqual(result.value, '100');
51 });
52 }); // replacerBigInt
53
54 describe('replacerHttpIncomingMessage', function () {
55 it('ignores other values', function () {
56 shouldNotReplace(jsonReplacers.replacerHttpIncomingMessage, { foo: 'bar' });
57 });
58 it('renders a ClientRequest as an Object', function () {
59 const value = new http.IncomingMessage();
60 value.method = 'GET';
61 value.url = new URL('http://example.com/');
62 const result = jsonReplacers.replacerHttpIncomingMessage(key, value);
63 assert.strictEqual(result.replaced, true);
64 assert.strictEqual(result.value.method, 'GET');
65 assert.strictEqual(result.value.url.href, 'http://example.com/');
66 });
67 it('scrubs auth header from IncomingMessage Object', function () {
68 const value = new http.IncomingMessage();
69 value.headers.authorization = 'Super secret scheme';
70 const result = jsonReplacers.replacerHttpIncomingMessage(key, value);
71 assert.strictEqual(result.replaced, true);
72 assert.strictEqual(result.value.headers.authorization, 'Super *************');
73 });
74 }); // replacerHttpIncomingMessage
75
76 describe('replacerHttpServerResponse', function () {
77 it('ignores other values', function () {
78 shouldNotReplace(jsonReplacers.replacerHttpServerResponse, { foo: 'bar' });
79 });
80 it('renders a ServerResponse as an Object', function () {
81 const value = Object.create(http.ServerResponse.prototype);
82 const result = jsonReplacers.replacerHttpServerResponse(key, value);
83 assert.strictEqual(result.replaced, true);
84 assert.strictEqual(result.value.statusCode, 200);
85 });
86 }); // replacerHttpServerResponse
87
88 }); // JSON Replacers