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.
		
		
		
		
		
			
		
			
				
					350 lines
				
				7.7 KiB
			
		
		
			
		
	
	
					350 lines
				
				7.7 KiB
			| 
											3 years ago
										 | 'use strict' | ||
|  | const test = require('tape') | ||
|  | const pino = require('../browser') | ||
|  | 
 | ||
|  | function noop () {} | ||
|  | 
 | ||
|  | test('throws if transmit object does not have send function', ({ end, throws }) => { | ||
|  |   throws(() => { | ||
|  |     pino({ browser: { transmit: {} } }) | ||
|  |   }) | ||
|  | 
 | ||
|  |   throws(() => { | ||
|  |     pino({ browser: { transmit: { send: 'not a func' } } }) | ||
|  |   }) | ||
|  | 
 | ||
|  |   end() | ||
|  | }) | ||
|  | 
 | ||
|  | test('calls send function after write', ({ end, is }) => { | ||
|  |   let c = 0 | ||
|  |   const logger = pino({ | ||
|  |     browser: { | ||
|  |       write: () => { | ||
|  |         c++ | ||
|  |       }, | ||
|  |       transmit: { | ||
|  |         send () { is(c, 1) } | ||
|  |       } | ||
|  |     } | ||
|  |   }) | ||
|  | 
 | ||
|  |   logger.fatal({ test: 'test' }) | ||
|  |   end() | ||
|  | }) | ||
|  | 
 | ||
