UNPKG

fastify

Version:

Fast and low overhead web framework, for Node.js

143 lines (112 loc) 3.27 kB
'use strict' const t = require('tap') const test = t.test const sget = require('simple-get').concat const Fastify = require('../fastify') const { FST_ERR_INVALID_URL } = require('../lib/errors') const { getServerUrl } = require('./helper') test('Request and Reply share the route config', async t => { t.plan(3) const fastify = Fastify() const config = { this: 'is a string', thisIs: function aFunction () {} } fastify.route({ method: 'GET', url: '/', config, handler: (req, reply) => { t.same(req.context, reply.context) t.same(req.context.config, reply.context.config) t.match(req.context.config, config, 'there are url and method additional properties') reply.send({ hello: 'world' }) } }) await fastify.inject('/') }) test('Will not try to re-createprefixed HEAD route if it already exists and exposeHeadRoutes is true', async (t) => { t.plan(1) const fastify = Fastify({ exposeHeadRoutes: true }) fastify.register((scope, opts, next) => { scope.route({ method: 'HEAD', path: '/route', handler: (req, reply) => { reply.header('content-type', 'text/plain') reply.send('custom HEAD response') } }) scope.route({ method: 'GET', path: '/route', handler: (req, reply) => { reply.send({ ok: true }) } }) next() }, { prefix: '/prefix' }) await fastify.ready() t.ok(true) }) test('route with non-english characters', t => { t.plan(4) const fastify = Fastify() fastify.get('/föö', (request, reply) => { reply.send('here /föö') }) fastify.listen({ port: 0 }, err => { t.error(err) t.teardown(() => { fastify.close() }) sget({ method: 'GET', url: getServerUrl(fastify) + encodeURI('/föö') }, (err, response, body) => { t.error(err) t.equal(response.statusCode, 200) t.equal(body.toString(), 'here /föö') }) }) }) test('invalid url attribute - non string URL', t => { t.plan(1) const fastify = Fastify() try { fastify.get(/^\/(donations|skills|blogs)/, () => { }) } catch (error) { t.equal(error.code, FST_ERR_INVALID_URL().code) } }) test('exposeHeadRoute should not reuse the same route option', async t => { t.plan(2) const fastify = Fastify() // we update the onRequest hook in onRoute hook // if we reuse the same route option // that means we will append another function inside the array fastify.addHook('onRoute', function (routeOption) { if (Array.isArray(routeOption.onRequest)) { routeOption.onRequest.push(() => {}) } else { routeOption.onRequest = [() => {}] } }) fastify.addHook('onRoute', function (routeOption) { t.equal(routeOption.onRequest.length, 1) }) fastify.route({ method: 'GET', path: '/more-coffee', async handler () { return 'hello world' } }) }) test('using fastify.all when a catchall is defined does not degrade performance', { timeout: 30000 }, async t => { t.plan(1) const fastify = Fastify() fastify.get('/*', async (_, reply) => reply.json({ ok: true })) for (let i = 0; i < 100; i++) { fastify.all(`/${i}`, async (_, reply) => reply.json({ ok: true })) } t.pass() })