@itentialopensource/adapter-servicenow 2.4.5 → 2.5.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 (39) hide show
  1. package/AUTH.md +11 -14
  2. package/CHANGELOG.md +8 -0
  3. package/CONTRIBUTING.md +1 -160
  4. package/ENHANCE.md +2 -2
  5. package/README.md +23 -18
  6. package/SYSTEMINFO.md +9 -6
  7. package/adapter.js +161 -333
  8. package/adapterBase.js +465 -898
  9. package/changelogs/changelog.md +175 -0
  10. package/metadata.json +20 -52
  11. package/package.json +24 -24
  12. package/pronghorn.json +934 -595
  13. package/propertiesSchema.json +358 -31
  14. package/refs?service=git-upload-pack +0 -0
  15. package/report/adapterInfo.json +8 -8
  16. package/report/updateReport1691172645870.json +120 -0
  17. package/sampleProperties.json +51 -2
  18. package/test/integration/adapterTestBasicGet.js +2 -4
  19. package/test/integration/adapterTestConnectivity.js +91 -42
  20. package/test/integration/adapterTestIntegration.js +130 -2
  21. package/test/unit/adapterBaseTestUnit.js +388 -313
  22. package/test/unit/adapterTestUnit.js +342 -122
  23. package/utils/adapterInfo.js +1 -1
  24. package/utils/addAuth.js +1 -1
  25. package/utils/artifactize.js +1 -1
  26. package/utils/checkMigrate.js +1 -1
  27. package/utils/entitiesToDB.js +2 -2
  28. package/utils/findPath.js +1 -1
  29. package/utils/methodDocumentor.js +225 -0
  30. package/utils/modify.js +13 -15
  31. package/utils/packModificationScript.js +1 -1
  32. package/utils/pre-commit.sh +2 -0
  33. package/utils/taskMover.js +309 -0
  34. package/utils/tbScript.js +89 -34
  35. package/utils/tbUtils.js +41 -21
  36. package/utils/testRunner.js +1 -1
  37. package/utils/troubleshootingAdapter.js +9 -6
  38. package/workflows/README.md +0 -3
  39. package/workflows/ServiceNow - get change, get attachment, create change.json +0 -1
@@ -8,16 +8,18 @@
8
8
 
9
9
  // include required items for testing & logging
10
10
  const assert = require('assert');
11
- const fs = require('fs-extra');
12
- const mocha = require('mocha');
13
11
  const path = require('path');
14
12
  const util = require('util');
15
- const winston = require('winston');
16
13
  const execute = require('child_process').execSync;
14
+ const fs = require('fs-extra');
15
+ const mocha = require('mocha');
16
+ const winston = require('winston');
17
17
  const { expect } = require('chai');
18
18
  const { use } = require('chai');
19
19
  const td = require('testdouble');
20
+ const Ajv = require('ajv');
20
21
 
22
+ const ajv = new Ajv({ strictSchema: false, allErrors: true, allowUnionTypes: true });
21
23
  const anything = td.matchers.anything();
22
24
  let logLevel = 'none';
23
25
  const isRapidFail = false;
@@ -41,7 +43,7 @@ samProps.protocol = 'http';
41
43
  samProps.port = 80;
42
44
  samProps.ssl.enabled = false;
43
45
  samProps.ssl.accept_invalid_cert = false;
44
- samProps.request.attempt_timeout = 60000;
46
+ samProps.request.attempt_timeout = 1200000;
45
47
  const attemptTimeout = samProps.request.attempt_timeout;
46
48
  const { stub } = samProps;
47
49
 
