iotagent-node-lib 2.18.0 → 2.19.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 (119) hide show
  1. package/.github/workflows/ci.yml +1 -2
  2. package/doc/advanced-topics.md +122 -53
  3. package/doc/api.md +52 -52
  4. package/doc/development.md +8 -9
  5. package/doc/expressionLanguage.md +514 -316
  6. package/doc/installationguide.md +66 -64
  7. package/doc/usermanual.md +48 -16
  8. package/docker/Mosquitto/Dockerfile +1 -0
  9. package/docker/Mosquitto/README.md +1 -0
  10. package/docker/Mosquitto/startMosquitto.sh +6 -4
  11. package/lib/command/commandLine.js +1 -1
  12. package/lib/fiware-iotagent-lib.js +3 -0
  13. package/lib/jexlTranformsMap.js +9 -1
  14. package/lib/model/Device.js +4 -1
  15. package/lib/model/Group.js +19 -1
  16. package/lib/plugins/expressionParser.js +6 -4
  17. package/lib/plugins/expressionPlugin.js +8 -1
  18. package/lib/plugins/jexlParser.js +3 -1
  19. package/lib/request-shim.js +111 -0
  20. package/lib/services/common/genericMiddleware.js +6 -2
  21. package/lib/services/common/iotManagerService.js +1 -1
  22. package/lib/services/common/securityServiceKeystone.js +1 -1
  23. package/lib/services/common/securityServiceOAuth2.js +3 -2
  24. package/lib/services/devices/deviceRegistryMongoDB.js +1 -0
  25. package/lib/services/devices/devices-NGSI-LD.js +1 -1
  26. package/lib/services/devices/devices-NGSI-v2.js +2 -6
  27. package/lib/services/devices/registrationUtils.js +0 -2
  28. package/lib/services/ngsi/entities-NGSI-LD.js +95 -11
  29. package/lib/services/ngsi/entities-NGSI-v2.js +93 -8
  30. package/lib/services/ngsi/ngsiService.js +3 -2
  31. package/lib/services/northBound/contextServer-NGSI-LD.js +3 -2
  32. package/lib/services/northBound/deviceProvisioningServer.js +29 -6
  33. package/lib/services/northBound/northboundServer.js +2 -0
  34. package/lib/services/northBound/restUtils.js +1 -1
  35. package/package.json +4 -4
  36. package/test/tools/utils.js +2 -0
  37. package/test/unit/expressions/jexlExpression-test.js +5 -5
  38. package/test/unit/general/contextBrokerKeystoneSecurityAccess-test.js +1 -1
  39. package/test/unit/general/deviceService-test.js +2 -5
  40. package/test/unit/general/loglevel-api_test.js +6 -11
  41. package/test/unit/general/migration-test.js +1 -0
  42. package/test/unit/general/startup-test.js +1 -0
  43. package/test/unit/memoryRegistry/deviceRegistryMemory_test.js +1 -0
  44. package/test/unit/mongodb/mongodb-group-registry-test.js +1 -1
  45. package/test/unit/mongodb/mongodb-registry-test.js +2 -1
  46. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin12a.json +7 -0
  47. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin13.json +13 -13
  48. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin1a.json +18 -0
  49. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin29.json +18 -0
  50. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin31.json +15 -0
  51. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin32.json +17 -0
  52. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin33.json +18 -0
  53. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin34.json +17 -0
  54. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin4a.json +36 -0
  55. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin7.json +16 -16
  56. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin8a.json +18 -0
  57. package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityPlugin15.json +25 -0
  58. package/test/unit/ngsi-ld/expressions/jexlBasedTransformations-test.js +1018 -0
  59. package/test/unit/ngsi-ld/general/contextBrokerOAuthSecurityAccess-test.js +2 -2
  60. package/test/unit/ngsi-ld/general/deviceService-test.js +1 -1
  61. package/test/unit/ngsi-ld/general/https-support-test.js +2 -1
  62. package/test/unit/ngsi-ld/general/iotam-autoregistration-test.js +2 -1
  63. package/test/unit/ngsi-ld/general/startup-test.js +1 -0
  64. package/test/unit/ngsi-ld/lazyAndCommands/active-devices-attribute-update-test.js +3 -1
  65. package/test/unit/ngsi-ld/lazyAndCommands/command-test.js +2 -1
  66. package/test/unit/ngsi-ld/lazyAndCommands/lazy-devices-test.js +2 -6
  67. package/test/unit/ngsi-ld/lazyAndCommands/polling-commands-test.js +2 -1
  68. package/test/unit/ngsi-ld/ngsiService/active-devices-test.js +1 -0
  69. package/test/unit/ngsi-ld/ngsiService/autocast-test.js +1 -0
  70. package/test/unit/ngsi-ld/ngsiService/geoproperties-test.js +1 -0
  71. package/test/unit/ngsi-ld/ngsiService/subscriptions-test.js +4 -3
  72. package/test/unit/ngsi-ld/plugins/alias-plugin_test.js +1 -0
  73. package/test/unit/ngsi-ld/plugins/bidirectional-plugin_test.js +3 -2
  74. package/test/unit/ngsi-ld/plugins/multientity-plugin_test.js +61 -0
  75. package/test/unit/ngsi-ld/provisioning/device-provisioning-api_test.js +2 -1
  76. package/test/unit/ngsi-ld/provisioning/device-registration_test.js +3 -2
  77. package/test/unit/ngsi-ld/provisioning/device-update-registration_test.js +1 -0
  78. package/test/unit/ngsi-ld/provisioning/listProvisionedDevices-test.js +42 -54
  79. package/test/unit/ngsi-ld/provisioning/provisionDeviceMultientity-test.js +2 -1
  80. package/test/unit/ngsi-ld/provisioning/removeProvisionedDevice-test.js +4 -4
  81. package/test/unit/ngsi-ld/provisioning/singleConfigurationMode-test.js +3 -5
  82. package/test/unit/ngsi-ld/provisioning/updateProvisionedDevices-test.js +12 -18
  83. package/test/unit/ngsi-mixed/provisioning/ngsi-versioning-test.js +3 -1
  84. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin17.json +1 -1
  85. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin32.json +16 -0
  86. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin33.json +22 -0
  87. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin34.json +12 -0
  88. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin15.json +25 -0
  89. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin16.json +25 -0
  90. package/test/unit/ngsiv2/expressions/expressionBasedTransformations-test.js +4 -4
  91. package/test/unit/ngsiv2/expressions/jexlBasedTransformations-test.js +500 -0
  92. package/test/unit/ngsiv2/general/contextBrokerOAuthSecurityAccess-test.js +3 -2
  93. package/test/unit/ngsiv2/general/deviceService-test.js +9 -8
  94. package/test/unit/ngsiv2/general/https-support-test.js +2 -1
  95. package/test/unit/ngsiv2/general/iotam-autoregistration-test.js +2 -1
  96. package/test/unit/ngsiv2/general/startup-test.js +1 -0
  97. package/test/unit/ngsiv2/lazyAndCommands/active-devices-attribute-update-test.js +3 -1
  98. package/test/unit/ngsiv2/lazyAndCommands/command-test.js +2 -1
  99. package/test/unit/ngsiv2/lazyAndCommands/lazy-devices-test.js +14 -18
  100. package/test/unit/ngsiv2/lazyAndCommands/polling-commands-test.js +3 -1
  101. package/test/unit/ngsiv2/ngsiService/active-devices-test.js +1 -0
  102. package/test/unit/ngsiv2/ngsiService/queryDeviceInformationInCb-test.js +0 -1
  103. package/test/unit/ngsiv2/ngsiService/subscriptions-test.js +4 -3
  104. package/test/unit/ngsiv2/plugins/bidirectional-plugin_test.js +3 -2
  105. package/test/unit/ngsiv2/plugins/multientity-plugin_test.js +210 -0
  106. package/test/unit/ngsiv2/plugins/translation-inPlugins_test.js +1 -1
  107. package/test/unit/ngsiv2/provisioning/device-group-api-test.js +3 -2
  108. package/test/unit/ngsiv2/provisioning/device-group-utils-test.js +2 -1
  109. package/test/unit/ngsiv2/provisioning/device-provisioning-api_test.js +2 -1
  110. package/test/unit/ngsiv2/provisioning/device-registration_test.js +3 -2
  111. package/test/unit/ngsiv2/provisioning/device-update-registration_test.js +4 -3
  112. package/test/unit/ngsiv2/provisioning/listProvisionedDevices-test.js +42 -53
  113. package/test/unit/ngsiv2/provisioning/provisionDeviceMultientity-test.js +2 -1
  114. package/test/unit/ngsiv2/provisioning/removeProvisionedDevice-test.js +4 -4
  115. package/test/unit/ngsiv2/provisioning/singleConfigurationMode-test.js +3 -4
  116. package/test/unit/ngsiv2/provisioning/updateProvisionedDevices-test.js +13 -19
  117. package/test/unit/plugins/capture-configuration-inPlugins_test.js +3 -1
  118. package/test/unit/plugins/capture-provision-inPlugins_test.js +2 -1
  119. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin20.json +0 -25