|  | test('passes send function the logged level', ({ end, is }) => { | ||
|  |   const logger = pino({ | ||
|  |     browser: { | ||
|  |       write () {}, | ||
|  |       transmit: { | ||
|  |         send (level) { | ||
|  |           is(level, 'fatal') | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   }) | ||
|  | 
 | ||
|  |   logger.fatal({ test: 'test' }) | ||
|  |   end() | ||
|  | }) | ||
|  | 
 | ||
|  | test('passes send function message strings in logEvent object when asObject is not set', ({ end, same, is }) => { | ||
|  |   const logger = pino({ | ||
|  |     browser: { | ||
|  |       write: noop, | ||
|  |       transmit: { | ||
|  |         send (level, { messages }) { | ||
|  |           is(messages[0], 'test') | ||
|  |           is(messages[1], 'another test') | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   }) | ||
|  | 
 | ||
|  |   logger.fatal('test', 'another test') | ||
|  | 
 | ||
|  |   end() | ||
|  | }) | ||
|  | 
 | ||
|  | test('passes send function message objects in logEvent object when asObject is not set', ({ end, same, is }) => { | ||
|  |   const logger = pino({ | ||
|  |     browser: { | ||
|  |       write: noop, | ||
|  |       transmit: { | ||
|  |         send (level, { messages }) { | ||
|  |           same(messages[0], { test: 'test' }) | ||
|  |           is(messages[1], 'another test') | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   }) | ||
|  | 
 | ||
|  |   logger.fatal({ test: 'test' }, 'another test') | ||
|  | 
 | ||
|  |   end() | ||
|  | }) | ||
|  | 
 | ||
|  | test('passes send function message strings in logEvent object when asObject is set', ({ end, same, is }) => { | ||
|  |   const logger = pino({ | ||
|  |     browser: { | ||
|  |       asObject: true, | ||
|  |       write: noop, | ||
|  |       transmit: { | ||
|  |         send (level, { messages }) { | ||
|  |           is(messages[0], 'test') | ||
|  |           is(messages[1], 'another test') | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   }) | ||
|  | 
 | ||
|  |   logger.fatal('test', 'another test') | ||
|  | 
 | ||
|  |   end() | ||
|  | }) | ||
|  | 
 | ||
|  | test('passes send function message objects in logEvent object when asObject is set', ({ end, same, is }) => { | ||
|  |   const logger = pino({ | ||
|  |     browser: { | ||
|  |       asObject: true, | ||
|  |       write: noop, | ||
|  |       transmit: { | ||
|  |         send (level, { messages }) { | ||
|  |           same(messages[0], { test: 'test' }) | ||
|  |           is(messages[1], 'another test') | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   }) | ||
|  | 
 | ||
|  |   logger.fatal({ test: 'test' }, 'another test') | ||
|  | 
 | ||
|  |   end() | ||
|  | }) | ||
|  | 
 | ||
|  | test('supplies a timestamp (ts) in logEvent object which is exactly the same as the `time` property in asObject mode', ({ end, is }) => { | ||
|  |   let expected | ||
|  |   const logger = pino({ | ||
|  |     browser: { | ||
|  |       asObject: true, // implicit because `write`, but just to be explicit
 | ||
|  |       write (o) { | ||
|  |         expected = o.time | ||
|  |       }, | ||
|  |       transmit: { | ||
|  |         send (level, logEvent) { | ||
|  |           is(logEvent.ts, expected) | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   }) | ||
|  | 
 | ||
|  |   logger.fatal('test') | ||
|  |   end() | ||
|  | }) | ||
|  | 
 | ||
|  | test('passes send function child bindings via logEvent object', ({ end, same, is }) => { | ||
|  |   const logger = pino({ | ||
|  |     browser: { | ||
|  |       write: noop, | ||
|  |       transmit: { | ||
|  |         send (level, logEvent) { | ||
|  |           const messages = logEvent.messages | ||
|  |           const bindings = logEvent.bindings | ||
|  |           same(bindings[0], { first: 'binding' }) | ||
|  |           same(bindings[1], { second: 'binding2' }) | ||
|  |           same(messages[0], { test: 'test' }) | ||
|  |           is(messages[1], 'another test') | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   }) | ||
|  | 
 | ||
|  |   logger | ||
|  |     .child({ first: 'binding' }) | ||
|  |     .child({ second: 'binding2' }) | ||
|  |     .fatal({ test: 'test' }, 'another test') | ||
|  |   end() | ||
|  | }) | ||
|  | 
 | ||
|  | test('passes send function level:{label, value} via logEvent object', ({ end, is }) => { | ||
|  |   const logger = pino({ | ||
|  |     browser: { | ||
|  |       write: noop, | ||
|  |       transmit: { | ||
|  |         send (level, logEvent) { | ||
|  |           const label = logEvent.level.label | ||
|  |           const value = logEvent.level.value | ||
|  | 
 | ||
|  |           is(label, 'fatal') | ||
|  |           is(value, 60) | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   }) | ||
|  | 
 | ||
|  |   logger.fatal({ test: 'test' }, 'another test') | ||
|  |   end() | ||
|  | }) | ||
|  | 
 | ||
|  | test('calls send function according to transmit.level', ({ end, is }) => { | ||
|  |   let c = 0 | ||
|  |   const logger = pino({ | ||
|  |     browser: { | ||
|  |       write: noop, | ||
|  |       transmit: { | ||
|  |         level: 'error', | ||
|  |         send (level) { | ||
|  |           c++ | ||
|  |           if (c === 1) is(level, 'error') | ||
|  |           if (c === 2) is(level, 'fatal') | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   }) | ||
|  |   logger.warn('ignored') | ||
|  |   logger.error('test') | ||
|  |   logger.fatal('test') | ||
|  |   end() | ||
|  | }) | ||
|  | 
 | ||
|  | test('transmit.level defaults to logger level', ({ end, is }) => { | ||
|  |   let c = 0 | ||
|  |   const logger = pino({ | ||
|  |     level: 'error', | ||
|  |     browser: { | ||
|  |       write: noop, | ||
|  |       transmit: { | ||
|  |         send (level) { | ||
|  |           c++ | ||
|  |           if (c === 1) is(level, 'error') | ||
|  |           if (c === 2) is(level, 'fatal') | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   }) | ||
|  |   logger.warn('ignored') | ||
|  |   logger.error('test') | ||
|  |   logger.fatal('test') | ||
|  |   end() | ||
|  | }) | ||
|  | 
 | ||
|  | test('transmit.level is effective even if lower than logger level', ({ end, is }) => { | ||
|  |   let c = 0 | ||
|  |   const logger = pino({ | ||
|  |     level: 'error', | ||
|  |     browser: { | ||
|  |       write: noop, | ||
|  |       transmit: { | ||
|  |         level: 'info', | ||
|  |         send (level) { | ||
|  |           c++ | ||
|  |           if (c === 1) is(level, 'warn') | ||
|  |           if (c === 2) is(level, 'error') | ||
|  |           if (c === 3) is(level, 'fatal') | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   }) | ||
|  |   logger.warn('ignored') | ||
|  |   logger.error('test') | ||
|  |   logger.fatal('test') | ||
|  |   end() | ||
|  | }) | ||
|  | 
 | ||
|  | test('applies all serializers to messages and bindings (serialize:false - default)', ({ end, same, is }) => { | ||
|  |   const logger = pino({ | ||
|  |     serializers: { | ||
|  |       first: () => 'first', | ||
|  |       second: () => 'second', | ||
|  |       test: () => 'serialize it' | ||
|  |     }, | ||
|  |     browser: { | ||
|  |       write: noop, | ||
|  |       transmit: { | ||
|  |         send (level, logEvent) { | ||
|  |           const messages = logEvent.messages | ||
|  |           const bindings = logEvent.bindings | ||
|  |           same(bindings[0], { first: 'first' }) | ||
|  |           same(bindings[1], { second: 'second' }) | ||
|  |           same(messages[0], { test: 'serialize it' }) | ||
|  |           is(messages[1].type, 'Error') | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   }) | ||
|  | 
 | ||
|  |   logger | ||
|  |     .child({ first: 'binding' }) | ||
|  |     .child({ second: 'binding2' }) | ||
|  |     .fatal({ test: 'test' }, Error()) | ||
|  |   end() | ||
|  | }) | ||
|  | 
 | ||
|  | test('applies all serializers to messages and bindings (serialize:true)', ({ end, same, is }) => { | ||
|  |   const logger = pino({ | ||
|  |     serializers: { | ||
|  |       first: () => 'first', | ||
|  |       second: () => 'second', | ||
|  |       test: () => 'serialize it' | ||
|  |     }, | ||
|  |     browser: { | ||
|  |       serialize: true, | ||
|  |       write: noop, | ||
|  |       transmit: { | ||
|  |         send (level, logEvent) { | ||
|  |           const messages = logEvent.messages | ||
|  |           const bindings = logEvent.bindings | ||
|  |           same(bindings[0], { first: 'first' }) | ||
|  |           same(bindings[1], { second: 'second' }) | ||
|  |           same(messages[0], { test: 'serialize it' }) | ||
|  |           is(messages[1].type, 'Error') | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   }) | ||
|  | 
 | ||
|  |   logger | ||
|  |     .child({ first: 'binding' }) | ||
|  |     .child({ second: 'binding2' }) | ||
|  |     .fatal({ test: 'test' }, Error()) | ||
|  |   end() | ||
|  | }) | ||
|  | 
 | ||
|  | test('extracts correct bindings and raw messages over multiple transmits', ({ end, same, is }) => { | ||
|  |   let messages = null | ||
|  |   let bindings = null | ||
|  | 
 | ||
|  |   const logger = pino({ | ||
|  |     browser: { | ||
|  |       write: noop, | ||
|  |       transmit: { | ||
|  |         send (level, logEvent) { | ||
|  |           messages = logEvent.messages | ||
|  |           bindings = logEvent.bindings | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   }) | ||
|  | 
 | ||
|  |   const child = logger.child({ child: true }) | ||
|  |   const grandchild = child.child({ grandchild: true }) | ||
|  | 
 | ||
|  |   logger.fatal({ test: 'parent:test1' }) | ||
|  |   logger.fatal({ test: 'parent:test2' }) | ||
|  |   same([], bindings) | ||
|  |   same([{ test: 'parent:test2' }], messages) | ||
|  | 
 | ||
|  |   child.fatal({ test: 'child:test1' }) | ||
|  |   child.fatal({ test: 'child:test2' }) | ||
|  |   same([{ child: true }], bindings) | ||
|  |   same([{ test: 'child:test2' }], messages) | ||
|  | 
 | ||
|  |   grandchild.fatal({ test: 'grandchild:test1' }) | ||
|  |   grandchild.fatal({ test: 'grandchild:test2' }) | ||
|  |   same([{ child: true }, { grandchild: true }], bindings) | ||
|  |   same([{ test: 'grandchild:test2' }], messages) | ||
|  | 
 | ||
|  |   end() | ||
|  | }) |