iotagent-node-lib 4.5.0 → 4.7.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 (124) hide show
  1. package/.github/workflows/ci.yml +0 -1
  2. package/Changelog +12 -0
  3. package/README.md +67 -272
  4. package/config.js +3 -1
  5. package/doc/README.md +1 -1
  6. package/doc/admin.md +40 -18
  7. package/doc/api.md +532 -136
  8. package/doc/deprecated.md +4 -0
  9. package/doc/devel/architecture.md +5 -135
  10. package/doc/devel/development.md +224 -12
  11. package/doc/getting-started.md +114 -53
  12. package/doc/requirements.txt +1 -1
  13. package/doc/roadmap.md +5 -5
  14. package/docker/Mosquitto/Dockerfile +2 -2
  15. package/docker/Mosquitto/README.md +14 -11
  16. package/lib/commonConfig.js +21 -2
  17. package/lib/constants.js +3 -0
  18. package/lib/fiware-iotagent-lib.js +12 -15
  19. package/lib/jexlTranformsMap.js +3 -1
  20. package/lib/model/Command.js +2 -2
  21. package/lib/model/Device.js +7 -3
  22. package/lib/model/Group.js +5 -3
  23. package/lib/model/dbConn.js +53 -115
  24. package/lib/services/commands/commandRegistryMongoDB.js +115 -75
  25. package/lib/services/common/alarmManagement.js +3 -0
  26. package/lib/services/common/iotManagerService.js +3 -1
  27. package/lib/services/devices/deviceRegistryMemory.js +36 -0
  28. package/lib/services/devices/deviceRegistryMongoDB.js +160 -87
  29. package/lib/services/devices/deviceService.js +33 -3
  30. package/lib/services/devices/devices-NGSI-v2.js +6 -1
  31. package/lib/services/groups/groupRegistryMongoDB.js +120 -83
  32. package/lib/services/groups/groupService.js +1 -1
  33. package/lib/services/ngsi/entities-NGSI-LD.js +320 -570
  34. package/lib/services/ngsi/entities-NGSI-v2.js +51 -3
  35. package/lib/services/ngsi/ngsiService.js +34 -1
  36. package/lib/services/northBound/deviceGroupAdministrationServer.js +42 -6
  37. package/lib/services/northBound/deviceProvisioningServer.js +12 -4
  38. package/lib/services/northBound/northboundServer.js +2 -0
  39. package/lib/services/stats/statsRegistry.js +128 -101
  40. package/lib/templates/createDevice.json +0 -24
  41. package/lib/templates/createDeviceLax.json +0 -23
  42. package/lib/templates/deviceGroup.json +1 -25
  43. package/lib/templates/updateDevice.json +12 -24
  44. package/lib/templates/updateDeviceLax.json +12 -23
  45. package/package.json +5 -5
  46. package/scripts/legacy_expression_tool/README.md +0 -1
  47. package/test/functional/README.md +22 -17
  48. package/test/functional/config-test.js +3 -2
  49. package/test/functional/functional-tests-runner.js +9 -4
  50. package/test/functional/functional-tests.js +4 -4
  51. package/test/functional/testCases.js +245 -4
  52. package/test/functional/testUtils.js +2 -2
  53. package/test/unit/examples/deviceProvisioningRequests/provisionFullDevice.json +1 -13
  54. package/test/unit/examples/groupProvisioningRequests/multipleConfigGroupsCreation.json +44 -0
  55. package/test/unit/examples/groupProvisioningRequests/provisionDuplicateConfigGroup.json +35 -0
  56. package/test/unit/examples/groupProvisioningRequests/provisionFullConfigGroup.json +36 -0
  57. package/test/unit/examples/groupProvisioningRequests/provisionFullConfigGroupAlternate.json +36 -0
  58. package/test/unit/examples/groupProvisioningRequests/provisionFullGroup.json +1 -0
  59. package/test/unit/general/config-multi-core-test.js +1 -2
  60. package/test/unit/general/contextBrokerKeystoneSecurityAccess-test.js +5 -4
  61. package/test/unit/general/deviceService-test.js +106 -3
  62. package/test/unit/general/statistics-service_test.js +1 -74
  63. package/test/unit/memoryRegistry/deviceRegistryMemory_test.js +6 -5
  64. package/test/unit/mongodb/mongodb-configGroup-registry-test.js +452 -0
  65. package/test/unit/mongodb/mongodb-connectionoptions-test.js +9 -42
  66. package/test/unit/mongodb/mongodb-group-registry-test.js +34 -33
  67. package/test/unit/mongodb/mongodb-service-registry-test.js +477 -0
  68. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin1a.json +4 -4
  69. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin2.json +22 -22
  70. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin29.json +4 -4
  71. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin32.json +14 -15
  72. package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityPlugin1.json +23 -23
  73. package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityPlugin15.json +0 -5
  74. package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityPlugin4.json +11 -16
  75. package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityPlugin5.json +23 -28
  76. package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityPlugin6.json +8 -13
  77. package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityPlugin7.json +0 -5
  78. package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityPlugin8.json +24 -29
  79. package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityTimestampPlugin2.json +12 -17
  80. package/test/unit/ngsi-ld/examples/contextRequests/updateContextStaticLinkedAttributes.json +12 -10
  81. package/test/unit/ngsi-ld/expressions/jexlBasedTransformations-test.js +1 -104
  82. package/test/unit/ngsi-ld/general/config-jsonld-contexts-test.js +1 -2
  83. package/test/unit/ngsi-ld/plugins/multientity-plugin_test.js +4 -5
  84. package/test/unit/ngsi-ld/provisioning/listProvisionedDevices-test.js +0 -4
  85. package/test/unit/ngsi-mixed/provisioning/ngsi-versioning-test.js +8 -5
  86. package/test/unit/ngsiv2/expressions/jexlBasedTransformations-test.js +42 -41
  87. package/test/unit/ngsiv2/general/contextBrokerOAuthSecurityAccess-test.js +11 -10
  88. package/test/unit/ngsiv2/general/deviceService-test.js +98 -4
  89. package/test/unit/ngsiv2/general/https-support-test.js +1 -1
  90. package/test/unit/ngsiv2/general/iotam-autoregistration-test.js +195 -0
  91. package/test/unit/ngsiv2/lazyAndCommands/active-devices-attribute-update-test.js +4 -3
  92. package/test/unit/ngsiv2/lazyAndCommands/command-test.js +6 -5
  93. package/test/unit/ngsiv2/lazyAndCommands/lazy-devices-test.js +17 -16
  94. package/test/unit/ngsiv2/lazyAndCommands/polling-commands-test.js +10 -18
  95. package/test/unit/ngsiv2/ngsiService/active-devices-test.js +21 -20
  96. package/test/unit/ngsiv2/ngsiService/staticAttributes-test.js +8 -7
  97. package/test/unit/ngsiv2/plugins/alias-plugin_test.js +12 -11
  98. package/test/unit/ngsiv2/plugins/custom-plugin_test.js +3 -2
  99. package/test/unit/ngsiv2/plugins/multientity-plugin_test.js +28 -27
  100. package/test/unit/ngsiv2/provisioning/device-group-api-test.js +265 -4
  101. package/test/unit/ngsiv2/provisioning/device-provisioning-api_test.js +12 -11
  102. package/test/unit/ngsiv2/provisioning/device-provisioning-configGroup-api_test.js +1190 -0
  103. package/test/unit/ngsiv2/provisioning/device-registration_test.js +5 -4
  104. package/test/unit/ngsiv2/provisioning/listProvisionedDevices-test.js +6 -9
  105. package/test/unit/ngsiv2/provisioning/provisionDeviceMultientity-test.js +1 -1
  106. package/test/unit/ngsiv2/provisioning/removeProvisionedDevice-test.js +5 -4
  107. package/test/unit/ngsiv2/provisioning/updateProvisionedDevices-test.js +8 -7
  108. package/test/unit/statsRegistry/openmetrics-test.js +167 -0
  109. package/lib/templates/queryContext.json +0 -25
  110. package/test/unit/examples/deviceProvisioningRequests/provisionBidirectionalDevice.json +0 -35
  111. package/test/unit/examples/deviceProvisioningRequests/provisionDeviceBidirectionalGroup.json +0 -17
  112. package/test/unit/examples/groupProvisioningRequests/bidirectionalGroup.json +0 -31
  113. package/test/unit/general/statistics-persistence_test.js +0 -121
  114. package/test/unit/ngsi-ld/examples/contextRequests/createBidirectionalDevice.json +0 -17
  115. package/test/unit/ngsi-ld/examples/contextRequests/updateContextProcessTimestamp.json +0 -12
  116. package/test/unit/ngsi-ld/examples/subscriptionRequests/bidirectionalNotification.json +0 -13
  117. package/test/unit/ngsi-ld/examples/subscriptionRequests/bidirectionalNotificationWithDatasetId.json +0 -21
  118. package/test/unit/ngsi-ld/examples/subscriptionRequests/bidirectionalNotificationWithMetadata.json +0 -17
  119. package/test/unit/ngsi-ld/examples/subscriptionRequests/bidirectionalSubscriptionRequest.json +0 -23
  120. package/test/unit/ngsi-ld/plugins/timestamp-processing-plugin_test.js +0 -132
  121. package/test/unit/ngsiv2/examples/contextRequests/createBidirectionalDevice.json +0 -8
  122. package/test/unit/ngsiv2/examples/subscriptionRequests/bidirectionalNotification.json +0 -13
  123. package/test/unit/ngsiv2/examples/subscriptionRequests/bidirectionalNotificationWithMetadata.json +0 -19
  124. package/test/unit/ngsiv2/examples/subscriptionRequests/bidirectionalSubscriptionRequest.json +0 -24
