fastify
Version:
Fast and low overhead web framework, for Node.js
160 lines (140 loc) • 3.4 kB
JavaScript
/* eslint no-prototype-builtins: 0 */
const t = require('tap')
const test = t.test
const decorator = require('../../lib/decorate')
const {
kState
} = require('../../lib/symbols')
test('decorate should add the given method to its instance', t => {
t.plan(1)
function build () {
server.add = decorator.add
server[kState] = {
listening: false,
closing: false,
started: false
}
return server
function server () {}
}
const server = build()
server.add('test', () => {})
t.ok(server.test)
})
test('decorate is chainable', t => {
t.plan(3)
function build () {
server.add = decorator.add
server[kState] = {
listening: false,
closing: false,
started: false
}
return server
function server () {}
}
const server = build()
server
.add('test1', () => {})
.add('test2', () => {})
.add('test3', () => {})
t.ok(server.test1)
t.ok(server.test2)
t.ok(server.test3)
})
test('checkExistence should check if a property is part of the given instance', t => {
t.plan(1)
const instance = { test: () => {} }
t.ok(decorator.exist(instance, 'test'))
})
test('checkExistence should find the instance if not given', t => {
t.plan(1)
function build () {
server.add = decorator.add
server.check = decorator.exist
server[kState] = {
listening: false,
closing: false,
started: false
}
return server
function server () {}
}
const server = build()
server.add('test', () => {})
t.ok(server.check('test'))
})
test('checkExistence should check the prototype as well', t => {
t.plan(1)
function Instance () {}
Instance.prototype.test = () => {}
const instance = new Instance()
t.ok(decorator.exist(instance, 'test'))
})
test('checkDependencies should throw if a dependency is not present', t => {
t.plan(2)
const instance = {}
try {
decorator.dependencies(instance, 'foo', ['test'])
t.fail()
} catch (e) {
t.equal(e.code, 'FST_ERR_DEC_MISSING_DEPENDENCY')
t.equal(e.message, 'The decorator is missing dependency \'test\'.')
}
})
test('decorate should internally call checkDependencies', t => {
t.plan(2)
function build () {
server.add = decorator.add
server[kState] = {
listening: false,
closing: false,
started: false
}
return server
function server () {}
}
const server = build()
try {
server.add('method', () => {}, ['test'])
t.fail()
} catch (e) {
t.equal(e.code, 'FST_ERR_DEC_MISSING_DEPENDENCY')
t.equal(e.message, 'The decorator is missing dependency \'test\'.')
}
})
test('decorate should recognize getter/setter objects', t => {
t.plan(6)
const one = {
[kState]: {
listening: false,
closing: false,
started: false
}
}
decorator.add.call(one, 'foo', {
getter: () => this._a,
setter: (val) => {
t.pass()
this._a = val
}
})
t.equal(Object.prototype.hasOwnProperty.call(one, 'foo'), true)
t.equal(one.foo, undefined)
one.foo = 'a'
t.equal(one.foo, 'a')
// getter only
const two = {
[kState]: {
listening: false,
closing: false,
started: false
}
}
decorator.add.call(two, 'foo', {
getter: () => 'a getter'
})
t.equal(Object.prototype.hasOwnProperty.call(two, 'foo'), true)
t.equal(two.foo, 'a getter')
})