@@ -220,19 +222,24 @@ describe('[unit] Servicenow Adapter Test', () => {
220
222
  it('package.json should be validated', (done) => {
221
223
  try {
222
224
  const packageDotJson = require('../../package.json');
223
- const { PJV } = require('package-json-validator');
224
- const options = {
225
- warnings: true, // show warnings
226
- recommendations: true // show recommendations
225
+ // Define the JSON schema for package.json
226
+ const packageJsonSchema = {
227
+ type: 'object',
228
+ properties: {
229
+ name: { type: 'string' },
230
+ version: { type: 'string' }
231
+ // May need to add more properties as needed
232
+ },
233
+ required: ['name', 'version']
227
234
  };
228
- const results = PJV.validate(JSON.stringify(packageDotJson), 'npm', options);
235
+ const validate = ajv.compile(packageJsonSchema);
236
+ const isValid = validate(packageDotJson);
229
237
 
230
- if (results.valid === false) {
231
- log.error('The package.json contains the following errors: ');
232
- log.error(util.inspect(results));
233
- assert.equal(true, results.valid);
238
+ if (isValid === false) {
239
+ log.error('The package.json contains errors');
240
+ assert.equal(true, isValid);
234
241
  } else {
235
- assert.equal(true, results.valid);
242
+ assert.equal(true, isValid);
236
243
  }
237
244
 
238
245
  done();
@@ -271,7 +278,7 @@ describe('[unit] Servicenow Adapter Test', () => {
271
278
  assert.notEqual(undefined, packageDotJson.scripts);
272
279
  assert.notEqual(null, packageDotJson.scripts);
273
280
  assert.notEqual('', packageDotJson.scripts);
274
- assert.equal('node utils/setup.js && npm install --package-lock-only --ignore-scripts && npx npm-force-resolutions', packageDotJson.scripts.preinstall);
281
+ assert.equal('node utils/setup.js', packageDotJson.scripts.preinstall);
275
282
  assert.equal('node --max_old_space_size=4096 ./node_modules/eslint/bin/eslint.js . --ext .json --ext .js', packageDotJson.scripts.lint);
276
283
  assert.equal('node --max_old_space_size=4096 ./node_modules/eslint/bin/eslint.js . --ext .json --ext .js --quiet', packageDotJson.scripts['lint:errors']);
277
284
  assert.equal('mocha test/unit/adapterBaseTestUnit.js --LOG=error', packageDotJson.scripts['test:baseunit']);
@@ -308,17 +315,17 @@ describe('[unit] Servicenow Adapter Test', () => {
308
315
  assert.notEqual(undefined, packageDotJson.dependencies);
309
316
  assert.notEqual(null, packageDotJson.dependencies);
310
317
  assert.notEqual('', packageDotJson.dependencies);
311
- assert.equal('^6.12.0', packageDotJson.dependencies.ajv);
312
- assert.equal('^0.21.0', packageDotJson.dependencies.axios);
313
- assert.equal('^2.20.0', packageDotJson.dependencies.commander);
314
- assert.equal('^8.1.0', packageDotJson.dependencies['fs-extra']);
315
- assert.equal('^9.0.1', packageDotJson.dependencies.mocha);
318
+ assert.equal('^8.12.0', packageDotJson.dependencies.ajv);
319
+ assert.equal('^1.4.0', packageDotJson.dependencies.axios);
320
+ assert.equal('^11.0.0', packageDotJson.dependencies.commander);
321
+ assert.equal('^11.1.1', packageDotJson.dependencies['fs-extra']);
322
+ assert.equal('^10.2.0', packageDotJson.dependencies.mocha);
316
323
  assert.equal('^2.0.1', packageDotJson.dependencies['mocha-param']);
317
- assert.equal('^0.5.3', packageDotJson.dependencies['network-diagnostics']);
318
324
  assert.equal('^15.1.0', packageDotJson.dependencies.nyc);
325
+ assert.equal('^0.4.4', packageDotJson.dependencies.ping);
319
326
  assert.equal('^1.4.10', packageDotJson.dependencies['readline-sync']);
320
- assert.equal('^7.3.2', packageDotJson.dependencies.semver);
321
- assert.equal('^3.3.3', packageDotJson.dependencies.winston);
327
+ assert.equal('^7.5.3', packageDotJson.dependencies.semver);
328
+ assert.equal('^3.9.0', packageDotJson.dependencies.winston);
322
329
  done();
323
330
  } catch (error) {
324
331
  log.error(`Test Failure: ${error}`);
@@ -331,13 +338,12 @@ describe('[unit] Servicenow Adapter Test', () => {
331
338
  assert.notEqual(undefined, packageDotJson.devDependencies);
332
339
  assert.notEqual(null, packageDotJson.devDependencies);
333
340
  assert.notEqual('', packageDotJson.devDependencies);
334
- assert.equal('^4.3.4', packageDotJson.devDependencies.chai);
335
- assert.equal('^7.29.0', packageDotJson.devDependencies.eslint);
336
- assert.equal('^14.2.1', packageDotJson.devDependencies['eslint-config-airbnb-base']);
337
- assert.equal('^2.23.4', packageDotJson.devDependencies['eslint-plugin-import']);
338
- assert.equal('^3.0.0', packageDotJson.devDependencies['eslint-plugin-json']);
339
- assert.equal('^0.6.3', packageDotJson.devDependencies['package-json-validator']);
340
- assert.equal('^3.16.1', packageDotJson.devDependencies.testdouble);
341
+ assert.equal('^4.3.7', packageDotJson.devDependencies.chai);
342
+ assert.equal('^8.44.0', packageDotJson.devDependencies.eslint);
343
+ assert.equal('^15.0.0', packageDotJson.devDependencies['eslint-config-airbnb-base']);
344
+ assert.equal('^2.27.5', packageDotJson.devDependencies['eslint-plugin-import']);
345
+ assert.equal('^3.1.0', packageDotJson.devDependencies['eslint-plugin-json']);
346
+ assert.equal('^3.18.0', packageDotJson.devDependencies.testdouble);
341
347
  done();
342
348
  } catch (error) {
343
349
  log.error(`Test Failure: ${error}`);
@@ -381,16 +387,30 @@ describe('[unit] Servicenow Adapter Test', () => {
381
387
  assert.equal(true, Array.isArray(pronghornDotJson.methods));
382
388
  assert.notEqual(0, pronghornDotJson.methods.length);
383
389
  assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapUpdateAdapterConfiguration'));
390
+ assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapSuspendAdapter'));
391
+ assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapUnsuspendAdapter'));
392
+ assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapGetAdapterQueue'));
384
393
  assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapFindAdapterPath'));
385
394
  assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapTroubleshootAdapter'));
386
395
  assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapRunAdapterHealthcheck'));
387
396
  assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapRunAdapterConnectivity'));
388
397
  assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapRunAdapterBasicGet'));
389
- assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapSuspendAdapter'));
390
- assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapUnsuspendAdapter'));
391
- assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapGetAdapterQueue'));
398
+ assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapMoveAdapterEntitiesToDB'));
399
+ assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapDeactivateTasks'));
400
+ assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapActivateTasks'));
401
+ assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapPopulateEntityCache'));
402
+ assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapRetrieveEntitiesCache'));
403
+ assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'getDevice'));
404
+ assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'getDevicesFiltered'));
405
+ assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'isAlive'));
406
+ assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'getConfig'));
407
+ assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapGetDeviceCount'));
408
+ assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapExpandedGenericAdapterRequest'));
392
409
  assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'genericAdapterRequest'));
393
410
  assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'genericAdapterRequestNoBasePath'));
411
+ assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapRunAdapterLint'));
412
+ assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapRunAdapterTests'));
413
+ assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapGetAdapterInventory'));
394
414
  done();
395
415
  } catch (error) {
396
416
  log.error(`Test Failure: ${error}`);
@@ -511,6 +531,39 @@ describe('[unit] Servicenow Adapter Test', () => {
511
531
  done(error);
512
532
  }
513
533
  });
534
+ it('pronghorn.json verify input/output schema objects', (done) => {
535
+ const verifySchema = (methodName, schema) => {
536
+ try {
537
+ ajv.compile(schema);
538
+ } catch (error) {
539
+ const errorMessage = `Invalid schema found in '${methodName}' method.
540
+ Schema => ${JSON.stringify(schema)}.
541
+ Details => ${error.message}`;
542
+ throw new Error(errorMessage);
543
+ }
544
+ };
545
+
546
+ try {
547
+ const pronghornDotJson = require('../../pronghorn.json');
548
+ const { methods } = pronghornDotJson;
549
+ for (let i = 0; i < methods.length; i += 1) {
550
+ for (let j = 0; j < methods[i].input.length; j += 1) {
551
+ const inputSchema = methods[i].input[j].schema;
552
+ if (inputSchema) {
553
+ verifySchema(methods[i].name, inputSchema);
554
+ }
555
+ }
556
+ const outputSchema = methods[i].output.schema;
557
+ if (outputSchema) {
558
+ verifySchema(methods[i].name, outputSchema);
559
+ }
560
+ }
561
+ done();
562
+ } catch (error) {
563
+ log.error(`Adapter Exception: ${error}`);
564
+ done(error);
565
+ }
566
+ });
514
567
  });