@@ -0,0 +1,452 @@
1
+ /*
2
+ * Copyright 2024 Telefonica Investigación y Desarrollo, S.A.U
3
+ *
4
+ * This file is part of fiware-iotagent-lib
5
+ *
6
+ * fiware-iotagent-lib is free software: you can redistribute it and/or
7
+ * modify it under the terms of the GNU Affero General Public License as
8
+ * published by the Free Software Foundation, either version 3 of the License,
9
+ * or (at your option) any later version.
10
+ *
11
+ * fiware-iotagent-lib is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14
+ * See the GNU Affero General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU Affero General Public
17
+ * License along with fiware-iotagent-lib.
18
+ * If not, see http://www.gnu.org/licenses/.
19
+ *
20
+ * For those usages not covered by the GNU Affero General Public License
21
+ * please contact with::[contacto@tid.es]
22
+ *
23
+ * Modified by: Daniel Calvo - ATOS Research & Innovation
24
+ */
25
+
26
+ /* eslint-disable no-unused-vars */
27
+
28
+ const iotAgentLib = require('../../../lib/fiware-iotagent-lib');
29
+ const _ = require('underscore');
30
+ const utils = require('../../tools/utils');
31
+ const request = utils.request;
32
+ const async = require('async');
33
+ const should = require('should');
34
+ const iotAgentConfig = {
35
+ logLevel: 'FATAL',
36
+ contextBroker: {
37
+ host: '192.168.1.1',
38
+ port: '1026'
39
+ },
40
+ server: {
41
+ name: 'testAgent',
42
+ port: 4041,
43
+ host: 'localhost',
44
+ baseRoot: '/'
45
+ },
46
+ types: {},
47
+ deviceRegistry: {
48
+ type: 'mongodb'
49
+ },
50
+ mongodb: {
51
+ host: 'localhost',
52
+ port: '27017',
53
+ db: 'iotagent'
54
+ },
55
+ service: 'smartgondor',
56
+ subservice: 'gardens',
57
+ providerUrl: 'http://smartgondor.com',
58
+ deviceRegistrationDuration: 'P1M'
59
+ };
60
+ const mongo = require('mongodb').MongoClient;
61
+ const mongoUtils = require('./mongoDBUtils');
62
+ const optionsCreation = {
63
+ url: 'http://localhost:4041/iot/groups',
64
+ method: 'POST',
65
+ json: {
66
+ groups: [
67
+ {
68
+ resource: '/deviceTest',
69
+ apikey: '801230BJKL23Y9090DSFL123HJK09H324HV8732',
70
+ entity_type: 'Light',
71
+ trust: '8970A9078A803H3BL98PINEQRW8342HBAMS',
72
+ cbHost: 'http://unexistentHost:1026',
73
+ commands: [
74
+ {
75
+ name: 'wheel1',
76
+ type: 'Wheel'
77
+ }
78
+ ],
79
+ lazy: [
80
+ {
81
+ name: 'luminescence',
82
+ type: 'Lumens'
83
+ }
84
+ ],
85
+ attributes: [
86
+ {
87
+ name: 'status',
88
+ type: 'Boolean'
89
+ }
90
+ ],
91
+ internal_attributes: [
92
+ {
93
+ customField: 'customValue'
94
+ }
95
+ ]
96
+ }
97
+ ]
98
+ },
99
+ headers: {
100
+ 'fiware-service': 'testservice',
101
+ 'fiware-servicepath': '/testingPath'
102
+ }
103
+ };
104
+ const optionsDelete = {
105
+ url: 'http://localhost:4041/iot/groups',
106
+ method: 'DELETE',
107
+ json: {},
108
+ headers: {
109
+ 'fiware-service': 'testservice',
110
+ 'fiware-servicepath': '/testingPath'
111
+ },
112
+ qs: {
113
+ resource: '/deviceTest',
114
+ apikey: '801230BJKL23Y9090DSFL123HJK09H324HV8732'
115
+ }
116
+ };
117
+ const optionsList = {
118
+ url: 'http://localhost:4041/iot/groups',
119
+ method: 'GET',
120
+ json: {},
121
+ headers: {
122
+ 'fiware-service': 'testservice',
123
+ 'fiware-servicepath': '/*'
124
+ }
125
+ };
126
+ const optionsUpdate = {
127
+ url: 'http://localhost:4041/iot/groups',
128
+ method: 'PUT',
129
+ json: {
130
+ apikey: '801230BJKL23Y9090DSFL123HJK09H324HV8732',
131
+ trust: '8970A9078A803H3BL98PINEQRW8342HBAMS',
132
+ cbHost: 'http://anotherUnexistentHost:1026',
133
+ commands: [
134
+ {
135
+ name: 'wheel1',
136
+ type: 'Wheel'
137
+ }
138
+ ],
139
+ lazy: [
140
+ {
141
+ name: 'luminescence',
142
+ type: 'Lumens'
143
+ }
144
+ ],
145
+ attributes: [
146
+ {
147
+ name: 'status',
148
+ type: 'Boolean'
149
+ }
150
+ ],
151
+ static_attributes: [
152
+ {
153
+ name: 'bootstrapServer',
154
+ type: 'Address',
155
+ value: '127.0.0.1'
156
+ }
157
+ ]
158
+ },
159
+ headers: {
160
+ 'fiware-service': 'testservice',
161
+ 'fiware-servicepath': '/testingPath'
162
+ },
163
+ qs: {
164
+ resource: '/deviceTest',
165
+ apikey: '801230BJKL23Y9090DSFL123HJK09H324HV8732'
166
+ }
167
+ };
168
+ const optionsGet = {
169
+ url: 'http://localhost:4041/iot/groups',
170
+ method: 'GET',
171
+ json: {},
172
+ headers: {
173
+ 'fiware-service': 'testservice',
174
+ 'fiware-servicepath': '/testingPath'
175
+ }
176
+ };
177
+ let iotAgentDb;
178
+
179
+ describe('MongoDB Group Registry test', function () {
180
+ beforeEach(function (done) {
181
+ mongoUtils.cleanDbs(function () {
182
+ iotAgentLib.activate(iotAgentConfig, function () {
183
+ mongo.connect('mongodb://localhost:27017/iotagent', { useNewUrlParser: true }, function (err, db) {
184
+ iotAgentDb = db;
185
+ done();
186
+ });
187
+ });
188
+ });
189
+ });
190
+
191
+ afterEach(function (done) {
192
+ iotAgentLib.deactivate(function () {
193
+ iotAgentDb.close(function (error) {
194
+ mongoUtils.cleanDbs(done);
195
+ });
196
+ });
197
+ });
198
+ describe('When a new device group creation request arrives', function () {
199
+ it('should store it in the DB', function (done) {
200
+ request(optionsCreation, function (error, response, body) {
201
+ iotAgentDb
202
+ .db()
203
+ .collection('groups')
204
+ .find({})
205
+ .toArray(function (err, docs) {
206
+ should.not.exist(err);
207
+ should.exist(docs);
208
+ should.exist(docs.length);
209
+ docs.length.should.equal(1);
210
+ should.exist(docs[0].type);
211
+ should.exist(docs[0].internalAttributes);
212
+ should.exist(docs[0].attributes);
213
+ should.exist(docs[0].apikey);
214
+ docs[0].type.should.equal('Light');
215
+ docs[0].apikey.should.equal('801230BJKL23Y9090DSFL123HJK09H324HV8732');
216
+ docs[0].internalAttributes.length.should.equal(1);
217
+ docs[0].internalAttributes[0].customField.should.equal('customValue');
218
+ docs[0].attributes.length.should.equal(1);
219
+ docs[0].attributes[0].name.should.equal('status');
220
+ done();
221
+ });
222
+ });
223
+ });
224
+ it('should store the service information from the headers into the DB', function (done) {
225
+ request(optionsCreation, function (error, response, body) {
226
+ iotAgentDb
227
+ .db()
228
+ .collection('groups')
229
+ .find({})
230
+ .toArray(function (err, docs) {
231
+ should.not.exist(err);
232
+ should.exist(docs[0].service);
233
+ should.exist(docs[0].subservice);
234
+ docs[0].service.should.equal('testservice');
235
+ docs[0].subservice.should.equal('/testingPath');
236
+ done();
237
+ });
238
+ });
239
+ });
240
+ });
241
+
242
+ describe('When a new device group creation request arrives with an existant (apikey, resource) pair', function () {
243
+ it('should return a DUPLICATE_GROUP error', function (done) {
244
+ request(optionsCreation, function (error, response, body) {
245
+ request(optionsCreation, function (error, response, body) {
246
+ response.statusCode.should.equal(409);
247
+ body.name.should.equal('DUPLICATE_GROUP');
248
+ done();
249
+ });
250
+ });
251
+ });
252
+ });
253
+
254
+ describe('When a device group removal request arrives', function () {
255
+ beforeEach(function (done) {
256
+ request(optionsCreation, done);
257
+ });
258
+
259
+ it('should remove it from the database', function (done) {
260
+ request(optionsDelete, function (error, response, body) {
261
+ iotAgentDb
262
+ .db()
263
+ .collection('groups')
264
+ .find({})
265
+ .toArray(function (err, docs) {
266
+ should.not.exist(err);
267
+ should.exist(docs);
268
+ should.exist(docs.length);
269
+ docs.length.should.equal(0);
270
+ done();
271
+ });
272
+ });
273
+ });
274
+
275
+ it('should return a 204 OK statusCode', function (done) {
276
+ request(optionsDelete, function (error, response, body) {
277
+ response.statusCode.should.equal(204);
278
+ done();
279
+ });
280
+ });
281
+ });
282
+
283
+ describe('When a device group update request arrives', function () {
284
+ beforeEach(function (done) {
285
+ request(optionsCreation, done);
286
+ });
287
+
288
+ it('should update the values in the database', function (done) {
289
+ request(optionsUpdate, function (error, response, body) {
290
+ iotAgentDb
291
+ .db()
292
+ .collection('groups')
293
+ .find({})
294
+ .toArray(function (err, docs) {
295
+ should.not.exist(err);
296
+ should.exist(docs);
297
+ should.exist(docs[0].cbHost);
298
+ docs[0].cbHost.should.equal('http://anotherUnexistentHost:1026');
299
+ should.exist(docs[0].staticAttributes);
300
+ docs[0].staticAttributes.length.should.equal(1);
301
+ done();
302
+ });
303
+ });
304
+ });
305
+ });
306
+
307
+ describe('When a multiple device group creation arrives', function () {
308
+ const optionsMultipleCreation = _.clone(optionsCreation);
309
+
310
+ beforeEach(function (done) {
311
+ optionsMultipleCreation.json = utils.readExampleFile(
312
+ './test/unit/examples/groupProvisioningRequests/multipleConfigGroupsCreation.json'
313
+ );
314
+
315
+ done();
316
+ });
317
+
318
+ it('should create the values in the database', function (done) {
319
+ request(optionsMultipleCreation, function (error, response, body) {
320
+ iotAgentDb
321
+ .db()
322
+ .collection('groups')
323
+ .find({})
324
+ .toArray(function (err, docs) {
325
+ should.not.exist(err);
326
+ should.exist(docs);
327
+ docs.length.should.equal(2);
328
+ done();
329
+ });
330
+ });
331
+ });
332
+ });
333
+
334
+ describe('When a device group listing request arrives', function () {
335
+ beforeEach(function (done) {
336
+ const optionsCreation1 = _.clone(optionsCreation);
337
+ const optionsCreation2 = _.clone(optionsCreation);
338
+ const optionsCreation3 = _.clone(optionsCreation);
339
+
340
+ optionsCreation2.json = { groups: [] };
341
+ optionsCreation3.json = { groups: [] };
342
+
343
+ optionsCreation2.json.groups[0] = _.clone(optionsCreation.json.groups[0]);
344
+ optionsCreation3.json.groups[0] = _.clone(optionsCreation.json.groups[0]);
345
+
346
+ optionsCreation2.json.groups[0].apikey = 'qwertyuiop';
347
+ optionsCreation3.json.groups[0].apikey = 'lkjhgfds';
348
+
349
+ async.series(
350
+ [
351
+ async.apply(request, optionsCreation1),
352
+ async.apply(request, optionsCreation2),
353
+ async.apply(request, optionsCreation3)
354
+ ],
355
+ done
356
+ );
357
+ });
358
+
359
+ it('should return all the configured device groups from the database', function (done) {
360
+ request(optionsList, function (error, response, body) {
361
+ body.count.should.equal(3);
362
+ done();
363
+ });
364
+ });
365
+ });
366
+
367
+ describe('When a device group listing arrives with a limit', function () {
368
+ const optionsConstrained = {
369
+ url: 'http://localhost:4041/iot/groups',
370
+ method: 'GET',
371
+ qs: {
372
+ limit: 3,
373
+ offset: 2
374
+ },
375
+ json: {},
376
+ headers: {
377
+ 'fiware-service': 'testservice',
378
+ 'fiware-servicepath': '/*'
379
+ }
380
+ };
381
+
382
+ beforeEach(function (done) {
383
+ const optionsCreationList = [];
384
+ const creationFns = [];
385
+
386
+ for (let i = 0; i < 10; i++) {
387
+ optionsCreationList[i] = _.clone(optionsCreation);
388
+ optionsCreationList[i].json = { groups: [] };
389
+ optionsCreationList[i].json.groups[0] = _.clone(optionsCreation.json.groups[0]);
390
+ optionsCreationList[i].json.groups[0].apikey = 'qwertyuiop' + i;
391
+ creationFns.push(async.apply(request, optionsCreationList[i]));
392
+ }
393
+
394
+ async.series(creationFns, done);
395
+ });
396
+
397
+ it('should return the appropriate count of groups', function (done) {
398
+ request(optionsConstrained, function (error, response, body) {
399
+ body.count.should.equal(10);
400
+ done();
401
+ });
402
+ });
403
+ });
404
+
405
+ describe('When a device info request arrives', function () {
406
+ beforeEach(function (done) {
407
+ async.series([async.apply(request, optionsCreation)], done);
408
+ });
409
+
410
+ it('should return all the configured device groups from the database', function (done) {
411
+ request(optionsGet, function (error, response, body) {
412
+ should.exist(body);
413
+ should.exist(body.count);
414
+ body.count.should.equal(1);
415
+ should.exist(body.groups);
416
+ should.exist(body.groups.length);
417
+ body.groups.length.should.equal(1);
418
+ body.groups[0].service.should.equal('testservice');
419
+ done();
420
+ });
421
+ });
422
+ });
423
+
424
+ describe('When a device info request arrives and multiple groups have been created', function () {
425
+ beforeEach(function (done) {
426
+ const optionsCreationList = [];
427
+ const creationFns = [];
428
+
429
+ for (let i = 0; i < 10; i++) {
430
+ optionsCreationList[i] = _.clone(optionsCreation);
431
+ optionsCreationList[i].json = { groups: [] };
432
+ optionsCreationList[i].json.groups[0] = _.clone(optionsCreation.json.groups[0]);
433
+ optionsCreationList[i].json.groups[0].apikey = 'qwertyuiop' + i;
434
+ creationFns.push(async.apply(request, optionsCreationList[i]));
435
+ }
436
+
437
+ async.series(creationFns, done);
438
+ });
439
+
440
+ it('should return all the configured device groups from the database', function (done) {
441
+ request(optionsGet, function (error, response, body) {
442
+ should.exist(body);
443
+ should.exist(body.count);
444
+ body.count.should.equal(10);
445
+ should.exist(body.groups);
446
+ should.exist(body.groups.length);
447
+ body.groups.length.should.equal(10);
448
+ done();
449
+ });
450
+ });
451
+ });
452
+ });
@@ -41,9 +41,8 @@ const iotAgentConfig = {
41
41
  host: 'localhost',
42
42
  baseRoot: '/'
43
43
  },
