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.
- package/.github/workflows/ci.yml +0 -1
- package/Changelog +12 -0
- package/README.md +67 -272
- package/config.js +3 -1
- package/doc/README.md +1 -1
- package/doc/admin.md +40 -18
- package/doc/api.md +532 -136
- package/doc/deprecated.md +4 -0
- package/doc/devel/architecture.md +5 -135
- package/doc/devel/development.md +224 -12
- package/doc/getting-started.md +114 -53
- package/doc/requirements.txt +1 -1
- package/doc/roadmap.md +5 -5
- package/docker/Mosquitto/Dockerfile +2 -2
- package/docker/Mosquitto/README.md +14 -11
- package/lib/commonConfig.js +21 -2
- package/lib/constants.js +3 -0
- package/lib/fiware-iotagent-lib.js +12 -15
- package/lib/jexlTranformsMap.js +3 -1
- package/lib/model/Command.js +2 -2
- package/lib/model/Device.js +7 -3
- package/lib/model/Group.js +5 -3
- package/lib/model/dbConn.js +53 -115
- package/lib/services/commands/commandRegistryMongoDB.js +115 -75
- package/lib/services/common/alarmManagement.js +3 -0
- package/lib/services/common/iotManagerService.js +3 -1
- package/lib/services/devices/deviceRegistryMemory.js +36 -0
- package/lib/services/devices/deviceRegistryMongoDB.js +160 -87
- package/lib/services/devices/deviceService.js +33 -3
- package/lib/services/devices/devices-NGSI-v2.js +6 -1
- package/lib/services/groups/groupRegistryMongoDB.js +120 -83
- package/lib/services/groups/groupService.js +1 -1
- package/lib/services/ngsi/entities-NGSI-LD.js +320 -570
- package/lib/services/ngsi/entities-NGSI-v2.js +51 -3
- package/lib/services/ngsi/ngsiService.js +34 -1
- package/lib/services/northBound/deviceGroupAdministrationServer.js +42 -6
- package/lib/services/northBound/deviceProvisioningServer.js +12 -4
- package/lib/services/northBound/northboundServer.js +2 -0
- package/lib/services/stats/statsRegistry.js +128 -101
- package/lib/templates/createDevice.json +0 -24
- package/lib/templates/createDeviceLax.json +0 -23
- package/lib/templates/deviceGroup.json +1 -25
- package/lib/templates/updateDevice.json +12 -24
- package/lib/templates/updateDeviceLax.json +12 -23
- package/package.json +5 -5
- package/scripts/legacy_expression_tool/README.md +0 -1
- package/test/functional/README.md +22 -17
- package/test/functional/config-test.js +3 -2
- package/test/functional/functional-tests-runner.js +9 -4
- package/test/functional/functional-tests.js +4 -4
- package/test/functional/testCases.js +245 -4
- package/test/functional/testUtils.js +2 -2
- package/test/unit/examples/deviceProvisioningRequests/provisionFullDevice.json +1 -13
- package/test/unit/examples/groupProvisioningRequests/multipleConfigGroupsCreation.json +44 -0
- package/test/unit/examples/groupProvisioningRequests/provisionDuplicateConfigGroup.json +35 -0
- package/test/unit/examples/groupProvisioningRequests/provisionFullConfigGroup.json +36 -0
- package/test/unit/examples/groupProvisioningRequests/provisionFullConfigGroupAlternate.json +36 -0
- package/test/unit/examples/groupProvisioningRequests/provisionFullGroup.json +1 -0
- package/test/unit/general/config-multi-core-test.js +1 -2
- package/test/unit/general/contextBrokerKeystoneSecurityAccess-test.js +5 -4
- package/test/unit/general/deviceService-test.js +106 -3
- package/test/unit/general/statistics-service_test.js +1 -74
- package/test/unit/memoryRegistry/deviceRegistryMemory_test.js +6 -5
- package/test/unit/mongodb/mongodb-configGroup-registry-test.js +452 -0
- package/test/unit/mongodb/mongodb-connectionoptions-test.js +9 -42
- package/test/unit/mongodb/mongodb-group-registry-test.js +34 -33
- package/test/unit/mongodb/mongodb-service-registry-test.js +477 -0
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin1a.json +4 -4
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin2.json +22 -22
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin29.json +4 -4
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin32.json +14 -15
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityPlugin1.json +23 -23
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityPlugin15.json +0 -5
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityPlugin4.json +11 -16
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityPlugin5.json +23 -28
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityPlugin6.json +8 -13
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityPlugin7.json +0 -5
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityPlugin8.json +24 -29
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityTimestampPlugin2.json +12 -17
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextStaticLinkedAttributes.json +12 -10
- package/test/unit/ngsi-ld/expressions/jexlBasedTransformations-test.js +1 -104
- package/test/unit/ngsi-ld/general/config-jsonld-contexts-test.js +1 -2
- package/test/unit/ngsi-ld/plugins/multientity-plugin_test.js +4 -5
- package/test/unit/ngsi-ld/provisioning/listProvisionedDevices-test.js +0 -4
- package/test/unit/ngsi-mixed/provisioning/ngsi-versioning-test.js +8 -5
- package/test/unit/ngsiv2/expressions/jexlBasedTransformations-test.js +42 -41
- package/test/unit/ngsiv2/general/contextBrokerOAuthSecurityAccess-test.js +11 -10
- package/test/unit/ngsiv2/general/deviceService-test.js +98 -4
- package/test/unit/ngsiv2/general/https-support-test.js +1 -1
- package/test/unit/ngsiv2/general/iotam-autoregistration-test.js +195 -0
- package/test/unit/ngsiv2/lazyAndCommands/active-devices-attribute-update-test.js +4 -3
- package/test/unit/ngsiv2/lazyAndCommands/command-test.js +6 -5
- package/test/unit/ngsiv2/lazyAndCommands/lazy-devices-test.js +17 -16
- package/test/unit/ngsiv2/lazyAndCommands/polling-commands-test.js +10 -18
- package/test/unit/ngsiv2/ngsiService/active-devices-test.js +21 -20
- package/test/unit/ngsiv2/ngsiService/staticAttributes-test.js +8 -7
- package/test/unit/ngsiv2/plugins/alias-plugin_test.js +12 -11
- package/test/unit/ngsiv2/plugins/custom-plugin_test.js +3 -2
- package/test/unit/ngsiv2/plugins/multientity-plugin_test.js +28 -27
- package/test/unit/ngsiv2/provisioning/device-group-api-test.js +265 -4
- package/test/unit/ngsiv2/provisioning/device-provisioning-api_test.js +12 -11
- package/test/unit/ngsiv2/provisioning/device-provisioning-configGroup-api_test.js +1190 -0
- package/test/unit/ngsiv2/provisioning/device-registration_test.js +5 -4
- package/test/unit/ngsiv2/provisioning/listProvisionedDevices-test.js +6 -9
- package/test/unit/ngsiv2/provisioning/provisionDeviceMultientity-test.js +1 -1
- package/test/unit/ngsiv2/provisioning/removeProvisionedDevice-test.js +5 -4
- package/test/unit/ngsiv2/provisioning/updateProvisionedDevices-test.js +8 -7
- package/test/unit/statsRegistry/openmetrics-test.js +167 -0
- package/lib/templates/queryContext.json +0 -25
- package/test/unit/examples/deviceProvisioningRequests/provisionBidirectionalDevice.json +0 -35
- package/test/unit/examples/deviceProvisioningRequests/provisionDeviceBidirectionalGroup.json +0 -17
- package/test/unit/examples/groupProvisioningRequests/bidirectionalGroup.json +0 -31
- package/test/unit/general/statistics-persistence_test.js +0 -121
- package/test/unit/ngsi-ld/examples/contextRequests/createBidirectionalDevice.json +0 -17
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextProcessTimestamp.json +0 -12
- package/test/unit/ngsi-ld/examples/subscriptionRequests/bidirectionalNotification.json +0 -13
- package/test/unit/ngsi-ld/examples/subscriptionRequests/bidirectionalNotificationWithDatasetId.json +0 -21
- package/test/unit/ngsi-ld/examples/subscriptionRequests/bidirectionalNotificationWithMetadata.json +0 -17
- package/test/unit/ngsi-ld/examples/subscriptionRequests/bidirectionalSubscriptionRequest.json +0 -23
- package/test/unit/ngsi-ld/plugins/timestamp-processing-plugin_test.js +0 -132
- package/test/unit/ngsiv2/examples/contextRequests/createBidirectionalDevice.json +0 -8
- package/test/unit/ngsiv2/examples/subscriptionRequests/bidirectionalNotification.json +0 -13
- package/test/unit/ngsiv2/examples/subscriptionRequests/bidirectionalNotificationWithMetadata.json +0 -19
- 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
|
-
|
|
45
|
-
|
|
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, '
|
|
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, '
|
|
336
|
+
stub = sinon.stub(mongoose, 'connect').callsFake(function (url, options, fn) {
|
|
370
337
|
should.fail();
|
|
371
338
|
});
|
|
372
339
|
config.setConfig(cfg);
|