515
568
 
516
569
  describe('propertiesSchema.json', () => {
@@ -546,6 +599,7 @@ describe('[unit] Servicenow Adapter Test', () => {
546
599
  assert.equal('string', propertiesDotJson.properties.host.type);
547
600
  assert.equal('integer', propertiesDotJson.properties.port.type);
548
601
  assert.equal('boolean', propertiesDotJson.properties.stub.type);
602
+ assert.equal('string', propertiesDotJson.properties.protocol.type);
549
603
  assert.notEqual(undefined, propertiesDotJson.definitions.authentication);
550
604
  assert.notEqual(null, propertiesDotJson.definitions.authentication);
551
605
  assert.notEqual('', propertiesDotJson.definitions.authentication);
@@ -579,7 +633,6 @@ describe('[unit] Servicenow Adapter Test', () => {
579
633
  assert.equal('boolean', propertiesDotJson.properties.encode_pathvars.type);
580
634
  assert.equal('boolean', propertiesDotJson.properties.encode_queryvars.type);
581
635
  assert.equal(true, Array.isArray(propertiesDotJson.properties.save_metric.type));
582
- assert.equal('string', propertiesDotJson.properties.protocol.type);
583
636
  assert.notEqual(undefined, propertiesDotJson.definitions);
584
637
  assert.notEqual(null, propertiesDotJson.definitions);
585
638
  assert.notEqual('', propertiesDotJson.definitions);
@@ -736,6 +789,7 @@ describe('[unit] Servicenow Adapter Test', () => {
736
789
  assert.notEqual(undefined, sampleDotJson.properties.host);
737
790
  assert.notEqual(undefined, sampleDotJson.properties.port);
738
791
  assert.notEqual(undefined, sampleDotJson.properties.stub);
792
+ assert.notEqual(undefined, sampleDotJson.properties.protocol);
739
793
  assert.notEqual(undefined, sampleDotJson.properties.authentication);
740
794
  assert.notEqual(null, sampleDotJson.properties.authentication);
741
795
  assert.notEqual('', sampleDotJson.properties.authentication);
@@ -769,7 +823,6 @@ describe('[unit] Servicenow Adapter Test', () => {
769
823
  assert.notEqual(undefined, sampleDotJson.properties.encode_pathvars);
770
824
  assert.notEqual(undefined, sampleDotJson.properties.encode_queryvars);
771
825
  assert.notEqual(undefined, sampleDotJson.properties.save_metric);
772
- assert.notEqual(undefined, sampleDotJson.properties.protocol);
773
826
  assert.notEqual(undefined, sampleDotJson.properties.healthcheck);
774
827
  assert.notEqual(null, sampleDotJson.properties.healthcheck);
775
828
  assert.notEqual('', sampleDotJson.properties.healthcheck);
@@ -939,40 +992,6 @@ describe('[unit] Servicenow Adapter Test', () => {
939
992
  });
940
993
  });
941
994
 
942
- describe('#iapFindAdapterPath', () => {
943
- it('should have a iapFindAdapterPath function', (done) => {
944
- try {
945
- assert.equal(true, typeof a.iapFindAdapterPath === 'function');
946
- done();
947
- } catch (error) {
948
- log.error(`Test Failure: ${error}`);
949
- done(error);
950
- }
951
- });
952
- it('iapFindAdapterPath should find atleast one path that matches', (done) => {
953
- try {
954
- a.iapFindAdapterPath('{base_path}/{version}', (data, error) => {
955
- try {
956
- assert.equal(undefined, error);
957
- assert.notEqual(undefined, data);
958
- assert.notEqual(null, data);
959
- assert.equal(true, data.found);
960
- assert.notEqual(undefined, data.foundIn);
961
- assert.notEqual(null, data.foundIn);
962
- assert.notEqual(0, data.foundIn.length);
963
- done();
964
- } catch (err) {
965
- log.error(`Test Failure: ${err}`);
966
- done(err);
967
- }
968
- });
969
- } catch (error) {
970
- log.error(`Adapter Exception: ${error}`);
971
- done(error);
972
- }
973
- }).timeout(attemptTimeout);
974
- });
975
-
976
995
  describe('#iapSuspendAdapter', () => {
977
996
  it('should have a iapSuspendAdapter function', (done) => {
978
997
  try {
@@ -1009,6 +1028,40 @@ describe('[unit] Servicenow Adapter Test', () => {
1009
1028
  });
1010
1029
  });
1011
1030
 
1031
+ describe('#iapFindAdapterPath', () => {
1032
+ it('should have a iapFindAdapterPath function', (done) => {
1033
+ try {
1034
+ assert.equal(true, typeof a.iapFindAdapterPath === 'function');
1035
+ done();
1036
+ } catch (error) {
1037
+ log.error(`Test Failure: ${error}`);
1038
+ done(error);
1039
+ }
1040
+ });
1041
+ it('iapFindAdapterPath should find atleast one path that matches', (done) => {
1042
+ try {
1043
+ a.iapFindAdapterPath('{base_path}/{version}', (data, error) => {
1044
+ try {
1045
+ assert.equal(undefined, error);
1046
+ assert.notEqual(undefined, data);
1047
+ assert.notEqual(null, data);
1048
+ assert.equal(true, data.found);
1049
+ assert.notEqual(undefined, data.foundIn);
1050
+ assert.notEqual(null, data.foundIn);
1051
+ assert.notEqual(0, data.foundIn.length);
1052
+ done();
1053
+ } catch (err) {
1054
+ log.error(`Test Failure: ${err}`);
1055
+ done(err);
1056
+ }
1057
+ });
1058
+ } catch (error) {
1059
+ log.error(`Adapter Exception: ${error}`);
1060
+ done(error);
1061
+ }
1062
+ }).timeout(attemptTimeout);
1063
+ });
1064
+
1012
1065
  describe('#iapTroubleshootAdapter', () => {
1013
1066
  it('should have a iapTroubleshootAdapter function', (done) => {
1014
1067
  try {
@@ -1154,49 +1207,53 @@ describe('[unit] Servicenow Adapter Test', () => {
1154
1207
  }).timeout(attemptTimeout);
1155
1208
  });
1156
1209
 
1157
- // describe('#iapHasAdapterEntity', () => {
1158
- // it('should have a iapHasAdapterEntity function', (done) => {
1159
- // try {
1160
- // assert.equal(true, typeof a.iapHasAdapterEntity === 'function');
1161
- // done();
1162
- // } catch (error) {
1163
- // log.error(`Test Failure: ${error}`);
1164
- // done(error);
1165
- // }
1166
- // });
1167
- // it('should find entity', (done) => {
1168
- // try {
1169
- // a.iapHasAdapterEntity('template_entity', // 'a9e9c33dc61122760072455df62663d2', (data) => {
1170
- // try {
1171
- // assert.equal(true, data[0]);
1172
- // done();
1173
- // } catch (err) {
1174
- // log.error(`Test Failure: ${err}`);
1175
- // done(err);
1176
- // }
1177
- // });
1178
- // } catch (error) {
1179
- // log.error(`Adapter Exception: ${error}`);
1180
- // done(error);
1181
- // }
1182
- // }).timeout(attemptTimeout);
1183
- // it('should not find entity', (done) => {
1184
- // try {
1185
- // a.iapHasAdapterEntity('template_entity', 'blah', (data) => {
1186
- // try {
1187
- // assert.equal(false, data[0]);
1188
- // done();
1189
- // } catch (err) {
1190
- // log.error(`Test Failure: ${err}`);
1191
- // done(err);
1192
- // }
1193
- // });
1194
- // } catch (error) {
1195
- // log.error(`Adapter Exception: ${error}`);
1196
- // done(error);
1197
- // }
1198
- // }).timeout(attemptTimeout);
1199
- // });
1210
+ describe('#iapDeactivateTasks', () => {
1211
+ it('should have a iapDeactivateTasks function', (done) => {
1212
+ try {
1213
+ assert.equal(true, typeof a.iapDeactivateTasks === 'function');
1214
+ done();
1215
+ } catch (error) {
1216
+ log.error(`Test Failure: ${error}`);
1217
+ done(error);
1218
+ }
1219
+ });
1220
+ });
1221
+
1222
+ describe('#iapActivateTasks', () => {
1223
+ it('should have a iapActivateTasks function', (done) => {
1224
+ try {
1225
+ assert.equal(true, typeof a.iapActivateTasks === 'function');
1226
+ done();
1227
+ } catch (error) {
1228
+ log.error(`Test Failure: ${error}`);
1229
+ done(error);
1230
+ }
1231
+ });
1232
+ });
1233
+
1234
+ describe('#iapPopulateEntityCache', () => {
1235
+ it('should have a iapPopulateEntityCache function', (done) => {
1236
+ try {
1237
+ assert.equal(true, typeof a.iapPopulateEntityCache === 'function');
1238
+ done();
1239
+ } catch (error) {
1240
+ log.error(`Test Failure: ${error}`);
1241
+ done(error);
1242
+ }
1243
+ });
1244
+ });
1245
+
1246
+ describe('#iapRetrieveEntitiesCache', () => {
1247
+ it('should have a iapRetrieveEntitiesCache function', (done) => {
1248
+ try {
1249
+ assert.equal(true, typeof a.iapRetrieveEntitiesCache === 'function');
1250
+ done();
1251
+ } catch (error) {
1252
+ log.error(`Test Failure: ${error}`);
1253
+ done(error);
1254
+ }
1255
+ });
1256
+ });
1200
1257
 
1201
1258
  describe('#hasEntities', () => {
1202
1259
  it('should have a hasEntities function', (done) => {
@@ -1270,6 +1327,169 @@ describe('[unit] Servicenow Adapter Test', () => {
1270
1327
  });
1271
1328
  });
1272
1329
 
1330
+ describe('#iapExpandedGenericAdapterRequest', () => {
1331
+ it('should have a iapExpandedGenericAdapterRequest function', (done) => {
1332
+ try {
1333
+ assert.equal(true, typeof a.iapExpandedGenericAdapterRequest === 'function');
1334
+ done();
1335
+ } catch (error) {
1336
+ log.error(`Test Failure: ${error}`);
1337
+ done(error);
1338
+ }
1339
+ });
1340
+ });
1341
+
1342
+ describe('#genericAdapterRequest', () => {
1343
+ it('should have a genericAdapterRequest function', (done) => {
1344
+ try {
1345
+ assert.equal(true, typeof a.genericAdapterRequest === 'function');
1346
+ done();
1347
+ } catch (error) {
1348
+ log.error(`Test Failure: ${error}`);
1349
+ done(error);
1350
+ }
1351
+ });
1352
+ });
1353
+
1354
+ describe('#genericAdapterRequestNoBasePath', () => {
1355
+ it('should have a genericAdapterRequestNoBasePath function', (done) => {
1356
+ try {
1357
+ assert.equal(true, typeof a.genericAdapterRequestNoBasePath === 'function');
1358
+ done();
1359
+ } catch (error) {
1360
+ log.error(`Test Failure: ${error}`);
1361
+ done(error);
1362
+ }
1363
+ });
1364
+ });
1365
+
1366
+ describe('#iapRunAdapterLint', () => {
1367
+ it('should have a iapRunAdapterLint function', (done) => {
1368
+ try {
1369
+ assert.equal(true, typeof a.iapRunAdapterLint === 'function');
1370
+ done();
1371
+ } catch (error) {
1372
+ log.error(`Test Failure: ${error}`);
1373
+ done(error);
1374
+ }
1375
+ });
1376
+ it('retrieve the lint results', (done) => {
1377
+ try {
1378
+ a.iapRunAdapterLint((data, error) => {
1379
+ try {
1380
+ assert.equal(undefined, error);
1381
+ assert.notEqual(undefined, data);
1382
+ assert.notEqual(null, data);
1383
+ assert.notEqual(undefined, data.status);
1384
+ assert.notEqual(null, data.status);
1385
+ assert.equal('SUCCESS', data.status);
1386
+ done();
1387
+ } catch (err) {
1388
+ log.error(`Test Failure: ${err}`);
1389
+ done(err);
1390
+ }
1391
+ });
1392
+ } catch (error) {
1393
+ log.error(`Adapter Exception: ${error}`);
1394
+ done(error);
1395
+ }
1396
+ }).timeout(attemptTimeout);
1397
+ });
1398
+
1399
+ describe('#iapRunAdapterTests', () => {
1400
+ it('should have a iapRunAdapterTests function', (done) => {
1401
+ try {
1402
+ assert.equal(true, typeof a.iapRunAdapterTests === 'function');
1403
+ done();
1404
+ } catch (error) {
1405
+ log.error(`Test Failure: ${error}`);
1406
+ done(error);
1407
+ }
1408
+ });
1409
+ });
1410
+
1411
+ describe('#iapGetAdapterInventory', () => {
1412
+ it('should have a iapGetAdapterInventory function', (done) => {
1413
+ try {
1414
+ assert.equal(true, typeof a.iapGetAdapterInventory === 'function');
1415
+ done();
1416
+ } catch (error) {
1417
+ log.error(`Test Failure: ${error}`);
1418
+ done(error);
1419
+ }
1420
+ });
1421
+ it('retrieve the inventory', (done) => {
1422
+ try {
1423
+ a.iapGetAdapterInventory((data, error) => {
1424
+ try {
1425
+ assert.equal(undefined, error);
1426
+ assert.notEqual(undefined, data);
1427
+ assert.notEqual(null, data);
1428
+ done();
1429
+ } catch (err) {
1430
+ log.error(`Test Failure: ${err}`);
1431
+ done(err);
1432
+ }
1433
+ });
1434
+ } catch (error) {
1435
+ log.error(`Adapter Exception: ${error}`);
1436
+ done(error);
1437
+ }
1438
+ }).timeout(attemptTimeout);
1439
+ });
1440
+ describe('metadata.json', () => {
1441
+ it('should have a metadata.json', (done) => {
1442
+ try {
1443
+ fs.exists('metadata.json', (val) => {
1444
+ assert.equal(true, val);
1445
+ done();
1446
+ });
1447
+ } catch (error) {
1448
+ log.error(`Test Failure: ${error}`);
1449
+ done(error);
1450
+ }
1451
+ });
1452
+ it('metadata.json is customized', (done) => {
1453
+ try {
1454
+ const metadataDotJson = require('../../metadata.json');
1455
+ assert.equal('adapter-servicenow', metadataDotJson.name);
1456
+ done();
1457
+ } catch (error) {
1458
+ log.error(`Test Failure: ${error}`);
1459
+ done(error);
1460
+ }
1461
+ });
1462
+ it('metadata.json contains accurate documentation', (done) => {
1463
+ try {
1464
+ const metadataDotJson = require('../../metadata.json');
1465
+ assert.notEqual(undefined, metadataDotJson.documentation);
1466
+ assert.equal('https://www.npmjs.com/package/@itentialopensource/adapter-servicenow', metadataDotJson.documentation.npmLink);
1467
+ assert.equal('https://docs.itential.com/opensource/docs/troubleshooting-an-adapter', metadataDotJson.documentation.faqLink);
1468
+ assert.equal('https://gitlab.com/itentialopensource/adapters/contributing-guide', metadataDotJson.documentation.contributeLink);
1469
+ assert.equal('https://itential.atlassian.net/servicedesk/customer/portals', metadataDotJson.documentation.issueLink);
1470
+ done();
1471
+ } catch (error) {
1472
+ log.error(`Test Failure: ${error}`);
1473
+ done(error);
1474
+ }
1475
+ });
1476
+ it('metadata.json has related items', (done) => {
1477
+ try {
1478
+ const metadataDotJson = require('../../metadata.json');
1479
+ assert.notEqual(undefined, metadataDotJson.relatedItems);
1480
+ assert.notEqual(undefined, metadataDotJson.relatedItems.adapters);
1481
+ assert.notEqual(undefined, metadataDotJson.relatedItems.integrations);
1482
+ assert.notEqual(undefined, metadataDotJson.relatedItems.ecosystemApplications);
1483
+ assert.notEqual(undefined, metadataDotJson.relatedItems.automations);
1484
+ assert.notEqual(undefined, metadataDotJson.relatedItems.transformations);
1485
+ assert.notEqual(undefined, metadataDotJson.relatedItems.useCases);
1486
+ done();
1487
+ } catch (error) {
1488
+ log.error(`Test Failure: ${error}`);
1489
+ done(error);
1490
+ }
1491
+ });
1492
+ });
1273
1493
  /*
1274
1494
  -----------------------------------------------------------------------
1275
1495
  -----------------------------------------------------------------------
@@ -4586,7 +4806,7 @@ describe('[unit] Servicenow Adapter Test', () => {
4586
4806
  const body = { blah: 'bad body' };
4587
4807
  a.createChangeRequest(body, (data, error) => {
4588
4808
  try {
4589
- const displayE = 'Schema validation failed on should have required property \'.summary\'';
4809
+ const displayE = 'Schema validation failed on must have required property \'summary\'';
4590
4810
  runErrorAsserts(data, error, 'AD.312', 'Test-servicenow-translatorUtil-buildJSONEntity', displayE);
4591
4811
  done();
4592
4812
  } catch (err) {
@@ -4749,7 +4969,7 @@ describe('[unit] Servicenow Adapter Test', () => {
4749
4969
  const body = { blah: 'bad body' };
4750
4970
  a.createIncident(body, (data, error) => {
4751
4971
  try {
4752
- const displayE = 'Schema validation failed on should have required property \'.summary\'';
4972
+ const displayE = 'Schema validation failed on must have required property \'summary\'';
4753
4973
  runErrorAsserts(data, error, 'AD.312', 'Test-servicenow-translatorUtil-buildJSONEntity', displayE);
4754
4974
  done();
4755
4975
  } catch (err) {
@@ -4912,7 +5132,7 @@ describe('[unit] Servicenow Adapter Test', () => {
4912
5132
  const body = { blah: 'bad body' };
4913
5133
  a.createGroup(body, (data, error) => {
4914
5134
  try {
4915
- const displayE = 'Schema validation failed on should have required property \'.name\'';
5135
+ const displayE = 'Schema validation failed on must have required property \'name\'';
4916
5136
  runErrorAsserts(data, error, 'AD.312', 'Test-servicenow-translatorUtil-buildJSONEntity', displayE);
4917
5137
  done();
4918
5138
  } catch (err) {
@@ -5075,7 +5295,7 @@ describe('[unit] Servicenow Adapter Test', () => {
5075
5295
  const body = { blah: 'bad body' };
5076
5296
  a.createConfigItem(body, (data, error) => {
5077
5297
  try {
5078
- const displayE = 'Schema validation failed on should have required property \'.name\'';
5298
+ const displayE = 'Schema validation failed on must have required property \'name\'';
5079
5299
  runErrorAsserts(data, error, 'AD.312', 'Test-servicenow-translatorUtil-buildJSONEntity', displayE);
5080
5300
  done();
5081
5301
  } catch (err) {
@@ -5238,7 +5458,7 @@ describe('[unit] Servicenow Adapter Test', () => {
5238
5458
  const body = { blah: 'bad body' };
5239
5459
  a.createArticle(body, (data, error) => {
5240
5460
  try {
5241
- const displayE = 'Schema validation failed on should have required property \'.summary\'';
5461
+ const displayE = 'Schema validation failed on must have required property \'summary\'';
5242
5462
  runErrorAsserts(data, error, 'AD.312', 'Test-servicenow-translatorUtil-buildJSONEntity', displayE);
5243
5463
  done();
5244
5464
  } catch (err) {
@@ -5401,7 +5621,7 @@ describe('[unit] Servicenow Adapter Test', () => {
5401
5621
  const body = { blah: 'bad body' };
5402
5622
  a.createProblem(body, (data, error) => {
5403
5623
  try {
5404
- const displayE = 'Schema validation failed on should have required property \'.summary\'';
5624
+ const displayE = 'Schema validation failed on must have required property \'summary\'';
5405
5625
  runErrorAsserts(data, error, 'AD.312', 'Test-servicenow-translatorUtil-buildJSONEntity', displayE);
5406
5626
  done();
5407
5627
  } catch (err) {
@@ -5564,7 +5784,7 @@ describe('[unit] Servicenow Adapter Test', () => {
5564
5784
  const body = { blah: 'bad body' };
5565
5785
  a.createRequests(body, (data, error) => {
5566
5786
  try {
5567
- const displayE = 'Schema validation failed on should have required property \'.summary\'';
5787
+ const displayE = 'Schema validation failed on must have required property \'summary\'';
5568
5788
  runErrorAsserts(data, error, 'AD.312', 'Test-servicenow-translatorUtil-buildJSONEntity', displayE);
5569
5789
  done();
5570
5790
  } catch (err) {
@@ -5727,7 +5947,7 @@ describe('[unit] Servicenow Adapter Test', () => {
5727
5947
  const body = { blah: 'bad body' };
5728
5948
  a.createRequestItems(body, (data, error) => {
5729
5949
  try {
5730
- const displayE = 'Schema validation failed on should have required property \'.summary\'';
5950
+ const displayE = 'Schema validation failed on must have required property \'summary\'';
5731
5951
  runErrorAsserts(data, error, 'AD.312', 'Test-servicenow-translatorUtil-buildJSONEntity', displayE);
5732
5952
  done();
5733
5953
  } catch (err) {
@@ -5890,7 +6110,7 @@ describe('[unit] Servicenow Adapter Test', () => {
5890
6110
  const ubody = { password: 'badbody' };
5891
6111
  a.createUsers(ubody, (data, error) => {
5892
6112
  try {
5893
- const displayE = 'Schema validation failed on should have required property \'.username\'';
6113
+ const displayE = 'Schema validation failed on must have required property \'username\'';
5894
6114
  runErrorAsserts(data, error, 'AD.312', 'Test-servicenow-translatorUtil-buildJSONEntity', displayE);
5895
6115
  done();
5896
6116
  } catch (err) {
@@ -5908,7 +6128,7 @@ describe('[unit] Servicenow Adapter Test', () => {
5908
6128
  const pbody = { username: 'badbody' };
5909
6129
  a.createUsers(pbody, (data, error) => {
5910
6130
  try {
5911
- const displayE = 'Schema validation failed on should have required property \'.password\'';
6131
+ const displayE = 'Schema validation failed on must have required property \'password\'';
5912
6132
  runErrorAsserts(data, error, 'AD.312', 'Test-servicenow-translatorUtil-buildJSONEntity', displayE);
5913
6133
  done();
5914
6134
  } catch (err) {