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.
		
		
		
		
		
			
		
			
				
					
					
						
							273 lines
						
					
					
						
							5.6 KiB
						
					
					
				
			
		
		
	
	
							273 lines
						
					
					
						
							5.6 KiB
						
					
					
				'use strict'
 | 
						|
 | 
						|
const { test } = require('tap')
 | 
						|
const { promisify } = require('util')
 | 
						|
const sleep = promisify(setTimeout)
 | 
						|
const boot = require('..')
 | 
						|
 | 
						|
test('await use - nested plugins with same tick callbacks', async (t) => {
 | 
						|
  const app = {}
 | 
						|
  boot(app)
 | 
						|
 | 
						|
  t.plan(4)
 | 
						|
 | 
						|
  await app.use((f, opts, cb) => {
 | 
						|
    t.pass('plugin init')
 | 
						|
    app.use((f, opts, cb) => {
 | 
						|
      t.pass('plugin2 init')
 | 
						|
      cb()
 | 
						|
    })
 | 
						|
    cb()
 | 
						|
  })
 | 
						|
  t.pass('reachable')
 | 
						|
 | 
						|
  await app.ready()
 | 
						|
  t.pass('reachable')
 | 
						|
})
 | 
						|
 | 
						|
test('await use - nested plugins with future tick callbacks', async (t) => {
 | 
						|
  const app = {}
 | 
						|
  boot(app)
 | 
						|
 | 
						|
  t.plan(4)
 | 
						|
 | 
						|
  await app.use((f, opts, cb) => {
 | 
						|
    t.pass('plugin init')
 | 
						|
    app.use((f, opts, cb) => {
 | 
						|
      t.pass('plugin2 init')
 | 
						|
      setImmediate(cb)
 | 
						|
    })
 | 
						|
    setImmediate(cb)
 | 
						|
  })
 | 
						|
  t.pass('reachable')
 | 
						|
 | 
						|
  await app.ready()
 | 
						|
  t.pass('reachable')
 | 
						|
})
 | 
						|
 | 
						|
test('await use - nested async function plugins', async (t) => {
 | 
						|
  const app = {}
 | 
						|
  boot(app)
 | 
						|
 | 
						|
  t.plan(5)
 | 
						|
 | 
						|
  await app.use(async (f, opts) => {
 | 
						|
    t.pass('plugin init')
 | 
						|
    await app.use(async (f, opts) => {
 | 
						|
      t.pass('plugin2 init')
 | 
						|
    })
 | 
						|
    t.pass('reachable')
 | 
						|
  })
 | 
						|
  t.pass('reachable')
 | 
						|
 | 
						|
  await app.ready()
 | 
						|
  t.pass('reachable')
 | 
						|
})
 | 
						|
 | 
						|
test('await use - promise returning function plugins + promise chaining', async (t) => {
 | 
						|
  const app = {}
 | 
						|
  boot(app)
 | 
						|
 | 
						|
  t.plan(6)
 | 
						|
 | 
						|
  await app.use((f, opts) => {
 | 
						|
    t.pass('plugin init')
 | 
						|
    return app.use((f, opts) => {
 | 
						|
      t.pass('plugin2 init')
 | 
						|
      return Promise.resolve()
 | 
						|
    }).then(() => {
 | 
						|
      t.pass('reachable')
 | 
						|
      return 'test'
 | 
						|
    }).then((val) => {
 | 
						|
      t.equal(val, 'test')
 | 
						|
    })
 | 
						|
  })
 | 
						|
  t.pass('reachable')
 | 
						|
 | 
						|
  await app.ready()
 | 
						|
  t.pass('reachable')
 | 
						|
})
 | 
						|
 | 
						|
