@hurenkam/hue-services 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/.github/workflows/node.js.yml +31 -0
  2. package/.nyc_output/ecb1b16f-015c-458b-96d5-32cb9569c1e8.json +1 -0
  3. package/.nyc_output/processinfo/ecb1b16f-015c-458b-96d5-32cb9569c1e8.json +1 -0
  4. package/.nyc_output/processinfo/index.json +1 -0
  5. package/.vscode/settings.json +15 -0
  6. package/.vscode/sftp.json +11 -0
  7. package/LICENSE +201 -0
  8. package/README.md +340 -0
  9. package/Todo.txt +18 -0
  10. package/coverage/BaseNode.js.html +379 -0
  11. package/coverage/base.css +224 -0
  12. package/coverage/block-navigation.js +87 -0
  13. package/coverage/favicon.png +0 -0
  14. package/coverage/index.html +101 -0
  15. package/coverage/lcov-report/base.css +224 -0
  16. package/coverage/lcov-report/block-navigation.js +87 -0
  17. package/coverage/lcov-report/favicon.png +0 -0
  18. package/coverage/lcov-report/index.html +161 -0
  19. package/coverage/lcov-report/prettify.css +1 -0
  20. package/coverage/lcov-report/prettify.js +2 -0
  21. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  22. package/coverage/lcov-report/sorter.js +196 -0
  23. package/coverage/lcov-report/src/RestApi.js.html +499 -0
  24. package/coverage/lcov-report/src/all.js.html +208 -0
  25. package/coverage/lcov-report/src/clip/ClipApi.js.html +1096 -0
  26. package/coverage/lcov-report/src/clip/Resource.js.html +481 -0
  27. package/coverage/lcov-report/src/clip/index.html +131 -0
  28. package/coverage/lcov-report/src/debug.js.html +253 -0
  29. package/coverage/lcov-report/src/files.js.html +118 -0
  30. package/coverage/lcov-report/src/index.html +161 -0
  31. package/coverage/lcov-report/src/nodes/BaseNode.js.html +381 -0
  32. package/coverage/lcov-report/src/nodes/BridgeConfigNode.js.html +817 -0
  33. package/coverage/lcov-report/src/nodes/ButtonNode.js.html +241 -0
  34. package/coverage/lcov-report/src/nodes/DevicePowerNode.js.html +199 -0
  35. package/coverage/lcov-report/src/nodes/GroupedLightNode.js.html +226 -0
  36. package/coverage/lcov-report/src/nodes/LightLevelNode.js.html +205 -0
  37. package/coverage/lcov-report/src/nodes/LightNode.js.html +226 -0
  38. package/coverage/lcov-report/src/nodes/MotionNode.js.html +205 -0
  39. package/coverage/lcov-report/src/nodes/RelativeRotaryNode.js.html +253 -0
  40. package/coverage/lcov-report/src/nodes/ResourceNode.js.html +388 -0
  41. package/coverage/lcov-report/src/nodes/SceneNode.js.html +124 -0
  42. package/coverage/lcov-report/src/nodes/ServiceNode.js.html +124 -0
  43. package/coverage/lcov-report/src/nodes/TemperatureNode.js.html +205 -0
  44. package/coverage/lcov-report/src/nodes/ZigbeeConnectivityNode.js.html +199 -0
  45. package/coverage/lcov-report/src/nodes/index.html +311 -0
  46. package/coverage/lcov-report/src/ui/BaseUI.js.html +484 -0
  47. package/coverage/lcov-report/src/ui/BridgeConfigUI.js.html +475 -0
  48. package/coverage/lcov-report/src/ui/ButtonUI.js.html +166 -0
  49. package/coverage/lcov-report/src/ui/DevicePowerUI.js.html +166 -0
  50. package/coverage/lcov-report/src/ui/GroupedLightUI.js.html +178 -0
  51. package/coverage/lcov-report/src/ui/LightLevelUI.js.html +166 -0
  52. package/coverage/lcov-report/src/ui/LightUI.js.html +178 -0
  53. package/coverage/lcov-report/src/ui/MotionUI.js.html +166 -0
  54. package/coverage/lcov-report/src/ui/RelativeRotaryUI.js.html +166 -0
  55. package/coverage/lcov-report/src/ui/ResourceUI.js.html +511 -0
  56. package/coverage/lcov-report/src/ui/SceneUI.js.html +160 -0
  57. package/coverage/lcov-report/src/ui/ServiceUI.js.html +868 -0
  58. package/coverage/lcov-report/src/ui/TemperatureUI.js.html +166 -0
  59. package/coverage/lcov-report/src/ui/ZigbeeConnectivityUI.js.html +166 -0
  60. package/coverage/lcov-report/src/ui/index.html +311 -0
  61. package/coverage/lcov.info +2217 -0
  62. package/coverage/prettify.css +1 -0
  63. package/coverage/prettify.js +2 -0
  64. package/coverage/sort-arrow-sprite.png +0 -0
  65. package/coverage/sorter.js +196 -0
  66. package/coverage/src/RestApi.js.html +499 -0
  67. package/coverage/src/all.js.html +208 -0
  68. package/coverage/src/clip/ClipApi.js.html +1183 -0
  69. package/coverage/src/clip/Resource.js.html +481 -0
  70. package/coverage/src/clip/index.html +131 -0
  71. package/coverage/src/debug.js.html +253 -0
  72. package/coverage/src/files.js.html +118 -0
  73. package/coverage/src/index.html +116 -0
  74. package/coverage/src/nodes/BaseNode.js.html +379 -0
  75. package/coverage/src/nodes/BridgeConfigNode.js.html +517 -0
  76. package/coverage/src/nodes/ButtonNode.js.html +238 -0
  77. package/coverage/src/nodes/DevicePowerNode.js.html +196 -0
  78. package/coverage/src/nodes/GroupedLightNode.js.html +223 -0
  79. package/coverage/src/nodes/LightLevelNode.js.html +202 -0
  80. package/coverage/src/nodes/LightNode.js.html +223 -0
  81. package/coverage/src/nodes/MotionNode.js.html +202 -0
  82. package/coverage/src/nodes/RelativeRotaryNode.js.html +250 -0
  83. package/coverage/src/nodes/ResourceNode.js.html +373 -0
  84. package/coverage/src/nodes/SceneNode.js.html +124 -0
  85. package/coverage/src/nodes/ServiceNode.js.html +124 -0
  86. package/coverage/src/nodes/TemperatureNode.js.html +202 -0
  87. package/coverage/src/nodes/ZigbeeConnectivityNode.js.html +199 -0
  88. package/coverage/src/nodes/index.html +311 -0
  89. package/coverage/src/ui/BaseUI.js.html +484 -0
  90. package/coverage/src/ui/BridgeConfigUI.js.html +475 -0
  91. package/coverage/src/ui/ButtonUI.js.html +166 -0
  92. package/coverage/src/ui/DevicePowerUI.js.html +166 -0
  93. package/coverage/src/ui/GroupedLightUI.js.html +178 -0
  94. package/coverage/src/ui/LightLevelUI.js.html +166 -0
  95. package/coverage/src/ui/LightUI.js.html +178 -0
  96. package/coverage/src/ui/MotionUI.js.html +166 -0
  97. package/coverage/src/ui/RelativeRotaryUI.js.html +166 -0
  98. package/coverage/src/ui/ResourceUI.js.html +511 -0
  99. package/coverage/src/ui/SceneUI.js.html +160 -0
  100. package/coverage/src/ui/ServiceUI.js.html +868 -0
  101. package/coverage/src/ui/TemperatureUI.js.html +166 -0
  102. package/coverage/src/ui/ZigbeeConnectivityUI.js.html +166 -0
  103. package/coverage/src/ui/index.html +311 -0
  104. package/examples/flows.json +959 -0
  105. package/package.json +53 -0
  106. package/screenshots/Screenshot from 2022-11-29 00-29-23.png +0 -0
  107. package/screenshots/Screenshot from 2022-11-29 00-30-16.png +0 -0
  108. package/screenshots/Screenshot from 2022-11-29 00-30-58.png +0 -0
  109. package/screenshots/Screenshot from 2022-11-29 00-31-29.png +0 -0
  110. package/src/RestApi.js +138 -0
  111. package/src/all.html +52 -0
  112. package/src/all.js +42 -0
  113. package/src/clip/ClipApi.js +367 -0
  114. package/src/clip/Resource.js +132 -0
  115. package/src/debug.js +56 -0
  116. package/src/files.js +12 -0
  117. package/src/hue.js +98 -0
  118. package/src/nodes/BaseNode.js +98 -0
  119. package/src/nodes/BridgeConfigNode.js +144 -0
  120. package/src/nodes/ButtonNode.js +51 -0
  121. package/src/nodes/DevicePowerNode.js +37 -0
  122. package/src/nodes/GroupedLightNode.js +46 -0
  123. package/src/nodes/LightLevelNode.js +39 -0
  124. package/src/nodes/LightNode.js +46 -0
  125. package/src/nodes/MotionNode.js +39 -0
  126. package/src/nodes/RelativeRotaryNode.js +55 -0
  127. package/src/nodes/ResourceNode.js +95 -0
  128. package/src/nodes/SceneNode.js +13 -0
  129. package/src/nodes/ServiceNode.js +13 -0
  130. package/src/nodes/TemperatureNode.js +39 -0
  131. package/src/nodes/ZigbeeConnectivityNode.js +38 -0
  132. package/src/ui/BaseUI.js +133 -0
  133. package/src/ui/BridgeConfigUI.js +130 -0
  134. package/src/ui/ButtonUI.js +27 -0
  135. package/src/ui/DevicePowerUI.js +27 -0
  136. package/src/ui/GroupedLightUI.js +31 -0
  137. package/src/ui/LightLevelUI.js +27 -0
  138. package/src/ui/LightUI.js +31 -0
  139. package/src/ui/MotionUI.js +27 -0
  140. package/src/ui/RelativeRotaryUI.js +27 -0
  141. package/src/ui/ResourceUI.js +142 -0
  142. package/src/ui/SceneUI.js +25 -0
  143. package/src/ui/ServiceUI.js +261 -0
  144. package/src/ui/TemperatureUI.js +27 -0
  145. package/src/ui/ZigbeeConnectivityUI.js +27 -0
  146. package/test/BaseNode_spec.js +246 -0
  147. package/test/BaseUI_spec.js +17 -0
  148. package/test/BridgeConfigNode_spec.js +184 -0
  149. package/test/ButtonNode_spec.js +178 -0
  150. package/test/ClipApi_spec.js +769 -0
  151. package/test/DevicePowerNode_spec.js +186 -0
  152. package/test/GroupedLightNode_spec.js +218 -0
  153. package/test/LightLevelNode_spec.js +154 -0
  154. package/test/LightNode_spec.js +218 -0
  155. package/test/MotionNode_spec.js +186 -0
  156. package/test/RelativeRotataryNode_spec.js +325 -0
  157. package/test/ResourceNode_spec.js +308 -0
  158. package/test/Resource_spec.js +392 -0
  159. package/test/SceneNode_spec.js +33 -0
  160. package/test/ServiceNode_spec.js +33 -0
  161. package/test/TemperatureNode_spec.js +153 -0
  162. package/test/ZigbeeConnectivityNode_spec.js +186 -0
