/* eslint-env mocha */
'use strict';
-const assert = require('assert');
+const assert = require('node:assert');
const sinon = require('sinon'); // eslint-disable-line node/no-unpublished-require
const Logger = require('../../lib/logger');
-const http = require('http');
+const http = require('node:http');
+const { AsyncLocalStorage } = require('node:async_hooks');
+const asyncLocalStorage = new AsyncLocalStorage();
describe('Logger', function () {
- let config, logger, scope, message;
+ let config, logger, commonObject, scope, message;
beforeEach(function () {
- config = {
+ config = {};
+ commonObject = {
nodeId: '3c100e84-9a7f-11ec-9b4e-0025905f714a',
- logger: {},
};
- logger = new Logger(config);
- Object.keys(Logger.nullLogger).forEach((level) => sinon.stub(logger.backend, level));
+ logger = new Logger(config, commonObject);
+ const logWrapper = process.env['VERBOSE_TESTS'] ? sinon.spy : sinon.stub;
+ Object.keys(Logger.nullLogger).forEach((level) => logWrapper(logger.backend, level));
scope = 'testScope';
message = 'message';
});
});
it('stubs missing levels', function () {
- logger = new Logger(config);
+ const backend = {
+ debug: () => {},
+ }
+ logger = new Logger(config, commonObject, undefined, backend);
assert.strictEqual(typeof logger.info, 'function');
});
it('logs Errors', function () {
logger.error(scope, message, { e: new Error('an error') });
assert(logger.backend.error.called);
- assert(logger.backend.error.args[0][0].includes('an error'));
+ assert(logger.backend.error.args[0][0].includes('an error'), logger.backend.error.args[0][0]);
});
it('covers config settings', function () {
- config.logger.ignoreBelowLevel = 'info';
+ config.ignoreBelowLevel = 'info';
logger = new Logger(config);
logger.debug(scope, message, {});
assert(logger.backend.debug.notCalled);
});
it('covers config error', function () {
- config.logger.ignoreBelowLevel = 'not a level';
+ config.ignoreBelowLevel = 'not a level';
try {
logger = new Logger(config);
assert.fail('expected RangeError here');
it('sanitizes', function () {
logger.dataSanitizers.push((data, sanitize = true) => {
let unclean = false;
- const credentialLength = data && data.ctx && data.ctx.parsedBody && data.ctx.parsedBody.credential && data.ctx.parsedBody.credential.length;
+ const credentialLength = data?.ctx?.parsedBody?.credential?.length;
if (credentialLength) {
unclean = true;
}
assert.deepStrictEqual(levels, expected);
});
+ it('logs async storage data', async function () {
+ logger = new Logger(config, commonObject, asyncLocalStorage);
+ const data = { foo: 'bar' };
+ asyncLocalStorage.run(data, async () => {
+ logger.info(scope, message, { baz: 3 });
+ });
+ assert(logger.backend.info.called);
+ assert(logger.backend.info.args[0][0].includes('"foo":"bar"'));
+ });
+
+ it('covers no async storage', function () {
+ logger = new Logger(config);
+ const data = { foo: 'bar' };
+ asyncLocalStorage.run(data, async () => {
+ logger.info(scope, message, { baz: 3 });
+ });
+ assert(logger.backend.info.called);
+ assert(!logger.backend.info.args[0][0].includes('"foo":"bar"'));
+ });
+
+ it('covers circular objects', function () {
+ const data = { foo: 'bar' };
+ data.self = data;
+ logger.info(scope, message, data);
+ assert(logger.backend.info.called);
+ assert(logger.backend.info.args[0][0].includes('[Circular]'));
+ });
}); // Logger
\ No newline at end of file