UNPKG

3.38 kBJavaScriptView Raw
1'use strict'
2
3/* eslint no-prototype-builtins: 0 */
4
5const t = require('tap')
6const test = t.test
7const decorator = require('../../lib/decorate')
8const {
9 kState
10} = require('../../lib/symbols')
11
12test('decorate should add the given method to its instance', t => {
13 t.plan(1)
14 function build () {
15 server.add = decorator.add
16 server[kState] = {
17 listening: false,
18 closing: false,
19 started: false
20 }
21 return server
22 function server () {}
23 }
24
25 const server = build()
26 server.add('test', () => {})
27 t.ok(server.test)
28})
29
30test('decorate is chainable', t => {
31 t.plan(3)
32 function build () {
33 server.add = decorator.add
34 server[kState] = {
35 listening: false,
36 closing: false,
37 started: false
38 }
39 return server
40 function server () {}
41 }
42
43 const server = build()
44 server
45 .add('test1', () => {})
46 .add('test2', () => {})
47 .add('test3', () => {})
48
49 t.ok(server.test1)
50 t.ok(server.test2)
51 t.ok(server.test3)
52})
53
54test('checkExistence should check if a property is part of the given instance', t => {
55 t.plan(1)
56 const instance = { test: () => {} }
57 t.ok(decorator.exist(instance, 'test'))
58})
59
60test('checkExistence should find the instance if not given', t => {
61 t.plan(1)
62 function build () {
63 server.add = decorator.add
64 server.check = decorator.exist
65 server[kState] = {
66 listening: false,
67 closing: false,
68 started: false
69 }
70 return server
71 function server () {}
72 }
73
74 const server = build()
75 server.add('test', () => {})
76 t.ok(server.check('test'))
77})
78
79test('checkExistence should check the prototype as well', t => {
80 t.plan(1)
81 function Instance () {}
82 Instance.prototype.test = () => {}
83
84 const instance = new Instance()
85 t.ok(decorator.exist(instance, 'test'))
86})
87
88test('checkDependencies should throw if a dependency is not present', t => {
89 t.plan(2)
90 const instance = {}
91 try {
92 decorator.dependencies(instance, ['test'])
93 t.fail()
94 } catch (e) {
95 t.is(e.code, 'FST_ERR_DEC_MISSING_DEPENDENCY')
96 t.is(e.message, 'FST_ERR_DEC_MISSING_DEPENDENCY: The decorator is missing dependency \'test\'.')
97 }
98})
99
100test('decorate should internally call checkDependencies', t => {
101 t.plan(2)
102 function build () {
103 server.add = decorator.add
104 server[kState] = {
105 listening: false,
106 closing: false,
107 started: false
108 }
109 return server
110 function server () {}
111 }
112
113 const server = build()
114
115 try {
116 server.add('method', () => {}, ['test'])
117 t.fail()
118 } catch (e) {
119 t.is(e.code, 'FST_ERR_DEC_MISSING_DEPENDENCY')
120 t.is(e.message, 'FST_ERR_DEC_MISSING_DEPENDENCY: The decorator is missing dependency \'test\'.')
121 }
122})
123
124test('decorate should recognize getter/setter objects', t => {
125 t.plan(6)
126
127 const one = {
128 [kState]: {
129 listening: false,
130 closing: false,
131 started: false
132 }
133 }
134 decorator.add.call(one, 'foo', {
135 getter: () => this._a,
136 setter: (val) => {
137 t.pass()
138 this._a = val
139 }
140 })
141 t.is(one.hasOwnProperty('foo'), true)
142 t.is(one.foo, undefined)
143 one.foo = 'a'
144 t.is(one.foo, 'a')
145
146 // getter only
147 const two = {
148 [kState]: {
149 listening: false,
150 closing: false,
151 started: false
152 }
153 }
154 decorator.add.call(two, 'foo', {
155 getter: () => 'a getter'
156 })
157 t.is(two.hasOwnProperty('foo'), true)
158 t.is(two.foo, 'a getter')
159})