@@ -30,6 +30,7 @@ const utils = require('../../../tools/utils');
30
30
  const should = require('should');
31
31
  const logger = require('logops');
32
32
  const nock = require('nock');
33
+ const timekeeper = require('timekeeper');
33
34
  let contextBrokerMock;
34
35
  const iotAgentConfig = {
35
36
  logLevel: 'FATAL',
@@ -216,6 +217,134 @@ const iotAgentConfig = {
216
217
  expression: 'updated|trim'
217
218
  }
218
219
  ]
220
+ },
221
+ GPS: {
222
+ commands: [],
223
+ type: 'GPS',
224
+ lazy: [],
225
+ active: [
226
+ {
227
+ name: 'location',
228
+ type: 'geo:json',
229
+ expression: "{coordinates: [lon,lat], type: 'Point'}"
230
+ },
231
+ {
232
+ name: 'TimeInstant',
233
+ type: 'DateTime',
234
+ expression: 'ts|toisodate'
235
+ }
236
+ ],
237
+ explicitAttrs: true
238
+ },
239
+ GPS2: {
240
+ commands: [],
241
+ type: 'GPS',
242
+ lazy: [],
243
+ active: [
244
+ {
245
+ name: 'location',
246
+ type: 'geo:json',
247
+ expression: "{coordinates: [lon,lat], type: 'Point'}"
248
+ }
249
+ ],
250
+ explicitAttrs: true
251
+ },
252
+ GPS3: {
253
+ commands: [],
254
+ type: 'GPS',
255
+ lazy: [],
256
+ static: [
257
+ {
258
+ name: 'color',
259
+ type: 'string',
260
+ value: 'blue'
261
+ }
262
+ ],
263
+ active: [
264
+ {
265
+ name: 'price',
266
+ type: 'number'
267
+ },
268
+ {
269
+ name: 'location',
270
+ type: 'geo:json',
271
+ expression: "{coordinates: [lon,lat], type: 'Point'}"
272
+ }
273
+ ],
274
+ explicitAttrs: '[ "location" ]'
275
+ },
276
+ GPS4: {
277
+ commands: [],
278
+ type: 'GPS',
279
+ lazy: [],
280
+ static: [
281
+ {
282
+ name: 'color',
283
+ type: 'string',
284
+ value: 'blue'
285
+ }
286
+ ],
287
+ active: [
288
+ {
289
+ name: 'price',
290
+ type: 'number'
291
+ },
292
+ {
293
+ name: 'location',
294
+ type: 'geo:json',
295
+ expression: "{coordinates: [lon,lat], type: 'Point'}"
296
+ }
297
+ ],
298
+ explicitAttrs: '[ "loca" + "tion" ]'
299
+ },
300
+ GPS5: {
301
+ commands: [],
302
+ type: 'GPS',
303
+ lazy: [],
304
+ static: [
305
+ {
306
+ name: 'color',
307
+ type: 'string',
308
+ value: 'blue'
309
+ }
310
+ ],
311
+ active: [
312
+ {
313
+ name: 'price',
314
+ type: 'number'
315
+ },
316
+ {
317
+ name: 'location',
318
+ type: 'geo:json',
319
+ expression: "{coordinates: [lon,lat], type: 'Point'}"
320
+ }
321
+ ],
322
+ explicitAttrs: '[ myattr ]'
323
+ },
324
+ GPS6: {
325
+ commands: [],
326
+ type: 'GPS',
327
+ lazy: [],
328
+ static: [
329
+ {
330
+ name: 'lat',
331
+ type: 'Number',
332
+ value: 52
333
+ },
334
+ {
335
+ name: 'lon',
336
+ type: 'Number',
337
+ value: 13
338
+ }
339
+ ],
340
+ active: [
341
+ {
342
+ name: 'location',
343
+ type: 'geo:json',
344
+ expression: "{coordinates: [lon,lat], type: 'Point'}"
345
+ }
346
+ ],
347
+ explicitAttrs: true
219
348
  }
