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.
		
		
		
		
		
			
		
			
				
					865 lines
				
				16 KiB
			
		
		
			
		
	
	
					865 lines
				
				16 KiB
			| 
											3 years ago
										 | 'use strict' | ||
|  | 
 | ||
|  | const test = require('tap').test | ||
|  | const boot = require('..') | ||
|  | 
 | ||
|  | test('boot a plugin and then execute a call after that', (t) => { | ||
|  |   t.plan(5) | ||
|  | 
 | ||
|  |   const app = boot() | ||
|  |   let pluginLoaded = false | ||
|  |   let afterCalled = false | ||
|  | 
 | ||
|  |   app.use(function (s, opts, done) { | ||
|  |     t.notOk(afterCalled, 'after not called') | ||
|  |     pluginLoaded = true | ||
|  |     done() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.after(function (err, cb) { | ||
|  |     t.error(err) | ||
|  |     t.ok(pluginLoaded, 'afterred!') | ||
|  |     afterCalled = true | ||
|  |     cb() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.on('start', () => { | ||
|  |     t.ok(afterCalled, 'after called') | ||
|  |     t.ok(pluginLoaded, 'plugin loaded') | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('after without a done callback', (t) => { | ||
|  |   t.plan(5) | ||
|  | 
 | ||
|  |   const app = boot() | ||
|  |   let pluginLoaded = false | ||
|  |   let afterCalled = false | ||
|  | 
 | ||
|  |   app.use(function (s, opts, done) { | ||
|  |     t.notOk(afterCalled, 'after not called') | ||
|  |     pluginLoaded = true | ||
|  |     done() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.after(function (err) { | ||
|  |     t.error(err) | ||
|  |     t.ok(pluginLoaded, 'afterred!') | ||
|  |     afterCalled = true | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.on('start', () => { | ||
|  |     t.ok(afterCalled, 'after called') | ||
|  |     t.ok(pluginLoaded, 'plugin loaded') | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('verify when a afterred call happens', (t) => { | ||
|  |   t.plan(3) | ||
|  | 
 | ||
|  |   const app = boot() | ||
|  | 
 | ||
|  |   app.use(function (s, opts, done) { | ||
|  |     done() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.after(function (err, cb) { | ||
|  |     t.error(err) | ||
|  |     t.pass('afterred finished') | ||
|  |     cb() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.on('start', () => { | ||
|  |     t.pass('booted') | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('internal after', (t) => { | ||
|  |   t.plan(18) | ||
|  | 
 | ||
|  |   const app = boot() | ||
|  |   let firstLoaded = false | ||
|  |   let secondLoaded = false | ||
|  |   let thirdLoaded = false | ||
|  |   let afterCalled = false | ||
|  | 
 | ||
|  |   app.use(first) | ||
|  |   app.use(third) | ||
|  | 
 | ||
|  |   function first (s, opts, done) { | ||
|  |     t.notOk(firstLoaded, 'first is not loaded') | ||
|  |     t.notOk(secondLoaded, 'second is not loaded') | ||
|  |     t.notOk(thirdLoaded, 'third is not loaded') | ||
|  |     firstLoaded = true | ||
|  |     s.use(second) | ||
|  |     s.after(function (err, cb) { | ||
|  |       t.error(err) | ||
|  |       t.notOk(afterCalled, 'after was not called') | ||
|  |       afterCalled = true | ||
|  |       cb() | ||
|  |     }) | ||
|  |     done() | ||
|  |   } | ||
|  | 
 | ||
|  |   function second (s, opts, done) { | ||
|  |     t.ok(firstLoaded, 'first is loaded') | ||
|  |     t.notOk(secondLoaded, 'second is not loaded') | ||
|  |     t.notOk(thirdLoaded, 'third is not loaded') | ||
|  |     t.notOk(afterCalled, 'after was not called') | ||
|  |     secondLoaded = true | ||
|  |     done() | ||
|  |   } | ||
|  | 
 | ||
|  |   function third (s, opts, done) { | ||
|  |     t.ok(firstLoaded, 'first is loaded') | ||
|  |     t.ok(secondLoaded, 'second is loaded') | ||
|  |     t.ok(afterCalled, 'after was called') | ||
|  |     t.notOk(thirdLoaded, 'third is not loaded') | ||
|  |     thirdLoaded = true | ||
|  |     done() | ||
|  |   } | ||
|  | 
 | ||
|  |   app.on('start', () => { | ||
|  |     t.ok(firstLoaded, 'first is loaded') | ||
|  |     t.ok(secondLoaded, 'second is loaded') | ||
|  |     t.ok(thirdLoaded, 'third is loaded') | ||
|  |     t.ok(afterCalled, 'after was called') | ||
|  |     t.pass('booted') | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('ready adds at the end of the queue', (t) => { | ||
|  |   t.plan(14) | ||
|  | 
 | ||
|  |   const app = boot() | ||
|  |   let pluginLoaded = false | ||
|  |   let afterCalled = false | ||
|  |   let readyCalled = false | ||
|  | 
 | ||
|  |   app.ready(function (err, cb) { | ||
|  |     t.error(err) | ||
|  |     t.ok(pluginLoaded, 'after the plugin') | ||
|  |     t.ok(afterCalled, 'after after') | ||
|  |     readyCalled = true | ||
|  |     process.nextTick(cb) | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.use(function (s, opts, done) { | ||
|  |     t.notOk(afterCalled, 'after not called') | ||
|  |     t.notOk(readyCalled, 'ready not called') | ||
|  |     pluginLoaded = true | ||
|  | 
 | ||
|  |     app.ready(function (err) { | ||
|  |       t.error(err) | ||
|  |       t.ok(readyCalled, 'after the first ready') | ||
|  |       t.ok(afterCalled, 'after the after callback') | ||
|  |     }) | ||
|  | 
 | ||
|  |     done() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.after(function (err, cb) { | ||
|  |     t.error(err) | ||
|  |     t.ok(pluginLoaded, 'executing after!') | ||
|  |     t.notOk(readyCalled, 'ready not called') | ||
|  |     afterCalled = true | ||
|  |     cb() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.on('start', () => { | ||
|  |     t.ok(afterCalled, 'after called') | ||
|  |     t.ok(pluginLoaded, 'plugin loaded') | ||
|  |     t.ok(readyCalled, 'ready called') | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('if the after/ready callback has two parameters, the first one must be the context', (t) => { | ||
|  |   t.plan(4) | ||
|  | 
 | ||
|  |   const server = { my: 'server' } | ||
|  |   const app = boot(server) | ||
|  | 
 | ||
|  |   app.use(function (s, opts, done) { | ||
|  |     done() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.after(function (err, context, cb) { | ||
|  |     t.error(err) | ||
|  |     t.equal(server, context) | ||
|  |     cb() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.ready(function (err, context, cb) { | ||
|  |     t.error(err) | ||
|  |     t.equal(server, context) | ||
|  |     cb() | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('if the after/ready async, the returns must be the context generated', (t) => { | ||
|  |   t.plan(3) | ||
|  | 
 | ||
|  |   const server = { my: 'server', index: 0 } | ||
|  |   const app = boot(server) | ||
|  |   app.override = function (old) { | ||
|  |     return { ...old, index: old.index + 1 } | ||
|  |   } | ||
|  | 
 | ||
|  |   app.use(function (s, opts, done) { | ||
|  |     s.use(function (s, opts, done) { | ||
|  |       s.ready().then(itself => t.same(itself, s, 'deep deep')) | ||
|  |       done() | ||
|  |     }) | ||
|  |     s.ready().then(itself => t.same(itself, s, 'deep')) | ||
|  |     done() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.ready().then(itself => t.same(itself, server, 'outer')) | ||
|  | }) | ||
|  | 
 | ||
|  | test('if the after/ready callback, the returns must be the context generated', (t) => { | ||
|  |   t.plan(3) | ||
|  | 
 | ||
|  |   const server = { my: 'server', index: 0 } | ||
|  |   const app = boot(server) | ||
|  |   app.override = function (old) { | ||
|  |     return { ...old, index: old.index + 1 } | ||
|  |   } | ||
|  | 
 | ||
|  |   app.use(function (s, opts, done) { | ||
|  |     s.use(function (s, opts, done) { | ||
|  |       s.ready((_, itself, done) => { | ||
|  |         t.same(itself, s, 'deep deep') | ||
|  |         done() | ||
|  |       }) | ||
|  |       done() | ||
|  |     }) | ||
|  |     s.ready((_, itself, done) => { | ||
|  |       t.same(itself, s, 'deep') | ||
|  |       done() | ||
|  |     }) | ||
|  |     done() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.ready((_, itself, done) => { | ||
|  |     t.same(itself, server, 'outer') | ||
|  |     done() | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('error should come in the first after - one parameter', (t) => { | ||
|  |   t.plan(3) | ||
|  | 
 | ||
|  |   const server = { my: 'server' } | ||
|  |   const app = boot(server) | ||
|  | 
 | ||
|  |   app.use(function (s, opts, done) { | ||
|  |     done(new Error('err')) | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.after(function (err) { | ||
|  |     t.ok(err instanceof Error) | ||
|  |     t.equal(err.message, 'err') | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.ready(function (err) { | ||
|  |     t.error(err) | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('error should come in the first after - two parameters', (t) => { | ||
|  |   t.plan(3) | ||
|  | 
 | ||
|  |   const server = { my: 'server' } | ||
|  |   const app = boot(server) | ||
|  | 
 | ||
|  |   app.use(function (s, opts, done) { | ||
|  |     done(new Error('err')) | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.after(function (err, cb) { | ||
|  |     t.ok(err instanceof Error) | ||
|  |     t.equal(err.message, 'err') | ||
|  |     cb() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.ready(function (err) { | ||
|  |     t.error(err) | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('error should come in the first after - three parameter', (t) => { | ||
|  |   t.plan(4) | ||
|  | 
 | ||
|  |   const server = { my: 'server' } | ||
|  |   const app = boot(server) | ||
|  | 
 | ||
|  |   app.use(function (s, opts, done) { | ||
|  |     done(new Error('err')) | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.after(function (err, context, cb) { | ||
|  |     t.ok(err instanceof Error) | ||
|  |     t.equal(err.message, 'err') | ||
|  |     t.equal(context, server) | ||
|  |     cb() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.ready(function (err) { | ||
|  |     t.error(err) | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('error should come in the first ready - one parameter', (t) => { | ||
|  |   t.plan(2) | ||
|  | 
 | ||
|  |   const server = { my: 'server' } | ||
|  |   const app = boot(server) | ||
|  | 
 | ||
|  |   app.use(function (s, opts, done) { | ||
|  |     done(new Error('err')) | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.ready(function (err) { | ||
|  |     t.ok(err instanceof Error) | ||
|  |     t.equal(err.message, 'err') | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('error should come in the first ready - two parameters', (t) => { | ||
|  |   t.plan(2) | ||
|  | 
 | ||
|  |   const server = { my: 'server' } | ||
|  |   const app = boot(server) | ||
|  | 
 | ||
|  |   app.use(function (s, opts, done) { | ||
|  |     done(new Error('err')) | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.ready(function (err, cb) { | ||
|  |     t.ok(err instanceof Error) | ||
|  |     t.equal(err.message, 'err') | ||
|  |     cb() | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('error should come in the first ready - three parameters', (t) => { | ||
|  |   t.plan(3) | ||
|  | 
 | ||
|  |   const server = { my: 'server' } | ||
|  |   const app = boot(server) | ||
|  | 
 | ||
|  |   app.use(function (s, opts, done) { | ||
|  |     done(new Error('err')) | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.ready(function (err, context, cb) { | ||
|  |     t.ok(err instanceof Error) | ||
|  |     t.equal(err.message, 'err') | ||
|  |     t.equal(context, server) | ||
|  |     cb() | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('if `use` has a callback with more then one parameter, the error must not reach ready', (t) => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const server = { my: 'server' } | ||
|  |   const app = boot(server) | ||
|  | 
 | ||
|  |   app.use(function (s, opts, done) { | ||
|  |     done(new Error('err')) | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.ready(function (err) { | ||
|  |     t.ok(err) | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('if `use` has a callback without parameters, the error must reach ready', (t) => { | ||
|  |   t.plan(1) | ||
|  | 
 | ||
|  |   const server = { my: 'server' } | ||
|  |   const app = boot(server) | ||
|  | 
 | ||
|  |   app.use(function (s, opts, done) { | ||
|  |     done(new Error('err')) | ||
|  |   }, () => {}) | ||
|  | 
 | ||
|  |   app.ready(function (err) { | ||
|  |     t.ok(err) | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('should pass the errors from after to ready', (t) => { | ||
|  |   t.plan(6) | ||
|  | 
 | ||
|  |   const server = {} | ||
|  |   const app = boot(server, {}) | ||
|  | 
 | ||
|  |   server.use(function (s, opts, done) { | ||
|  |     t.equal(s, server, 'the first argument is the server') | ||
|  |     t.same(opts, {}, 'no options') | ||
|  |     done() | ||
|  |   }).after((err, done) => { | ||
|  |     t.error(err) | ||
|  |     done(new Error('some error')) | ||
|  |   }) | ||
|  | 
 | ||
|  |   server.onClose(() => { | ||
|  |     t.ok('onClose called') | ||
|  |   }) | ||
|  | 
 | ||
|  |   server.ready(err => { | ||
|  |     t.equal(err.message, 'some error') | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.on('start', () => { | ||
|  |     server.close(() => { | ||
|  |       t.pass('booted') | ||
|  |     }) | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('after no encapsulation', t => { | ||
|  |   t.plan(4) | ||
|  | 
 | ||
|  |   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.after(function (err, i, done) { | ||
|  |       t.error(err) | ||
|  |       t.notOk(i.test) | ||
|  |       done() | ||
|  |     }) | ||
|  |     next() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.after(function (err, i, done) { | ||
|  |     t.error(err) | ||
|  |     t.notOk(i.test) | ||
|  |     done() | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('ready no encapsulation', t => { | ||
|  |   t.plan(4) | ||
|  | 
 | ||
|  |   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.ready(function (err, i, done) { | ||
|  |       t.error(err) | ||
|  |       t.notOk(i.test) | ||
|  |       done() | ||
|  |     }) | ||
|  |     next() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.ready(function (err, i, done) { | ||
|  |     t.error(err) | ||
|  |     t.notOk(i.test) | ||
|  |     done() | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('after encapsulation with a server', t => { | ||
|  |   t.plan(4) | ||
|  | 
 | ||
|  |   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.after(function (err, i, done) { | ||
|  |       t.error(err) | ||
|  |       t.ok(i.test) | ||
|  |       done() | ||
|  |     }) | ||
|  |     next() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.after(function (err, i, done) { | ||
|  |     t.error(err) | ||
|  |     t.notOk(i.test) | ||
|  |     done() | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('ready encapsulation with a server', t => { | ||
|  |   t.plan(4) | ||
|  | 
 | ||
|  |   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.ready(function (err, i, done) { | ||
|  |       t.error(err) | ||
|  |       t.ok(i.test) | ||
|  |       done() | ||
|  |     }) | ||
|  |     next() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.ready(function (err, i, done) { | ||
|  |     t.error(err) | ||
|  |     t.notOk(i.test) | ||
|  |     done() | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('after should passthrough the errors', (t) => { | ||
|  |   t.plan(5) | ||
|  | 
 | ||
|  |   const app = boot() | ||
|  |   let pluginLoaded = false | ||
|  |   let afterCalled = false | ||
|  | 
 | ||
|  |   app.use(function (s, opts, done) { | ||
|  |     t.notOk(afterCalled, 'after not called') | ||
|  |     pluginLoaded = true | ||
|  |     done(new Error('kaboom')) | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.after(function () { | ||
|  |     t.ok(pluginLoaded, 'afterred!') | ||
|  |     afterCalled = true | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.ready(function (err) { | ||
|  |     t.ok(err) | ||
|  |     t.ok(afterCalled, 'after called') | ||
|  |     t.ok(pluginLoaded, 'plugin loaded') | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('stop loading plugins if it errors', (t) => { | ||
|  |   t.plan(2) | ||
|  | 
 | ||
|  |   const app = boot() | ||
|  | 
 | ||
|  |   app.use(function first (server, opts, done) { | ||
|  |     t.pass('first called') | ||
|  |     done(new Error('kaboom')) | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.use(function second (server, opts, done) { | ||
|  |     t.fail('this should never be called') | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.ready((err) => { | ||
|  |     t.equal(err.message, 'kaboom') | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('keep loading if there is an .after', (t) => { | ||
|  |   t.plan(4) | ||
|  | 
 | ||
|  |   const app = boot() | ||
|  | 
 | ||
|  |   app.use(function first (server, opts, done) { | ||
|  |     t.pass('first called') | ||
|  |     done(new Error('kaboom')) | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.after(function (err) { | ||
|  |     t.equal(err.message, 'kaboom') | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.use(function second (server, opts, done) { | ||
|  |     t.pass('second called') | ||
|  |     done() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.ready((err) => { | ||
|  |     t.error(err) | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('do not load nested plugin if parent errors', (t) => { | ||
|  |   t.plan(4) | ||
|  | 
 | ||
|  |   const app = boot() | ||
|  | 
 | ||
|  |   app.use(function first (server, opts, done) { | ||
|  |     t.pass('first called') | ||
|  | 
 | ||
|  |     server.use(function second (_, opts, done) { | ||
|  |       t.fail('this should never be called') | ||
|  |     }) | ||
|  | 
 | ||
|  |     done(new Error('kaboom')) | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.after(function (err) { | ||
|  |     t.equal(err.message, 'kaboom') | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.use(function third (server, opts, done) { | ||
|  |     t.pass('third called') | ||
|  |     done() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.ready((err) => { | ||
|  |     t.error(err) | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('.after nested', (t) => { | ||
|  |   t.plan(4) | ||
|  | 
 | ||
|  |   const app = boot() | ||
|  | 
 | ||
|  |   app.use(function outer (app, opts, done) { | ||
|  |     app.use(function first (app, opts, done) { | ||
|  |       t.pass('first called') | ||
|  |       done(new Error('kaboom')) | ||
|  |     }) | ||
|  | 
 | ||
|  |     app.after(function (err) { | ||
|  |       t.equal(err.message, 'kaboom') | ||
|  |     }) | ||
|  | 
 | ||
|  |     app.use(function second (app, opts, done) { | ||
|  |       t.pass('second called') | ||
|  |       done() | ||
|  |     }) | ||
|  | 
 | ||
|  |     done() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.ready((err) => { | ||
|  |     t.error(err) | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('nested error', (t) => { | ||
|  |   t.plan(4) | ||
|  | 
 | ||
|  |   const app = boot() | ||
|  | 
 | ||
|  |   app.use(function outer (app, opts, done) { | ||
|  |     app.use(function first (app, opts, done) { | ||
|  |       t.pass('first called') | ||
|  |       done(new Error('kaboom')) | ||
|  |     }) | ||
|  | 
 | ||
|  |     app.use(function second (app, opts, done) { | ||
|  |       t.fail('this should never be called') | ||
|  |     }) | ||
|  | 
 | ||
|  |     done() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.after(function (err) { | ||
|  |     t.equal(err.message, 'kaboom') | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.use(function third (server, opts, done) { | ||
|  |     t.pass('third called') | ||
|  |     done() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.ready((err) => { | ||
|  |     t.error(err) | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('preReady event', (t) => { | ||
|  |   t.plan(4) | ||
|  | 
 | ||
|  |   const app = boot() | ||
|  |   const order = [1, 2] | ||
|  | 
 | ||
|  |   app.use(function first (server, opts, done) { | ||
|  |     t.pass('first called') | ||
|  |     done() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.use(function second (server, opts, done) { | ||
|  |     t.pass('second called') | ||
|  |     done() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.on('preReady', () => { | ||
|  |     t.equal(order.shift(), 1) | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.ready(() => { | ||
|  |     t.equal(order.shift(), 2) | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('preReady event (multiple)', (t) => { | ||
|  |   t.plan(6) | ||
|  | 
 | ||
|  |   const app = boot() | ||
|  |   const order = [1, 2, 3, 4] | ||
|  | 
 | ||
|  |   app.use(function first (server, opts, done) { | ||
|  |     t.pass('first called') | ||
|  |     done() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.use(function second (server, opts, done) { | ||
|  |     t.pass('second called') | ||
|  |     done() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.on('preReady', () => { | ||
|  |     t.equal(order.shift(), 1) | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.on('preReady', () => { | ||
|  |     t.equal(order.shift(), 2) | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.on('preReady', () => { | ||
|  |     t.equal(order.shift(), 3) | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.ready(() => { | ||
|  |     t.equal(order.shift(), 4) | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('preReady event (nested)', (t) => { | ||
|  |   t.plan(6) | ||
|  | 
 | ||
|  |   const app = boot() | ||
|  |   const order = [1, 2, 3, 4] | ||
|  | 
 | ||
|  |   app.use(function first (server, opts, done) { | ||
|  |     t.pass('first called') | ||
|  |     done() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.use(function second (server, opts, done) { | ||
|  |     t.pass('second called') | ||
|  | 
 | ||
|  |     server.on('preReady', () => { | ||
|  |       t.equal(order.shift(), 3) | ||
|  |     }) | ||
|  | 
 | ||
|  |     done() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.on('preReady', () => { | ||
|  |     t.equal(order.shift(), 1) | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.on('preReady', () => { | ||
|  |     t.equal(order.shift(), 2) | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.ready(() => { | ||
|  |     t.equal(order.shift(), 4) | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('preReady event (errored)', (t) => { | ||
|  |   t.plan(5) | ||
|  | 
 | ||
|  |   const app = boot() | ||
|  |   const order = [1, 2, 3] | ||
|  | 
 | ||
|  |   app.use(function first (server, opts, done) { | ||
|  |     t.pass('first called') | ||
|  |     done(new Error('kaboom')) | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.use(function second (server, opts, done) { | ||
|  |     t.fail('We should not be here') | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.on('preReady', () => { | ||
|  |     t.equal(order.shift(), 1) | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.on('preReady', () => { | ||
|  |     t.equal(order.shift(), 2) | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.ready((err) => { | ||
|  |     t.ok(err) | ||
|  |     t.equal(order.shift(), 3) | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('after return self', (t) => { | ||
|  |   t.plan(6) | ||
|  | 
 | ||
|  |   const app = boot() | ||
|  |   let pluginLoaded = false | ||
|  |   let afterCalled = false | ||
|  |   let second = false | ||
|  | 
 | ||
|  |   app.use(function (s, opts, done) { | ||
|  |     t.notOk(afterCalled, 'after not called') | ||
|  |     pluginLoaded = true | ||
|  |     done() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.after(function () { | ||
|  |     t.ok(pluginLoaded, 'afterred!') | ||
|  |     afterCalled = true | ||
|  |     // happens with after(() => app.use(..))
 | ||
|  |     return app | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.use(function (s, opts, done) { | ||
|  |     t.ok(afterCalled, 'after called') | ||
|  |     second = true | ||
|  |     done() | ||
|  |   }) | ||
|  | 
 | ||
|  |   app.on('start', () => { | ||
|  |     t.ok(afterCalled, 'after called') | ||
|  |     t.ok(pluginLoaded, 'plugin loaded') | ||
|  |     t.ok(second, 'second plugin loaded') | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('after 1 param swallows errors with server and timeout', (t) => { | ||
|  |   t.plan(3) | ||
|  | 
 | ||
|  |   const server = {} | ||
|  |   boot(server, { autostart: false, timeout: 1000 }) | ||
|  | 
 | ||
|  |   server.use(function first (server, opts, done) { | ||
|  |     t.pass('first called') | ||
|  |     done(new Error('kaboom')) | ||
|  |   }) | ||
|  | 
 | ||
|  |   server.use(function second (server, opts, done) { | ||
|  |     t.fail('We should not be here') | ||
|  |   }) | ||
|  | 
 | ||
|  |   server.after(function (err) { | ||
|  |     t.ok(err) | ||
|  |   }) | ||
|  | 
 | ||
|  |   server.ready(function (err) { | ||
|  |     t.error(err) | ||
|  |   }) | ||
|  | }) |