108 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
'use strict'
 | 
						|
 | 
						|
const test = require('node:test')
 | 
						|
const os = require('node:os')
 | 
						|
const diagChan = require('node:diagnostics_channel')
 | 
						|
const { AsyncLocalStorage } = require('node:async_hooks')
 | 
						|
const { Writable } = require('node:stream')
 | 
						|
const tspl = require('@matteo.collina/tspl')
 | 
						|
const pino = require('../pino')
 | 
						|
 | 
						|
const hostname = os.hostname()
 | 
						|
const { pid } = process
 | 
						|
const AS_JSON_START = 'tracing:pino_asJson:start'
 | 
						|
const AS_JSON_END = 'tracing:pino_asJson:end'
 | 
						|
 | 
						|
// Skip tests if diagnostics_channel.tracingChannel is not available (Node < 18.19)
 | 
						|
const skip = typeof diagChan.tracingChannel !== 'function'
 | 
						|
 | 
						|
test.beforeEach(ctx => {
 | 
						|
  ctx.pino = {
 | 
						|
    ts: 1757512800000, // 2025-09-10T10:00:00.000-05:00
 | 
						|
    now: Date.now
 | 
						|
  }
 | 
						|
 | 
						|
  Date.now = () => ctx.pino.ts
 | 
						|
 | 
						|
  ctx.pino.dest = new Writable({
 | 
						|
    objectMode: true,
 | 
						|
    write (data, enc, cb) {
 | 
						|
      cb()
 | 
						|
    }
 | 
						|
  })
 | 
						|
})
 | 
						|
 | 
						|
test.afterEach(ctx => {
 | 
						|
  Date.now = ctx.pino.now
 | 
						|
})
 | 
						|
 | 
						|
test('asJson emits events', { skip }, async (t) => {
 | 
						|
  const plan = tspl(t, { plan: 8 })
 | 
						|
  const { dest } = t.pino
 | 
						|
  const logger = pino({}, dest)
 | 
						|
  const expectedArguments = [
 | 
						|
    {},
 | 
						|
    'testing',
 | 
						|
    30,
 | 
						|
    `,"time":${t.pino.ts}`
 | 
						|
  ]
 | 
						|
 | 
						|
  let startEvent
 | 
						|
  diagChan.subscribe(AS_JSON_START, startHandler)
 | 
						|
  diagChan.subscribe(AS_JSON_END, endHandler)
 | 
						|
 | 
						|
  logger.info('testing')
 | 
						|
  await plan
 | 
						|
 | 
						|
  diagChan.unsubscribe(AS_JSON_START, startHandler)
 | 
						|
  diagChan.unsubscribe(AS_JSON_END, endHandler)
 | 
						|
 | 
						|
  function startHandler (event) {
 | 
						|
    startEvent = event
 | 
						|
    plan.equal(Object.prototype.toString.call(event.instance), '[object Pino]')
 | 
						|
    plan.equal(event.instance === logger, true)
 | 
						|
    plan.deepStrictEqual(Array.from(event.arguments ?? []), expectedArguments)
 | 
						|
  }
 | 
						|
 | 
						|
  function endHandler (event) {
 | 
						|
    plan.equal(Object.prototype.toString.call(event.instance), '[object Pino]')
 | 
						|
    plan.equal(event.instance === logger, true)
 | 
						|
    plan.deepStrictEqual(Array.from(event.arguments ?? []), expectedArguments)
 | 
						|
    plan.equal(
 | 
						|
      event.result,
 | 
						|
      `{"level":30,"time":${t.pino.ts},"pid":${pid},"hostname":"${hostname}","msg":"testing"}\n`
 | 
						|
    )
 | 
						|
 | 
						|
    plan.equal(event.arguments === startEvent.arguments, true, 'same event object is supplied to both events')
 | 
						|
  }
 | 
						|
})
 | 
						|
 | 
						|
test('asJson context is not lost', { skip }, async (t) => {
 | 
						|
  const plan = tspl(t, { plan: 2 })
 | 
						|
  const { dest } = t.pino
 | 
						|
  const logger = pino({}, dest)
 | 
						|
  const asyncLocalStorage = new AsyncLocalStorage()
 | 
						|
  const localStore = { foo: 'bar' }
 | 
						|
 | 
						|
  diagChan.subscribe(AS_JSON_START, startHandler)
 | 
						|
  diagChan.subscribe(AS_JSON_END, endHandler)
 | 
						|
 | 
						|
  asyncLocalStorage.run(localStore, () => {
 | 
						|
    logger.info('testing')
 | 
						|
  })
 | 
						|
  await plan
 | 
						|
 | 
						|
  diagChan.unsubscribe(AS_JSON_START, startHandler)
 | 
						|
  diagChan.unsubscribe(AS_JSON_END, endHandler)
 | 
						|
 | 
						|
  function startHandler () {
 | 
						|
    const store = asyncLocalStorage.getStore()
 | 
						|
    plan.equal(store === localStore, true)
 | 
						|
  }
 | 
						|
 | 
						|
  function endHandler () {
 | 
						|
    const store = asyncLocalStorage.getStore()
 | 
						|
    plan.equal(store === localStore, true)
 | 
						|
  }
 | 
						|
})
 |