220
349
  },
221
350
  service: 'smartgondor',
@@ -225,6 +354,38 @@ const iotAgentConfig = {
225
354
  throttling: 'PT5S'
226
355
  };
227
356
 
357
+ const iotAgentConfigTS = {
358
+ logLevel: 'FATAL',
359
+ contextBroker: {
360
+ host: '192.168.1.1',
361
+ port: '1026',
362
+ ngsiVersion: 'v2'
363
+ },
364
+ defaultExpressionLanguage: 'jexl',
365
+ server: {
366
+ port: 4041
367
+ },
368
+ types: {
369
+ GPS: {
370
+ commands: [],
371
+ type: 'GPS',
372
+ lazy: [],
373
+ active: [
374
+ {
375
+ name: 'location',
376
+ type: 'geo:json',
377
+ expression: "{coordinates: [lon,lat], type: 'Point'}"
378
+ }
379
+ ],
380
+ explicitAttrs: true
381
+ }
382
+ },
383
+ timestamp: true,
384
+ service: 'smartgondor',
385
+ subservice: 'gardens',
386
+ providerUrl: 'http://smartgondor.com'
387
+ };
388
+
228
389
  describe('Java expression language (JEXL) based transformations plugin', function () {
229
390
  beforeEach(function (done) {
230
391
  logger.setLevel('FATAL');
@@ -804,4 +965,343 @@ describe('Java expression language (JEXL) based transformations plugin', functio
804
965
  });
805
966
  });
806
967
  });
