1 | 'use strict'
|
2 |
|
3 |
|
4 |
|
5 | const t = require('tap')
|
6 | const test = t.test
|
7 | const decorator = require('../../lib/decorate')
|
8 | const {
|
9 | kState
|
10 | } = require('../../lib/symbols')
|
11 |
|
12 | test('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 |
|
30 | test('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 |
|
54 | test('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 |
|
60 | test('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 |
|
79 | test('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 |
|
88 | test('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 |
|
100 | test('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 |
|
124 | test('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 |
|
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 | })
|