@itentialopensource/adapter-google_drive 0.5.6 → 0.6.1

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 (44) 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 +9 -5
  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 +25 -29
  17. package/pronghorn.json +17 -15
  18. package/propertiesSchema.json +68 -7
  19. package/report/adapterInfo.json +7 -7
  20. package/report/updateReport1748555084132.json +120 -0
  21. package/sampleProperties.json +4 -0
  22. package/test/integration/adapterTestBasicGet.js +88 -54
  23. package/test/integration/adapterTestConnectivity.js +15 -16
  24. package/test/integration/adapterTestIntegration.js +1 -38
  25. package/test/unit/adapterBaseTestUnit.js +641 -39
  26. package/test/unit/adapterTestUnit.js +17 -54
  27. package/utils/adapterInfo.js +114 -164
  28. package/utils/argParser.js +44 -0
  29. package/utils/checkMigrate.js +77 -38
  30. package/utils/entitiesToDB.js +53 -42
  31. package/utils/logger.js +26 -0
  32. package/utils/modify.js +56 -55
  33. package/utils/mongoDbConnection.js +79 -0
  34. package/utils/mongoUtils.js +162 -0
  35. package/utils/taskMover.js +31 -32
  36. package/utils/tbScript.js +36 -172
  37. package/utils/tbUtils.js +84 -226
  38. package/utils/troubleshootingAdapter.js +68 -84
  39. package/utils/updateAdapterConfig.js +158 -0
  40. package/utils/addAuth.js +0 -94
  41. package/utils/artifactize.js +0 -146
  42. package/utils/basicGet.js +0 -50
  43. package/utils/packModificationScript.js +0 -35
  44. package/utils/patches2bundledDeps.js +0 -90
package/package.json CHANGED
@@ -1,13 +1,12 @@
1
1
  {
2
2
  "name": "@itentialopensource/adapter-google_drive",
3
- "version": "0.5.6",
3
+ "version": "0.6.1",
4
4
  "description": "This adapter integrates with system described as: google drive",
5
5
  "main": "adapter.js",
6
6
  "wizardVersion": "2.44.7",
7
- "engineVersion": "1.68.2",
7
+ "engineVersion": "1.69.14",
8
8
  "adapterType": "http",
9
9
  "scripts": {
10
- "artifactize": "npm i && node utils/packModificationScript.js",
11
10
  "preinstall": "node utils/setup.js",
12
11
  "deinstall": "node utils/removeHooks.js",
13
12
  "lint": "node --max_old_space_size=4096 ./node_modules/eslint/bin/eslint.js . --ext .json --ext .js",
@@ -17,7 +16,6 @@
17
16
  "test:integration": "mocha test/integration/adapterTestIntegration.js --LOG=error",
18
17
  "adapter:patches2bundled": "node utils/patches2bundledDeps.js",
19
18
  "test": "npm run test:baseunit && npm run test:unit && npm run test:integration",
20
- "adapter:install": "npm i && node utils/tbScript.js install",
21
19
  "adapter:checkMigrate": "node utils/checkMigrate.js",
22
20
  "adapter:findPath": "node utils/findPath.js",
23
21
  "adapter:migrate": "node utils/modify.js -m",
@@ -32,10 +30,9 @@
32
30
  },
33
31
  "keywords": [
34
32
  "Itential",
35
- "IAP",
33
+ "Itential Platform",
36
34
  "Automation",
37
35
  "Integration",
38
- "App-Artifacts",
39
36
  "Adapter",
40
37
  "Persistence",
41
38
  "Google",
@@ -54,31 +51,30 @@
54
51
  "author": "Itential",
55
52
  "homepage": "https://gitlab.com/itentialopensource/adapters/adapter-google_drive#readme",
56
53
  "dependencies": {
57
- "@itentialopensource/adapter-utils": "^5.10.1",
58
- "acorn": "^8.14.0",
59
- "ajv": "^8.17.1",
60
- "axios": "^1.8.2",
61
- "commander": "^11.0.0",
62
- "dns-lookup-promise": "^1.0.4",
63
- "fs-extra": "^11.2.0",
64
- "gtoken": "^5.3.2",
65
- "json-query": "^2.2.2",
66
- "mocha": "^10.8.2",
67
- "mocha-param": "^2.0.1",
68
- "mongodb": "^4.17.2",
69
- "ping": "^0.4.4",
70
- "prompts": "^2.4.2",
71
- "readline-sync": "^1.4.10",
72
- "semver": "^7.6.3",
73
- "winston": "^3.17.0"
54
+ "@itentialopensource/adapter-utils": "5.10.19",
55
+ "acorn": "8.14.1",
56
+ "ajv": "8.17.1",
57
+ "axios": "1.9.0",
58
+ "commander": "11.1.0",
59
+ "fs-extra": "11.3.0",
60
+ "gtoken": "5.3.2",
61
+ "json-query": "2.2.2",
62
+ "mocha": "10.8.2",
63
+ "mocha-param": "2.0.1",
64
+ "mongodb": "4.17.2",
65
+ "ping": "0.4.4",
66
+ "prompts": "2.4.2",
67
+ "readline-sync": "1.4.10",
68
+ "semver": "7.7.2",
69
+ "winston": "3.17.0"
74
70
  },
75
71
  "devDependencies": {
76
- "chai": "^4.3.7",
77
- "eslint": "^8.44.0",
78
- "eslint-config-airbnb-base": "^15.0.0",
79
- "eslint-plugin-import": "^2.27.5",
80
- "eslint-plugin-json": "^3.1.0",
81
- "testdouble": "^3.18.0"
72
+ "chai": "4.5.0",
73
+ "eslint": "8.57.0",
74
+ "eslint-config-airbnb-base": "15.0.0",
75
+ "eslint-plugin-import": "2.31.0",
76
+ "eslint-plugin-json": "3.1.0",
77
+ "testdouble": "3.18.0"
82
78
  },
83
79
  "private": false
84
80
  }
package/pronghorn.json CHANGED
@@ -64,13 +64,13 @@
64
64
  }
