You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					209 lines
				
				5.9 KiB
			
		
		
			
		
	
	
					209 lines
				
				5.9 KiB
			| 
											3 years ago
										 | 'use strict' | ||
|  | const { test } = require('tap') | ||
|  | const { sink, once } = require('./helper') | ||
|  | const pino = require('../') | ||
|  | 
 | ||
|  | const parentSerializers = { | ||
|  |   test: () => 'parent' | ||
|  | } | ||
|  | 
 | ||
|  | const childSerializers = { | ||
|  |   test: () => 'child' | ||
|  | } | ||
|  | 
 | ||
|  | test('default err namespace error serializer', async ({ equal }) => { | ||
|  |   const stream = sink() | ||
|  |   const parent = pino(stream) | ||
|  | 
 | ||
|  |   parent.info({ err: ReferenceError('test') }) | ||
|  |   const o = await once(stream, 'data') | ||
|  |   equal(typeof o.err, 'object') | ||
|  |   equal(o.err.type, 'ReferenceError') | ||
|  |   equal(o.err.message, 'test') | ||
|  |   equal(typeof o.err.stack, 'string') | ||
|  | }) | ||
|  | 
 | ||
|  | test('custom serializer overrides default err namespace error serializer', async ({ equal }) => { | ||
|  |   const stream = sink() | ||
|  |   const parent = pino({ | ||
|  |     serializers: { | ||
|  |       err: (e) => ({ | ||
|  |         t: e.constructor.name, | ||
|  |         m: e.message, | ||
|  |         s: e.stack | ||
|  |       }) | ||
|  |     } | ||
|  |   }, stream) | ||
|  | 
 | ||
|  |   parent.info({ err: ReferenceError('test') }) | ||
|  |   const o = await once(stream, 'data') | ||
|  |   equal(typeof o.err, 'object') | ||
|  |   equal(o.err.t, 'ReferenceError') | ||
|  |   equal(o.err.m, 'test') | ||
|  |   equal(typeof o.err.s, 'string') | ||
|  | }) | ||
|  | 
 | ||
|  | test('null overrides default err namespace error serializer', async ({ equal }) => { | ||
|  |   const stream = sink() | ||
|  |   const parent = pino({ serializers: { err: null } }, stream) | ||
|  | 
 | ||
|  |   parent.info({ err: ReferenceError('test') }) | ||
|  |   const o = await once(stream, 'data') | ||
|  |   equal(typeof o.err, 'object') | ||
|  |   equal(typeof o.err.type, 'undefined') | ||
|  |   equal(typeof o.err.message, 'undefined') | ||
|  |   equal(typeof o.err.stack, 'undefined') | ||
|  | }) | ||
|  | 
 | ||
|  | test('undefined overrides default err namespace error serializer', async ({ equal }) => { | ||
|  |   const stream = sink() | ||
|  |   const parent = pino({ serializers: { err: undefined } }, stream) | ||
|  | 
 | ||
|  |   parent.info({ err: ReferenceError('test') }) | ||
|  |   const o = await once(stream, 'data') | ||
|  |   equal(typeof o.err, 'object') | ||
|  |   equal(typeof o.err.type, 'undefined') | ||
|  |   equal(typeof o.err.message, 'undefined') | ||
|  |   equal(typeof o.err.stack, 'undefined') | ||
|  | }) | ||
|  | 
 | ||
|  | test('serializers override values', async ({ equal }) => { | ||
|  |   const stream = sink() | ||
|  |   const parent = pino({ serializers: parentSerializers }, stream) | ||
|  |   parent.child({}, { serializers: childSerializers }) | ||
|  | 
 | ||
|  |   parent.fatal({ test: 'test' }) | ||
|  |   const o = await once(stream, 'data') | ||
|  |   equal(o.test, 'parent') | ||
|  | }) | ||
|  | 
 | ||
|  | test('child does not overwrite parent serializers', async ({ equal }) => { | ||
|  |   const stream = sink() | ||
|  |   const parent = pino({ serializers: parentSerializers }, stream) | ||
|  |   const child = parent.child({}, { serializers: childSerializers }) | ||
|  | 
 | ||
|  |   parent.fatal({ test: 'test' }) | ||
|  | 
 | ||
|  |   const o = once(stream, 'data') | ||
|  |   equal((await o).test, 'parent') | ||
|  |   const o2 = once(stream, 'data') | ||
|  |   child.fatal({ test: 'test' }) | ||
|  |   equal((await o2).test, 'child') | ||
|  | }) | ||
|  | 
 | ||
