@itentialopensource/adapter-microsoft_graph 1.4.8 → 1.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 (45) hide show
  1. package/.eslintrc.js +1 -0
  2. package/AUTH.md +4 -4
  3. package/BROKER.md +4 -4
  4. package/CALLS.md +9 -9
  5. package/ENHANCE.md +3 -3
  6. package/PROPERTIES.md +24 -9
  7. package/README.md +24 -23
  8. package/SUMMARY.md +2 -2
  9. package/SYSTEMINFO.md +1 -1
  10. package/TAB1.md +2 -2
  11. package/TAB2.md +17 -11
  12. package/TROUBLESHOOT.md +10 -1
  13. package/UTILITIES.md +473 -0
  14. package/adapter.js +5 -5
  15. package/adapterBase.js +52 -16
  16. package/package.json +24 -28
  17. package/pronghorn.json +15 -13
  18. package/propertiesSchema.json +68 -7
  19. package/report/adapterInfo.json +7 -7
  20. package/report/auto-adapter-openapi.json +8063 -0
  21. package/report/updateReport1748551976792.json +120 -0
  22. package/sampleProperties.json +4 -0
  23. package/test/integration/adapterTestBasicGet.js +88 -54
  24. package/test/integration/adapterTestConnectivity.js +15 -16
  25. package/test/integration/adapterTestIntegration.js +1 -38
  26. package/test/unit/adapterBaseTestUnit.js +641 -39
  27. package/test/unit/adapterTestUnit.js +17 -54
  28. package/utils/adapterInfo.js +114 -164
  29. package/utils/argParser.js +44 -0
  30. package/utils/checkMigrate.js +77 -38
  31. package/utils/entitiesToDB.js +53 -42
  32. package/utils/logger.js +26 -0
  33. package/utils/modify.js +56 -55
  34. package/utils/mongoDbConnection.js +79 -0
  35. package/utils/mongoUtils.js +162 -0
  36. package/utils/taskMover.js +31 -32
  37. package/utils/tbScript.js +36 -172
  38. package/utils/tbUtils.js +84 -226
  39. package/utils/troubleshootingAdapter.js +68 -84
  40. package/utils/updateAdapterConfig.js +158 -0
  41. package/utils/addAuth.js +0 -94
  42. package/utils/artifactize.js +0 -146
  43. package/utils/basicGet.js +0 -50
  44. package/utils/packModificationScript.js +0 -35
  45. package/utils/patches2bundledDeps.js +0 -90
@@ -0,0 +1,120 @@
1
+ {
2
+ "errors": [],
3
+ "statistics": [
4
+ {
5
+ "owner": "errorJson",
6
+ "description": "New adapter errors available for use",
7
+ "value": 0
8
+ },
9
+ {
10
+ "owner": "errorJson",
11
+ "description": "Adapter errors no longer available for use",
12
+ "value": 0
13
+ },
14
+ {
15
+ "owner": "errorJson",
16
+ "description": "Adapter errors that have been updated (e.g. recommendation changes)",
17
+ "value": 31
18
+ },
19
+ {
20
+ "owner": "packageJson",
21
+ "description": "Number of production dependencies",
22
+ "value": 15
23
+ },
24
+ {
25
+ "owner": "packageJson",
26
+ "description": "Number of development dependencies",
27
+ "value": 6
28
+ },
29
+ {
30
+ "owner": "packageJson",
31
+ "description": "Number of npm scripts",
32
+ "value": 19
33
+ },
34
+ {
35
+ "owner": "packageJson",
36
+ "description": "Runtime Library dependency",
37
+ "value": "5.10.16"
38
+ },
39
+ {
40
+ "owner": "propertiesSchemaJson",
41
+ "description": "Adapter properties defined in the propertiesSchema file",
42
+ "value": 79
43
+ },
44
+ {
45
+ "owner": "markdown",
46
+ "description": "Number of lines in the README.md",
47
+ "value": 345
48
+ },
49
+ {
50
+ "owner": "markdown",
51
+ "description": "Number of lines in the SUMMARY.md",
52
+ "value": 9
53
+ },
54
+ {
55
+ "owner": "markdown",
56
+ "description": "Number of lines in the PROPERTIES.md",
57
+ "value": 662
58
+ },
59
+ {
60
+ "owner": "markdown",
61
+ "description": "Number of lines in the TROUBLESHOOT.md",
62
+ "value": 57
63
+ },
64
+ {
65
+ "owner": "markdown",
66
+ "description": "Number of lines in the ENHANCE.md",
67
+ "value": 70
68
+ },
69
+ {
70
+ "owner": "markdown",
71
+ "description": "Number of lines in the BROKER.md",
72
+ "value": 70
73
+ },
74
+ {
75
+ "owner": "unitTestJS",
76
+ "description": "Number of lines of code in unit tests",
77
+ "value": 7970
78
+ },
79
+ {
80
+ "owner": "unitTestJS",
81
+ "description": "Number of unit tests",
82
+ "value": 511
83
+ },
84
+ {
85
+ "owner": "integrationTestJS",
86
+ "description": "Number of lines of code in integration tests",
87
+ "value": 6281
88
+ },
89
+ {
90
+ "owner": "integrationTestJS",
91
+ "description": "Number of integration tests",
92
+ "value": 216
93
+ },
94
+ {
95
+ "owner": "staticFile",
96
+ "description": "Number of lines of code in adapterBase.js",
97
+ "value": 1489
98
+ },
99
+ {
100
+ "owner": "staticFile",
101
+ "description": "Number of static files added",
102
+ "value": 37
103
+ },
104
+ {
105
+ "owner": "Overall",
106
+ "description": "Total lines of Code",
107
+ "value": 15740
108
+ },
109
+ {
110
+ "owner": "Overall",
111
+ "description": "Total Tests",
112
+ "value": 727
113
+ },
114
+ {
115
+ "owner": "Overall",
116
+ "description": "Total Files",
117
+ "value": 6
118
+ }
119
+ ]
120
+ }
@@ -98,18 +98,22 @@
98
98
  "enabled": false,
