const { test } = require('tap'); const sandbox = require('@log4js-node/sandboxed-module'); const realFS = require('fs'); const modulePath = 'some/path/to/mylog4js.json'; const pathsChecked = []; let fakeFS = {}; let dependencies; let fileRead; test('log4js configure', (batch) => { batch.beforeEach((done) => { fileRead = 0; fakeFS = { realpath: realFS.realpath, // fs-extra looks for this ReadStream: realFS.ReadStream, // need to define these, because graceful-fs uses them WriteStream: realFS.WriteStream, read: realFS.read, closeSync: () => {}, config: { appenders: { console: { type: 'console', layout: { type: 'messagePassThrough' }, }, }, categories: { default: { appenders: ['console'], level: 'INFO', }, }, }, readdirSync: (dir) => require('fs').readdirSync(dir), readFileSync: (file, encoding) => { fileRead += 1; batch.type(file, 'string'); batch.equal(file, modulePath); batch.equal(encoding, 'utf8'); return JSON.stringify(fakeFS.config); }, statSync: (path) => { pathsChecked.push(path); if (path === modulePath) { return { mtime: new Date() }; } throw new Error('no such file'); }, }; dependencies = { requires: { fs: fakeFS, }, }; if (typeof done === 'function') { done(); } }); batch.test( 'when configuration file loaded via LOG4JS_CONFIG env variable', (t) => { process.env.LOG4JS_CONFIG = 'some/path/to/mylog4js.json'; const log4js = sandbox.require('../../lib/log4js', dependencies); t.notOk(log4js.isConfigured(), 'should not have configured'); log4js.getLogger('test-logger'); t.ok(log4js.isConfigured(), 'should be configured'); t.equal(fileRead, 1, 'should load the specified local config file'); delete process.env.LOG4JS_CONFIG; t.end(); } ); batch.test( 'when configuration is set via configure() method call, return the log4js object', (t) => { const log4js = sandbox .require('../../lib/log4js', dependencies) .configure(fakeFS.config); t.type( log4js, 'object', 'Configure method call should return the log4js object!' ); const log = log4js.getLogger('daemon'); t.type( log, 'object', 'log4js object, returned by configure(...) method should be able to create log object.' ); t.type(log.info, 'function'); t.end(); } ); batch.end(); });