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.
		
		
		
		
		
			
		
			
				
					
					
						
							544 lines
						
					
					
						
							9.7 KiB
						
					
					
				
			
		
		
	
	
							544 lines
						
					
					
						
							9.7 KiB
						
					
					
				| 'use strict'
 | |
| 
 | |
| const test = require('tap').test
 | |
| const boot = require('..')
 | |
| 
 | |
| test('boot an app with a plugin', (t) => {
 | |
|   t.plan(4)
 | |
| 
 | |
|   const app = boot()
 | |
|   let last = false
 | |
| 
 | |
|   app.use(function (server, opts, done) {
 | |
|     app.onClose(() => {
 | |
|       t.ok('onClose called')
 | |
|       t.notOk(last)
 | |
|       last = true
 | |
|     })
 | |
|     done()
 | |
|   })
 | |
| 
 | |
|   app.on('start', () => {
 | |
|     app.close(() => {
 | |
|       t.ok(last)
 | |
|       t.pass('Closed in the correct order')
 | |
|     })
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('onClose arguments', (t) => {
 | |
|   t.plan(5)
 | |
| 
 | |
|   const app = boot()
 | |
| 
 | |
|   app.use(function (server, opts, next) {
 | |
|     server.onClose((instance, done) => {
 | |
|       t.ok('called')
 | |
|       t.equal(server, instance)
 | |
|       done()
 | |
|     })
 | |
|     next()
 | |
|   })
 | |
| 
 | |
|   app.use(function (server, opts, next) {
 | |
|     server.onClose((instance) => {
 | |
|       t.ok('called')
 | |
|       t.equal(server, instance)
 | |
|     })
 | |
|     next()
 | |
|   })
 | |
| 
 | |
|   app.on('start', () => {
 | |
|     app.close(() => {
 | |
|       t.pass('Closed in the correct order')
 | |
|     })
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('onClose arguments - fastify encapsulation test case', (t) => {
 | |
|   t.plan(5)
 | |
| 
 | |
|   const server = { my: 'server' }
 | |
|   const app = boot(server)
 | |
| 
 | |
|   app.override = function (s, fn, opts) {
 | |
|     s = Object.create(s)
 | |
|     return s
 | |
|   }
 | |
| 
 | |
|   app.use(function (instance, opts, next) {
 | |
|     instance.test = true
 | |
|     instance.onClose((i, done) => {
 | |
|       t.ok(i.test)
 | |
|       done()
 | |
|     })
 | |
|     next()
 | |
|   })
 | |
| 
 | |
|   app.use(function (instance, opts, next) {
 | |
|     t.notOk(instance.test)
 | |
|     instance.onClose((i, done) => {
 | |
|       t.notOk(i.test)
 | |
|       done()
 | |
|     })
 | |
|     next()
 | |
|   })
 | |
| 
 | |
|   app.on('start', () => {
 | |
|     t.notOk(app.test)
 | |
|     app.close(() => {
 | |
|       t.pass('Closed in the correct order')
 | |
|     })
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('onClose arguments - fastify encapsulation test case / 2', (t) => {
 | |
|   t.plan(5)
 | |
| 
 | |
|   const server = { my: 'server' }
 | |
|   const app = boot(server)
 | |
| 
 | |
|   app.override = function (s, fn, opts) {
 | |
|     s = Object.create(s)
 | |
|     return s
 | |
|   }
 | |
| 
 | |
|   server.use(function (instance, opts, next) {
 | |
|     instance.test = true
 | |
|     instance.onClose((i, done) => {
 | |
|       t.ok(i.test)
 | |
|       done()
 | |
|     })
 | |
|     next()
 | |
|   })
 | |
| 
 | |
|   server.use(function (instance, opts, next) {
 | |
|     t.notOk(instance.test)
 | |
|     instance.onClose((i, done) => {
 | |
|       t.notOk(i.test)
 | |
|       done()
 | |
|     })
 | |
|     next()
 | |
|   })
 | |
| 
 | |
|   app.on('start', () => {
 | |
|     t.notOk(server.test)
 | |
|     try {
 | |
|       server.close()
 | |
|       t.pass()
 | |
|     } catch (err) {
 | |
|       t.fail(err)
 | |
|     }
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('onClose arguments - encapsulation test case no server', (t) => {
 | |
|   t.plan(5)
 | |
| 
 | |
|   const app = boot()
 | |
| 
 | |
|   app.override = function (s, fn, opts) {
 | |
|     s = Object.create(s)
 | |
|     return s
 | |
|   }
 | |
| 
 | |
|   app.use(function (instance, opts, next) {
 | |
|     instance.test = true
 | |
|     instance.onClose((i, done) => {
 | |
|       t.notOk(i.test)
 | |
|       done()
 | |
|     })
 | |
|     next()
 | |
|   })
 | |
| 
 | |
|   app.use(function (instance, opts, next) {
 | |
|     t.notOk(instance.test)
 | |
|     instance.onClose((i) => {
 | |
|       t.notOk(i.test)
 | |
|     })
 | |
|     next()
 | |
|   })
 | |
| 
 | |
|   app.on('start', () => {
 | |
|     t.notOk(app.test)
 | |
|     app.close(() => {
 | |
|       t.pass('Closed in the correct order')
 | |
|     })
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('onClose should handle errors', (t) => {
 | |
|   t.plan(3)
 | |
| 
 | |
|   const app = boot()
 | |
| 
 | |
|   app.use(function (server, opts, done) {
 | |
|     app.onClose((instance, done) => {
 | |
|       t.ok('called')
 | |
|       done(new Error('some error'))
 | |
|     })
 | |
|     done()
 | |
|   })
 | |
| 
 | |
|   app.on('start', () => {
 | |
|     app.close(err => {
 | |
|       t.equal(err.message, 'some error')
 | |
|       t.pass('Closed in the correct order')
 | |
|     })
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('#54 close handlers should receive same parameters when queue is not empty', (t) => {
 | |
|   t.plan(6)
 | |
| 
 | |
|   const context = { test: true }
 | |
|   const app = boot(context)
 | |
| 
 | |
|   app.use(function (server, opts, done) {
 | |
|     done()
 | |
|   })
 | |
|   app.on('start', () => {
 | |
|     app.close((err, done) => {
 | |
|       t.equal(err, null)
 | |
|       t.pass('Closed in the correct order')
 | |
|       setImmediate(done)
 | |
|     })
 | |
|     app.close(err => {
 | |
|       t.equal(err, null)
 | |
|       t.pass('Closed in the correct order')
 | |
|     })
 | |
|     app.close(err => {
 | |
|       t.equal(err, null)
 | |
|       t.pass('Closed in the correct order')
 | |
|     })
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('onClose should handle errors / 2', (t) => {
 | |
|   t.plan(4)
 | |
| 
 | |
|   const app = boot()
 | |
| 
 | |
|   app.onClose((instance, done) => {
 | |
|     t.ok('called')
 | |
|     done(new Error('some error'))
 | |
|   })
 | |
| 
 | |
|   app.use(function (server, opts, done) {
 | |
|     app.onClose((instance, done) => {
 | |
|       t.ok('called')
 | |
|       done()
 | |
|     })
 | |
|     done()
 | |
|   })
 | |
| 
 | |
|   app.on('start', () => {
 | |
|     app.close(err => {
 | |
|       t.equal(err.message, 'some error')
 | |
|       t.pass('Closed in the correct order')
 | |
|     })
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('close arguments', (t) => {
 | |
|   t.plan(4)
 | |
| 
 | |
|   const app = boot()
 | |
| 
 | |
|   app.use(function (server, opts, done) {
 | |
|     app.onClose((instance, done) => {
 | |
|       t.ok('called')
 | |
|       done()
 | |
|     })
 | |
|     done()
 | |
|   })
 | |
| 
 | |
|   app.on('start', () => {
 | |
|     app.close((err, instance, done) => {
 | |
|       t.error(err)
 | |
|       t.equal(instance, app)
 | |
|       done()
 | |
|       t.pass('Closed in the correct order')
 | |
|     })
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('close event', (t) => {
 | |
|   t.plan(3)
 | |
| 
 | |
|   const app = boot()
 | |
|   let last = false
 | |
| 
 | |
|   app.on('start', () => {
 | |
|     app.close(() => {
 | |
|       t.notOk(last)
 | |
|       last = true
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   app.on('close', () => {
 | |
|     t.ok(last)
 | |
|     t.pass('event fired')
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('close order', (t) => {
 | |
|   t.plan(5)
 | |
| 
 | |
|   const app = boot()
 | |
|   const order = [1, 2, 3, 4]
 | |
| 
 | |
|   app.use(function (server, opts, done) {
 | |
|     app.onClose(() => {
 | |
|       t.equal(order.shift(), 3)
 | |
|     })
 | |
| 
 | |
|     app.use(function (server, opts, done) {
 | |
|       app.onClose(() => {
 | |
|         t.equal(order.shift(), 2)
 | |
|       })
 | |
|       done()
 | |
|     })
 | |
|     done()
 | |
|   })
 | |
| 
 | |
|   app.use(function (server, opts, done) {
 | |
|     app.onClose(() => {
 | |
|       t.equal(order.shift(), 1)
 | |
|     })
 | |
|     done()
 | |
|   })
 | |
| 
 | |
|   app.on('start', () => {
 | |
|     app.close(() => {
 | |
|       t.equal(order.shift(), 4)
 | |
|       t.pass('Closed in the correct order')
 | |
|     })
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('close without a cb', (t) => {
 | |
|   t.plan(1)
 | |
| 
 | |
|   const app = boot()
 | |
| 
 | |
|   app.onClose((instance, done) => {
 | |
|     t.ok('called')
 | |
|     done()
 | |
|   })
 | |
| 
 | |
|   app.close()
 | |
| })
 | |
| 
 | |
| test('onClose with 0 parameters', (t) => {
 | |
|   t.plan(4)
 | |
| 
 | |
|   const server = { my: 'server' }
 | |
|   const app = boot(server)
 | |
| 
 | |
|   app.use(function (instance, opts, next) {
 | |
|     instance.onClose(function () {
 | |
|       t.ok('called')
 | |
|       t.equal(arguments.length, 0)
 | |
|     })
 | |
|     next()
 | |
|   })
 | |
| 
 | |
|   app.close(err => {
 | |
|     t.error(err)
 | |
|     t.pass('Closed')
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('onClose with 1 parameter', (t) => {
 | |
|   t.plan(3)
 | |
| 
 | |
|   const server = { my: 'server' }
 | |
|   const app = boot(server)
 | |
| 
 | |
|   app.use(function (instance, opts, next) {
 | |
|     instance.onClose(function (context) {
 | |
|       t.equal(arguments.length, 1)
 | |
|     })
 | |
|     next()
 | |
|   })
 | |
| 
 | |
|   app.close(err => {
 | |
|     t.error(err)
 | |
|     t.pass('Closed')
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('close passing not a function', (t) => {
 | |
|   t.plan(1)
 | |
| 
 | |
|   const app = boot()
 | |
| 
 | |
|   app.onClose((instance, done) => {
 | |
|     t.ok('called')
 | |
|     done()
 | |
|   })
 | |
| 
 | |
|   t.throws(() => app.close({}), { message: 'not a function' })
 | |
| })
 | |
| 
 | |
| test('close passing not a function', (t) => {
 | |
|   t.plan(1)
 | |
| 
 | |
|   const app = boot()
 | |
| 
 | |
|   app.onClose((instance, done) => {
 | |
|     t.ok('called')
 | |
|     done()
 | |
|   })
 | |
| 
 | |
|   t.throws(() => app.close({}), { message: 'not a function' })
 | |
| })
 | |
| 
 | |
| test('close passing not a function when wrapping', (t) => {
 | |
|   t.plan(1)
 | |
| 
 | |
|   const app = {}
 | |
|   boot(app)
 | |
| 
 | |
|   app.onClose((instance, done) => {
 | |
|     t.ok('called')
 | |
|     done()
 | |
|   })
 | |
| 
 | |
|   t.throws(() => app.close({}), { message: 'not a function' })
 | |
| })
 | |
| 
 | |
| test('close should trigger ready()', (t) => {
 | |
|   t.plan(2)
 | |
| 
 | |
|   const app = boot(null, {
 | |
|     autostart: false
 | |
|   })
 | |
| 
 | |
|   app.on('start', () => {
 | |
|     // this will be emitted after the
 | |
|     // callback in close() is fired
 | |
|     t.pass('started')
 | |
|   })
 | |
| 
 | |
|   app.close(() => {
 | |
|     t.pass('closed')
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('close without a cb returns a promise', (t) => {
 | |
|   t.plan(1)
 | |
| 
 | |
|   const app = boot()
 | |
|   app.close().then(() => {
 | |
|     t.pass('promise resolves')
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('close without a cb returns a promise when attaching to a server', (t) => {
 | |
|   t.plan(1)
 | |
| 
 | |
|   const server = {}
 | |
|   boot(server)
 | |
|   server.close().then(() => {
 | |
|     t.pass('promise resolves')
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('close with async onClose handlers', t => {
 | |
|   t.plan(7)
 | |
| 
 | |
|   const app = boot()
 | |
|   const order = [1, 2, 3, 4, 5, 6]
 | |
| 
 | |
|   app.onClose(() => {
 | |
|     return new Promise(resolve => setTimeout(resolve, 500)).then(() => {
 | |
|       t.equal(order.shift(), 5)
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   app.onClose(() => {
 | |
|     t.equal(order.shift(), 4)
 | |
|   })
 | |
| 
 | |
|   app.onClose(instance => {
 | |
|     return new Promise(resolve => setTimeout(resolve, 500)).then(() => {
 | |
|       t.equal(order.shift(), 3)
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   app.onClose(async instance => {
 | |
|     return new Promise(resolve => setTimeout(resolve, 500)).then(() => {
 | |
|       t.equal(order.shift(), 2)
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   app.onClose(async () => {
 | |
|     return new Promise(resolve => setTimeout(resolve, 500)).then(() => {
 | |
|       t.equal(order.shift(), 1)
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   app.on('start', () => {
 | |
|     app.close(() => {
 | |
|       t.equal(order.shift(), 6)
 | |
|       t.pass('Closed in the correct order')
 | |
|     })
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('onClose callback must be a function', (t) => {
 | |
|   t.plan(1)
 | |
| 
 | |
|   const app = boot()
 | |
| 
 | |
|   app.use(function (server, opts, done) {
 | |
|     t.throws(() => app.onClose({}), { message: 'not a function' })
 | |
|     done()
 | |
|   })
 | |
| })
 | |
| 
 | |
| test('close custom server with async onClose handlers', t => {
 | |
|   t.plan(7)
 | |
| 
 | |
|   const server = {}
 | |
|   const app = boot(server)
 | |
|   const order = [1, 2, 3, 4, 5, 6]
 | |
| 
 | |
|   server.onClose(() => {
 | |
|     return new Promise(resolve => setTimeout(resolve, 500)).then(() => {
 | |
|       t.equal(order.shift(), 5)
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   server.onClose(() => {
 | |
|     t.equal(order.shift(), 4)
 | |
|   })
 | |
| 
 | |
|   server.onClose(instance => {
 | |
|     return new Promise(resolve => setTimeout(resolve, 500)).then(() => {
 | |
|       t.equal(order.shift(), 3)
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   server.onClose(async instance => {
 | |
|     return new Promise(resolve => setTimeout(resolve, 500)).then(() => {
 | |
|       t.equal(order.shift(), 2)
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   server.onClose(async () => {
 | |
|     return new Promise(resolve => setTimeout(resolve, 500)).then(() => {
 | |
|       t.equal(order.shift(), 1)
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   app.on('start', () => {
 | |
|     app.close(() => {
 | |
|       t.equal(order.shift(), 6)
 | |
|       t.pass('Closed in the correct order')
 | |
|     })
 | |
|   })
 | |
| })
 |