968
+
969
+ describe('When there are additional attributes sent by the device to be calculated and removed', function () {
970
+ // Case: Expression which results is sent as a new attribute
971
+ const values = [
972
+ {
973
+ name: 'lat',
974
+ type: 'Number',
975
+ value: 52
976
+ },
977
+ {
978
+ name: 'lon',
979
+ type: 'Number',
980
+ value: 13
981
+ },
982
+ {
983
+ name: 'ts',
984
+ type: 'Number',
985
+ value: 1
986
+ }
987
+ ];
988
+
989
+ beforeEach(function () {
990
+ nock.cleanAll();
991
+
992
+ contextBrokerMock = nock('http://192.168.1.1:1026')
993
+ .matchHeader('fiware-service', 'smartgondor')
994
+ .matchHeader('fiware-servicepath', 'gardens')
995
+ .patch(
996
+ '/v2/entities/gps1/attrs',
997
+ utils.readExampleFile(
998
+ './test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin32.json'
999
+ )
1000
+ )
1001
+ .query({ type: 'GPS' })
1002
+ .reply(204);
1003
+ });
1004
+
1005
+ it('should calculate them and remove non-explicitAttrs from the payload', function (done) {
1006
+ iotAgentLib.update('gps1', 'GPS', '', values, function (error) {
1007
+ should.not.exist(error);
1008
+ contextBrokerMock.done();
1009
+ done();
1010
+ });
1011
+ });
1012
+ });
1013
+
1014
+ describe('When there is an extra TimeInstant sent by the device to be removed', function () {
1015
+ // Case: Expression which results is sent as a new attribute
1016
+ const values = [
1017
+ {
1018
+ name: 'lat',
1019
+ type: 'Number',
1020
+ value: 52
1021
+ },
1022
+ {
1023
+ name: 'lon',
1024
+ type: 'Number',
1025
+ value: 13
1026
+ },
1027
+ {
1028
+ name: 'TimeInstant',
1029
+ type: 'DateTime',
1030
+ value: '2015-08-05T07:35:01.468+00:00'
1031
+ }
1032
+ ];
1033
+
1034
+ beforeEach(function () {
1035
+ nock.cleanAll();
1036
+
1037
+ contextBrokerMock = nock('http://192.168.1.1:1026')
1038
+ .matchHeader('fiware-service', 'smartgondor')
1039
+ .matchHeader('fiware-servicepath', 'gardens')
1040
+ .patch(
1041
+ '/v2/entities/gps1/attrs',
1042
+ utils.readExampleFile(
1043
+ './test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin34.json'
1044
+ )
1045
+ )
1046
+ .query({ type: 'GPS' })
1047
+ .reply(204);
1048
+ });
1049
+
1050
+ it('should calculate them and remove non-explicitAttrs from the payload', function (done) {
1051
+ iotAgentLib.update('gps1', 'GPS2', '', values, function (error) {
1052
+ should.not.exist(error);
1053
+ contextBrokerMock.done();
1054
+ done();
1055
+ });
1056
+ });
1057
+ });
1058
+
1059
+ describe('When there is an extra TimeInstant sent by the device to be removed by string', function () {
1060
+ // Case: Expression which results is sent as a new attribute
1061
+ const values = [
1062
+ {
1063
+ name: 'lat',
1064
+ type: 'Number',
1065
+ value: 52
1066
+ },
1067
+ {
1068
+ name: 'lon',
1069
+ type: 'Number',
1070
+ value: 13
1071
+ },
1072
+ {
1073
+ name: 'TimeInstant',
1074
+ type: 'DateTime',
1075
+ value: '2015-08-05T07:35:01.468+00:00'
1076
+ }
1077
+ ];
1078
+
1079
+ beforeEach(function () {
1080
+ nock.cleanAll();
1081
+
1082
+ contextBrokerMock = nock('http://192.168.1.1:1026')
1083
+ .matchHeader('fiware-service', 'smartgondor')
1084
+ .matchHeader('fiware-servicepath', 'gardens')
1085
+ .patch(
1086
+ '/v2/entities/gps1/attrs',
1087
+ utils.readExampleFile(
1088
+ './test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin34.json'
1089
+ )
1090
+ )
1091
+ .query({ type: 'GPS' })
1092
+ .reply(204);
1093
+ });
1094
+
1095
+ it('should calculate them and remove non-explicitAttrs by string from the payload', function (done) {
1096
+ iotAgentLib.update('gps1', 'GPS3', '', values, function (error) {
1097
+ should.not.exist(error);
1098
+ contextBrokerMock.done();
1099
+ done();
1100
+ });
1101
+ });
1102
+ });
1103
+
1104
+ describe('When there is an extra TimeInstant sent by the device to be removed by jexl expression', function () {
1105
+ // Case: Expression which results is sent as a new attribute
1106
+ const values = [
1107
+ {
1108
+ name: 'lat',
1109
+ type: 'Number',
1110
+ value: 52
1111
+ },
1112
+ {
1113
+ name: 'lon',
1114
+ type: 'Number',
1115
+ value: 13
1116
+ },
1117
+ {
1118
+ name: 'TimeInstant',
1119
+ type: 'DateTime',
1120
+ value: '2015-08-05T07:35:01.468+00:00'
1121
+ }
1122
+ ];
1123
+
1124
+ beforeEach(function () {
1125
+ nock.cleanAll();
1126
+
1127
+ contextBrokerMock = nock('http://192.168.1.1:1026')
1128
+ .matchHeader('fiware-service', 'smartgondor')
1129
+ .matchHeader('fiware-servicepath', 'gardens')
1130
+ .patch(
1131
+ '/v2/entities/gps1/attrs',
1132
+ utils.readExampleFile(
1133
+ './test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin34.json'
1134
+ )
1135
+ )
1136
+ .query({ type: 'GPS' })
1137
+ .reply(204);
1138
+ });
1139
+
1140
+ it('should calculate them and remove non-explicitAttrs by jexl expression from the payload', function (done) {
1141
+ iotAgentLib.update('gps1', 'GPS4', '', values, function (error) {
1142
+ should.not.exist(error);
1143
+ contextBrokerMock.done();
1144
+ done();
1145
+ });
1146
+ });
1147
+ });
1148
+
1149
+ describe('When there is an extra TimeInstant sent by the device to be removed by jexl expression with context ', function () {
1150
+ // Case: Expression which results is sent as a new attribute
1151
+ const values = [
1152
+ {
1153
+ name: 'lat',
1154
+ type: 'Number',
1155
+ value: 52
1156
+ },
1157
+ {
1158
+ name: 'lon',
1159
+ type: 'Number',
1160
+ value: 13
1161
+ },
1162
+ {
1163
+ name: 'myattr',
1164
+ type: 'String',
1165
+ value: 'location'
1166
+ },
1167
+ {
1168
+ name: 'TimeInstant',
1169
+ type: 'DateTime',
1170
+ value: '2015-08-05T07:35:01.468+00:00'
1171
+ }
1172
+ ];
1173
+
1174
+ beforeEach(function () {
1175
+ nock.cleanAll();
1176
+
1177
+ contextBrokerMock = nock('http://192.168.1.1:1026')
1178
+ .matchHeader('fiware-service', 'smartgondor')
1179
+ .matchHeader('fiware-servicepath', 'gardens')
1180
+ .patch(
1181
+ '/v2/entities/gps1/attrs',
1182
+ utils.readExampleFile(
1183
+ './test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin34.json'
1184
+ )
1185
+ )
1186
+ .query({ type: 'GPS' })
1187
+ .reply(204);
1188
+ });
1189
+
1190
+ it('should calculate them and remove non-explicitAttrs by jexl expression with context from the payload ', function (done) {
1191
+ iotAgentLib.update('gps1', 'GPS5', '', values, function (error) {
1192
+ should.not.exist(error);
1193
+ contextBrokerMock.done();
1194
+ done();
1195
+ });
1196
+ });
1197
+ });
1198
+
1199
+ describe('When there is an extra TimeInstant sent by the device to be removedb jexl expression using static attrs', function () {
1200
+ // Case: Expression which results is sent as a new attribute
1201
+ const values = [
1202
+ {
1203
+ name: 'TimeInstant',
1204
+ type: 'DateTime',
1205
+ value: '2015-08-05T07:35:01.468+00:00'
1206
+ }
1207
+ ];
1208
+
1209
+ beforeEach(function () {
1210
+ nock.cleanAll();
1211
+
1212
+ contextBrokerMock = nock('http://192.168.1.1:1026')
1213
+ .matchHeader('fiware-service', 'smartgondor')
1214
+ .matchHeader('fiware-servicepath', 'gardens')
1215
+ .patch(
1216
+ '/v2/entities/gps1/attrs',
1217
+ utils.readExampleFile(
1218
+ './test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin34.json'
1219
+ )
1220
+ )
1221
+ .query({ type: 'GPS' })
1222
+ .reply(204);
1223
+ });
1224
+
1225
+ it('should calculate them and remove non-explicitAttrs from the payload', function (done) {
1226
+ iotAgentLib.update('gps1', 'GPS6', '', values, function (error) {
1227
+ should.not.exist(error);
1228
+ contextBrokerMock.done();
1229
+ done();
1230
+ });
1231
+ });
1232
+ });
1233
+ });
1234
+
1235
+ describe('Java expression language (JEXL) based transformations plugin - Timestamps', function () {
1236
+ beforeEach(function (done) {
1237
+ logger.setLevel('FATAL');
1238
+
1239
+ iotAgentLib.activate(iotAgentConfigTS, function () {
1240
+ iotAgentLib.clearAll(function () {
1241
+ iotAgentLib.addUpdateMiddleware(iotAgentLib.dataPlugins.attributeAlias.update);
1242
+ iotAgentLib.addQueryMiddleware(iotAgentLib.dataPlugins.attributeAlias.query);
1243
+ iotAgentLib.addUpdateMiddleware(iotAgentLib.dataPlugins.expressionTransformation.update);
1244
+ done();
1245
+ });
1246
+ });
1247
+ });
1248
+
1249
+ afterEach(function (done) {
1250
+ iotAgentLib.clearAll(function () {
1251
+ iotAgentLib.deactivate(done);
1252
+ });
1253
+ });
1254
+
1255
+ describe('When timestamps are added but are not explicitly defined', function () {
1256
+ // Case: Expression which results is sent as a new attribute
1257
+ const values = [
1258
+ {
1259
+ name: 'lat',
1260
+ type: 'Number',
1261
+ value: 52
1262
+ },
1263
+ {
1264
+ name: 'lon',
1265
+ type: 'Number',
1266
+ value: 13
1267
+ },
1268
+ {
1269
+ name: 'ts',
1270
+ type: 'Number',
1271
+ value: 1
1272
+ }
1273
+ ];
1274
+
1275
+ beforeEach(function () {
1276
+ const time = new Date(1438760101468); // 2015-08-05T07:35:01.468+00:00
1277
+
1278
+ timekeeper.freeze(time);
1279
+ nock.cleanAll();
1280
+
1281
+ contextBrokerMock = nock('http://192.168.1.1:1026')
1282
+ .matchHeader('fiware-service', 'smartgondor')
1283
+ .matchHeader('fiware-servicepath', 'gardens')
1284
+ .patch(
1285
+ '/v2/entities/gps1/attrs',
1286
+ utils.readExampleFile(
1287
+ './test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin33.json'
1288
+ )
1289
+ )
1290
+ .query({ type: 'GPS' })
1291
+ .reply(204);
1292
+ });
1293
+
1294
+ afterEach(function (done) {
1295
+ timekeeper.reset();
1296
+ done();
1297
+ });
1298
+
1299
+ it('should calculate them and not remove the timestamp from the payload', function (done) {
1300
+ iotAgentLib.update('gps1', 'GPS', '', values, function (error) {
1301
+ should.not.exist(error);
1302
+ contextBrokerMock.done();
1303
+ done();
1304
+ });
1305
+ });
1306
+ });
807
1307
  });
