'use strict'; const Tap = require('tap'); const TokenFormatter = require('../../lib/formatters/token'); // Prepare the test Tap.plan(15); const logObject = { _timestamp: BigInt(Date.now()) * 1000000n, _cologneLog: '1.0.0', _from: 'Dummy Logger', _level: 6, _levelString: 'error', message: 'testing stuff!' }; const isoDate = (new Date(Number(logObject._timestamp) / 1000000)).toISOString(); const defaultFormatter = new TokenFormatter(); const customFormatter = new TokenFormatter({ formatString: '{{_level}} {{_cologneLog}} {{_timestamp}} {{_magic}}' }); const ansiFormatter = new TokenFormatter({ formatString: 'string {{_ansi:red}}with color:{{_ansi:reset}} {{message}}' }); const ansiLevelFormatter = new TokenFormatter({ formatString: 'string {{_ansi:_level}}with color:{{_ansi:reset}} {{message}}' }); const plainDateFormatter = new TokenFormatter({ isoDate: false, formatString: '{{_timestamp}}' }); const customSearchFormatter = new TokenFormatter({ formatString: '[[message]]', replaceRule: /\[\[(.*?)\]\]/g }); /** * TEST: #format() - default */ const defaultFormattedString = defaultFormatter.format(logObject); Tap.equal(typeof defaultFormattedString, 'string', '#format() should output a string in default mode'); Tap.equal(defaultFormattedString, logObject.message, '#format() should include the message in default mode'); /** * TEST: #format() - custom */ const customFormattedString = customFormatter.format(logObject); Tap.equal(typeof customFormattedString, 'string', '#format() should output a string in custom mode'); Tap.ok(customFormattedString.match(logObject._level), '#format() with custom string should include the specified tokens (check 1)'); Tap.ok(customFormattedString.match(logObject._cologneLog), '#format() with custom string should include the specified tokens (check 2)'); Tap.ok(customFormattedString.match(isoDate), '#format() with iso date should include the timestamp as an iso date'); Tap.ok(customFormattedString.match('{{_magic}}'), '#format() should not replace tokens that don\'t match'); /** * TEST: #format() - ansi */ const ansiFormattedString = ansiFormatter.format(logObject); Tap.equal(typeof ansiFormattedString, 'string', '#format() should output a string in ansi mode'); Tap.equal(ansiFormattedString.split(String.fromCharCode(27) + '[31m').length, 2, '#format() with ansi tokens should colorize the string'); Tap.equal(ansiFormattedString.split(String.fromCharCode(27) + '[0m').length, 2, '#format() with ansi reset should reset the string'); /** * TEST: #format() - ansi based on level */ const ansiLevelFormattedString = ansiLevelFormatter.format(logObject); Tap.equal(ansiLevelFormattedString.split(String.fromCharCode(27) + '[34m').length, 2, '#format() with ansi tokens should colorize the string based on level'); /** * TEST: #format() - plain date */ const plainDateFormattedString = plainDateFormatter.format(logObject); Tap.equal(typeof plainDateFormattedString, 'string', '#format() should output a string in plain date mode'); Tap.equal(plainDateFormattedString, logObject._timestamp.toString(), '#format() with plain date should include the timestamp as-is'); /** * TEST: #format() - custom search */ const customSearchFormattedString = customSearchFormatter.format(logObject); Tap.equal(typeof customSearchFormattedString, 'string', '#format() should output a string in custom search mode'); Tap.equal(customSearchFormattedString, logObject.message, '#format() with a custom search, should properly match the new tokens');