99
99
  "accept_invalid_cert": false,
100
100
  "ca_file": "",
101
+ "ca_file_content": "",
101
102
  "key_file": "",
102
103
  "cert_file": "",
103
104
  "secure_protocol": "",
104
105
  "ciphers": ""
105
106
  },
106
107
  "mongo": {
108
+ "url": "",
107
109
  "host": "",
108
110
  "port": 0,
109
111
  "database": "",
112
+ "dbAuth": false,
110
113
  "username": "",
111
114
  "password": "",
112
115
  "replSet": "",
116
+ "addSrv": false,
113
117
  "db_ssl": {
114
118
  "enabled": false,
115
119
  "accept_invalid_cert": false,
@@ -1,83 +1,117 @@
1
1
  /* @copyright Itential, LLC 2020 */
2
2
 
3
- /* global describe context before after */
3
+ /* global describe it log before after */
4
4
  /* eslint global-require: warn */
5
5
  /* eslint no-unused-vars: warn */
6
6
  /* eslint import/no-extraneous-dependencies: warn */
7
7
  /* eslint import/no-dynamic-require: warn */
8
8
  /* eslint import/no-unresolved: warn */
9
+ /* eslint no-loop-func: warn */
10
+
11
+ /* This performs a number of GET calls (defaults to 5 calls) which do not reuire an input, to test connectivity and functionality.
12
+ The number of calls can be modified if running from CLI. */
9
13
 
10
- const path = require('path');
11
14
  const assert = require('assert');
12
- const mocha = require('mocha');
13
- const itParam = require('mocha-param');
14
15
 
15
- const utils = require('../../utils/tbUtils');
16
- const basicGet = require('../../utils/basicGet');
17
- const { name } = require('../../package.json');
16
+ const log = require('../../utils/logger');
17
+ const { id } = require('../../package.json');
18
18
  const { methods } = require('../../pronghorn.json');
19
+ const { parseArgs } = require('../../utils/argParser');
20
+
21
+ const {
22
+ properties, maxCalls
23
+ } = parseArgs();
24
+
25
+ // require the adapter that we are going to be using
26
+ const TestAdapter = require('../../adapter');
19
27
 
20
- const getPronghornProps = (iapDir) => {
21
- console.log('Retrieving properties.json file...');
22
- const rawProps = require(path.join(iapDir, 'properties.json'));
23
- console.log('Decrypting properties...');
24
- const pronghornProps = utils.decryptProperties(rawProps, iapDir);
25
- console.log('Found properties.\n');
26
- return pronghornProps;
27
- };
28
+ if (!properties) {
29
+ log.warn('No properties provided. Exiting process.');
30
+ process.exit(1);
31
+ }
28
32
 
29
- let a;
33
+ let successCount = 0;
34
+ let calls = 0;
35
+ let attemptTimeout = 60000;
36
+ if (properties.request && properties.request.attempt_timeout) {
37
+ attemptTimeout = properties.request.attempt_timeout;
38
+ }
39
+
40
+ // turn off stub mode - basic get should not be run in stub mode
41
+ properties.stub = false;
30
42
 
31
43
  describe('[integration] Adapter BasicGET Test', () => {
32
- context('Testing GET calls without query parameters', () => {
33
- before(async () => {
34
- const iapDir = path.join(__dirname, '../../../../../');
35
- if (!utils.areWeUnderIAPinstallationDirectory()) {
36
- const sampleProperties = require('../../sampleProperties.json');
37
- const adapter = { properties: sampleProperties };
38
- a = basicGet.getAdapterInstance(adapter);
44
+ describe('Class Tests', () => {
45
+ const testAdapter = new TestAdapter(
46
+ id,
47
+ properties
48
+ );
49
+
50
+ after((done) => {
51
+ if (successCount === calls) {
52
+ log.info('\x1b[32m%s\x1b[0m', `\n\nSUCCESS: ${successCount} test(s) passed of ${calls} executed!`);
53
+ } else if (successCount > 0) {
54
+ log.error('\x1b[32m%s\x1b[0m', `\n\nPARTIAL SUCCESS: ${successCount} test(s) passed of ${calls} executed!`);
39
55
  } else {
40
- const pronghornProps = getPronghornProps(iapDir);
41
- console.log('Connecting to Database...');
42
- const database = await basicGet.connect(pronghornProps);
43
- console.log('Connection established.');
44
- const adapter = await database.collection(utils.SERVICE_CONFIGS_COLLECTION).findOne(
45
- { model: name }
46
- );
47
- a = basicGet.getAdapterInstance(adapter);
56
+ log.error('\x1b[31m%s\x1b[0m', '\n\nFAILURE: All tests failed.');
48
57
  }
58
+ done();
49
59
  });
50
60
 
51
- after((done) => {
52
- done();
61
+ const basicGets = methods.filter((method) => {
62
+ // ignore iapMetadata as the input since its optional and all functions will have it
63
+ const inputKeys = (method.input || [])
64
+ .map((param) => param.name)
65
+ .filter((name) => name !== 'iapMetadata');
66
+ return method.route.verb === 'GET' && inputKeys.length === 0 && !method.name.startsWith('iap');
53
67
  });
54
68
 
55
- const basicGets = methods.filter((method) => (method.route.verb === 'GET' && method.input.length === 0));
56
69
  if (basicGets.length === 0) {
57
- console.log('No non-parameter GET calls found.');
58
- process.exit(0);
70
+ log.warn('No non-parameter GET calls found.');
71
+ process.exitCode = 0;
72
+ return;
59
73
  }
74
+
60
75
  const functionNames = basicGets.map((g) => g.name);
61
- const request = function request(f, ad) {
62
- return new Promise((resolve, reject) => {
63
- const getRespCode = (resp) => {
64
- if (resp) {
65
- if (resp.metrics.code !== 200) {
66
- console.log('\x1b[31m', `Testing ${f} \nResponseCode: ${resp.metrics.code}`);
76
+ calls = functionNames.length;
77
+ if (calls > maxCalls) {
78
+ calls = maxCalls;
79
+ }
80
+
81
+ // test up to the first 5 get calls without parameters
82
+ for (let f = 0; f < calls; f += 1) {
83
+ const fnName = functionNames[f];
84
+ const method = basicGets.find((m) => m.name === fnName);
85
+ const hasIapMetadata = Array.isArray(method.input) && method.input.some((param) => param.name === 'iapMetadata');
86
+ describe(`#${functionNames[f]}`, () => {
87
+ it('should return valid response without error', (done) => {
88
+ const callback = (data, error) => {
89
+ try {
90
+ assert.equal(undefined, error);
91
+ assert.notEqual(undefined, data);
92
+ assert.notEqual(null, data);
93
+ assert.notEqual(undefined, data.response);
94
+ assert.notEqual(null, data.response);
95
+ successCount += 1;
96
+ done();
97
+ } catch (err) {
98
+ log.error(`Test Failure in ${fnName}: ${err}`);
99
+ done(err);
100
+ }
101
+ };
102
+
103
+ try {
104
+ if (hasIapMetadata) {
105
+ testAdapter[fnName](null, callback);
106
+ } else {
107
+ testAdapter[fnName](callback);
67
108
  }
68
- resolve(resp.metrics.code);
69
- } else {
70
- console.log('\x1b[31m', `call ${f} results in failure`);
71
- reject(new Error(`${f} failed`));
109
+ } catch (err) {
110
+ log.error(`Unexpected error in test for ${fnName}: ${err}`);
111
+ done(err);
72
112
  }
73
- };
74
- ad[f](getRespCode, console.log);
113
+ }).timeout(attemptTimeout);
75
114
  });
76
- };
77
-
78
- itParam('GET call should return 200', functionNames, (fname) => {
79
- console.log(`\t ${fname}`);
80
- return request(fname, a).then((result) => assert.equal(result, 200));
81
- });
115
+ }
82
116
  });
83
117
  });
@@ -7,14 +7,11 @@ const assert = require('assert');
7
7
  const https = require('https');
8
8
  const mocha = require('mocha');
9
9
  const ping = require('ping');
10
- const dnsLookup = require('dns-lookup-promise');
10
+ const dns = require('dns');
11
+ const { parseArgs } = require('../../utils/argParser');
11
12
 
12
- let host;
13
- process.argv.forEach((val) => {
14
- if (val.indexOf('--HOST') === 0) {
15
- [, host] = val.split('=');
16
- }
17
- });
13
+ const dnsPromises = dns.promises;
14
+ const { host } = parseArgs();
18
15
 
19
16
  describe('[integration] Adapter Test', () => {
20
17
  context(`Testing network connection on ${host}`, () => {
@@ -23,10 +20,10 @@ describe('[integration] Adapter Test', () => {
23
20
  });
24
21
 
25
22
  it('DNS resolve', (done) => {
26
- dnsLookup(host)
27
- .then((addresses) => {
23
+ dnsPromises.lookup(host, { all: true })
24
+ .then((result) => {
28
25
  try {
29
- assert.ok(addresses.length > 0);
26
+ assert.ok(result.length > 0);
30
27
  done();
31
28
  } catch (error) {
32
29
  done(error);
@@ -78,12 +75,13 @@ describe('[integration] Adapter Test', () => {
78
75
  it('Support IPv4', (done) => {
79
76
  const options = {
80
77
  family: 4,
81
- hints: dnsLookup.ADDRCONFIG
78
+ hints: dns.ADDRCONFIG
82
79
  };
83
80
 
84
- dnsLookup.lookup(host, options)
85
- .then((address, family) => {
81
+ dnsPromises.lookup(host, options)
82
+ .then((result) => {
86
83
  try {
84
+ const { address, family } = result;
87
85
  assert.ok(address !== null && family === 4);
88
86
  done();
89
87
  } catch (error) {
@@ -98,12 +96,13 @@ describe('[integration] Adapter Test', () => {
98
96
  it('Support IPv6', (done) => {
99
97
  const options = {
100
98
  family: 6,
101
- hints: dnsLookup.ADDRCONFIG
99
+ hints: dns.ADDRCONFIG
102
100
  };
103
101
 
104
- dnsLookup.lookup(host, options)
105
- .then((address, family) => {
102
+ dnsPromises.lookup(host, options)
103
+ .then((result) => {
106
104
  try {
105
+ const { address, family } = result;
107
106
  assert.ok(address !== null && family === 6);
108
107
  done();
109
108
  } catch (error) {
@@ -16,11 +16,11 @@ const winston = require('winston');
16
16
  const { expect } = require('chai');
17
17
  const { use } = require('chai');
18
18
  const td = require('testdouble');
19
+ const log = require('../../utils/logger');
19
20
 
20
21
  const anything = td.matchers.anything();
21
22
 
22
23
  // stub and attemptTimeout are used throughout the code so set them here
23
- let logLevel = 'none';
24
24
  const isRapidFail = false;
25
25
  const isSaveMockData = false;
26
26
 
@@ -71,43 +71,6 @@ global.pronghornProps = {
71
71
 
72
72
  global.$HOME = `${__dirname}/../..`;
73
73
 
74
- // set the log levels that Pronghorn uses, spam and trace are not defaulted in so without
75
- // this you may error on log.trace calls.
76
- const myCustomLevels = {
77
- levels: {
78
- spam: 6,
79
- trace: 5,
80
- debug: 4,
81
- info: 3,
82
- warn: 2,
83
- error: 1,
84
- none: 0
85
- }
86
- };
87
-
88
- // need to see if there is a log level passed in
89
- process.argv.forEach((val) => {
90
- // is there a log level defined to be passed in?
91
- if (val.indexOf('--LOG') === 0) {
92
- // get the desired log level
93
- const inputVal = val.split('=')[1];
94
-
95
- // validate the log level is supported, if so set it
96
- if (Object.hasOwnProperty.call(myCustomLevels.levels, inputVal)) {
97
- logLevel = inputVal;
98
- }
99
- }
100
- });
101
-
102
- // need to set global logging
103
- global.log = winston.createLogger({
104
- level: logLevel,
105
- levels: myCustomLevels.levels,
106
- transports: [
107
- new winston.transports.Console()
108
- ]
109
- });
110
-
111
74
  /**
112
75
  * Runs the common asserts for test
113
76
  */