test('await use - await and use chaining', async (t) => {
 | 
						|
  const app = {}
 | 
						|
  boot(app)
 | 
						|
 | 
						|
  t.plan(3)
 | 
						|
 | 
						|
  app.use(async (f, opts, cb) => {
 | 
						|
    await app.use(async (f, opts) => {
 | 
						|
      t.pass('plugin init')
 | 
						|
    }).use(async (f, opts) => {
 | 
						|
      t.pass('plugin2 init')
 | 
						|
    })
 | 
						|
  })
 | 
						|
 | 
						|
  await app.ready()
 | 
						|
  t.pass('reachable')
 | 
						|
})
 | 
						|
 | 
						|
function thenableRejects (t, thenable, err, msg) {
 | 
						|
  return t.rejects(async () => { await thenable }, err, msg)
 | 
						|
}
 | 
						|
 | 
						|
test('await use - error handling, async throw', async (t) => {
 | 
						|
  const app = {}
 | 
						|
  boot(app)
 | 
						|
 | 
						|
  t.plan(2)
 | 
						|
 | 
						|
  await thenableRejects(t, app.use(async (f, opts) => {
 | 
						|
    throw Error('kaboom')
 | 
						|
  }), Error('kaboom'))
 | 
						|
 | 
						|
  await t.rejects(app.ready(), Error('kaboom'))
 | 
						|
})
 | 
						|
 | 
						|
test('await use - error handling, async throw, nested', async (t) => {
 | 
						|
  const app = {}
 | 
						|
  boot(app)
 | 
						|
 | 
						|
  t.plan(2)
 | 
						|
 | 
						|
  await thenableRejects(t, app.use(async function a (f, opts) {
 | 
						|
    await app.use(async function b (f, opts) {
 | 
						|
      throw Error('kaboom')
 | 
						|
    })
 | 
						|
  }, Error('kaboom')), 'b')
 | 
						|
 | 
						|
  t.rejects(() => app.ready(), Error('kaboom'))
 | 
						|
})
 | 
						|
 | 
						|
test('await use - error handling, same tick cb err', async (t) => {
 | 
						|
  const app = {}
 | 
						|
  boot(app)
 | 
						|
 | 
						|
  t.plan(2)
 | 
						|
 | 
						|
  await thenableRejects(t, app.use((f, opts, cb) => {
 | 
						|
    cb(Error('kaboom'))
 | 
						|
  }), Error('kaboom'))
 | 
						|
 | 
						|
  t.rejects(() => app.ready(), Error('kaboom'))
 | 
						|
})
 | 
						|
 | 
						|
test('await use - error handling, same tick cb err, nested', async (t) => {
 | 
						|
  const app = {}
 | 
						|
  boot(app)
 | 
						|
 | 
						|
  t.plan(2)
 | 
						|
 | 
						|
  await thenableRejects(t, app.use((f, opts, cb) => {
 | 
						|
    app.use((f, opts, cb) => {
 | 
						|
      cb(Error('kaboom'))
 | 
						|
    })
 | 
						|
    cb()
 | 
						|
  }), Error('kaboom'))
 | 
						|
 | 
						|
  t.rejects(() => app.ready(), Error('kaboom'))
 | 
						|
})
 | 
						|
 | 
						|
test('await use - error handling, future tick cb err', async (t) => {
 | 
						|
  const app = {}
 | 
						|
  boot(app)
 | 
						|
 | 
						|
  t.plan(2)
 | 
						|
 | 
						|
  await thenableRejects(t, app.use((f, opts, cb) => {
 | 
						|
    setImmediate(() => { cb(Error('kaboom')) })
 | 
						|
  }), Error('kaboom'))
 | 
						|
 | 
						|
  t.rejects(() => app.ready(), Error('kaboom'))
 | 
						|
})
 | 
						|
 | 
						|