65
65
  },
66
66
  {
67
- "name" : "replace",
67
+ "name": "replace",
68
68
  "type": "boolean",
69
69
  "info": "True to replace entire mock data, false to merge/append",
70
70
  "required": false,
71
71
  "schema": {
72
72
  "title": "replace",
73
- "type" : "boolean"
73
+ "type": "boolean"
74
74
  }
75
75
  }
76
76
  ],
@@ -226,16 +226,6 @@
226
226
  "title": "props",
227
227
  "type": "object"
228
228
  }
229
- },
230
- {
231
- "name": "persistFlag",
232
- "type": "boolean",
233
- "info": "Whether the input properties should be saved",
234
- "required": true,
235
- "schema": {
236
- "title": "persistFlag",
237
- "type": "boolean"
238
- }
239
229
  }
240
230
  ],
241
231
  "output": {
@@ -306,7 +296,19 @@
306
296
  "name": "iapRunAdapterBasicGet",
307
297
  "summary": "Runs basicGet script for adapter",
308
298
  "description": "Runs basicGet script for adapter",
309
- "input": [],
299
+ "input": [
300
+ {
301
+ "name": "maxCalls",
302
+ "required": false,
303
+ "type": "number",
304
+ "info": "How many GET endpoints to test (defaults to 5)",
305
+ "schema": {
306
+ "title": "maxCalls",
307
+ "type": "number",
308
+ "default": 5
309
+ }
310
+ }
311
+ ],
310
312
  "output": {
311
313
  "name": "result",
312
314
  "type": "object",
@@ -327,8 +329,8 @@
327
329
  },
328
330
  {
329
331
  "name": "iapMoveAdapterEntitiesToDB",
330
- "summary": "Moves entities from an adapter into the IAP database",
331
- "description": "Moves entities from an adapter into the IAP database",
332
+ "summary": "Moves entities from an adapter into the Itential Platform database",
333
+ "description": "Moves entities from an adapter into the Itential Platform database",
332
334
  "input": [],
333
335
  "output": {
334
336
  "name": "res",
@@ -764,6 +764,14 @@
764
764
  "security/ca.pem"
765
765
  ]
766
766
  },
767
+ "ca_file_content": {
768
+ "type": "string",
769
+ "description": "The content of the CA file used for SSL",
770
+ "default": "",
771
+ "examples": [
772
+ "-----BEGIN CERTIFICATE-----"
773
+ ]
774
+ },
767
775
  "key_file": {
768
776
  "type": "string",
769
777
  "description": "The fully qualified path name to the key file used for SSL",
@@ -853,32 +861,48 @@
853
861
  "mongo": {
854
862
  "type": "object",
855
863
  "properties": {
864
+ "url": {
865
+ "type": "string",
866
+ "description": "Mongo's complete connection URL. This property overrides host, port, database, username, password and replSet settings.",
867
+ "examples": [
868
+ "mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]]",
869
+ "mongodb+srv://[username:password@]cluster0.xxxxx.mongodb.net/[defaultauthdb][?options]",
870
+ "mongodb+srv://cluster0.xxxxx.mongodb.net/[defaultauthdb][?options]"
871
+ ]
872
+ },
856
873
  "host": {
857
874
  "type": "string",
858
- "description": "host where mongo database can be found",
875
+ "description": "Host information for the Mongo server",
859
876
  "default": "",
860
877
  "examples": [
861
- "localhost"
878
+ "localhost",
879
+ "cluster0.xxxxx.mongodb.net",
880
+ "my-cluster.example.com"
862
881
  ]
863
882
  },
864
883
  "port": {
865
884
  "type": "integer",
866
- "description": "port on which to connect to the mongo database",
885
+ "description": "Port information for the Mongo server. Not used when using mongodb+srv:// protocol",
867
886
  "default": 443,
868
887
  "minimum": 0,
869
888
  "maximum": 65535
870
889
  },
871
890
  "database": {
872
891
  "type": "string",
873
- "description": "The name of the database to store adapter information in",
892
+ "description": "The database for the adapter to use for its data.",
874
893
  "default": "",
875
894
  "examples": [
876
895
  "adapter-xyz"
877
896
  ]
878
897
  },
898
+ "dbAuth": {
899
+ "type": "boolean",
900
+ "description": "Whether to use authentication for MongoDB connection. Default is false.",
901
+ "default": false
902
+ },
879
903
  "username": {
880
904
  "type": "string",
881
- "description": "The user to connect to the database with",
905
+ "description": "If credentials are required to access Mongo, this is the user to login as.",
882
906
  "default": "",
883
907
  "examples": [
884
908
  "username"
@@ -886,7 +910,7 @@
886
910
  },
887
911
  "password": {
888
912
  "type": "string",
889
- "description": "The password to connect to the database with",
913
+ "description": "If credentials are required to access Mongo, this is the password to login with.",
890
914
  "default": "",
891
915
  "examples": [
892
916
  "password"
@@ -894,12 +918,17 @@
894
918
  },
895
919
  "replSet": {
896
920
  "type": "string",
897
- "description": "The replica set for the database",
921
+ "description": "If the database is set up to use replica sets, define it here so it can be added to the database connection. Not used when using mongodb+srv:// protocol",
898
922
  "default": "",
899
923
  "examples": [
900
924
  "my_repolica_set"
901
925
  ]
902
926
  },
927
+ "addSrv": {
928
+ "type": "boolean",
929
+ "description": "Whether the connection requires the mongodb+srv:// protocol. If true, uses mongodb+srv:// protocol. Note: mongodb+srv:// can also be used for non-Atlas deployments that support DNS SRV records",
930
+ "default": false
931
+ },
903
932
  "db_ssl": {
904
933
  "type": "object",
905
934
  "description": "SSL for mongo database connection",
@@ -940,6 +969,38 @@
940
969
  }
941
970
  }
942
971
  }
972
+ },
973
+ "dependencies": {
974
+ "dbAuth": {
975
+ "oneOf": [
976
+ {
977
+ "properties": {
978
+ "dbAuth": {
979
+ "const": false
980
+ }
981
+ }
982
+ },
983
+ {
984
+ "properties": {
985
+ "dbAuth": {
986
+ "const": true
987
+ },
988
+ "username": {
989
+ "type": "string",
990
+ "minLength": 1
991
+ },
992
+ "password": {
993
+ "type": "string",
994
+ "minLength": 1
995
+ }
996
+ },
997
+ "required": [
998
+ "username",
999
+ "password"
1000
+ ]
1001
+ }
1002
+ ]
1003
+ }
943
1004
  }
944
1005
  },
945
1006
  "devicebroker": {
@@ -1,10 +1,10 @@
1
1
  {
2
- "version": "0.5.2",
3
- "configLines": 13248,
4
- "scriptLines": 1783,
5
- "codeLines": 6688,
6
- "testLines": 6959,
7
- "testCases": 293,
8
- "totalCodeLines": 15430,
2
+ "version": "0.5.6",
3
+ "configLines": 14999,
4
+ "scriptLines": 2498,
5
+ "codeLines": 6724,
6
+ "testLines": 7520,
7
+ "testCases": 306,
8
+ "totalCodeLines": 16742,
9
9
  "wfTasks": 71
10
10
  }
@@ -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": 2961
78
+ },
79
+ {
80
+ "owner": "unitTestJS",
81
+ "description": "Number of unit tests",
82
+ "value": 169
83
+ },
84
+ {
85
+ "owner": "integrationTestJS",
86
+ "description": "Number of lines of code in integration tests",
87
+ "value": 2696
88
+ },
89
+ {
90
+ "owner": "integrationTestJS",
91
+ "description": "Number of integration tests",
92
+ "value": 55
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": 7146
108
+ },
109
+ {
110
+ "owner": "Overall",
111
+ "description": "Total Tests",
112
+ "value": 224
113
+ },
114
+ {
115
+ "owner": "Overall",
116
+ "description": "Total Files",
117
+ "value": 6
118
+ }
119
+ ]
120
+ }
@@ -111,18 +111,22 @@
111
111
  "enabled": false,
112
112
  "accept_invalid_cert": false,
113
113
  "ca_file": "",
114
+ "ca_file_content": "",
114
115
  "key_file": "",
115
116
  "cert_file": "",
116
117
  "secure_protocol": "",
117
118
  "ciphers": ""
118
119
  },
119
120
  "mongo": {
121
+ "url": "",
120
122
  "host": "",
121
123
  "port": 0,
122
124
  "database": "",
125
+ "dbAuth": false,
123
126
  "username": "",
124
127
  "password": "",
125
128
  "replSet": "",
129
+ "addSrv": false,
126
130
  "db_ssl": {
127
131
  "enabled": false,
128
132
  "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
  });