First commit
This commit is contained in:
187
node_modules/pino-std-serializers/test/err-with-cause.test.js
generated
vendored
Normal file
187
node_modules/pino-std-serializers/test/err-with-cause.test.js
generated
vendored
Normal file
@@ -0,0 +1,187 @@
|
||||
'use strict'
|
||||
|
||||
const { test } = require('node:test')
|
||||
const assert = require('node:assert')
|
||||
const serializer = require('../lib/err-with-cause')
|
||||
const { wrapErrorSerializer } = require('../')
|
||||
|
||||
test('serializes Error objects', () => {
|
||||
const serialized = serializer(Error('foo'))
|
||||
assert.strictEqual(serialized.type, 'Error')
|
||||
assert.strictEqual(serialized.message, 'foo')
|
||||
assert.match(serialized.stack, /err-with-cause\.test\.js:/)
|
||||
})
|
||||
|
||||
test('serializes Error objects with extra properties', () => {
|
||||
const err = Error('foo')
|
||||
err.statusCode = 500
|
||||
const serialized = serializer(err)
|
||||
assert.strictEqual(serialized.type, 'Error')
|
||||
assert.strictEqual(serialized.message, 'foo')
|
||||
assert.ok(serialized.statusCode)
|
||||
assert.strictEqual(serialized.statusCode, 500)
|
||||
assert.match(serialized.stack, /err-with-cause\.test\.js:/)
|
||||
})
|
||||
|
||||
test('serializes Error objects with subclass "type"', () => {
|
||||
class MyError extends Error {}
|
||||
|
||||
const err = new MyError('foo')
|
||||
const serialized = serializer(err)
|
||||
assert.strictEqual(serialized.type, 'MyError')
|
||||
})
|
||||
|
||||
test('serializes nested errors', () => {
|
||||
const err = Error('foo')
|
||||
err.inner = Error('bar')
|
||||
const serialized = serializer(err)
|
||||
assert.strictEqual(serialized.type, 'Error')
|
||||
assert.strictEqual(serialized.message, 'foo')
|
||||
assert.match(serialized.stack, /err-with-cause\.test\.js:/)
|
||||
assert.strictEqual(serialized.inner.type, 'Error')
|
||||
assert.strictEqual(serialized.inner.message, 'bar')
|
||||
assert.match(serialized.inner.stack, /Error: bar/)
|
||||
assert.match(serialized.inner.stack, /err-with-cause\.test\.js:/)
|
||||
})
|
||||
|
||||
test('serializes error causes', () => {
|
||||
const innerErr = Error('inner')
|
||||
const middleErr = Error('middle')
|
||||
middleErr.cause = innerErr
|
||||
const outerErr = Error('outer')
|
||||
outerErr.cause = middleErr
|
||||
|
||||
const serialized = serializer(outerErr)
|
||||
|
||||
assert.strictEqual(serialized.type, 'Error')
|
||||
assert.strictEqual(serialized.message, 'outer')
|
||||
assert.match(serialized.stack, /err-with-cause\.test\.js:/)
|
||||
|
||||
assert.strictEqual(serialized.cause.type, 'Error')
|
||||
assert.strictEqual(serialized.cause.message, 'middle')
|
||||
assert.match(serialized.cause.stack, /err-with-cause\.test\.js:/)
|
||||
|
||||
assert.strictEqual(serialized.cause.cause.type, 'Error')
|
||||
assert.strictEqual(serialized.cause.cause.message, 'inner')
|
||||
assert.match(serialized.cause.cause.stack, /err-with-cause\.test\.js:/)
|
||||
})
|
||||
|
||||
test('keeps non-error cause', () => {
|
||||
const err = Error('foo')
|
||||
err.cause = 'abc'
|
||||
const serialized = serializer(err)
|
||||
assert.strictEqual(serialized.type, 'Error')
|
||||
assert.strictEqual(serialized.message, 'foo')
|
||||
assert.strictEqual(serialized.cause, 'abc')
|
||||
})
|
||||
|
||||
test('prevents infinite recursion', () => {
|
||||
const err = Error('foo')
|
||||
err.inner = err
|
||||
const serialized = serializer(err)
|
||||
assert.strictEqual(serialized.type, 'Error')
|
||||
assert.strictEqual(serialized.message, 'foo')
|
||||
assert.match(serialized.stack, /err-with-cause\.test\.js:/)
|
||||
assert.ok(!serialized.inner)
|
||||
})
|
||||
|
||||
test('cleans up infinite recursion tracking', () => {
|
||||
const err = Error('foo')
|
||||
const bar = Error('bar')
|
||||
err.inner = bar
|
||||
bar.inner = err
|
||||
|
||||
serializer(err)
|
||||
const serialized = serializer(err)
|
||||
|
||||
assert.strictEqual(serialized.type, 'Error')
|
||||
assert.strictEqual(serialized.message, 'foo')
|
||||
assert.match(serialized.stack, /err-with-cause\.test\.js:/)
|
||||
assert.ok(serialized.inner)
|
||||
assert.strictEqual(serialized.inner.type, 'Error')
|
||||
assert.strictEqual(serialized.inner.message, 'bar')
|
||||
assert.match(serialized.inner.stack, /Error: bar/)
|
||||
assert.ok(!serialized.inner.inner)
|
||||
})
|
||||
|
||||
test('err.raw is available', () => {
|
||||
const err = Error('foo')
|
||||
const serialized = serializer(err)
|
||||
assert.strictEqual(serialized.raw, err)
|
||||
})
|
||||
|
||||
test('redefined err.constructor doesnt crash serializer', () => {
|
||||
function check (a, name) {
|
||||
assert.strictEqual(a.type, name)
|
||||
assert.strictEqual(a.message, 'foo')
|
||||
}
|
||||
|
||||
const err1 = TypeError('foo')
|
||||
err1.constructor = '10'
|
||||
|
||||
const err2 = TypeError('foo')
|
||||
err2.constructor = undefined
|
||||
|
||||
const err3 = Error('foo')
|
||||
err3.constructor = null
|
||||
|
||||
const err4 = Error('foo')
|
||||
err4.constructor = 10
|
||||
|
||||
class MyError extends Error {}
|
||||
|
||||
const err5 = new MyError('foo')
|
||||
err5.constructor = undefined
|
||||
|
||||
check(serializer(err1), 'TypeError')
|
||||
check(serializer(err2), 'TypeError')
|
||||
check(serializer(err3), 'Error')
|
||||
check(serializer(err4), 'Error')
|
||||
// We do not expect 'MyError' because err5.constructor has been blown away.
|
||||
// `err5.name` is 'Error' from the base class prototype.
|
||||
check(serializer(err5), 'Error')
|
||||
})
|
||||
|
||||
test('pass through anything that does not look like an Error', () => {
|
||||
function check (a) {
|
||||
assert.strictEqual(serializer(a), a)
|
||||
}
|
||||
|
||||
check('foo')
|
||||
check({ hello: 'world' })
|
||||
check([1, 2])
|
||||
})
|
||||
|
||||
test('can wrap err serializers', () => {
|
||||
const err = Error('foo')
|
||||
err.foo = 'foo'
|
||||
const serializer = wrapErrorSerializer(function (err) {
|
||||
delete err.foo
|
||||
err.bar = 'bar'
|
||||
return err
|
||||
})
|
||||
const serialized = serializer(err)
|
||||
assert.strictEqual(serialized.type, 'Error')
|
||||
assert.strictEqual(serialized.message, 'foo')
|
||||
assert.match(serialized.stack, /err-with-cause\.test\.js:/)
|
||||
assert.ok(!serialized.foo)
|
||||
assert.strictEqual(serialized.bar, 'bar')
|
||||
})
|
||||
|
||||
test('serializes aggregate errors', { skip: !global.AggregateError }, () => {
|
||||
const foo = new Error('foo')
|
||||
const bar = new Error('bar')
|
||||
for (const aggregate of [
|
||||
new AggregateError([foo, bar], 'aggregated message'), // eslint-disable-line no-undef
|
||||
{ errors: [foo, bar], message: 'aggregated message', stack: 'err-with-cause.test.js:' }
|
||||
]) {
|
||||
const serialized = serializer(aggregate)
|
||||
assert.strictEqual(serialized.message, 'aggregated message')
|
||||
assert.strictEqual(serialized.aggregateErrors.length, 2)
|
||||
assert.strictEqual(serialized.aggregateErrors[0].message, 'foo')
|
||||
assert.strictEqual(serialized.aggregateErrors[1].message, 'bar')
|
||||
assert.match(serialized.aggregateErrors[0].stack, /^Error: foo/)
|
||||
assert.match(serialized.aggregateErrors[1].stack, /^Error: bar/)
|
||||
assert.match(serialized.stack, /err-with-cause\.test\.js:/)
|
||||
}
|
||||
})
|
||||
200
node_modules/pino-std-serializers/test/err.test.js
generated
vendored
Normal file
200
node_modules/pino-std-serializers/test/err.test.js
generated
vendored
Normal file
@@ -0,0 +1,200 @@
|
||||
'use strict'
|
||||
|
||||
const assert = require('node:assert')
|
||||
const { test } = require('node:test')
|
||||
const serializer = require('../lib/err')
|
||||
const { wrapErrorSerializer } = require('../')
|
||||
|
||||
test('serializes Error objects', () => {
|
||||
const serialized = serializer(Error('foo'))
|
||||
assert.strictEqual(serialized.type, 'Error')
|
||||
assert.strictEqual(serialized.message, 'foo')
|
||||
assert.match(serialized.stack, /err\.test\.js:/)
|
||||
})
|
||||
|
||||
test('serializes Error objects with extra properties', () => {
|
||||
const err = Error('foo')
|
||||
err.statusCode = 500
|
||||
const serialized = serializer(err)
|
||||
assert.strictEqual(serialized.type, 'Error')
|
||||
assert.strictEqual(serialized.message, 'foo')
|
||||
assert.ok(serialized.statusCode)
|
||||
assert.strictEqual(serialized.statusCode, 500)
|
||||
assert.match(serialized.stack, /err\.test\.js:/)
|
||||
})
|
||||
|
||||
test('serializes Error objects with subclass "type"', () => {
|
||||
class MyError extends Error {}
|
||||
const err = new MyError('foo')
|
||||
const serialized = serializer(err)
|
||||
assert.strictEqual(serialized.type, 'MyError')
|
||||
})
|
||||
|
||||
test('serializes nested errors', () => {
|
||||
const err = Error('foo')
|
||||
err.inner = Error('bar')
|
||||
const serialized = serializer(err)
|
||||
assert.strictEqual(serialized.type, 'Error')
|
||||
assert.strictEqual(serialized.message, 'foo')
|
||||
assert.match(serialized.stack, /err\.test\.js:/)
|
||||
assert.strictEqual(serialized.inner.type, 'Error')
|
||||
assert.strictEqual(serialized.inner.message, 'bar')
|
||||
assert.match(serialized.inner.stack, /Error: bar/)
|
||||
assert.match(serialized.inner.stack, /err\.test\.js:/)
|
||||
})
|
||||
|
||||
test('serializes error causes', () => {
|
||||
for (const cause of [
|
||||
Error('bar'),
|
||||
{ message: 'bar', stack: 'Error: bar: err.test.js:' }
|
||||
]) {
|
||||
const err = Error('foo')
|
||||
err.cause = cause
|
||||
err.cause.cause = Error('abc')
|
||||
const serialized = serializer(err)
|
||||
assert.strictEqual(serialized.type, 'Error')
|
||||
assert.strictEqual(serialized.message, 'foo: bar: abc')
|
||||
assert.match(serialized.stack, /err\.test\.js:/)
|
||||
assert.match(serialized.stack, /Error: foo/)
|
||||
assert.match(serialized.stack, /Error: bar/)
|
||||
assert.match(serialized.stack, /Error: abc/)
|
||||
assert.ok(!serialized.cause)
|
||||
}
|
||||
})
|
||||
|
||||
test('serializes error causes with VError support', function (t) {
|
||||
// Fake VError-style setup
|
||||
const err = Error('foo: bar')
|
||||
err.foo = 'abc'
|
||||
err.cause = function () {
|
||||
const err = Error('bar')
|
||||
err.cause = Error(this.foo)
|
||||
return err
|
||||
}
|
||||
const serialized = serializer(err)
|
||||
assert.strictEqual(serialized.type, 'Error')
|
||||
assert.strictEqual(serialized.message, 'foo: bar: abc')
|
||||
assert.match(serialized.stack, /err\.test\.js:/)
|
||||
assert.match(serialized.stack, /Error: foo/)
|
||||
assert.match(serialized.stack, /Error: bar/)
|
||||
assert.match(serialized.stack, /Error: abc/)
|
||||
})
|
||||
|
||||
test('keeps non-error cause', () => {
|
||||
const err = Error('foo')
|
||||
err.cause = 'abc'
|
||||
const serialized = serializer(err)
|
||||
assert.strictEqual(serialized.type, 'Error')
|
||||
assert.strictEqual(serialized.message, 'foo')
|
||||
assert.strictEqual(serialized.cause, 'abc')
|
||||
})
|
||||
|
||||
test('prevents infinite recursion', () => {
|
||||
const err = Error('foo')
|
||||
err.inner = err
|
||||
const serialized = serializer(err)
|
||||
assert.strictEqual(serialized.type, 'Error')
|
||||
assert.strictEqual(serialized.message, 'foo')
|
||||
assert.match(serialized.stack, /err\.test\.js:/)
|
||||
assert.ok(!serialized.inner)
|
||||
})
|
||||
|
||||
test('cleans up infinite recursion tracking', () => {
|
||||
const err = Error('foo')
|
||||
const bar = Error('bar')
|
||||
err.inner = bar
|
||||
bar.inner = err
|
||||
|
||||
serializer(err)
|
||||
const serialized = serializer(err)
|
||||
|
||||
assert.strictEqual(serialized.type, 'Error')
|
||||
assert.strictEqual(serialized.message, 'foo')
|
||||
assert.match(serialized.stack, /err\.test\.js:/)
|
||||
assert.ok(serialized.inner)
|
||||
assert.strictEqual(serialized.inner.type, 'Error')
|
||||
assert.strictEqual(serialized.inner.message, 'bar')
|
||||
assert.match(serialized.inner.stack, /Error: bar/)
|
||||
assert.ok(!serialized.inner.inner)
|
||||
})
|
||||
|
||||
test('err.raw is available', () => {
|
||||
const err = Error('foo')
|
||||
const serialized = serializer(err)
|
||||
assert.strictEqual(serialized.raw, err)
|
||||
})
|
||||
|
||||
test('redefined err.constructor doesnt crash serializer', () => {
|
||||
function check (a, name) {
|
||||
assert.strictEqual(a.type, name)
|
||||
assert.strictEqual(a.message, 'foo')
|
||||
}
|
||||
|
||||
const err1 = TypeError('foo')
|
||||
err1.constructor = '10'
|
||||
|
||||
const err2 = TypeError('foo')
|
||||
err2.constructor = undefined
|
||||
|
||||
const err3 = Error('foo')
|
||||
err3.constructor = null
|
||||
|
||||
const err4 = Error('foo')
|
||||
err4.constructor = 10
|
||||
|
||||
class MyError extends Error {}
|
||||
const err5 = new MyError('foo')
|
||||
err5.constructor = undefined
|
||||
|
||||
check(serializer(err1), 'TypeError')
|
||||
check(serializer(err2), 'TypeError')
|
||||
check(serializer(err3), 'Error')
|
||||
check(serializer(err4), 'Error')
|
||||
// We do not expect 'MyError' because err5.constructor has been blown away.
|
||||
// `err5.name` is 'Error' from the base class prototype.
|
||||
check(serializer(err5), 'Error')
|
||||
})
|
||||
|
||||
test('pass through anything that does not look like an Error', () => {
|
||||
function check (a) {
|
||||
assert.strictEqual(serializer(a), a)
|
||||
}
|
||||
|
||||
check('foo')
|
||||
check({ hello: 'world' })
|
||||
check([1, 2])
|
||||
})
|
||||
|
||||
test('can wrap err serializers', () => {
|
||||
const err = Error('foo')
|
||||
err.foo = 'foo'
|
||||
const serializer = wrapErrorSerializer(function (err) {
|
||||
delete err.foo
|
||||
err.bar = 'bar'
|
||||
return err
|
||||
})
|
||||
const serialized = serializer(err)
|
||||
assert.strictEqual(serialized.type, 'Error')
|
||||
assert.strictEqual(serialized.message, 'foo')
|
||||
assert.match(serialized.stack, /err\.test\.js:/)
|
||||
assert.ok(!serialized.foo)
|
||||
assert.strictEqual(serialized.bar, 'bar')
|
||||
})
|
||||
|
||||
test('serializes aggregate errors', { skip: !global.AggregateError }, () => {
|
||||
const foo = new Error('foo')
|
||||
const bar = new Error('bar')
|
||||
for (const aggregate of [
|
||||
new AggregateError([foo, bar], 'aggregated message'), // eslint-disable-line no-undef
|
||||
{ errors: [foo, bar], message: 'aggregated message', stack: 'err.test.js:' }
|
||||
]) {
|
||||
const serialized = serializer(aggregate)
|
||||
assert.strictEqual(serialized.message, 'aggregated message')
|
||||
assert.strictEqual(serialized.aggregateErrors.length, 2)
|
||||
assert.strictEqual(serialized.aggregateErrors[0].message, 'foo')
|
||||
assert.strictEqual(serialized.aggregateErrors[1].message, 'bar')
|
||||
assert.match(serialized.aggregateErrors[0].stack, /^Error: foo/)
|
||||
assert.match(serialized.aggregateErrors[1].stack, /^Error: bar/)
|
||||
assert.match(serialized.stack, /err\.test\.js:/)
|
||||
}
|
||||
})
|
||||
477
node_modules/pino-std-serializers/test/req.test.js
generated
vendored
Normal file
477
node_modules/pino-std-serializers/test/req.test.js
generated
vendored
Normal file
@@ -0,0 +1,477 @@
|
||||
'use strict'
|
||||
|
||||
const { tspl } = require('@matteo.collina/tspl')
|
||||
const http = require('node:http')
|
||||
const { test } = require('node:test')
|
||||
const serializers = require('../lib/req')
|
||||
const { wrapRequestSerializer } = require('../')
|
||||
|
||||
test('maps request', async (t) => {
|
||||
const p = tspl(t, { plan: 2 })
|
||||
|
||||
const server = http.createServer(handler)
|
||||
server.unref()
|
||||
server.listen(0, () => {
|
||||
http.get(server.address(), () => {})
|
||||
})
|
||||
|
||||
t.after(() => server.close())
|
||||
|
||||
function handler (req, res) {
|
||||
const serialized = serializers.mapHttpRequest(req)
|
||||
p.ok(serialized.req)
|
||||
p.ok(serialized.req.method)
|
||||
res.end()
|
||||
}
|
||||
|
||||
await p.completed
|
||||
})
|
||||
|
||||
test('does not return excessively long object', async (t) => {
|
||||
const p = tspl(t, { plan: 1 })
|
||||
|
||||
const server = http.createServer(handler)
|
||||
server.unref()
|
||||
server.listen(0, () => {
|
||||
http.get(server.address(), () => {})
|
||||
})
|
||||
|
||||
t.after(() => server.close())
|
||||
|
||||
function handler (req, res) {
|
||||
const serialized = serializers.reqSerializer(req)
|
||||
p.strictEqual(Object.keys(serialized).length, 6)
|
||||
res.end()
|
||||
}
|
||||
|
||||
await p.completed
|
||||
})
|
||||
|
||||
test('req.raw is available', async (t) => {
|
||||
const p = tspl(t, { plan: 2 })
|
||||
|
||||
const server = http.createServer(handler)
|
||||
server.unref()
|
||||
server.listen(0, () => {
|
||||
http.get(server.address(), () => {})
|
||||
})
|
||||
|
||||
t.after(() => server.close())
|
||||
|
||||
function handler (req, res) {
|
||||
req.foo = 'foo'
|
||||
const serialized = serializers.reqSerializer(req)
|
||||
p.ok(serialized.raw)
|
||||
p.strictEqual(serialized.raw.foo, 'foo')
|
||||
res.end()
|
||||
}
|
||||
|
||||
await p.completed
|
||||
})
|
||||
|
||||
test('req.raw will be obtained in from input request raw property if input request raw property is truthy', async (t) => {
|
||||
const p = tspl(t, { plan: 2 })
|
||||
|
||||
const server = http.createServer(handler)
|
||||
server.unref()
|
||||
server.listen(0, () => {
|
||||
http.get(server.address(), () => {})
|
||||
})
|
||||
|
||||
t.after(() => server.close())
|
||||
|
||||
function handler (req, res) {
|
||||
req.raw = { req: { foo: 'foo' }, res: {} }
|
||||
const serialized = serializers.reqSerializer(req)
|
||||
p.ok(serialized.raw)
|
||||
p.strictEqual(serialized.raw.req.foo, 'foo')
|
||||
res.end()
|
||||
}
|
||||
|
||||
await p.completed
|
||||
})
|
||||
|
||||
test('req.id defaults to undefined', async (t) => {
|
||||
const p = tspl(t, { plan: 1 })
|
||||
|
||||
const server = http.createServer(handler)
|
||||
server.unref()
|
||||
server.listen(0, () => {
|
||||
http.get(server.address(), () => {})
|
||||
})
|
||||
|
||||
t.after(() => server.close())
|
||||
|
||||
function handler (req, res) {
|
||||
const serialized = serializers.reqSerializer(req)
|
||||
p.strictEqual(serialized.id, undefined)
|
||||
res.end()
|
||||
}
|
||||
|
||||
await p.completed
|
||||
})
|
||||
|
||||
test('req.id has a non-function value', async (t) => {
|
||||
const p = tspl(t, { plan: 1 })
|
||||
|
||||
const server = http.createServer(handler)
|
||||
server.unref()
|
||||
server.listen(0, () => {
|
||||
http.get(server.address(), () => {})
|
||||
})
|
||||
|
||||
t.after(() => server.close())
|
||||
|
||||
function handler (req, res) {
|
||||
const serialized = serializers.reqSerializer(req)
|
||||
p.strictEqual(typeof serialized.id === 'function', false)
|
||||
res.end()
|
||||
}
|
||||
|
||||
await p.completed
|
||||
})
|
||||
|
||||
test('req.id will be obtained from input request info.id when input request id does not exist', async (t) => {
|
||||
const p = tspl(t, { plan: 1 })
|
||||
|
||||
const server = http.createServer(handler)
|
||||
server.unref()
|
||||
server.listen(0, () => {
|
||||
http.get(server.address(), () => {})
|
||||
})
|
||||
|
||||
t.after(() => server.close())
|
||||
|
||||
function handler (req, res) {
|
||||
req.info = { id: 'test' }
|
||||
const serialized = serializers.reqSerializer(req)
|
||||
p.strictEqual(serialized.id, 'test')
|
||||
res.end()
|
||||
}
|
||||
|
||||
await p.completed
|
||||
})
|
||||
|
||||
test('req.id has a non-function value with custom id function', async (t) => {
|
||||
const p = tspl(t, { plan: 2 })
|
||||
|
||||
const server = http.createServer(handler)
|
||||
server.unref()
|
||||
server.listen(0, () => {
|
||||
http.get(server.address(), () => {})
|
||||
})
|
||||
|
||||
t.after(() => server.close())
|
||||
|
||||
function handler (req, res) {
|
||||
req.id = function () { return 42 }
|
||||
const serialized = serializers.reqSerializer(req)
|
||||
p.strictEqual(typeof serialized.id === 'function', false)
|
||||
p.strictEqual(serialized.id, 42)
|
||||
res.end()
|
||||
}
|
||||
|
||||
await p.completed
|
||||
})
|
||||
|
||||
test('req.url will be obtained from input request req.path when input request url is an object', async (t) => {
|
||||
const p = tspl(t, { plan: 1 })
|
||||
|
||||
const server = http.createServer(handler)
|
||||
server.unref()
|
||||
server.listen(0, () => {
|
||||
http.get(server.address(), () => {})
|
||||
})
|
||||
|
||||
t.after(() => server.close())
|
||||
|
||||
function handler (req, res) {
|
||||
req.path = '/test'
|
||||
const serialized = serializers.reqSerializer(req)
|
||||
p.strictEqual(serialized.url, '/test')
|
||||
res.end()
|
||||
}
|
||||
|
||||
await p.completed
|
||||
})
|
||||
|
||||
test('req.url will be obtained from input request url.path when input request url is an object', async (t) => {
|
||||
const p = tspl(t, { plan: 1 })
|
||||
|
||||
const server = http.createServer(handler)
|
||||
server.unref()
|
||||
server.listen(0, () => {
|
||||
http.get(server.address(), () => {})
|
||||
})
|
||||
|
||||
t.after(() => server.close())
|
||||
|
||||
function handler (req, res) {
|
||||
req.url = { path: '/test' }
|
||||
const serialized = serializers.reqSerializer(req)
|
||||
p.strictEqual(serialized.url, '/test')
|
||||
res.end()
|
||||
}
|
||||
|
||||
await p.completed
|
||||
})
|
||||
|
||||
test('req.url will be obtained from input request url when input request url is not an object', async (t) => {
|
||||
const p = tspl(t, { plan: 1 })
|
||||
|
||||
const server = http.createServer(handler)
|
||||
server.unref()
|
||||
server.listen(0, () => {
|
||||
http.get(server.address(), () => {})
|
||||
})
|
||||
|
||||
t.after(() => server.close())
|
||||
|
||||
function handler (req, res) {
|
||||
req.url = '/test'
|
||||
const serialized = serializers.reqSerializer(req)
|
||||
p.strictEqual(serialized.url, '/test')
|
||||
res.end()
|
||||
}
|
||||
|
||||
await p.completed
|
||||
})
|
||||
|
||||
test('req.url will be empty when input request path and url are not defined', async (t) => {
|
||||
const p = tspl(t, { plan: 1 })
|
||||
|
||||
const server = http.createServer(handler)
|
||||
server.unref()
|
||||
server.listen(0, () => {
|
||||
http.get(server.address(), () => {})
|
||||
})
|
||||
|
||||
t.after(() => server.close())
|
||||
|
||||
function handler (req, res) {
|
||||
const serialized = serializers.reqSerializer(req)
|
||||
p.strictEqual(serialized.url, '/')
|
||||
res.end()
|
||||
}
|
||||
|
||||
await p.completed
|
||||
})
|
||||
|
||||
test('req.url will be obtained from input request originalUrl when available', async (t) => {
|
||||
const p = tspl(t, { plan: 1 })
|
||||
|
||||
const server = http.createServer(handler)
|
||||
server.unref()
|
||||
server.listen(0, () => {
|
||||
http.get(server.address(), () => {})
|
||||
})
|
||||
|
||||
t.after(() => server.close())
|
||||
|
||||
function handler (req, res) {
|
||||
req.originalUrl = '/test'
|
||||
const serialized = serializers.reqSerializer(req)
|
||||
p.strictEqual(serialized.url, '/test')
|
||||
res.end()
|
||||
}
|
||||
|
||||
await p.completed
|
||||
})
|
||||
|
||||
test('req.url will be obtained from input request url when req path is a function', async (t) => {
|
||||
const p = tspl(t, { plan: 1 })
|
||||
|
||||
const server = http.createServer(handler)
|
||||
server.unref()
|
||||
server.listen(0, () => {
|
||||
http.get(server.address(), () => {})
|
||||
})
|
||||
|
||||
t.after(() => server.close())
|
||||
|
||||
function handler (req, res) {
|
||||
req.path = function () {
|
||||
throw new Error('unexpected invocation')
|
||||
}
|
||||
req.url = '/test'
|
||||
const serialized = serializers.reqSerializer(req)
|
||||
p.strictEqual(serialized.url, '/test')
|
||||
res.end()
|
||||
}
|
||||
|
||||
await p.completed
|
||||
})
|
||||
|
||||
test('req.url being undefined does not throw an error', async (t) => {
|
||||
const p = tspl(t, { plan: 1 })
|
||||
|
||||
const server = http.createServer(handler)
|
||||
server.unref()
|
||||
server.listen(0, () => {
|
||||
http.get(server.address(), () => {})
|
||||
})
|
||||
|
||||
t.after(() => server.close())
|
||||
|
||||
function handler (req, res) {
|
||||
req.url = undefined
|
||||
const serialized = serializers.reqSerializer(req)
|
||||
p.strictEqual(serialized.url, undefined)
|
||||
res.end()
|
||||
}
|
||||
|
||||
await p.completed
|
||||
})
|
||||
|
||||
test('can wrap request serializers', async (t) => {
|
||||
const p = tspl(t, { plan: 3 })
|
||||
|
||||
const server = http.createServer(handler)
|
||||
server.unref()
|
||||
server.listen(0, () => {
|
||||
http.get(server.address(), () => {})
|
||||
})
|
||||
|
||||
t.after(() => server.close())
|
||||
|
||||
const serailizer = wrapRequestSerializer(function (req) {
|
||||
p.ok(req.method)
|
||||
p.strictEqual(req.method, 'GET')
|
||||
delete req.method
|
||||
return req
|
||||
})
|
||||
|
||||
function handler (req, res) {
|
||||
const serialized = serailizer(req)
|
||||
p.ok(!serialized.method)
|
||||
res.end()
|
||||
}
|
||||
|
||||
await p.completed
|
||||
})
|
||||
|
||||
test('req.remoteAddress will be obtained from request socket.remoteAddress as fallback', async (t) => {
|
||||
const p = tspl(t, { plan: 1 })
|
||||
|
||||
const server = http.createServer(handler)
|
||||
server.unref()
|
||||
server.listen(0, () => {
|
||||
http.get(server.address(), () => {})
|
||||
})
|
||||
|
||||
t.after(() => server.close())
|
||||
|
||||
function handler (req, res) {
|
||||
req.socket = { remoteAddress: 'http://localhost' }
|
||||
const serialized = serializers.reqSerializer(req)
|
||||
p.strictEqual(serialized.remoteAddress, 'http://localhost')
|
||||
res.end()
|
||||
}
|
||||
|
||||
await p.completed
|
||||
})
|
||||
|
||||
test('req.remoteAddress will be obtained from request info.remoteAddress if available', async (t) => {
|
||||
const p = tspl(t, { plan: 1 })
|
||||
|
||||
const server = http.createServer(handler)
|
||||
server.unref()
|
||||
server.listen(0, () => {
|
||||
http.get(server.address(), () => {})
|
||||
})
|
||||
|
||||
t.after(() => server.close())
|
||||
|
||||
function handler (req, res) {
|
||||
req.info = { remoteAddress: 'http://localhost' }
|
||||
const serialized = serializers.reqSerializer(req)
|
||||
p.strictEqual(serialized.remoteAddress, 'http://localhost')
|
||||
res.end()
|
||||
}
|
||||
|
||||
await p.completed
|
||||
})
|
||||
|
||||
test('req.remotePort will be obtained from request socket.remotePort as fallback', async (t) => {
|
||||
const p = tspl(t, { plan: 1 })
|
||||
|
||||
const server = http.createServer(handler)
|
||||
server.unref()
|
||||
server.listen(0, () => {
|
||||
http.get(server.address(), () => {})
|
||||
})
|
||||
|
||||
t.after(() => server.close())
|
||||
|
||||
function handler (req, res) {
|
||||
req.socket = { remotePort: 3000 }
|
||||
const serialized = serializers.reqSerializer(req)
|
||||
p.strictEqual(serialized.remotePort, 3000)
|
||||
res.end()
|
||||
}
|
||||
|
||||
await p.completed
|
||||
})
|
||||
|
||||
test('req.remotePort will be obtained from request info.remotePort if available', async (t) => {
|
||||
const p = tspl(t, { plan: 1 })
|
||||
|
||||
const server = http.createServer(handler)
|
||||
server.unref()
|
||||
server.listen(0, () => {
|
||||
http.get(server.address(), () => {})
|
||||
})
|
||||
|
||||
t.after(() => server.close())
|
||||
|
||||
function handler (req, res) {
|
||||
req.info = { remotePort: 3000 }
|
||||
const serialized = serializers.reqSerializer(req)
|
||||
p.strictEqual(serialized.remotePort, 3000)
|
||||
res.end()
|
||||
}
|
||||
|
||||
await p.completed
|
||||
})
|
||||
|
||||
test('req.query is available', async (t) => {
|
||||
const p = tspl(t, { plan: 1 })
|
||||
|
||||
const server = http.createServer(handler)
|
||||
server.unref()
|
||||
server.listen(0, () => {
|
||||
http.get(server.address(), () => {})
|
||||
})
|
||||
|
||||
t.after(() => server.close())
|
||||
|
||||
function handler (req, res) {
|
||||
req.query = '/foo?bar=foobar&bar=foo'
|
||||
const serialized = serializers.reqSerializer(req)
|
||||
p.strictEqual(serialized.query, '/foo?bar=foobar&bar=foo')
|
||||
res.end()
|
||||
}
|
||||
|
||||
await p.completed
|
||||
})
|
||||
|
||||
test('req.params is available', async (t) => {
|
||||
const p = tspl(t, { plan: 1 })
|
||||
|
||||
const server = http.createServer(handler)
|
||||
server.unref()
|
||||
server.listen(0, () => {
|
||||
http.get(server.address(), () => {})
|
||||
})
|
||||
|
||||
t.after(() => server.close())
|
||||
|
||||
function handler (req, res) {
|
||||
req.params = '/foo/bar'
|
||||
const serialized = serializers.reqSerializer(req)
|
||||
p.strictEqual(serialized.params, '/foo/bar')
|
||||
res.end()
|
||||
}
|
||||
|
||||
await p.completed
|
||||
})
|
||||
120
node_modules/pino-std-serializers/test/res.test.js
generated
vendored
Normal file
120
node_modules/pino-std-serializers/test/res.test.js
generated
vendored
Normal file
@@ -0,0 +1,120 @@
|
||||
'use strict'
|
||||
|
||||
/* eslint-disable no-prototype-builtins */
|
||||
|
||||
const { tspl } = require('@matteo.collina/tspl')
|
||||
const http = require('node:http')
|
||||
const { test } = require('node:test')
|
||||
const serializers = require('../lib/res')
|
||||
const { wrapResponseSerializer } = require('../')
|
||||
|
||||
test('res.raw is not enumerable', async (t) => {
|
||||
const p = tspl(t, { plan: 1 })
|
||||
|
||||
const server = http.createServer(handler)
|
||||
server.unref()
|
||||
server.listen(0, () => {
|
||||
http.get(server.address(), () => {})
|
||||
})
|
||||
|
||||
t.after(() => server.close())
|
||||
|
||||
function handler (_req, res) {
|
||||
const serialized = serializers.resSerializer(res)
|
||||
p.strictEqual(serialized.propertyIsEnumerable('raw'), false)
|
||||
res.end()
|
||||
}
|
||||
|
||||
await p.completed
|
||||
})
|
||||
|
||||
test('res.raw is available', async (t) => {
|
||||
const p = tspl(t, { plan: 2 })
|
||||
|
||||
const server = http.createServer(handler)
|
||||
server.unref()
|
||||
server.listen(0, () => {
|
||||
http.get(server.address(), () => {})
|
||||
})
|
||||
|
||||
t.after(() => server.close())
|
||||
|
||||
function handler (_req, res) {
|
||||
res.statusCode = 200
|
||||
const serialized = serializers.resSerializer(res)
|
||||
p.ok(serialized.raw)
|
||||
p.strictEqual(serialized.raw.statusCode, 200)
|
||||
res.end()
|
||||
}
|
||||
|
||||
await p.completed
|
||||
})
|
||||
|
||||
test('can wrap response serializers', async (t) => {
|
||||
const p = tspl(t, { plan: 3 })
|
||||
|
||||
const server = http.createServer(handler)
|
||||
server.unref()
|
||||
server.listen(0, () => {
|
||||
http.get(server.address(), () => {})
|
||||
})
|
||||
|
||||
t.after(() => server.close())
|
||||
|
||||
const serializer = wrapResponseSerializer(function (res) {
|
||||
p.ok(res.statusCode)
|
||||
p.strictEqual(res.statusCode, 200)
|
||||
delete res.statusCode
|
||||
return res
|
||||
})
|
||||
|
||||
function handler (_req, res) {
|
||||
res.end()
|
||||
res.statusCode = 200
|
||||
const serialized = serializer(res)
|
||||
p.ok(!serialized.statusCode)
|
||||
}
|
||||
|
||||
await p.completed
|
||||
})
|
||||
|
||||
test('res.headers is serialized', async (t) => {
|
||||
const p = tspl(t, { plan: 1 })
|
||||
|
||||
const server = http.createServer(handler)
|
||||
server.unref()
|
||||
server.listen(0, () => {
|
||||
http.get(server.address(), () => {})
|
||||
})
|
||||
|
||||
t.after(() => server.close())
|
||||
|
||||
function handler (_req, res) {
|
||||
res.setHeader('x-custom', 'y')
|
||||
const serialized = serializers.resSerializer(res)
|
||||
p.strictEqual(serialized.headers['x-custom'], 'y')
|
||||
res.end()
|
||||
}
|
||||
|
||||
await p.completed
|
||||
})
|
||||
|
||||
test('req.url will be obtained from input request url when input request url is not an object', async (t) => {
|
||||
const p = tspl(t, { plan: 1 })
|
||||
|
||||
const server = http.createServer(handler)
|
||||
server.unref()
|
||||
server.listen(0, () => {
|
||||
http.get(server.address(), () => {})
|
||||
})
|
||||
|
||||
t.after(() => server.close())
|
||||
|
||||
function handler (_req, res) {
|
||||
const serialized = serializers.resSerializer(res)
|
||||
p.strictEqual(serialized.statusCode, null)
|
||||
res.end()
|
||||
}
|
||||
|
||||
await p.completed
|
||||
})
|
||||
71
node_modules/pino-std-serializers/test/types/index.test-d.ts
generated
vendored
Normal file
71
node_modules/pino-std-serializers/test/types/index.test-d.ts
generated
vendored
Normal file
@@ -0,0 +1,71 @@
|
||||
import {IncomingMessage, ServerResponse} from "http";
|
||||
import {
|
||||
err,
|
||||
errWithCause,
|
||||
req,
|
||||
res,
|
||||
SerializedError,
|
||||
SerializedRequest,
|
||||
wrapErrorSerializer,
|
||||
wrapRequestSerializer,
|
||||
wrapResponseSerializer,
|
||||
SerializedResponse
|
||||
} from '../../';
|
||||
|
||||
const customErrorSerializer = (error: SerializedError) => {
|
||||
return {
|
||||
myOwnError: {
|
||||
data: `${error.type}-${error.message}\n\n${error.stack}`,
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
const customRequestSerializer = (req: SerializedRequest) => {
|
||||
const {
|
||||
headers,
|
||||
id,
|
||||
method,
|
||||
raw,
|
||||
remoteAddress,
|
||||
remotePort,
|
||||
url,
|
||||
query,
|
||||
params,
|
||||
} = req;
|
||||
return {
|
||||
myOwnRequest: {
|
||||
data: `${method}-${id}-${remoteAddress}-${remotePort}-${url}`,
|
||||
headers,
|
||||
raw,
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
const customResponseSerializer = (res: SerializedResponse) => {
|
||||
const {headers, raw, statusCode} = res;
|
||||
return {
|
||||
myOwnResponse: {
|
||||
data: statusCode,
|
||||
headers,
|
||||
raw,
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
const fakeError = new Error('A fake error for testing');
|
||||
const serializedError: SerializedError = err(fakeError);
|
||||
const mySerializer = wrapErrorSerializer(customErrorSerializer);
|
||||
|
||||
const fakeErrorWithCause = new Error('A fake error for testing with cause', { cause: new Error('An inner fake error') });
|
||||
const serializedErrorWithCause: SerializedError = errWithCause(fakeError);
|
||||
|
||||
const request: IncomingMessage = {} as IncomingMessage
|
||||
const serializedRequest: SerializedRequest = req(request);
|
||||
const myReqSerializer = wrapRequestSerializer(customRequestSerializer);
|
||||
|
||||
const response: ServerResponse = {} as ServerResponse
|
||||
const myResSerializer = wrapResponseSerializer(customResponseSerializer);
|
||||
const serializedResponse = res(response);
|
||||
|
||||
myResSerializer(response)
|
||||
|
||||
Reference in New Issue
Block a user