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.
298 lines
6.4 KiB
298 lines
6.4 KiB
4 years ago
|
'use strict'
|
||
|
|
||
|
const t = require('tap')
|
||
|
const proxyquire = require('proxyquire')
|
||
|
const test = t.test
|
||
|
const fp = require('./../')
|
||
|
const Fastify = require('fastify')
|
||
|
|
||
|
test('fastify-plugin is a function', t => {
|
||
|
t.plan(1)
|
||
|
t.type(fp, 'function')
|
||
|
})
|
||
|
|
||
|
test('should return the function with the skip-override Symbol', t => {
|
||
|
t.plan(1)
|
||
|
|
||
|
function plugin (fastify, opts, next) {
|
||
|
next()
|
||
|
}
|
||
|
|
||
|
fp(plugin)
|
||
|
t.ok(plugin[Symbol.for('skip-override')])
|
||
|
})
|
||
|
|
||
|
test('should support "default" function from babel module', t => {
|
||
|
t.plan(1)
|
||
|
|
||
|
const plugin = {
|
||
|
default: () => {}
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
fp(plugin)
|
||
|
t.pass()
|
||
|
} catch (e) {
|
||
|
t.is(e.message, 'fastify-plugin expects a function, instead got a \'object\'')
|
||
|
}
|
||
|
})
|
||
|
|
||
|
test('should throw if the plugin is not a function', t => {
|
||
|
t.plan(1)
|
||
|
|
||
|
try {
|
||
|
fp('plugin')
|
||
|
t.fail()
|
||
|
} catch (e) {
|
||
|
t.is(e.message, 'fastify-plugin expects a function, instead got a \'string\'')
|
||
|
}
|
||
|
})
|
||
|
|
||
|
test('should check the fastify version', t => {
|
||
|
t.plan(1)
|
||
|
|
||
|
function plugin (fastify, opts, next) {
|
||
|
next()
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
fp(plugin, { fastify: '>=0.10.0' })
|
||
|
t.pass()
|
||
|
} catch (e) {
|
||
|
t.fail()
|
||
|
}
|
||
|
})
|
||
|
|
||
|
test('should check the fastify version', t => {
|
||
|
t.plan(1)
|
||
|
|
||
|
function plugin (fastify, opts, next) {
|
||
|
next()
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
fp(plugin, '>=0.10.0')
|
||
|
t.pass()
|
||
|
} catch (e) {
|
||
|
t.fail()
|
||
|
}
|
||
|
})
|
||
|
|
||
|
test('the options object should be an object', t => {
|
||
|
t.plan(2)
|
||
|
|
||
|
try {
|
||
|
fp(() => {}, null)
|
||
|
t.fail()
|
||
|
} catch (e) {
|
||
|
t.is(e.message, 'The options object should be an object')
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
fp(() => {}, [])
|
||
|
t.fail()
|
||
|
} catch (e) {
|
||
|
t.is(e.message, 'The options object should be an object')
|
||
|
}
|
||
|
})
|
||
|
|
||
|
test('should throw if the fastify version does not satisfies the plugin requested version', t => {
|
||
|
t.plan(1)
|
||
|
|
||
|
function plugin (fastify, opts, next) {
|
||
|
next()
|
||
|
}
|
||
|
|
||
|
const v = require('fastify/package.json').version.replace(/-rc\.\d+/, '')
|
||
|
try {
|
||
|
fp(plugin, { fastify: '1000.1000.1000' })
|
||
|
t.fail()
|
||
|
} catch (e) {
|
||
|
t.is(e.message, `fastify-plugin: plugin - expected '1000.1000.1000' fastify version, '${v}' is installed`)
|
||
|
}
|
||
|
})
|
||
|
|
||
|
test('should throw if the version number is not a string', t => {
|
||
|
t.plan(1)
|
||
|
|
||
|
try {
|
||
|
fp(() => {}, { fastify: 12 })
|
||
|
t.fail()
|
||
|
} catch (e) {
|
||
|
t.is(e.message, 'fastify-plugin expects a version string, instead got \'number\'')
|
||
|
}
|
||
|
})
|
||
|
|
||
|
test('should not throw if fastify is not found', t => {
|
||
|
t.plan(1)
|
||
|
|
||
|
const fp = proxyquire('./../index.js', {
|
||
|
'fastify/package.json': null,
|
||
|
console: {
|
||
|
info: function (msg) {
|
||
|
t.is(msg, 'fastify not found, proceeding anyway')
|
||
|
}
|
||
|
}
|
||
|
})
|
||
|
|
||
|
function plugin (fastify, opts, next) {
|
||
|
next()
|
||
|
}
|
||
|
|
||
|
fp(plugin, { fastify: '>= 0' })
|
||
|
})
|
||
|
|
||
|
test('Should accept an option object', t => {
|
||
|
t.plan(2)
|
||
|
|
||
|
const opts = { hello: 'world' }
|
||
|
|
||
|
function plugin (fastify, opts, next) {
|
||
|
next()
|
||
|
}
|
||
|
|
||
|
fp(plugin, opts)
|
||
|
t.ok(plugin[Symbol.for('skip-override')])
|
||
|
t.deepEqual(plugin[Symbol.for('plugin-meta')], opts)
|
||
|
})
|
||
|
|
||
|
test('Should accept an option object and checks the version', t => {
|
||
|
t.plan(2)
|
||
|
|
||
|
const opts = { hello: 'world', fastify: '>=0.10.0' }
|
||
|
|
||
|
function plugin (fastify, opts, next) {
|
||
|
next()
|
||
|
}
|
||
|
|
||
|
fp(plugin, opts)
|
||
|
t.ok(plugin[Symbol.for('skip-override')])
|
||
|
t.deepEqual(plugin[Symbol.for('plugin-meta')], opts)
|
||
|
})
|
||
|
|
||
|
test('should throw if the fastify version does not satisfies the plugin requested version', t => {
|
||
|
t.plan(1)
|
||
|
|
||
|
function plugin (fastify, opts, next) {
|
||
|
next()
|
||
|
}
|
||
|
|
||
|
const v = require('fastify/package.json').version.replace(/-rc\.\d+/, '')
|
||
|
try {
|
||
|
fp(plugin, { fastify: '1000.1000.1000' })
|
||
|
t.fail()
|
||
|
} catch (e) {
|
||
|
t.is(e.message, `fastify-plugin: plugin - expected '1000.1000.1000' fastify version, '${v}' is installed`)
|
||
|
}
|
||
|
})
|
||
|
|
||
|
test('should throw if the fastify version does not satisfies the plugin requested version - plugin name', t => {
|
||
|
t.plan(1)
|
||
|
|
||
|
function plugin (fastify, opts, next) {
|
||
|
next()
|
||
|
}
|
||
|
|
||
|
const v = require('fastify/package.json').version.replace(/-rc\.\d+/, '')
|
||
|
try {
|
||
|
fp(plugin, { name: 'this-is-an-awesome-name', fastify: '1000.1000.1000' })
|
||
|
t.fail()
|
||
|
} catch (e) {
|
||
|
t.is(e.message, `fastify-plugin: this-is-an-awesome-name - expected '1000.1000.1000' fastify version, '${v}' is installed`)
|
||
|
}
|
||
|
})
|
||
|
|
||
|
test('should set anonymous function name to file it was called from', t => {
|
||
|
t.plan(2)
|
||
|
|
||
|
const fn = fp((fastify, opts, next) => {
|
||
|
next()
|
||
|
})
|
||
|
|
||
|
t.is(fn[Symbol.for('plugin-meta')].name, 'test')
|
||
|
t.is(fn[Symbol.for('fastify.display-name')], 'test')
|
||
|
})
|
||
|
|
||
|
test('should set display-name to meta name', t => {
|
||
|
t.plan(2)
|
||
|
|
||
|
const functionName = 'superDuperSpecialFunction'
|
||
|
|
||
|
const fn = fp((fastify, opts, next) => next(), {
|
||
|
name: functionName
|
||
|
})
|
||
|
|
||
|
t.is(fn[Symbol.for('plugin-meta')].name, functionName)
|
||
|
t.is(fn[Symbol.for('fastify.display-name')], functionName)
|
||
|
})
|
||
|
|
||
|
test('should preserve fastify version in meta', t => {
|
||
|
t.plan(1)
|
||
|
|
||
|
const opts = { hello: 'world', fastify: '>=0.10.0' }
|
||
|
|
||
|
const fn = fp((fastify, opts, next) => next(), opts)
|
||
|
|
||
|
t.is(fn[Symbol.for('plugin-meta')].fastify, '>=0.10.0')
|
||
|
})
|
||
|
|
||
|
test('should check fastify dependency graph - plugin', t => {
|
||
|
t.plan(1)
|
||
|
const fastify = Fastify()
|
||
|
|
||
|
fastify.register(fp((fastify, opts, next) => next(), {
|
||
|
fastify: '2.x',
|
||
|
name: 'plugin1-name'
|
||
|
}))
|
||
|
|
||
|
fastify.register(fp((fastify, opts, next) => next(), {
|
||
|
fastify: '2.x',
|
||
|
name: 'test',
|
||
|
dependencies: ['plugin1-name', 'plugin2-name']
|
||
|
}))
|
||
|
|
||
|
fastify.ready(err => {
|
||
|
t.is(err.message, "The dependency 'plugin2-name' of plugin 'test' is not registered")
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('should check fastify dependency graph - decorate', t => {
|
||
|
t.plan(1)
|
||
|
const fastify = Fastify()
|
||
|
|
||
|
fastify.decorate('plugin1', fp((fastify, opts, next) => next(), {
|
||
|
fastify: '2.x',
|
||
|
name: 'plugin1-name'
|
||
|
}))
|
||
|
|
||
|
fastify.register(fp((fastify, opts, next) => next(), {
|
||
|
fastify: '2.x',
|
||
|
name: 'test',
|
||
|
decorators: { fastify: ['plugin1', 'plugin2'] }
|
||
|
}))
|
||
|
|
||
|
fastify.ready(err => {
|
||
|
t.is(err.message, "The decorator 'plugin2' is not present in Fastify")
|
||
|
})
|
||
|
})
|
||
|
|
||
|
test('should check fastify dependency graph - decorateReply', t => {
|
||
|
t.plan(1)
|
||
|
const fastify = Fastify()
|
||
|
|
||
|
fastify.decorateReply('plugin1', fp((fastify, opts, next) => next(), {
|
||
|
fastify: '2.x',
|
||
|
name: 'plugin1-name'
|
||
|
}))
|
||
|
|
||
|
fastify.register(fp((fastify, opts, next) => next(), {
|
||
|
fastify: '2.x',
|
||
|
name: 'test',
|
||
|
decorators: { reply: ['plugin1', 'plugin2'] }
|
||
|
}))
|
||
|
|
||
|
fastify.ready(err => {
|
||
|
t.is(err.message, "The decorator 'plugin2' is not present in Reply")
|
||
|
})
|
||
|
})
|