UNPKG

node-tdd

Version:

Drop in extension for mocha to abstract commonly used test setups

61 lines (56 loc) 1.59 kB
import assert from 'assert'; import Joi from 'joi-strict'; export default (opts) => { Joi.assert(opts, Joi.object().keys({ logger: Joi.any(), verbose: Joi.boolean() }), 'Invalid Options Provided'); const logger = opts.logger; let verbose = opts.verbose; let loggerOriginal = null; const logLevels = Object .entries(logger) .filter(([k, v]) => typeof v === 'function') .map(([k]) => k); assert(logLevels.length !== 0, 'Passed logger does not expose logging functionality'); let logs; const reset = () => { logs = []; logLevels.forEach((level) => { logs[level] = []; }); }; return { inject: () => { assert(loggerOriginal === null); verbose = opts.verbose; loggerOriginal = logLevels .reduce((p, c) => Object.assign(p, { [c]: logger[c] }), {}); reset(); Object.keys(loggerOriginal).forEach((logLevel) => { logger[logLevel] = (...args) => { if (verbose === true) { loggerOriginal[logLevel](...args); } logs.push(...args); logs[logLevel].push(...args); }; }); }, release: () => { assert(loggerOriginal !== null); Object.assign(logger, loggerOriginal); loggerOriginal = null; }, verbose: (state) => { assert(typeof state === 'boolean'); verbose = state; }, levels: () => logLevels.slice(), get: (level = null) => { assert(level === null || logLevels.includes(level)); return (level === null ? logs : logs[level]).slice(); }, reset }; };