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.
		
		
		
		
		
			
		
			
				
					114 lines
				
				2.5 KiB
			
		
		
			
		
	
	
					114 lines
				
				2.5 KiB
			| 
											3 years ago
										 | 'use strict' | ||
|  | 
 | ||
|  | const test = require('tap').test | ||
|  | const boot = require('..') | ||
|  | 
 | ||
|  | test('reentrant', (t) => { | ||
|  |   t.plan(7) | ||
|  | 
 | ||
|  |   const app = boot() | ||
|  |   let firstLoaded = false | ||
|  |   let secondLoaded = false | ||
|  | 
 | ||
|  |   app | ||
|  |     .use(first) | ||
|  |     .after(() => { | ||
|  |       t.ok(firstLoaded, 'first is loaded') | ||
|  |       t.ok(secondLoaded, 'second is loaded') | ||
|  |       t.pass('booted') | ||
|  |     }) | ||
|  | 
 | ||
|  |   function first (s, opts, done) { | ||
|  |     t.notOk(firstLoaded, 'first is not loaded') | ||
|  |     t.notOk(secondLoaded, 'second is not loaded') | ||
|  |     firstLoaded = true | ||
|  |     s.use(second) | ||
|  |     done() | ||
|  |   } | ||
|  | 
 | ||
|  |   function second (s, opts, done) { | ||
|  |     t.ok(firstLoaded, 'first is loaded') | ||
|  |     t.notOk(secondLoaded, 'second is not loaded') | ||
|  |     secondLoaded = true | ||
|  |     done() | ||
|  |   } | ||
|  | }) | ||
|  | 
 | ||
|  | test('reentrant with callbacks deferred', (t) => { | ||
|  |   t.plan(11) | ||
|  | 
 | ||
|  |   const app = boot() | ||
|  |   let firstLoaded = false | ||
|  |   let secondLoaded = false | ||
|  |   let thirdLoaded = false | ||
|  | 
 | ||
|  |   app.use(first) | ||
|  | 
 | ||
|  |   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) | ||
|  |     setTimeout(() => { | ||
|  |       try { | ||
|  |         s.use(third) | ||
|  |       } catch (err) { | ||
|  |         t.equal(err.message, 'root plugin has already booted') | ||
|  |       } | ||
|  |     }, 500) | ||
|  |     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') | ||
|  |     secondLoaded = true | ||
|  |     done() | ||
|  |   } | ||
|  | 
 | ||
|  |   function third (s, opts, done) { | ||
|  |     thirdLoaded = true | ||
|  |     done() | ||
|  |   } | ||
|  | 
 | ||
|  |   app.on('start', () => { | ||
|  |     t.ok(firstLoaded, 'first is loaded') | ||
|  |     t.ok(secondLoaded, 'second is loaded') | ||
|  |     t.notOk(thirdLoaded, 'third is not loaded') | ||
|  |     t.pass('booted') | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | test('multiple loading time', t => { | ||
|  |   t.plan(1) | ||
|  |   const app = boot() | ||
|  | 
 | ||
|  |   function a (instance, opts, done) { | ||
|  |     (opts.use || []).forEach(_ => { instance.use(_, { use: opts.subUse || [] }) }) | ||
|  |     setTimeout(done, 10) | ||
|  |   } | ||
|  |   const pointer = a | ||
|  | 
 | ||
|  |   function b (instance, opts, done) { | ||
|  |     (opts.use || []).forEach(_ => { instance.use(_, { use: opts.subUse || [] }) }) | ||
|  |     setTimeout(done, 20) | ||
|  |   } | ||
|  | 
 | ||
|  |   function c (instance, opts, done) { | ||
|  |     (opts.use || []).forEach(_ => { instance.use(_, { use: opts.subUse || [] }) }) | ||
|  |     setTimeout(done, 30) | ||
|  |   } | ||
|  | 
 | ||
|  |   app | ||
|  |     .use(function a (instance, opts, done) { | ||
|  |       instance.use(pointer, { use: [b], subUse: [c] }) | ||
|  |         .use(b) | ||
|  |       setTimeout(done, 0) | ||
|  |     }) | ||
|  |     .after(() => { | ||
|  |       t.pass('booted') | ||
|  |     }) | ||
|  | }) |