@@ -27,10 +27,11 @@
27
27
 
28
28
  const iotAgentLib = require('../../../../lib/fiware-iotagent-lib');
29
29
  const utils = require('../../../tools/utils');
30
+ const request = utils.request;
30
31
  const should = require('should');
31
32
  const logger = require('logops');
32
33
  const nock = require('nock');
33
- const request = require('request');
34
+
34
35
  const timekeeper = require('timekeeper');
35
36
  let contextBrokerMock;
36
37
  let oauth2Mock;
@@ -338,7 +339,7 @@ describe('NGSI-v2 - Secured access to the Context Broker with OAuth2 provider',
338
339
  )
339
340
  .reply(201, utils.readExampleFile('./test/unit/examples/oauthResponses/tokenFromTrust.json'), {});
340
341
 
341
- contextBrokerMock.delete('/v2/subscriptions/51c0ac9ed714fb3b37d7d5a8').reply(204);
342
+ contextBrokerMock.delete('/v2/subscriptions/51c0ac9ed714fb3b37d7d5a8', '').reply(204);
342
343
 
343
344
  iotAgentLib.getDevice('Light1', 'smartgondor', 'electricity', function (error, device) {
344
345
  iotAgentLib.subscribe(device, ['dimming'], null, function (error) {
@@ -27,9 +27,10 @@
27
27
 
28
28
  const iotAgentLib = require('../../../../lib/fiware-iotagent-lib');
29
29
  const utils = require('../../../tools/utils');
30
+ const request = utils.request;
30
31
  const should = require('should');
31
32
  const nock = require('nock');
32
- const request = require('request');
33
+
33
34
  const logger = require('logops');
34
35
  const async = require('async');
35
36
  const iotAgentConfig = {
@@ -192,12 +193,12 @@ describe('NGSI-v2 - Device Service: utils', function () {
192
193
  .post('/v2/entities?options=upsert')
193
194
  .reply(204);
194
195
 
195
- async.series([request.bind(request, groupCreation), request.bind(request, deviceCreation)], function (
196
- error,
197
- results
198
- ) {
199
- done();
200
- });
196
+ async.series(
197
+ [utils.request.bind(utils.request, groupCreation), utils.request.bind(utils.request, deviceCreation)],
198
+ function (error, results) {
199
+ done();
200
+ }
201
+ );
201
202
  });
202
203
 
203
204
  it('should return the existing device', function (done) {
@@ -222,7 +223,7 @@ describe('NGSI-v2 - Device Service: utils', function () {
222
223
  .post('/v2/entities?options=upsert')
223
224
  .reply(204);
224
225
 
225
- async.series([request.bind(request, groupCreation)], function (error, results) {
226
+ async.series([utils.request.bind(utils.request, groupCreation)], function (error, results) {
226
227
  done();
227
228
  });
228
229
  });
@@ -27,9 +27,10 @@
27
27
  /* eslint-disable no-unused-vars */
28
28
 
29
29
  const iotAgentLib = require('../../../../lib/fiware-iotagent-lib');
30
- const request = require('request');
30
+
31
31
  const nock = require('nock');
32
32
  const utils = require('../../../tools/utils');
33
+ const request = utils.request;
33
34
  const groupRegistryMemory = require('../../../../lib/services/groups/groupRegistryMemory');
34
35
  const should = require('should');
35
36
  const iotAgentConfig = {
@@ -24,9 +24,10 @@
24
24
  /* eslint-disable no-unused-vars */
25
25
 
26
26
  const iotAgentLib = require('../../../../lib/fiware-iotagent-lib');
27
- const request = require('request');
27
+
28
28
  const nock = require('nock');
29
29
  const utils = require('../../../tools/utils');
30
+ const request = utils.request;
30
31
  const groupRegistryMemory = require('../../../../lib/services/groups/groupRegistryMemory');
31
32
  const should = require('should');
32
33
  const iotAgentConfig = {
@@ -30,6 +30,7 @@ const iotAgentLib = require('../../../../lib/fiware-iotagent-lib');
30
30
  const should = require('should');
31
31
  const nock = require('nock');
32
32
  const utils = require('../../../tools/utils');
33
+ const request = utils.request;
33
34
  const config = require('../../../../lib/commonConfig');
34
35
  const iotAgentConfig = {
35
36
  logLevel: 'FATAL',
@@ -26,11 +26,13 @@
26
26
  /* eslint-disable no-unused-vars */
27
27
 
28
28
  const iotAgentLib = require('../../../../lib/fiware-iotagent-lib');
29
+ const utils = require('../../../tools/utils');
30
+ const request = utils.request;
29
31
  const should = require('should');
30
32
  const logger = require('logops');
31
33
  const nock = require('nock');
32
34
  const mongoUtils = require('../../mongodb/mongoDBUtils');
33
- const request = require('request');
35
+
34
36
  let contextBrokerMock;
35
37
  const iotAgentConfig = {
36
38
  logLevel: 'FATAL',
@@ -27,11 +27,12 @@
27
27
 
28
28
  const iotAgentLib = require('../../../../lib/fiware-iotagent-lib');
29
29
  const utils = require('../../../tools/utils');
30
+ const request = utils.request;
30
31
  const should = require('should');
31
32
  const logger = require('logops');
32
33
  const nock = require('nock');
33
34
  const mongoUtils = require('../../mongodb/mongoDBUtils');
34
- const request = require('request');
35
+
35
36
  const timekeeper = require('timekeeper');
36
37
  let contextBrokerMock;
37
38
  let statusAttributeMock;