4 const assert
= require('assert');
5 const sinon
= require('sinon'); // eslint-disable-line node/no-unpublished-require
6 const Logger
= require('../../src/logger');
7 const Config
= require('../../config');
9 describe('Logger', function () {
13 beforeEach(function () {
14 config
= new Config('test');
15 logger
= new Logger(config
);
16 Object
.keys(Logger
.nullLogger
).forEach((level
) => sinon
.stub(logger
.backend
, level
));
19 afterEach(function () {
23 it('logs', function () {
24 logger
.info('testScope', 'message', { baz: 'quux' }, { foo: 1 }, 'more other');
25 assert(logger
.backend
.info
.called
);
28 it('logs BigInts', function () {
29 logger
.info('testScope', 'message', { aBigInteger: BigInt(2) });
30 assert(logger
.backend
.info
.called
);
31 assert(logger
.backend
.info
.args
[0][0].includes('"2"'));
34 it('logs Errors', function () {
35 logger
.error('testScope', 'message', { e: new Error('an error') });
36 assert(logger
.backend
.error
.called
);
37 assert(logger
.backend
.error
.args
[0][0].includes('an error'));
40 it('masks credentials', function () {
41 logger
.info('testScope', 'message', {
45 credential: 'password',
49 assert(logger
.backend
.info
.called
);
50 assert(logger
.backend
.info
.args
[0][0].includes('"username"'));
51 assert(logger
.backend
.info
.args
[0][0].includes('"********"'));
54 it('masks noisy cookie header', function () {
55 logger
.info('testScope', 'message', {
58 squeepSession: 'blahblahblahblahblah',
62 assert(logger
.backend
.info
.called
);
63 assert(logger
.backend
.info
.args
[0][0].includes('[scrubbed 20 bytes]'));
66 it('masks otp values', function () {
67 logger
.info('teestScope', 'message', {
69 otpKey: '1234567890123456789012',
70 otpConfirmKey: '1234567890123456789012',
71 otpConfirmBox: 'xxxMysteryxxx',
72 otpState: 'xxxMysteryxxx',
75 assert(logger
.backend
.info
.called
);
76 assert(!logger
.backend
.info
.args
[0][0].includes('"1234567890123456789012"'));
77 assert(!logger
.backend
.info
.args
[0][0].includes('"xxxMysteryxxx"'));
80 it('strips uninteresting scope dross', function () {
81 logger
.info('testScope', 'message', {
85 'https://thuza.ratfeathers.com/': {
87 description: 'Access detailed profile information, including name, image, and url.',
88 application: 'IndieAuth',
90 'https://thuza.ratfeathers.com/',
93 isManuallyAdded: false,
99 description: 'Access detailed profile information, including name, image, and url.',
100 application: 'IndieAuth',
102 'https://thuza.ratfeathers.com/',
105 isManuallyAdded: false,
108 description: 'Include email address with detailed profile information.',
109 application: 'IndieAuth',
112 isManuallyAdded: false,
118 assert(logger
.backend
.info
.called
);
121 it('strips uninteresting scope dross from session', function () {
122 logger
.info('testScope', 'message', {
126 'https://thuza.ratfeathers.com/': {
128 description: 'Access detailed profile information, including name, image, and url.',
129 application: 'IndieAuth',
131 'https://thuza.ratfeathers.com/',
134 isManuallyAdded: false,
140 description: 'Access detailed profile information, including name, image, and url.',
141 application: 'IndieAuth',
143 'https://thuza.ratfeathers.com/',
146 isManuallyAdded: false,
149 description: 'Include email address with detailed profile information.',
150 application: 'IndieAuth',
153 isManuallyAdded: false,
159 assert(logger
.backend
.info
.called
);