fastify
Version:
Fast and low overhead web framework, for Node.js
130 lines (113 loc) • 3.11 kB
JavaScript
const { test } = require('node:test')
const proxyquire = require('proxyquire')
const fs = require('node:fs')
const resolve = require('node:path').resolve
const zlib = require('node:zlib')
const pipeline = require('node:stream').pipeline
const Fastify = require('..')
const { waitForCb } = require('./toolkit')
test('onSend hook stream', t => {
t.plan(4)
const fastify = Fastify()
fastify.get('/', function (req, reply) {
reply.send({ hello: 'world' })
})
const { stepIn, patience } = waitForCb({ steps: 2 })
fastify.addHook('onSend', (req, reply, payload, done) => {
const gzStream = zlib.createGzip()
reply.header('Content-Encoding', 'gzip')
pipeline(
fs.createReadStream(resolve(__filename), 'utf8'),
gzStream,
(err) => {
t.assert.ifError(err)
stepIn()
}
)
done(null, gzStream)
})
fastify.inject({
url: '/',
method: 'GET'
}, (err, res) => {
t.assert.ifError(err)
t.assert.strictEqual(res.headers['content-encoding'], 'gzip')
const file = fs.readFileSync(resolve(__filename), 'utf8')
const payload = zlib.gunzipSync(res.rawPayload)
t.assert.strictEqual(payload.toString('utf-8'), file)
fastify.close()
stepIn()
})
return patience
})
test('onSend hook stream should work even if payload is not a proper stream', (t, testDone) => {
t.plan(1)
const reply = proxyquire('../lib/reply', {
'node:stream': {
finished: (...args) => {
if (args.length === 2) { args[1](new Error('test-error')) }
}
}
})
const Fastify = proxyquire('..', {
'./lib/reply.js': reply
})
const spyLogger = {
fatal: () => { },
error: () => { },
warn: (message) => {
t.assert.strictEqual(message, 'stream payload does not end properly')
fastify.close()
testDone()
},
info: () => { },
debug: () => { },
trace: () => { },
child: () => { return spyLogger }
}
const fastify = Fastify({ loggerInstance: spyLogger })
fastify.get('/', function (req, reply) {
reply.send({ hello: 'world' })
})
fastify.addHook('onSend', (req, reply, payload, done) => {
const fakeStream = { pipe: () => { } }
done(null, fakeStream)
})
fastify.inject({
url: '/',
method: 'GET'
})
})
test('onSend hook stream should work on payload with "close" ending function', (t, testDone) => {
t.plan(1)
const reply = proxyquire('../lib/reply', {
'node:stream': {
finished: (...args) => {
if (args.length === 2) { args[1](new Error('test-error')) }
}
}
})
const Fastify = proxyquire('..', {
'./lib/reply.js': reply
})
const fastify = Fastify({ logger: false })
fastify.get('/', function (req, reply) {
reply.send({ hello: 'world' })
})
fastify.addHook('onSend', (req, reply, payload, done) => {
const fakeStream = {
pipe: () => { },
close: (cb) => {
cb()
t.assert.ok('close callback called')
testDone()
}
}
done(null, fakeStream)
})
fastify.inject({
url: '/',
method: 'GET'
})
})