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.
140 lines
3.0 KiB
140 lines
3.0 KiB
3 years ago
|
'use strict'
|
||
|
|
||
|
const test = require('tap').test
|
||
|
const sget = require('simple-get')
|
||
|
const Fastify = require('../')
|
||
|
const { FST_ERR_BAD_URL } = require('../lib/errors')
|
||
|
|
||
|
function getUrl (app) {
|
||
|
const { address, port } = app.server.address()
|
||
|
if (address === '::1') {
|
||
|
return `http://[${address}]:${port}`
|
||
|
} else {
|
||
|
return `http://${address}:${port}`
|
||
|
}
|
||
|
}
|
||
|
|
||
|
test('Should honor ignoreTrailingSlash option', t => {
|
||
|
t.plan(4)
|
||
|
const fastify = Fastify({
|
||
|
ignoreTrailingSlash: true
|
||
|
})
|
||
|
|
||
|
fastify.get('/test', (req, res) => {
|
||
|
res.send('test')
|
||
|
})
|
||
|
|
||
|
fastify.listen(0, (err) => {
|
||
|
fastify.server.unref()
|
||
|
if (err) t.threw(err)
|
||
|
|
||
|
const baseUrl = getUrl(fastify)
|
||
|
|
||
|
sget.concat(baseUrl + '/test', (err, res, data) => {
|
||
|
if (err) t.threw(err)
|
||
|
t.equal(res.statusCode, 200)
|
||
|
t.equal(data.toString(), 'test')
|
||
|
})
|
||
|
|
||
|
sget.concat(baseUrl + '/test/', (err, res, data) => {
|
||
|
if (err) t.threw(err)
|
||
|
t.equal(res.statusCode, 200)
|
||
|
t.equal(data.toString(), 'test')
|
||
|
})
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('Should honor maxParamLength option', t => {
|
||
|
t.plan(4)
|
||
|
const fastify = Fastify({ maxParamLength: 10 })
|
||
|
|
||
|
fastify.get('/test/:id', (req, reply) => {
|
||
|
reply.send({ hello: 'world' })
|
||
|
})
|
||
|
|
||
|
fastify.inject({
|
||
|
method: 'GET',
|
||
|
url: '/test/123456789'
|
||
|
}, (error, res) => {
|
||
|
t.error(error)
|
||
|
t.equal(res.statusCode, 200)
|
||
|
})
|
||
|
|
||
|
fastify.inject({
|
||
|
method: 'GET',
|
||
|
url: '/test/123456789abcd'
|
||
|
}, (error, res) => {
|
||
|
t.error(error)
|
||
|
t.equal(res.statusCode, 404)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('Should expose router options via getters on request and reply', t => {
|
||
|
t.plan(7)
|
||
|
const fastify = Fastify()
|
||
|
|
||
|
fastify.get('/test/:id', (req, reply) => {
|
||
|
t.equal(reply.context.config.url, '/test/:id')
|
||
|
t.equal(reply.context.config.method, 'GET')
|
||
|
t.equal(req.routerPath, '/test/:id')
|
||
|
t.equal(req.routerMethod, 'GET')
|
||
|
t.equal(req.is404, false)
|
||
|
reply.send({ hello: 'world' })
|
||
|
})
|
||
|
|
||
|
fastify.inject({
|
||
|
method: 'GET',
|
||
|
url: '/test/123456789'
|
||
|
}, (error, res) => {
|
||
|
t.error(error)
|
||
|
t.equal(res.statusCode, 200)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('Should set is404 flag for unmatched paths', t => {
|
||
|
t.plan(3)
|
||
|
const fastify = Fastify()
|
||
|
|
||
|
fastify.setNotFoundHandler((req, reply) => {
|
||
|
t.equal(req.is404, true)
|
||
|
reply.code(404).send({ error: 'Not Found', message: 'Four oh for', statusCode: 404 })
|
||
|
})
|
||
|
|
||
|
fastify.inject({
|
||
|
method: 'GET',
|
||
|
url: '/nonexist/123456789'
|
||
|
}, (error, res) => {
|
||
|
t.error(error)
|
||
|
t.equal(res.statusCode, 404)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('Should honor frameworkErrors option', t => {
|
||
|
t.plan(3)
|
||
|
const fastify = Fastify({
|
||
|
frameworkErrors: function (err, req, res) {
|
||
|
if (err instanceof FST_ERR_BAD_URL) {
|
||
|
t.ok(true)
|
||
|
} else {
|
||
|
t.fail()
|
||
|
}
|
||
|
res.send(`${err.message} - ${err.code}`)
|
||
|
}
|
||
|
})
|
||
|
|
||
|
fastify.get('/test/:id', (req, res) => {
|
||
|
res.send('{ hello: \'world\' }')
|
||
|
})
|
||
|
|
||
|
fastify.inject(
|
||
|
{
|
||
|
method: 'GET',
|
||
|
url: '/test/%world'
|
||
|
},
|
||
|
(err, res) => {
|
||
|
t.error(err)
|
||
|
t.equal(res.body, '\'%world\' is not a valid url component - FST_ERR_BAD_URL')
|
||
|
}
|
||
|
)
|
||
|
})
|