|  | test('Symbol.for(\'pino.serializers\')', async ({ equal, not }) => { | ||
|  |   const stream = sink() | ||
|  |   const parent = pino({ serializers: parentSerializers }, stream) | ||
|  |   const child = parent.child({ a: 'property' }) | ||
|  | 
 | ||
|  |   equal(parent[Symbol.for('pino.serializers')], parentSerializers) | ||
|  |   equal(child[Symbol.for('pino.serializers')], parentSerializers) | ||
|  | 
 | ||
|  |   const child2 = parent.child({}, { | ||
|  |     serializers: { | ||
|  |       a | ||
|  |     } | ||
|  |   }) | ||
|  | 
 | ||
|  |   function a () { | ||
|  |     return 'hello' | ||
|  |   } | ||
|  | 
 | ||
|  |   not(child2[Symbol.for('pino.serializers')], parentSerializers) | ||
|  |   equal(child2[Symbol.for('pino.serializers')].a, a) | ||
|  |   equal(child2[Symbol.for('pino.serializers')].test, parentSerializers.test) | ||
|  | }) | ||
|  | 
 | ||
|  | test('children inherit parent serializers', async ({ equal }) => { | ||
|  |   const stream = sink() | ||
|  |   const parent = pino({ serializers: parentSerializers }, stream) | ||
|  | 
 | ||
|  |   const child = parent.child({ a: 'property' }) | ||
|  |   child.fatal({ test: 'test' }) | ||
|  |   const o = await once(stream, 'data') | ||
|  |   equal(o.test, 'parent') | ||
|  | }) | ||
|  | 
 | ||
|  | test('children inherit parent Symbol serializers', async ({ equal, not }) => { | ||
|  |   const stream = sink() | ||
|  |   const symbolSerializers = { | ||
|  |     [Symbol.for('pino.*')]: parentSerializers.test | ||
|  |   } | ||
|  |   const parent = pino({ serializers: symbolSerializers }, stream) | ||
|  | 
 | ||
|  |   equal(parent[Symbol.for('pino.serializers')], symbolSerializers) | ||
|  | 
 | ||
|  |   const child = parent.child({}, { | ||
|  |     serializers: { | ||
|  |       [Symbol.for('a')]: a, | ||
|  |       a | ||
|  |     } | ||
|  |   }) | ||
|  | 
 | ||
|  |   function a () { | ||
|  |     return 'hello' | ||
|  |   } | ||
|  | 
 | ||
|  |   not(child[Symbol.for('pino.serializers')], symbolSerializers) | ||
|  |   equal(child[Symbol.for('pino.serializers')].a, a) | ||
|  |   equal(child[Symbol.for('pino.serializers')][Symbol.for('a')], a) | ||
|  |   equal(child[Symbol.for('pino.serializers')][Symbol.for('pino.*')], parentSerializers.test) | ||
|  | }) | ||
|  | 
 | ||
|  | test('children serializers get called', async ({ equal }) => { | ||
|  |   const stream = sink() | ||
|  |   const parent = pino({ | ||
|  |     test: 'this' | ||
|  |   }, stream) | ||
|  | 
 | ||
|  |   const child = parent.child({ a: 'property' }, { serializers: childSerializers }) | ||
|  | 
 | ||
|  |   child.fatal({ test: 'test' }) | ||
|  |   const o = await once(stream, 'data') | ||
|  |   equal(o.test, 'child') | ||
|  | }) | ||
|  | 
 | ||
|  | test('children serializers get called when inherited from parent', async ({ equal }) => { | ||
|  |   const stream = sink() | ||
|  |   const parent = pino({ | ||
|  |     test: 'this', | ||
|  |     serializers: parentSerializers | ||
|  |   }, stream) | ||
|  | 
 | ||
|  |   const child = parent.child({}, { serializers: { test: function () { return 'pass' } } }) | ||
|  | 
 | ||
|  |   child.fatal({ test: 'fail' }) | ||
|  |   const o = await once(stream, 'data') | ||
|  |   equal(o.test, 'pass') | ||
|  | }) | ||
|  | 
 | ||
|  | test('non-overridden serializers are available in the children', async ({ equal }) => { | ||
|  |   const stream = sink() | ||
|  |   const pSerializers = { | ||
|  |     onlyParent: function () { return 'parent' }, | ||
|  |     shared: function () { return 'parent' } | ||
|  |   } | ||
|  | 
 | ||
|  |   const cSerializers = { | ||
|  |     shared: function () { return 'child' }, | ||
|  |     onlyChild: function () { return 'child' } | ||
|  |   } | ||
|  | 
 | ||
|  |   const parent = pino({ serializers: pSerializers }, stream) | ||
|  | 
 | ||
|  |   const child = parent.child({}, { serializers: cSerializers }) | ||
|  | 
 | ||
|  |   const o = once(stream, 'data') | ||
|  |   child.fatal({ shared: 'test' }) | ||
|  |   equal((await o).shared, 'child') | ||
|  |   const o2 = once(stream, 'data') | ||
|  |   child.fatal({ onlyParent: 'test' }) | ||
|  |   equal((await o2).onlyParent, 'parent') | ||
|  |   const o3 = once(stream, 'data') | ||
|  |   child.fatal({ onlyChild: 'test' }) | ||
|  |   equal((await o3).onlyChild, 'child') | ||
|  |   const o4 = once(stream, 'data') | ||
|  |   parent.fatal({ onlyChild: 'test' }) | ||
|  |   equal((await o4).onlyChild, 'test') | ||
|  | }) |