@@ -0,0 +1,392 @@
1
+ const Resource = require('../src/clip/Resource')
2
+ const assert = require('assert');
3
+ const sinon = require('sinon');
4
+
5
+ class TestClip {
6
+ static mock = {}
7
+
8
+ get(rtype,rid) {
9
+ if (TestClip.mock.get) {
10
+ return TestClip.mock.get(rtype,rid);
11
+ }
12
+ }
13
+ put(rtype,rid,data) {
14
+ if (TestClip.mock.put) {
15
+ return TestClip.mock.put(rtype,rid,data);
16
+ }
17
+ }
18
+ getResource() {
19
+ if (TestClip.mock.getResource) {
20
+ return TestClip.mock.getResource();
21
+ }
22
+ }
23
+ }
24
+
25
+ describe('Resource', function () {
26
+ beforeEach(()=>{
27
+ sandbox = sinon.createSandbox();
28
+ });
29
+
30
+ afterEach(function () {
31
+ sandbox.restore();
32
+ });
33
+
34
+
35
+ it('should construct and destruct', function (done) {
36
+ sandbox.stub(Resource.prototype,'id').callsFake(() => "id");
37
+ var resource = new Resource();
38
+ resource.destructor();
39
+ done();
40
+ });
41
+
42
+ it('should return data', function (done) {
43
+ sandbox.stub(Resource.prototype,'id').callsFake(() => "id");
44
+ var resource = new Resource({
45
+ id: "1801c6af-fff3-40b4-b5fa-2a056ce7a192",
46
+ type: "button",
47
+ });
48
+ var data = resource.data();
49
+ assert.equal(data.type,"button");
50
+ done();
51
+ });
52
+
53
+ it('should return clip', function (done) {
54
+ sandbox.stub(Resource.prototype,'id').callsFake(() => "id");
55
+ var resource = new Resource({
56
+ id: "1801c6af-fff3-40b4-b5fa-2a056ce7a192",
57
+ type: "button",
58
+ }, {
59
+ name: "clip"
60
+ });
61
+ var clip = resource.clip();
62
+ assert.equal(clip.name,"clip");
63
+ done();
64
+ });
65
+
66
+ it('should return rid', function (done) {
67
+ sandbox.stub(Resource.prototype,'id').callsFake(() => "id");
68
+ var resource = new Resource({
69
+ id: "1801c6af-fff3-40b4-b5fa-2a056ce7a192",
70
+ type: "button",
71
+ }, {
72
+ name: "clip"
73
+ });
74
+ var rid = resource.rid();
75
+ assert.equal(rid,"1801c6af-fff3-40b4-b5fa-2a056ce7a192");
76
+ done();
77
+ });
78
+
79
+ it('should return rtype', function (done) {
80
+ sandbox.stub(Resource.prototype,'id').callsFake(() => "id");
81
+ var resource = new Resource({
82
+ id: "1801c6af-fff3-40b4-b5fa-2a056ce7a192",
83
+ type: "button",
84
+ }, {
85
+ name: "clip"
86
+ });
87
+ var rtype = resource.rtype();
88
+ assert.equal(rtype,"button");
89
+ done();
90
+ });
91
+
92
+ it('should return data().metadata.name if present and name() is called', function (done) {
93
+ TestClip.mock = {
94
+ getResource: function() {
95
+ return "clip.getResource"
96
+ }
97
+ }
98
+
99
+ sandbox.stub(Resource.prototype,'id').callsFake(() => "id");
100
+ var resource = new Resource({
101
+ id: "1801c6af-fff3-40b4-b5fa-2a056ce7a192",
102
+ type: "button",
103
+ metadata: {
104
+ name: "Button"
105
+ }
106
+ }, new TestClip());
107
+ var name = resource.name();
108
+ assert.equal(name,"Button");
109
+ done();
110
+ });
111
+
112
+ it('should return owner().name() if present and name() is called with no data().metadata available', function (done) {
113
+ TestClip.mock = {
114
+ getResource: function() {
115
+ return {
116
+ rid: "c8867c84-f519-4012-9da9-79b801fc0a70",
117
+ name: function() {
118
+ return "Owner"
119
+ }
120
+ }
121
+ }
122
+ }
123
+
124
+ sandbox.stub(Resource.prototype,'id').callsFake(() => "id");
125
+ var resource = new Resource({
126
+ id: "1801c6af-fff3-40b4-b5fa-2a056ce7a192",
127
+ type: "button",
128
+ owner: {
129
+ rid: "c8867c84-f519-4012-9da9-79b801fc0a70"
130
+ },
131
+ }, new TestClip());
132
+ var name = resource.name();
133
+ assert.equal(name,"Owner");
134
+ done();
135
+ });
136
+
137
+ it('should call clip.getResource when looking up owner() if owner was set', function (done) {
138
+ TestClip.mock = {
139
+ getResource: function() {
140
+ return {
141
+ rid: "0c0f44df-e613-46aa-8da8-d4b378ed4d12",
142
+ name: function() {
143
+ return "Owner"
144
+ }
145
+ }
146
+ }
147
+ }
148
+
149
+ sandbox.stub(Resource.prototype,'id').callsFake(() => "id");
150
+ var resource = new Resource({
151
+ id: "1801c6af-fff3-40b4-b5fa-2a056ce7a192",
152
+ type: "button",
153
+ owner: {
154
+ rid: "0c0f44df-e613-46aa-8da8-d4b378ed4d12"
155
+ }
156
+ }, new TestClip());
157
+
158
+ var rid = resource.owner().rid;
159
+ assert.equal(rid,"0c0f44df-e613-46aa-8da8-d4b378ed4d12");
160
+ done();
161
+ });
162
+
163
+ it('should return null when looking up owner() if owner was not set', function (done) {
164
+ sandbox.stub(Resource.prototype,'id').callsFake(() => "id");
165
+ var resource = new Resource({
166
+ id: "1801c6af-fff3-40b4-b5fa-2a056ce7a192",
167
+ type: "button",
168
+ }, new TestClip());
169
+ var owner = resource.owner();
170
+ assert.equal(owner,null);
171
+ done();
172
+ });
173
+
174
+ it('should return type as typeName if no control_id is present', function (done) {
175
+ sandbox.stub(Resource.prototype,'id').callsFake(() => "id");
176
+ var resource = new Resource({
177
+ id: "1801c6af-fff3-40b4-b5fa-2a056ce7a192",
178
+ type: "button",
179
+ }, {
180
+ name: "clip"
181
+ });
182
+ var typeName = resource.typeName();
183
+ assert.equal(typeName,"button");
184
+ done();
185
+ });
186
+
187
+ it('should return type with number as typeName if control_id is present', function (done) {
188
+ sandbox.stub(Resource.prototype,'id').callsFake(() => "id");
189
+ var resource = new Resource({
190
+ id: "1801c6af-fff3-40b4-b5fa-2a056ce7a192",
191
+ type: "button",
192
+ metadata: {
193
+ control_id: 3
194
+ }
195
+ }, {
196
+ name: "clip"
197
+ });
198
+ var typeName = resource.typeName();
199
+ assert.equal(typeName,"button3");
200
+ done();
201
+ });
202
+
203
+ it('should lookup service resources if services() is called and data().services is not empty', function (done) {
204
+ TestClip.mock = {
205
+ getResource: function() {
206
+ return {
207
+ rid: "0c0f44df-e613-46aa-8da8-d4b378ed4d12",
208
+ name: function() {
209
+ return "Owner"
210
+ }
211
+ }
212
+ }
213
+ }
214
+
215
+ sandbox.stub(Resource.prototype,'id').callsFake(() => "id");
216
+ var resource = new Resource({
217
+ id: "1801c6af-fff3-40b4-b5fa-2a056ce7a192",
218
+ type: "device",
219
+ services: [{
220
+ rid: "2194dc5c-42ac-4f8b-845d-4af234cc1e6b",
221
+ rtype: "button"
222
+ },{
223
+ rid: "08f8c311-9e2c-4028-8a2d-625a0c260cb4",
224
+ rtype: "button"
225
+ }
226
+ ]
227
+ }, new TestClip());
228
+ var services = resource.services();
229
+ assert.equal(Object.keys(services).length,2);
230
+ done();
231
+ });
232
+
233
+ it('should return empty list if services() is called and data().services is not present', function (done) {
234
+ TestClip.mock = {
235
+ getResource: function() {
236
+ return {
237
+ rid: "0c0f44df-e613-46aa-8da8-d4b378ed4d12",
238
+ name: function() {
239
+ return "Owner"
240
+ }
241
+ }
242
+ }
243
+ }
244
+
245
+ sandbox.stub(Resource.prototype,'id').callsFake(() => "id");
246
+ var resource = new Resource({
247
+ id: "1801c6af-fff3-40b4-b5fa-2a056ce7a192",
248
+ type: "device",
249
+ }, new TestClip());
250
+ var services = resource.services();
251
+ assert.equal(Object.keys(services).length,0);
252
+ done();
253
+ });
254
+
255
+ it('should return empty list if services() is called and resource lookup fails', function (done) {
256
+ TestClip.mock = {
257
+ getResource: function() {
258
+ return null;
259
+ }
260
+ }
261
+
262
+ sandbox.stub(Resource.prototype,'id').callsFake(() => "id");
263
+ var resource = new Resource({
264
+ id: "1801c6af-fff3-40b4-b5fa-2a056ce7a192",
265
+ type: "device",
266
+ services: [{
267
+ rid: "2194dc5c-42ac-4f8b-845d-4af234cc1e6b",
268
+ rtype: "button"
269
+ },{
270
+ rid: "08f8c311-9e2c-4028-8a2d-625a0c260cb4",
271
+ rtype: "button"
272
+ }
273
+ ]
274
+ }, new TestClip());
275
+ var services = resource.services();
276
+ assert.equal(Object.keys(services).length,0);
277
+ done();
278
+ });
279
+
280
+ it('should forward get() to clip().get() with rtype() and rid() as parameters', function (done) {
281
+ TestClip.mock = {
282
+ get: function(rtype,rid) {
283
+ assert.equal(rtype,"device");
284
+ assert.equal(rid,"1801c6af-fff3-40b4-b5fa-2a056ce7a192");
285
+ done();
286
+ },
287
+ }
288
+
289
+ sandbox.stub(Resource.prototype,'id').callsFake(() => "id");
290
+ var resource = new Resource({
291
+ id: "1801c6af-fff3-40b4-b5fa-2a056ce7a192",
292
+ type: "device",
293
+ metadata: {
294
+ name: "Device"
295
+ }
296
+ }, new TestClip());
297
+ resource.get();
298
+ });
299
+
300
+ it('should forward put() to clip().put() with rtype() and rid() as parameters', function (done) {
301
+ TestClip.mock = {
302
+ put: function(rtype,rid,data) {
303
+ assert.equal(rtype,"device");
304
+ assert.equal(rid,"1801c6af-fff3-40b4-b5fa-2a056ce7a192");
305
+ assert.equal(data,"testdata");
306
+ done();
307
+ },
308
+ }
309
+
310
+ sandbox.stub(Resource.prototype,'id').callsFake(() => "id");
311
+ var resource = new Resource({
312
+ id: "1801c6af-fff3-40b4-b5fa-2a056ce7a192",
313
+ type: "device",
314
+ metadata: {
315
+ name: "Device"
316
+ }
317
+ }, new TestClip());
318
+ resource.put("testdata");
319
+ });
320
+
321
+ it('should appropriate data fields with information from event provided in updateStatus(event) call', function (done) {
322
+ TestClip.mock = {
323
+ }
324
+
325
+ sandbox.stub(Resource.prototype,'id').callsFake(() => "id");
326
+ var resource = new Resource({
327
+ id: "1801c6af-fff3-40b4-b5fa-2a056ce7a192",
328
+ type: "device",
329
+ metadata: {
330
+ name: "Device"
331
+ }
332
+ }, new TestClip());
333
+ resource.updateStatus({
334
+ id: "new_id",
335
+ button: {
336
+ last_event: "initial_press"
337
+ }
338
+ });
339
+ var data = resource.data();
340
+
341
+ // button event should be updated
342
+ assert.equal(data.button.last_event,"initial_press");
343
+
344
+ // id should not be updated
345
+ assert.equal(data.id,"1801c6af-fff3-40b4-b5fa-2a056ce7a192");
346
+
347
+ done();
348
+ });
349
+
350
+ it('should call updateStatus(event) when onEvent(event) is callled', function (done) {
351
+ TestClip.mock = {}
352
+
353
+ sandbox.stub(Resource.prototype,'id').callsFake(() => "id");
354
+ sandbox.stub(Resource.prototype,'updateStatus').callsFake(() => done());
355
+ var resource = new Resource({
356
+ id: "1801c6af-fff3-40b4-b5fa-2a056ce7a192",
357
+ type: "device",
358
+ metadata: {
359
+ name: "Device"
360
+ }
361
+ }, new TestClip());
362
+ resource.onEvent({
363
+ id: "new_id",
364
+ button: {
365
+ last_event: "initial_press"
366
+ }
367
+ });
368
+ });
369
+
370
+ it('should emit update event when onEvent(event) is callled', function (done) {
371
+ TestClip.mock = {}
372
+
373
+ sandbox.stub(Resource.prototype,'id').callsFake(() => "id");
374
+ sandbox.stub(Resource.prototype,'updateStatus').callsFake(() => {});
375
+ var resource = new Resource({
376
+ id: "1801c6af-fff3-40b4-b5fa-2a056ce7a192",
377
+ type: "device",
378
+ metadata: {
379
+ name: "Device"
380
+ }
381
+ }, new TestClip());
382
+ resource.on("update",function(event) {
383
+ done();
384
+ })
385
+ resource.onEvent({
386
+ id: "new_id",
387
+ button: {
388
+ last_event: "initial_press"
389
+ }
390
+ });
391
+ });
392
+ });
@@ -0,0 +1,33 @@
1
+ var helper = require("node-red-node-test-helper");
2
+ var testnodes = function(RED) {
3
+ "use strict";
4
+
5
+ const BaseNode = require('../src/nodes/BaseNode');
6
+ const SceneNode = require('../src/nodes/SceneNode');
7
+
8
+ BaseNode.nodeAPI = RED;
9
+ RED.nodes.registerType("SceneNode",SceneNode);
10
+ }
11
+
12
+ describe('Scene Node', function () {
13
+ afterEach(function () {
14
+ helper.unload();
15
+ });
16
+
17
+ it('should be loaded', function (done) {
18
+ //this.timeout(60000);
19
+ var flow = [{
20
+ id: "n1",
21
+ type: "SceneNode",
22
+ name: "scene node",
23
+ }];
24
+
25
+ helper.load(testnodes, flow, function () {
26
+ var n1 = helper.getNode("n1");
27
+ var config = n1.config;
28
+ //console.log(config);
29
+ config.should.have.property('name', 'scene node');
30
+ done();
31
+ });
32
+ });
33
+ });
@@ -0,0 +1,33 @@
1
+ var helper = require("node-red-node-test-helper");
2
+ var testnodes = function(RED) {
3
+ "use strict";
4
+
5
+ const BaseNode = require('../src/nodes/BaseNode');
6
+ const ServiceNode = require('../src/nodes/ServiceNode');
7
+
8
+ BaseNode.nodeAPI = RED;
9
+ RED.nodes.registerType("ServiceNode",ServiceNode);
10
+ }
11
+
12
+ describe('Service Node', function () {
13
+ afterEach(function () {
14
+ helper.unload();
15
+ });
16
+
17
+ it('should be loaded', function (done) {
18
+ //this.timeout(60000);
19
+ var flow = [{
20
+ id: "n1",
21
+ type: "ServiceNode",
22
+ name: "service node",
23
+ }];
24
+
25
+ helper.load(testnodes, flow, function () {
26
+ var n1 = helper.getNode("n1");
27
+ var config = n1.config;
28
+ //console.log(config);
29
+ config.should.have.property('name', 'service node');
30
+ done();
31
+ });
32
+ });
33
+ });
@@ -0,0 +1,153 @@
1
+ const helper = require("node-red-node-test-helper");
2
+ const assert = require('assert');
3
+ const sinon = require('sinon');
4
+
5
+ const testnodes = function(RED) {
6
+ "use strict";
7
+
8
+ const BaseNode = require('../src/nodes/BaseNode');
9
+ BaseNode.nodeAPI = RED;
10
+
11
+ RED.nodes.registerType("TemperatureNode",TemperatureNode);
12
+ }
13
+ const TemperatureNode = require('../src/nodes/TemperatureNode');
14
+ const { isNull } = require("util");
15
+
16
+ describe('TemperatureNode', function () {
17
+ beforeEach(()=>{
18
+ sandbox = sinon.createSandbox();
19
+ });
20
+
21
+ afterEach(function () {
22
+ sandbox.restore();
23
+ helper.unload();
24
+ });
25
+
26
+ it('should load', function (done) {
27
+ var flow = [{
28
+ id: "n1",
29
+ type: "TemperatureNode",
30
+ name: "temperature node",
31
+ }];
32
+
33
+ helper.load(testnodes, flow, function () {
34
+ var n1 = helper.getNode("n1");
35
+ n1.should.have.property('config');
36
+
37
+ var config = n1.config;
38
+ config.should.have.property('name', 'temperature node');
39
+ done();
40
+ });
41
+ });
42
+
43
+ it('should call updateStatus() when onUpdate(event) is called', function (done) {
44
+ const fakeStatus = sandbox.fake(() => {
45
+ done()
46
+ });
47
+ sandbox.replace(TemperatureNode.prototype,'updateStatus',fakeStatus);
48
+
49
+ var flow = [{
50
+ id: "n1",
51
+ type: "TemperatureNode",
52
+ name: "temperature node",
53
+ }];
54
+
55
+ helper.load(testnodes, flow, function () {
56
+ var n1 = helper.getNode("n1");
57
+ n1.onUpdate({
58
+ name: "event"
59
+ });
60
+ });
61
+ });
62
+
63
+ it('should call status() with "green/dot/25c"', function (done) {
64
+ const fakeResource = sandbox.fake.returns({
65
+ data: function() {
66
+ return { temperature: { temperature: 25 } }
67
+ }
68
+ });
69
+ sandbox.replace(TemperatureNode.prototype,'resource',fakeResource);
70
+ const fakeStatus = sandbox.fake(() => {
71
+ args = fakeStatus.firstArg;
72
+ assert.equal(args.fill,"green");
73
+ assert.equal(args.shape,"dot");
74
+ assert.equal(args.text,"25c");
75
+
76
+ done()
77
+ });
78
+ sandbox.replace(TemperatureNode.prototype,'status',fakeStatus);
79
+
80
+ var flow = [{
81
+ id: "n1",
82
+ type: "TemperatureNode",
83
+ name: "temperature node",
84
+ }];
85
+
86
+ helper.load(testnodes, flow, function () {
87
+ var n1 = helper.getNode("n1");
88
+ n1.onUpdate({
89
+ temperature: { temperature: 25 }
90
+ });
91
+ });
92
+ });
93
+
94
+ it('should call status() with "green/dot/" when resource==null', function (done) {
95
+ const fakeResource = sandbox.fake.returns(null);
96
+ sandbox.replace(TemperatureNode.prototype,'resource',fakeResource);
97
+ const fakeStatus = sandbox.fake(() => {
98
+
99
+ args = fakeStatus.firstArg;
100
+ assert.equal(args.fill,"grey");
101
+ assert.equal(args.shape,"dot");
102
+ assert.equal(args.text,"");
103
+
104
+ done()
105
+ });
106
+ sandbox.replace(TemperatureNode.prototype,'status',fakeStatus);
107
+
108
+ var flow = [{
109
+ id: "n1",
110
+ type: "TemperatureNode",
111
+ name: "temperature node",
112
+ }];
113
+
114
+ helper.load(testnodes, flow, function () {
115
+ var n1 = helper.getNode("n1");
116
+ n1.onUpdate({
117
+ temperature: { temperature: 25 }
118
+ });
119
+ });
120
+ });
121
+
122
+ it('should call status() with "green/dot/" when temperature==null', function (done) {
123
+ const fakeResource = sandbox.fake.returns({
124
+ data: function() {
125
+ return { temperature: { temperature: null } }
126
+ }
127
+ });
128
+ sandbox.replace(TemperatureNode.prototype,'resource',fakeResource);
129
+ const fakeStatus = sandbox.fake(() => {
130
+
131
+ args = fakeStatus.firstArg;
132
+ assert.equal(args.fill,"grey");
133
+ assert.equal(args.shape,"dot");
134
+ assert.equal(args.text,"");
135
+
136
+ done()
137
+ });
138
+ sandbox.replace(TemperatureNode.prototype,'status',fakeStatus);
139
+
140
+ var flow = [{
141
+ id: "n1",
142
+ type: "TemperatureNode",
143
+ name: "temperature node",
144
+ }];
145
+
146
+ helper.load(testnodes, flow, function () {
147
+ var n1 = helper.getNode("n1");
148
+ n1.onUpdate({
149
+ temperature: { temperature: 25 }
150
+ });
151
+ });
152
+ });
153
+ });