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