Viewing File: /home/ubuntu/efiexchange-node-base/node_modules/pino-pretty/test/lib/utils.internals.test.js

'use strict'

const tap = require('tap')
const clone = require('rfdc')()
const stringifySafe = require('fast-safe-stringify')
const { internals } = require('../../lib/utils')

tap.test('#joinLinesWithIndentation', t => {
  t.test('joinLinesWithIndentation adds indentation to beginning of subsequent lines', async t => {
    const input = 'foo\nbar\nbaz'
    const result = internals.joinLinesWithIndentation({ input })
    t.equal(result, 'foo\n    bar\n    baz')
  })

  t.test('joinLinesWithIndentation accepts custom indentation, line breaks, and eol', async t => {
    const input = 'foo\nbar\r\nbaz'
    const result = internals.joinLinesWithIndentation({ input, ident: '  ', eol: '^' })
    t.equal(result, 'foo^  bar^  baz')
  })

  t.end()
})

tap.test('#formatTime', t => {
  const dateStr = '2019-04-06T13:30:00.000-04:00'
  const epoch = new Date(dateStr)
  const epochMS = epoch.getTime()

  t.test('passes through epoch if `translateTime` is `false`', async t => {
    const formattedTime = internals.formatTime(epochMS)
    t.equal(formattedTime, epochMS)
  })

  t.test('translates epoch milliseconds if `translateTime` is `true`', async t => {
    const formattedTime = internals.formatTime(epochMS, true)
    t.equal(formattedTime, '2019-04-06 17:30:00.000 +0000')
  })

  t.test('translates epoch milliseconds to UTC string given format', async t => {
    const formattedTime = internals.formatTime(epochMS, 'd mmm yyyy H:MM')
    t.equal(formattedTime, '6 Apr 2019 17:30')
  })

  t.test('translates epoch milliseconds to SYS:STANDARD', async t => {
    const formattedTime = internals.formatTime(epochMS, 'SYS:STANDARD')
    t.match(formattedTime, /\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3} [-+]?\d{4}/)
  })

  t.test('translates epoch milliseconds to SYS:<FORMAT>', async t => {
    const formattedTime = internals.formatTime(epochMS, 'SYS:d mmm yyyy H:MM')
    t.match(formattedTime, /\d{1} \w{3} \d{4} \d{1,2}:\d{2}/)
  })

  t.test('passes through date string if `translateTime` is `false`', async t => {
    const formattedTime = internals.formatTime(dateStr)
    t.equal(formattedTime, dateStr)
  })

  t.test('translates date string if `translateTime` is `true`', async t => {
    const formattedTime = internals.formatTime(dateStr, true)
    t.equal(formattedTime, '2019-04-06 17:30:00.000 +0000')
  })

  t.test('translates date string to UTC string given format', async t => {
    const formattedTime = internals.formatTime(dateStr, 'd mmm yyyy H:MM')
    t.equal(formattedTime, '6 Apr 2019 17:30')
  })

  t.test('translates date string to SYS:STANDARD', async t => {
    const formattedTime = internals.formatTime(dateStr, 'SYS:STANDARD')
    t.match(formattedTime, /\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3} [-+]?\d{4}/)
  })

  t.test('translates date string to UTC:<FORMAT>', async t => {
    const formattedTime = internals.formatTime(dateStr, 'UTC:d mmm yyyy H:MM')
    t.equal(formattedTime, '6 Apr 2019 17:30')
  })

  t.test('translates date string to SYS:<FORMAT>', async t => {
    const formattedTime = internals.formatTime(dateStr, 'SYS:d mmm yyyy H:MM')
    t.match(formattedTime, /\d{1} \w{3} \d{4} \d{1,2}:\d{2}/)
  })

  t.end()
})

tap.test('#createDate', t => {
  const wanted = 1624450038567

  t.test('accepts arguments the Date constructor would accept', async t => {
    t.plan(2)
    t.same(internals.createDate(1624450038567).getTime(), wanted)
    t.same(internals.createDate('2021-06-23T12:07:18.567Z').getTime(), wanted)
  })

  t.test('accepts epoch as a string', async t => {
    // If Date() accepts this argument, the createDate function is not needed
    // and can be replaced with Date()
    t.plan(2)
    t.notSame(new Date('16244500385-67').getTime(), wanted)
    t.same(internals.createDate('1624450038567').getTime(), wanted)
  })

  t.end()
})

tap.test('#isValidDate', t => {
  t.test('returns true for valid dates', async t => {
    t.same(internals.isValidDate(new Date()), true)
  })

  t.test('returns false for non-dates and invalid dates', async t => {
    t.plan(2)
    t.same(internals.isValidDate('20210621'), false)
    t.same(internals.isValidDate(new Date('2021-41-99')), false)
  })

  t.end()
})

tap.test('#prettifyError', t => {
  t.test('prettifies error', t => {
    const error = Error('Bad error!')
    const lines = stringifySafe(error, Object.getOwnPropertyNames(error), 2)

    const prettyError = internals.prettifyError({ keyName: 'errorKey', lines, ident: '    ', eol: '\n' })
    t.match(prettyError, /\s*errorKey: {\n\s*"stack":[\s\S]*"message": "Bad error!"/)
    t.end()
  })

  t.end()
})

tap.test('#deleteLogProperty', t => {
  const logData = {
    level: 30,
    data1: {
      data2: { 'data-3': 'bar' }
    }
  }

  t.test('deleteLogProperty deletes property of depth 1', async t => {
    const log = clone(logData)
    internals.deleteLogProperty(log, 'data1')
    t.same(log, { level: 30 })
  })

  t.test('deleteLogProperty deletes property of depth 2', async t => {
    const log = clone(logData)
    internals.deleteLogProperty(log, 'data1.data2')
    t.same(log, { level: 30, data1: { } })
  })

  t.test('deleteLogProperty deletes property of depth 3', async t => {
    const log = clone(logData)
    internals.deleteLogProperty(log, 'data1.data2.data-3')
    t.same(log, { level: 30, data1: { data2: { } } })
  })

  t.end()
})

tap.test('#splitIgnoreKey', t => {
  t.test('splitIgnoreKey does not change key', async t => {
    const result = internals.splitIgnoreKey('data1')
    t.same(result, ['data1'])
  })

  t.test('splitIgnoreKey splits nested key', async t => {
    const result = internals.splitIgnoreKey('data1.data2.data-3')
    t.same(result, ['data1', 'data2', 'data-3'])
  })

  t.test('splitIgnoreKey splits nested keys ending with a dot', async t => {
    const result = internals.splitIgnoreKey('data1.data2.data-3.')
    t.same(result, ['data1', 'data2', 'data-3'])
  })

  t.test('splitIgnoreKey splits nested escaped key', async t => {
    const result = internals.splitIgnoreKey('logging\\.domain\\.corp/operation.foo.bar-2')
    t.same(result, ['logging.domain.corp/operation', 'foo', 'bar-2'])
  })

  t.test('splitIgnoreKey splits nested escaped key with special characters', async t => {
    const result = internals.splitIgnoreKey('logging\\.domain\\.corp/operation.!\t@#$%^&*()_+=-<>.bar\\.2')
    t.same(result, ['logging.domain.corp/operation', '!\t@#$%^&*()_+=-<>', 'bar.2'])
  })

  t.end()
})
Back to Directory File Manager