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')
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  )
							 | 
						||
| 
								 | 
							
								})
							 |