44
- stats: {
45
- interval: 50,
46
- persistence: true
44
+ deviceRegistry: {
45
+ type: 'mongodb'
47
46
  },
48
47
  types: {},
49
48
  service: 'smartgondor',
@@ -76,8 +75,6 @@ describe('dbConn.configureDb', function () {
76
75
  expected: {
77
76
  url: 'mongodb://example.com:27017/' + dbConn.DEFAULT_DB_NAME,
78
77
  options: {
79
- useNewUrlParser: true,
80
- useUnifiedTopology: true
81
78
  }
82
79
  }
83
80
  },
@@ -89,8 +86,6 @@ describe('dbConn.configureDb', function () {
89
86
  expected: {
90
87
  url: 'mongodb://example.com:98765/' + dbConn.DEFAULT_DB_NAME,
91
88
  options: {
92
- useNewUrlParser: true,
93
- useUnifiedTopology: true
94
89
  }
95
90
  }
96
91
  },
@@ -102,8 +97,6 @@ describe('dbConn.configureDb', function () {
102
97
  expected: {
103
98
  url: 'mongodb://example.com:27017/examples',
104
99
  options: {
105
- useNewUrlParser: true,
106
- useUnifiedTopology: true
107
100
  }
108
101
  }
109
102
  },
@@ -115,9 +108,7 @@ describe('dbConn.configureDb', function () {
115
108
  expected: {
116
109
  url: 'mongodb://example.com:27017/' + dbConn.DEFAULT_DB_NAME,
117
110
  options: {
118
- replicaSet: 'rs0',
119
- useNewUrlParser: true,
120
- useUnifiedTopology: true
111
+ replicaSet: 'rs0'
121
112
  }
122
113
  }
123
114
  },
@@ -129,8 +120,6 @@ describe('dbConn.configureDb', function () {
129
120
  expected: {
130
121
  url: 'mongodb://example.com:27017/' + dbConn.DEFAULT_DB_NAME,
131
122
  options: {
132
- useNewUrlParser: true,
133
- useUnifiedTopology: true
134
123
  }
135
124
  }
136
125
  },
@@ -142,8 +131,6 @@ describe('dbConn.configureDb', function () {
142
131
  expected: {
143
132
  url: 'mongodb://example.com:27017/' + dbConn.DEFAULT_DB_NAME,
144
133
  options: {
145
- useNewUrlParser: true,
146
- useUnifiedTopology: true
147
134
  }
148
135
  }
149
136
  },
@@ -159,9 +146,7 @@ describe('dbConn.configureDb', function () {
159
146
  auth: {
160
147
  user: 'user01',
161
148
  password: 'pass01'
162
- },
163
- useNewUrlParser: true,
164
- useUnifiedTopology: true
149
+ }
165
150
  }
166
151
  }
167
152
  },
@@ -173,8 +158,6 @@ describe('dbConn.configureDb', function () {
173
158
  expected: {
174
159
  url: 'mongodb://example.com:27017/' + dbConn.DEFAULT_DB_NAME,
175
160
  options: {
176
- useNewUrlParser: true,
177
- useUnifiedTopology: true
178
161
  }
179
162
  }
180
163
  },
@@ -195,9 +178,7 @@ describe('dbConn.configureDb', function () {
195
178
  auth: {
196
179
  user: 'user01',
197
180
  password: 'pass01'
198
- },
199
- useNewUrlParser: true,
200
- useUnifiedTopology: true
181
+ }
201
182
  }
202
183
  }
203
184
  },
@@ -209,9 +190,7 @@ describe('dbConn.configureDb', function () {
209
190
  expected: {
210
191
  url: 'mongodb://example.com:27017/' + dbConn.DEFAULT_DB_NAME,
211
192
  options: {
212
- ssl: true,
213
- useNewUrlParser: true,
214
- useUnifiedTopology: true
193
+ ssl: true
215
194
  }
216
195
  }
217
196
  },
@@ -225,8 +204,6 @@ describe('dbConn.configureDb', function () {
225
204
  expected: {
226
205
  url: 'mongodb://example.com:27017/' + dbConn.DEFAULT_DB_NAME + '?retryWrites=true',
227
206
  options: {
228
- useNewUrlParser: true,
229
- useUnifiedTopology: true
230
207
  }
231
208
  }
232
209
  },
@@ -244,8 +221,6 @@ describe('dbConn.configureDb', function () {
244
221
  dbConn.DEFAULT_DB_NAME +
245
222
  '?retryWrites=true&readPreference=nearest',
246
223
  options: {
247
- useNewUrlParser: true,
248
- useUnifiedTopology: true
249
224
  }
250
225
  }
251
226
  },
@@ -257,8 +232,6 @@ describe('dbConn.configureDb', function () {
257
232
  expected: {
258
233
  url: 'mongodb://example.com:27017/' + dbConn.DEFAULT_DB_NAME,
259
234
  options: {
260
- useNewUrlParser: true,
261
- useUnifiedTopology: true
262
235
  }
263
236
  }
264
237
  },
@@ -270,8 +243,6 @@ describe('dbConn.configureDb', function () {
270
243
  expected: {
271
244
  url: 'mongodb://example.com:27017/' + dbConn.DEFAULT_DB_NAME,
272
245
  options: {
273
- useNewUrlParser: true,
274
- useUnifiedTopology: true
275
246
  }
276
247
  }
277
248
  },
@@ -283,8 +254,6 @@ describe('dbConn.configureDb', function () {
283
254
  expected: {
284
255
  url: 'mongodb://example.com:27017/' + dbConn.DEFAULT_DB_NAME,
285
256
  options: {
286
- useNewUrlParser: true,
287
- useUnifiedTopology: true
288
257
  }
289
258
  }
290
259
  },
@@ -313,9 +282,7 @@ describe('dbConn.configureDb', function () {
313
282
  user: 'user01',
314
283
  password: 'pass01'
315
284
  },
316
- ssl: true,
317
- useNewUrlParser: true,
318
- useUnifiedTopology: true
285
+ ssl: true
319
286
  }
320
287
  }
321
288
  }
@@ -331,7 +298,7 @@ describe('dbConn.configureDb', function () {
331
298
  const cfg = Object.assign({}, iotAgentConfig, {
332
299
  mongodb: params.mongodb
333
300
  });
334
- stub = sinon.stub(mongoose, 'createConnection').callsFake(function (url, options, fn) {
301
+ stub = sinon.stub(mongoose, 'connect').callsFake(function (url, options, fn) {
335
302
  url.should.be.equal(params.expected.url);
336
303
  options.should.be.eql(params.expected.options);
337
304
  done();
@@ -366,7 +333,7 @@ describe('dbConn.configureDb', function () {
366
333
  const cfg = Object.assign({}, iotAgentConfig, {
367
334
  mongodb: params.mongodb
368
335
  });
369
- stub = sinon.stub(mongoose, 'createConnection').callsFake(function (url, options, fn) {
336
+ stub = sinon.stub(mongoose, 'connect').callsFake(function (url, options, fn) {
370
337
  should.fail();
371
338
  });
372
339
  config.setConfig(cfg);