test('await use - error handling, future tick cb err, nested', async (t) => {
 | 
						|
  const app = {}
 | 
						|
  boot(app)
 | 
						|
 | 
						|
  t.plan(2)
 | 
						|
 | 
						|
  await thenableRejects(t, app.use((f, opts, cb) => {
 | 
						|
    app.use((f, opts, cb) => {
 | 
						|
      setImmediate(() => { cb(Error('kaboom')) })
 | 
						|
    })
 | 
						|
    cb()
 | 
						|
  }), Error('kaboom'))
 | 
						|
 | 
						|
  t.rejects(() => app.ready(), Error('kaboom'))
 | 
						|
})
 | 
						|
 | 
						|
test('mixed await use and non-awaited use ', async (t) => {
 | 
						|
  const app = {}
 | 
						|
  boot(app)
 | 
						|
  t.plan(16)
 | 
						|
 | 
						|
  let firstLoaded = false
 | 
						|
  let secondLoaded = false
 | 
						|
  let thirdLoaded = false
 | 
						|
  let fourthLoaded = false
 | 
						|
 | 
						|
  await app.use(first)
 | 
						|
  t.ok(firstLoaded, 'first is loaded')
 | 
						|
  t.notOk(secondLoaded, 'second is not loaded')
 | 
						|
  t.notOk(thirdLoaded, 'third is not loaded')
 | 
						|
  t.notOk(fourthLoaded, 'fourth is not loaded')
 | 
						|
  app.use(second)
 | 
						|
  t.ok(firstLoaded, 'first is loaded')
 | 
						|
  t.notOk(secondLoaded, 'second is not loaded')
 | 
						|
  t.notOk(thirdLoaded, 'third is not loaded')
 | 
						|
  t.notOk(fourthLoaded, 'fourth is not loaded')
 | 
						|
  await app.use(third)
 | 
						|
  t.ok(firstLoaded, 'first is loaded')
 | 
						|
  t.ok(secondLoaded, 'second is loaded')
 | 
						|
  t.ok(thirdLoaded, 'third is loaded')
 | 
						|
  t.ok(fourthLoaded, 'fourth is loaded')
 | 
						|
  await app.ready()
 | 
						|
  t.ok(firstLoaded, 'first is loaded')
 | 
						|
  t.ok(secondLoaded, 'second is loaded')
 | 
						|
  t.ok(thirdLoaded, 'third is loaded')
 | 
						|
  t.ok(fourthLoaded, 'fourth is loaded')
 | 
						|
 | 
						|
  async function first () {
 | 
						|
    firstLoaded = true
 | 
						|
  }
 | 
						|
 | 
						|
  async function second () {
 | 
						|
    secondLoaded = true
 | 
						|
  }
 | 
						|
 | 
						|
  async function third (app) {
 | 
						|
    thirdLoaded = true
 | 
						|
    app.use(fourth)
 | 
						|
  }
 | 
						|
 | 
						|
  async function fourth () {
 | 
						|
    fourthLoaded = true
 | 
						|
  }
 | 
						|
})
 | 
						|
 | 
						|
test('await use - mix of same and future tick callbacks', async (t) => {
 | 
						|
  const app = {}
 | 
						|
  boot(app, { autostart: false })
 | 
						|
  let record = ''
 | 
						|
 | 
						|
  t.plan(4)
 | 
						|
 | 
						|
  await app.use(async function plugin0 () {
 | 
						|
    t.pass('plugin0 init')
 | 
						|
    record += 'plugin0|'
 | 
						|
  })
 | 
						|
  await app.use(async function plugin1 () {
 | 
						|
    t.pass('plugin1 init')
 | 
						|
    await sleep(500)
 | 
						|
    record += 'plugin1|'
 | 
						|
  })
 | 
						|
  await sleep(1)
 | 
						|
  await app.use(async function plugin2 () {
 | 
						|
    t.pass('plugin2 init')
 | 
						|
    await sleep(500)
 | 
						|
    record += 'plugin2|'
 | 
						|
  })
 | 
						|
  record += 'ready'
 | 
						|
  t.equal(record, 'plugin0|plugin1|plugin2|ready')
 | 
						|
})
 |