@sasjs/cli 3.27.0 → 3.27.2

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.
@@ -54,11 +54,11 @@ var utils_1 = require("@sasjs/utils");
54
54
  * for printing web app url on console.
55
55
  */
56
56
  function executeDeployScriptSasViya(deployScriptName, target, linesToExecute, logFilePath, streamConfig) {
57
- var _a, _b, _c, _d;
57
+ var _a, _b, _c, _d, _e;
58
58
  return __awaiter(this, void 0, void 0, function () {
59
- var contextName, _e, sasjs, authConfig, executionResult, log, appLoc, webAppStreamUrl;
60
- return __generator(this, function (_f) {
61
- switch (_f.label) {
59
+ var contextName, _f, sasjs, authConfig, executionResult, log, appLoc, webAppStreamUrl;
60
+ return __generator(this, function (_g) {
61
+ switch (_g.label) {
62
62
  case 0:
63
63
  (_a = process.logger) === null || _a === void 0 ? void 0 : _a.info("Sending ".concat(deployScriptName, " to SAS server for execution."));
64
64
  contextName = target.contextName;
@@ -67,7 +67,7 @@ function executeDeployScriptSasViya(deployScriptName, target, linesToExecute, lo
67
67
  }
68
68
  return [4 /*yield*/, (0, config_1.getSASjsAndAuthConfig)(target)];
69
69
  case 1:
70
- _e = _f.sent(), sasjs = _e.sasjs, authConfig = _e.authConfig;
70
+ _f = _g.sent(), sasjs = _f.sasjs, authConfig = _f.authConfig;
71
71
  return [4 /*yield*/, sasjs
72
72
  .executeScript({
73
73
  fileName: deployScriptName,
@@ -77,15 +77,24 @@ function executeDeployScriptSasViya(deployScriptName, target, linesToExecute, lo
77
77
  })
78
78
  .catch(function (err) {
79
79
  process.logger.error('executeScriptSASViya Error', err);
80
+ if (err.log)
81
+ return { log: err.log, completedWithError: true };
82
+ throw err;
80
83
  })];
81
84
  case 2:
82
- executionResult = _f.sent();
85
+ executionResult = _g.sent();
83
86
  try {
84
- log = executionResult.log.items
85
- ? executionResult.log.items
87
+ if (typeof executionResult.log === 'string') {
88
+ log = executionResult.log;
89
+ }
90
+ else if (executionResult.log.items) {
91
+ log = executionResult.log.items
86
92
  .map(function (i) { return i.line; })
87
- .join(os_1.default.EOL)
88
- : JSON.stringify(executionResult.log).replace(/\\n/g, os_1.default.EOL);
93
+ .join(os_1.default.EOL);
94
+ }
95
+ else {
96
+ log = JSON.stringify(executionResult.log).replace(/\\n/g, os_1.default.EOL);
97
+ }
89
98
  }
90
99
  catch (e) {
91
100
  (_b = process.logger) === null || _b === void 0 ? void 0 : _b.error("An error occurred when parsing the execution response: ".concat(e.message));
@@ -93,12 +102,16 @@ function executeDeployScriptSasViya(deployScriptName, target, linesToExecute, lo
93
102
  }
94
103
  return [4 /*yield*/, (0, utils_1.createFile)(logFilePath, log)];
95
104
  case 3:
96
- _f.sent();
97
- (_c = process.logger) === null || _c === void 0 ? void 0 : _c.success("Deployment completed! Log is available at ".concat(logFilePath));
105
+ _g.sent();
106
+ if (executionResult.completedWithError) {
107
+ (_c = process.logger) === null || _c === void 0 ? void 0 : _c.error("Log is available at ".concat(logFilePath));
108
+ throw new Error('Deployment process completed with error');
109
+ }
110
+ (_d = process.logger) === null || _d === void 0 ? void 0 : _d.success("Deployment completed! Log is available at ".concat(logFilePath));
98
111
  if (streamConfig === null || streamConfig === void 0 ? void 0 : streamConfig.streamWeb) {
99
112
  appLoc = encodeURI(target.appLoc);
100
113
  webAppStreamUrl = "".concat(target.serverUrl, "/SASJobExecution?_FILE=").concat(appLoc, "/services/").concat(streamConfig.streamServiceName, ".html&_debug=2");
101
- (_d = process.logger) === null || _d === void 0 ? void 0 : _d.info("Web app is available at ".concat(webAppStreamUrl));
114
+ (_e = process.logger) === null || _e === void 0 ? void 0 : _e.info("Web app is available at ".concat(webAppStreamUrl));
102
115
  }
103
116
  return [2 /*return*/];
104
117
  }
@@ -1,9 +1,6 @@
1
1
  import { TestResults, TestResultCsv } from '../../../types';
2
2
  export declare const saveLog: (outDirectory: string, test: string, log: string, lineBreak?: boolean) => Promise<void>;
3
- export declare const saveResultJson: (outDirectory: string, result: TestResults) => Promise<string | false>;
4
- export declare const saveResultCsv: (outDirectory: string, result: TestResults, options?: {}) => Promise<{
5
- csvData: TestResultCsv[];
6
- csvPath: string;
7
- }>;
8
- export declare const saveResultXml: (outDirectory: string, result: TestResults) => Promise<string>;
9
- export declare const saveCoverageLcov: (outDirectory: string, tests: string[]) => Promise<string>;
3
+ export declare const saveResultJson: (jsonPath: string, result: TestResults) => Promise<void>;
4
+ export declare const saveResultCsv: (csvPath: string, result: TestResults, options?: {}) => Promise<TestResultCsv[]>;
5
+ export declare const saveResultXml: (xmlPath: string, result: TestResults) => Promise<void>;
6
+ export declare const saveCoverageLcov: (coverageReportPath: string, tests: string[]) => Promise<void>;
@@ -91,31 +91,27 @@ var saveLog = function (outDirectory, test, log, lineBreak) {
91
91
  });
92
92
  };
93
93
  exports.saveLog = saveLog;
94
- var saveResultJson = function (outDirectory, result) { return __awaiter(void 0, void 0, void 0, function () {
95
- var finaleResult, filePath;
94
+ var saveResultJson = function (jsonPath, result) { return __awaiter(void 0, void 0, void 0, function () {
95
+ var finaleResult, err_1;
96
96
  return __generator(this, function (_a) {
97
97
  switch (_a.label) {
98
98
  case 0:
99
- try {
100
- finaleResult = JSON.stringify(result, null, 2);
101
- }
102
- catch (err) {
103
- (0, displayResult_1.displayError)(err, 'Error while converting test results into a string.');
104
- return [2 /*return*/, false];
105
- }
106
- filePath = path_1.default.join(outDirectory, "".concat(resultFileName, ".json"));
107
- if (!finaleResult) return [3 /*break*/, 2];
108
- return [4 /*yield*/, (0, utils_1.createFile)(filePath, finaleResult)];
99
+ _a.trys.push([0, 2, , 3]);
100
+ finaleResult = JSON.stringify(result, null, 2);
101
+ return [4 /*yield*/, (0, utils_1.createFile)(jsonPath, finaleResult)];
109
102
  case 1:
110
103
  _a.sent();
111
104
  return [3 /*break*/, 3];
112
- case 2: return [2 /*return*/, false];
113
- case 3: return [2 /*return*/, filePath];
105
+ case 2:
106
+ err_1 = _a.sent();
107
+ (0, displayResult_1.displayError)(err_1, 'Error while converting test results into a string.');
108
+ throw new Error('Error while converting test results into a string.');
109
+ case 3: return [2 /*return*/];
114
110
  }
115
111
  });
116
112
  }); };
117
113
  exports.saveResultJson = saveResultJson;
118
- var saveResultCsv = function (outDirectory, result, options) {
114
+ var saveResultCsv = function (csvPath, result, options) {
119
115
  if (options === void 0) { options = {
120
116
  header: true,
121
117
  columns: {
@@ -155,7 +151,6 @@ var saveResultCsv = function (outDirectory, result, options) {
155
151
  });
156
152
  return [2 /*return*/, new Promise(function (resolve, reject) {
157
153
  return (0, csv_stringify_1.default)(csvData, options || {}, function (err, output) { return __awaiter(void 0, void 0, void 0, function () {
158
- var csvPath;
159
154
  return __generator(this, function (_a) {
160
155
  switch (_a.label) {
161
156
  case 0:
@@ -163,13 +158,12 @@ var saveResultCsv = function (outDirectory, result, options) {
163
158
  (0, displayResult_1.displayError)(err, 'Error while saving CSV file');
164
159
  reject(err);
165
160
  }
166
- csvPath = path_1.default.join(outDirectory, "".concat(resultFileName, ".csv"));
167
161
  return [4 /*yield*/, (0, utils_1.createFile)(csvPath, output).catch(function (err) {
168
162
  return (0, displayResult_1.displayError)(err, 'Error while creating CSV file.');
169
163
  })];
170
164
  case 1:
171
165
  _a.sent();
172
- return [2 /*return*/, resolve({ csvData: csvData, csvPath: csvPath })];
166
+ return [2 /*return*/, resolve(csvData)];
173
167
  }
174
168
  });
175
169
  }); });
@@ -178,12 +172,11 @@ var saveResultCsv = function (outDirectory, result, options) {
178
172
  });
179
173
  };
180
174
  exports.saveResultCsv = saveResultCsv;
181
- var saveResultXml = function (outDirectory, result) { return __awaiter(void 0, void 0, void 0, function () {
182
- var filePath, getFailures, resultXml, xmlString;
175
+ var saveResultXml = function (xmlPath, result) { return __awaiter(void 0, void 0, void 0, function () {
176
+ var getFailures, resultXml, xmlString;
183
177
  return __generator(this, function (_a) {
184
178
  switch (_a.label) {
185
179
  case 0:
186
- filePath = path_1.default.join(outDirectory, "".concat(resultFileName, ".xml"));
187
180
  getFailures = function (testCase) {
188
181
  if (Array.isArray(testCase.result)) {
189
182
  return testCase.result
@@ -258,16 +251,16 @@ var saveResultXml = function (outDirectory, result) { return __awaiter(void 0, v
258
251
  ], false)
259
252
  };
260
253
  xmlString = (0, xml_1.default)(resultXml, { declaration: true, indent: ' ' });
261
- return [4 /*yield*/, (0, utils_1.createFile)(filePath, xmlString)];
254
+ return [4 /*yield*/, (0, utils_1.createFile)(xmlPath, xmlString)];
262
255
  case 1:
263
256
  _a.sent();
264
- return [2 /*return*/, filePath];
257
+ return [2 /*return*/];
265
258
  }
266
259
  });
267
260
  }); };
268
261
  exports.saveResultXml = saveResultXml;
269
- var saveCoverageLcov = function (outDirectory, tests) { return __awaiter(void 0, void 0, void 0, function () {
270
- var testsPrefixRegExp, coverageReport, coveringFile, filePath;
262
+ var saveCoverageLcov = function (coverageReportPath, tests) { return __awaiter(void 0, void 0, void 0, function () {
263
+ var testsPrefixRegExp, coverageReport, coveringFile;
271
264
  return __generator(this, function (_a) {
272
265
  switch (_a.label) {
273
266
  case 0:
@@ -297,11 +290,10 @@ var saveCoverageLcov = function (outDirectory, tests) { return __awaiter(void 0,
297
290
  }); })];
298
291
  case 1:
299
292
  _a.sent();
300
- filePath = path_1.default.join(outDirectory, 'coverage.lcov');
301
- return [4 /*yield*/, (0, utils_1.createFile)(filePath, coverageReport.join('\n'))];
293
+ return [4 /*yield*/, (0, utils_1.createFile)(coverageReportPath, coverageReport.join('\n'))];
302
294
  case 2:
303
295
  _a.sent();
304
- return [2 /*return*/, filePath];
296
+ return [2 /*return*/];
305
297
  }
306
298
  });
307
299
  }); };
@@ -123,11 +123,27 @@ describe('sasjs test', function () {
123
123
  });
124
124
  }); });
125
125
  it('should execute tests and create result CSV, XML and JSON files using default source and output locations', function () { return __awaiter(void 0, void 0, void 0, function () {
126
- var expectedResultsJson, expectedResultsCsv, resultsFolderPath, resultsJsonPath, resultsJson, resultsCsvPath, parsedResults, resultsCsv, resultsXmlPath, resultsXml, expectedResultsXml, coverageLcovPath, coverageLcov;
126
+ var resultsFolderPath, resultsJsonPath, resultsCsvPath, resultsXmlPath, coverageReportPath, expectedResultsJson, expectedResultsCsv, resultsJson, parsedResults, resultsCsv, resultsXml, expectedResultsXml, coverageLcovPath, coverageLcov;
127
127
  return __generator(this, function (_a) {
128
128
  switch (_a.label) {
129
129
  case 0:
130
+ resultsFolderPath = path_1.default.join(__dirname, target.name, 'sasjsresults');
131
+ resultsJsonPath = path_1.default.join(resultsFolderPath, 'testResults.json');
132
+ resultsCsvPath = path_1.default.join(resultsFolderPath, 'testResults.csv');
133
+ resultsXmlPath = path_1.default.join(resultsFolderPath, 'testResults.xml');
134
+ coverageReportPath = path_1.default.join(resultsFolderPath, 'coverage.lcov');
130
135
  expectedResultsJson = {
136
+ csv_result_path: resultsCsvPath,
137
+ xml_result_path: resultsXmlPath,
138
+ coverage_report_path: coverageReportPath,
139
+ tests_that_pass: '2/7 (29%)',
140
+ tests_with_results: '7/8 (88%)',
141
+ target_name: target.name,
142
+ target_server_url: target.serverUrl,
143
+ target_server_type: target.serverType,
144
+ local_date_time: expect.anything(),
145
+ local_user_id: expect.anything(),
146
+ local_machine_name: expect.anything(),
131
147
  sasjs_test_meta: [
132
148
  {
133
149
  test_target: 'testsetup',
@@ -222,8 +238,6 @@ describe('sasjs test', function () {
222
238
  return [4 /*yield*/, (0, test_1.runTest)(target, undefined, undefined, undefined, true)];
223
239
  case 1:
224
240
  _a.sent();
225
- resultsFolderPath = path_1.default.join(__dirname, target.name, 'sasjsresults');
226
- resultsJsonPath = path_1.default.join(resultsFolderPath, 'testResults.json');
227
241
  return [4 /*yield*/, expect((0, utils_1.folderExists)(resultsFolderPath)).resolves.toEqual(true)];
228
242
  case 2:
229
243
  _a.sent();
@@ -233,7 +247,6 @@ describe('sasjs test', function () {
233
247
  return [4 /*yield*/, (0, utils_1.readFile)(resultsJsonPath)];
234
248
  case 4:
235
249
  resultsJson = _a.sent();
236
- resultsCsvPath = path_1.default.join(resultsFolderPath, 'testResults.csv');
237
250
  return [4 /*yield*/, expect((0, utils_1.fileExists)(resultsCsvPath)).resolves.toEqual(true)];
238
251
  case 5:
239
252
  _a.sent();
@@ -245,7 +258,6 @@ describe('sasjs test', function () {
245
258
  resultsCsv = _a.sent();
246
259
  resultsCsv = resultsCsv.replace(/\b[0-9a-f]{8}\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\b[0-9a-f]{12}\b/g, 'sasjs_test_id');
247
260
  expect(resultsCsv).toEqual(expectedResultsCsv);
248
- resultsXmlPath = path_1.default.join(resultsFolderPath, 'testResults.xml');
249
261
  return [4 /*yield*/, expect((0, utils_1.fileExists)(resultsXmlPath)).resolves.toEqual(true)];
250
262
  case 7:
251
263
  _a.sent();
@@ -269,11 +281,32 @@ describe('sasjs test', function () {
269
281
  });
270
282
  }); });
271
283
  it('should execute filtered tests and create result CSV, XML and JSON files using custom source and output locations', function () { return __awaiter(void 0, void 0, void 0, function () {
272
- var expectedResultsJson, expectedResultsCsv, outputFolder, movedTestFlow, resultsFolderPath, resultsJsonPath, resultsJson, resultsCsvPath, parsedResults, resultsCsv, logFolder, logPath, log, resultsXmlPath, resultsXml, expectedResultsXml;
284
+ var outputFolder, movedTestFlow, resultsFolderPath, resultsJsonPath, resultsCsvPath, resultsXmlPath, coverageReportPath, expectedResultsJson, expectedResultsCsv, resultsJson, parsedResults, resultsCsv, logFolder, logPath, log, resultsXml, expectedResultsXml;
273
285
  return __generator(this, function (_a) {
274
286
  switch (_a.label) {
275
287
  case 0:
288
+ outputFolder = 'customOutPut';
289
+ movedTestFlow = 'movedTestFlow.json';
290
+ return [4 /*yield*/, (0, utils_1.copy)(path_1.default.join(__dirname, target.name, 'sasjsbuild', 'testFlow.json'), path_1.default.join(__dirname, target.name, movedTestFlow))];
291
+ case 1:
292
+ _a.sent();
293
+ resultsFolderPath = path_1.default.join(__dirname, target.name, outputFolder);
294
+ resultsJsonPath = path_1.default.join(resultsFolderPath, 'testResults.json');
295
+ resultsCsvPath = path_1.default.join(resultsFolderPath, 'testResults.csv');
296
+ resultsXmlPath = path_1.default.join(resultsFolderPath, 'testResults.xml');
297
+ coverageReportPath = path_1.default.join(resultsFolderPath, 'coverage.lcov');
276
298
  expectedResultsJson = {
299
+ csv_result_path: resultsCsvPath,
300
+ xml_result_path: resultsXmlPath,
301
+ coverage_report_path: coverageReportPath,
302
+ tests_that_pass: '0/4 (0%)',
303
+ tests_with_results: '4/5 (80%)',
304
+ target_name: target.name,
305
+ target_server_url: target.serverUrl,
306
+ target_server_type: target.serverType,
307
+ local_date_time: expect.anything(),
308
+ local_user_id: expect.anything(),
309
+ local_machine_name: expect.anything(),
277
310
  sasjs_test_meta: [
278
311
  {
279
312
  test_target: 'testsetup',
@@ -327,16 +360,9 @@ describe('sasjs test', function () {
327
360
  ]
328
361
  };
329
362
  expectedResultsCsv = "test_target,test_loc,sasjs_test_id,test_suite_result,test_description,test_url\ntestsetup,tests/testsetup.sas,sasjs_test_id,not provided,,".concat(testUrlLink('testsetup'), "\nstandalone,tests/jobs/jobs/standalone.test.sas,sasjs_test_id,not provided,,").concat(testUrlLink('jobs/jobs/standalone.test'), "\ndostuff,tests/services/admin/dostuff.test.0.sas,sasjs_test_id,FAIL,dostuff 0 test description,").concat(testUrlLink('services/admin/dostuff.test.0'), "\ntestteardown,tests/testteardown.sas,sasjs_test_id,not provided,,").concat(testUrlLink('testteardown'), "\n");
330
- outputFolder = 'customOutPut';
331
- movedTestFlow = 'movedTestFlow.json';
332
- return [4 /*yield*/, (0, utils_1.copy)(path_1.default.join(__dirname, target.name, 'sasjsbuild', 'testFlow.json'), path_1.default.join(__dirname, target.name, movedTestFlow))];
333
- case 1:
334
- _a.sent();
335
363
  return [4 /*yield*/, (0, test_1.runTest)(target, ['jobs/standalone', 'shouldFail', 'services/admin/dostuff.test.0'], outputFolder, movedTestFlow, true)];
336
364
  case 2:
337
365
  _a.sent();
338
- resultsFolderPath = path_1.default.join(__dirname, target.name, outputFolder);
339
- resultsJsonPath = path_1.default.join(resultsFolderPath, 'testResults.json');
340
366
  return [4 /*yield*/, expect((0, utils_1.folderExists)(resultsFolderPath)).resolves.toEqual(true)];
341
367
  case 3:
342
368
  _a.sent();
@@ -346,7 +372,6 @@ describe('sasjs test', function () {
346
372
  return [4 /*yield*/, (0, utils_1.readFile)(resultsJsonPath)];
347
373
  case 5:
348
374
  resultsJson = _a.sent();
349
- resultsCsvPath = path_1.default.join(resultsFolderPath, 'testResults.csv');
350
375
  return [4 /*yield*/, expect((0, utils_1.fileExists)(resultsCsvPath)).resolves.toEqual(true)];
351
376
  case 6:
352
377
  _a.sent();
@@ -373,7 +398,6 @@ describe('sasjs test', function () {
373
398
  case 9:
374
399
  log = _a.sent();
375
400
  expect(log.length).toBeGreaterThan(0);
376
- resultsXmlPath = path_1.default.join(resultsFolderPath, 'testResults.xml');
377
401
  return [4 /*yield*/, expect((0, utils_1.fileExists)(resultsXmlPath)).resolves.toEqual(true)];
378
402
  case 10:
379
403
  _a.sent();
@@ -426,11 +450,27 @@ describe('sasjs test', function () {
426
450
  });
427
451
  }); });
428
452
  it('should execute tests and create result CSV, XML and JSON files using default source and output locations', function () { return __awaiter(void 0, void 0, void 0, function () {
429
- var expectedResultsJson, expectedResultsCsv, resultsFolderPath, resultsJsonPath, resultsJson, resultsCsvPath, parsedResults, resultsCsv, resultsXmlPath, resultsXml, expectedResultsXml, coverageLcovPath, coverageLcov;
453
+ var resultsFolderPath, resultsJsonPath, resultsCsvPath, resultsXmlPath, coverageReportPath, expectedResultsJson, expectedResultsCsv, resultsJson, parsedResults, resultsCsv, resultsXml, expectedResultsXml, coverageLcovPath, coverageLcov;
430
454
  return __generator(this, function (_a) {
431
455
  switch (_a.label) {
432
456
  case 0:
457
+ resultsFolderPath = path_1.default.join(__dirname, target.name, 'sasjsresults');
458
+ resultsJsonPath = path_1.default.join(resultsFolderPath, 'testResults.json');
459
+ resultsCsvPath = path_1.default.join(resultsFolderPath, 'testResults.csv');
460
+ resultsXmlPath = path_1.default.join(resultsFolderPath, 'testResults.xml');
461
+ coverageReportPath = path_1.default.join(resultsFolderPath, 'coverage.lcov');
433
462
  expectedResultsJson = {
463
+ csv_result_path: resultsCsvPath,
464
+ xml_result_path: resultsXmlPath,
465
+ coverage_report_path: coverageReportPath,
466
+ tests_that_pass: '2/8 (25%)',
467
+ tests_with_results: '8/8 (100%)',
468
+ target_name: target.name,
469
+ target_server_url: target.serverUrl,
470
+ target_server_type: target.serverType,
471
+ local_date_time: expect.anything(),
472
+ local_user_id: expect.anything(),
473
+ local_machine_name: expect.anything(),
434
474
  sasjs_test_meta: [
435
475
  {
436
476
  test_target: 'testsetup',
@@ -536,8 +576,6 @@ describe('sasjs test', function () {
536
576
  return [4 /*yield*/, (0, test_1.runTest)(target, undefined, undefined, undefined, true)];
537
577
  case 1:
538
578
  _a.sent();
539
- resultsFolderPath = path_1.default.join(__dirname, target.name, 'sasjsresults');
540
- resultsJsonPath = path_1.default.join(resultsFolderPath, 'testResults.json');
541
579
  return [4 /*yield*/, expect((0, utils_1.folderExists)(resultsFolderPath)).resolves.toEqual(true)];
542
580
  case 2:
543
581
  _a.sent();
@@ -547,7 +585,6 @@ describe('sasjs test', function () {
547
585
  return [4 /*yield*/, (0, utils_1.readFile)(resultsJsonPath)];
548
586
  case 4:
549
587
  resultsJson = _a.sent();
550
- resultsCsvPath = path_1.default.join(resultsFolderPath, 'testResults.csv');
551
588
  return [4 /*yield*/, expect((0, utils_1.fileExists)(resultsCsvPath)).resolves.toEqual(true)];
552
589
  case 5:
553
590
  _a.sent();
@@ -559,7 +596,6 @@ describe('sasjs test', function () {
559
596
  resultsCsv = _a.sent();
560
597
  resultsCsv = resultsCsv.replace(/\b[0-9a-f]{8}\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\b[0-9a-f]{12}\b/g, 'sasjs_test_id');
561
598
  expect(resultsCsv).toEqual(expectedResultsCsv);
562
- resultsXmlPath = path_1.default.join(resultsFolderPath, 'testResults.xml');
563
599
  return [4 /*yield*/, expect((0, utils_1.fileExists)(resultsXmlPath)).resolves.toEqual(true)];
564
600
  case 7:
565
601
  _a.sent();
@@ -76,6 +76,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
76
76
  };
77
77
  Object.defineProperty(exports, "__esModule", { value: true });
78
78
  exports.getTestUrl = exports.runTest = void 0;
79
+ var os_1 = __importDefault(require("os"));
79
80
  var saveOutput_1 = require("./internal/saveOutput");
80
81
  var types_1 = require("../../types");
81
82
  var file_1 = require("../../utils/file");
@@ -88,10 +89,10 @@ var utils_2 = require("../../utils/utils");
88
89
  var createSASjsInstance_1 = require("../../utils/createSASjsInstance");
89
90
  // interface
90
91
  function runTest(target, testRegExps, outDirectory, flowSourcePath, force) {
91
- var _a, _b;
92
+ var _a, _b, _c;
92
93
  if (testRegExps === void 0) { testRegExps = []; }
93
94
  return __awaiter(this, void 0, void 0, function () {
94
- var testFlowData, testFlow, flow, sasjs, authConfig, username, password, _c, sas9CredentialsError, e_1, result, isCodeExamplePrinted, printCodeExample, jsonPath, xmlPath, _d, csvData, csvPath, coverageReportPath, resultTable, testSuites, testsCount, passedTestsCount, testsWithResultsCount, failedTestsCount, testsWithoutResultCount, errorMessage;
95
+ var testFlowData, testFlow, flow, sasjs, authConfig, username, password, _d, sas9CredentialsError, e_1, result, isCodeExamplePrinted, printCodeExample, resultFileName, jsonPath, xmlPath, csvPath, coverageReportPath, csvData, resultTable, testSuites, testsCount, passedTestsCount, testsWithResultsCount, resultProvidedTests, passedTests, testsWithResultsPercentage, passingTestsPercentage, errorMessage, failedTestsCount, testsWithoutResultCount;
95
96
  var _this = this;
96
97
  return __generator(this, function (_e) {
97
98
  switch (_e.label) {
@@ -157,8 +158,8 @@ function runTest(target, testRegExps, outDirectory, flowSourcePath, force) {
157
158
  contextName: target.contextName,
158
159
  useComputeApi: false
159
160
  });
160
- _c = target.serverType;
161
- switch (_c) {
161
+ _d = target.serverType;
162
+ switch (_d) {
162
163
  case utils_1.ServerType.SasViya: return [3 /*break*/, 2];
163
164
  case utils_1.ServerType.Sas9: return [3 /*break*/, 4];
164
165
  case utils_1.ServerType.Sasjs: return [3 /*break*/, 5];
@@ -343,20 +344,29 @@ function runTest(target, testRegExps, outDirectory, flowSourcePath, force) {
343
344
  }); })];
344
345
  case 12:
345
346
  _e.sent();
346
- return [4 /*yield*/, (0, saveOutput_1.saveResultJson)(outDirectory, result)];
347
+ resultFileName = 'testResults';
348
+ jsonPath = path_1.default.join(outDirectory, "".concat(resultFileName, ".json"));
349
+ xmlPath = path_1.default.join(outDirectory, "".concat(resultFileName, ".xml"));
350
+ csvPath = path_1.default.join(outDirectory, "".concat(resultFileName, ".csv"));
351
+ coverageReportPath = path_1.default.join(outDirectory, 'coverage.lcov');
352
+ result.local_date_time = new Date().toISOString();
353
+ result.local_user_id = os_1.default.userInfo().username;
354
+ result.local_machine_name = os_1.default.hostname();
355
+ result.target_name = target.name;
356
+ result.target_server_type = target.serverType;
357
+ result.target_server_url = target.serverUrl;
358
+ result.csv_result_path = csvPath;
359
+ result.xml_result_path = xmlPath;
360
+ result.coverage_report_path = coverageReportPath;
361
+ return [4 /*yield*/, (0, saveOutput_1.saveResultXml)(xmlPath, result)];
347
362
  case 13:
348
- jsonPath = _e.sent();
349
- if (!jsonPath)
350
- return [2 /*return*/];
351
- return [4 /*yield*/, (0, saveOutput_1.saveResultXml)(outDirectory, result)];
363
+ _e.sent();
364
+ return [4 /*yield*/, (0, saveOutput_1.saveResultCsv)(csvPath, result)];
352
365
  case 14:
353
- xmlPath = _e.sent();
354
- return [4 /*yield*/, (0, saveOutput_1.saveResultCsv)(outDirectory, result)];
366
+ csvData = _e.sent();
367
+ return [4 /*yield*/, (0, saveOutput_1.saveCoverageLcov)(coverageReportPath, flow)];
355
368
  case 15:
356
- _d = _e.sent(), csvData = _d.csvData, csvPath = _d.csvPath;
357
- return [4 /*yield*/, (0, saveOutput_1.saveCoverageLcov)(outDirectory, flow)];
358
- case 16:
359
- coverageReportPath = _e.sent();
369
+ _e.sent();
360
370
  resultTable = {};
361
371
  if (Array.isArray(csvData)) {
362
372
  testSuites = csvData.reduce(function (acc, item) {
@@ -395,20 +405,32 @@ function runTest(target, testRegExps, outDirectory, flowSourcePath, force) {
395
405
  testsCount = flow.length;
396
406
  passedTestsCount = Object.values(resultTable).filter(function (res) { return res.test_suite_result === types_1.TestResultStatus.pass; }).length;
397
407
  testsWithResultsCount = Object.values(resultTable).filter(function (res) { return res.test_suite_result !== types_1.TestResultStatus.notProvided; }).length;
398
- (_b = process.logger) === null || _b === void 0 ? void 0 : _b.info("Tests provided results: ".concat(testsWithResultsCount + '/' + testsCount, " (").concat(chalk_1.default.greenBright(Math.round((testsWithResultsCount / testsCount) * 100 || 0) + '%'), ")\n Tests that pass: ").concat(passedTestsCount + '/' + testsWithResultsCount, " (").concat(chalk_1.default.greenBright(Math.round((passedTestsCount / testsWithResultsCount) * 100 || 0) + '%'), ")\n "));
399
- (0, displayResult_1.displaySuccess)("Tests execution finished. The results are stored at:\n ".concat(jsonPath, "\n ").concat(csvPath, "\n ").concat(xmlPath));
400
- (0, displayResult_1.displaySuccess)("Tests coverage report:\n ".concat(coverageReportPath));
408
+ resultProvidedTests = testsWithResultsCount + '/' + testsCount;
409
+ passedTests = passedTestsCount + '/' + testsWithResultsCount;
410
+ testsWithResultsPercentage = Math.round((testsWithResultsCount / testsCount) * 100 || 0) + '%';
411
+ passingTestsPercentage = Math.round((passedTestsCount / testsWithResultsCount) * 100 || 0) + '%';
412
+ result.tests_with_results = "".concat(resultProvidedTests, " (").concat(testsWithResultsPercentage, ")");
413
+ result.tests_that_pass = "".concat(passedTests, " (").concat(passingTestsPercentage, ")");
414
+ (_b = process.logger) === null || _b === void 0 ? void 0 : _b.info("Tests provided results: ".concat(resultProvidedTests, " (").concat(chalk_1.default.greenBright(testsWithResultsPercentage), ")"));
415
+ (_c = process.logger) === null || _c === void 0 ? void 0 : _c.info("\n Tests that pass: ".concat(passedTests, " (").concat(chalk_1.default.greenBright(passingTestsPercentage), ")\n "));
416
+ errorMessage = '';
401
417
  if (!force) {
402
418
  failedTestsCount = testsWithResultsCount - passedTestsCount;
403
419
  testsWithoutResultCount = testsCount - testsWithResultsCount;
404
- errorMessage = '';
420
+ result.failed_to_complete = failedTestsCount;
421
+ result.completed_with_failures = testsWithoutResultCount;
405
422
  if (testsWithoutResultCount > 0)
406
423
  errorMessage = "".concat(testsWithoutResultCount, " ").concat(testsWithoutResultCount === 1 ? 'test' : 'tests', " failed to complete!\n");
407
424
  if (failedTestsCount > 0)
408
425
  errorMessage += "".concat(failedTestsCount, " ").concat(failedTestsCount === 1 ? 'test' : 'tests', " completed with failures!");
409
- if (errorMessage)
410
- return [2 /*return*/, Promise.reject(errorMessage)];
411
426
  }
427
+ return [4 /*yield*/, (0, saveOutput_1.saveResultJson)(jsonPath, result)];
428
+ case 16:
429
+ _e.sent();
430
+ (0, displayResult_1.displaySuccess)("Tests execution finished. The results are stored at:\n ".concat(jsonPath, "\n ").concat(csvPath, "\n ").concat(xmlPath));
431
+ (0, displayResult_1.displaySuccess)("Tests coverage report:\n ".concat(coverageReportPath));
432
+ if (errorMessage)
433
+ return [2 /*return*/, Promise.reject(errorMessage)];
412
434
  return [2 /*return*/];
413
435
  }
414
436
  });
package/build/config.json CHANGED
@@ -36,7 +36,7 @@
36
36
  },
37
37
  {
38
38
  "fileName": "buildinitviya.sas",
39
- "content": "/**\n @file buildinitviya.sas\n @brief this executed as part of the generation of the Viya build script\n @details This file is inserted *after* the build macros and *before* the service code.\n\n For an explanation of this part, see: https://sasjs.io/sasjs/sasjs-cli/#viya-deployment-script\n\n <h4> SAS Macros </h4>\n\n**/\n\n/*\n%put buildinit script;\n\n"
39
+ "content": "/**\n @file buildinitviya.sas\n @brief this executed as part of the generation of the Viya build script\n @details This file is inserted *after* the build macros and *before* the service code.\n\n For an explanation of this part, see: https://sasjs.io/sasjs/sasjs-cli/#viya-deployment-script\n\n <h4> SAS Macros </h4>\n\n**/\n\n%put buildinit script;\n\n"
40
40
  },
41
41
  {
42
42
  "fileName": "buildterm.sas",
@@ -195,27 +195,9 @@
195
195
  ],
196
196
  "config": {
197
197
  "$schema": "https://cli.sasjs.io/sasjsconfig-schema.json",
198
- "docConfig": {
199
- "displayMacroCore": true,
200
- "enableLineage": true,
201
- "outDirectory": "",
202
- "dataControllerUrl": "",
203
- "doxyContent": {
204
- "favIcon": "favicon.ico",
205
- "footer": "new_footer.html",
206
- "header": "new_header.html",
207
- "layout": "DoxygenLayout.xml",
208
- "logo": "logo.png",
209
- "readMe": "../../README.md",
210
- "stylesheet": "new_stylesheet.css",
211
- "path": "./sasjs/doxy/"
212
- }
213
- },
214
198
  "buildConfig": {
215
199
  "initProgram": "sasjs/build/buildinit.sas",
216
200
  "termProgram": "sasjs/build/buildterm.sas",
217
- "buildOutputFolder": "sasjsbuild",
218
- "buildResultsFolder": "sasjsresults",
219
201
  "macroVars": {
220
202
  "name": "value",
221
203
  "numvar": "42"
@@ -236,15 +218,12 @@
236
218
  "macroFolders": ["sasjs/macros"],
237
219
  "programFolders": ["sasjs/programs"],
238
220
  "binaryFolders": ["sasjs/binaries"],
239
- "serverType": "SASVIYA",
221
+ "defaultTarget": "viya",
240
222
  "targets": [
241
223
  {
242
224
  "name": "viya",
243
225
  "serverType": "SASVIYA",
244
- "serverUrl": "https://sas.analytium.co.uk",
245
- "httpsAgentOptions": {
246
- "allowInsecureRequests": false
247
- },
226
+ "serverUrl": "",
248
227
  "appLoc": "/Public/app",
249
228
  "contextName": "SAS Job Execution compute context",
250
229
  "buildConfig": {
@@ -256,10 +235,6 @@
256
235
  "extravar": "this too"
257
236
  }
258
237
  },
259
- "deployConfig": {
260
- "deployServicePack": true,
261
- "deployScripts": ["sasjsbuild/myviyadeploy.sas"]
262
- },
263
238
  "serviceConfig": {
264
239
  "serviceFolders": ["sasjs/targets/viya/services/admin"],
265
240
  "initProgram": "sasjs/build/serviceinit.sas",
@@ -269,52 +244,30 @@
269
244
  "extravar": "this too"
270
245
  }
271
246
  },
272
- "jobConfig": {
273
- "jobFolders": [],
274
- "initProgram": "",
275
- "termProgram": "",
276
- "macroVars": {}
277
- },
278
- "streamConfig": {
279
- "assetPaths": [],
280
- "streamWeb": false,
281
- "streamWebFolder": "webv",
282
- "webSourcePath": "dist"
283
- },
284
- "macroFolders": ["sasjs/targets/viya/macros"],
285
- "programFolders": []
247
+ "macroFolders": ["sasjs/targets/viya/macros"]
286
248
  },
287
249
  {
288
250
  "name": "sas9",
289
251
  "serverType": "SAS9",
290
- "serverUrl": "https://sas.analytium.co.uk:8343",
252
+ "serverUrl": "",
291
253
  "appLoc": "/User Folders/&sysuserid/My Folder",
292
254
  "serverName": "Foundation",
293
255
  "repositoryName": "SASApp",
294
- "buildConfig": {
295
- "buildOutputFileName": "mysas9deploy.sas",
296
- "initProgram": "",
297
- "termProgram": "",
298
- "macroVars": {}
299
- },
300
256
  "deployConfig": {
301
257
  "deployScripts": ["sasjs/build/deploysas9.sh"],
302
258
  "deployServicePack": false
303
259
  },
304
260
  "serviceConfig": {
305
261
  "serviceFolders": ["sasjs/targets/sas9/services/admin"],
306
- "initProgram": "",
307
- "termProgram": "sasjs/build/servicetermother.sas",
308
- "macroVars": {}
262
+ "termProgram": "sasjs/build/servicetermother.sas"
309
263
  },
310
- "streamConfig": {
311
- "assetPaths": [],
312
- "streamWeb": false,
313
- "streamWebFolder": "web9",
314
- "webSourcePath": "dist"
315
- },
316
- "macroFolders": ["sasjs/targets/sas9/macros"],
317
- "programFolders": []
264
+ "macroFolders": ["sasjs/targets/sas9/macros"]
265
+ },
266
+ {
267
+ "name": "sasjs",
268
+ "serverType": "SASJS",
269
+ "serverUrl": "",
270
+ "appLoc": "/Public/app"
318
271
  }
319
272
  ]
320
273
  }
@@ -1,3 +1,4 @@
1
+ import { ServerType } from '@sasjs/utils';
1
2
  export interface TestFlow {
2
3
  testSetUp?: string;
3
4
  testTearDown?: string;
@@ -41,6 +42,19 @@ export interface TestResult {
41
42
  }
42
43
  export interface TestResults {
43
44
  sasjs_test_meta: TestDescription[];
45
+ csv_result_path?: string;
46
+ xml_result_path?: string;
47
+ coverage_report_path?: string;
48
+ failed_to_complete?: number;
49
+ completed_with_failures?: number;
50
+ tests_with_results?: string;
51
+ tests_that_pass?: string;
52
+ target_name?: string;
53
+ target_server_url?: string;
54
+ target_server_type?: ServerType;
55
+ local_date_time?: string;
56
+ local_user_id?: string;
57
+ local_machine_name?: string;
44
58
  }
45
59
  export interface TestResultCsv {
46
60
  test_target: string;
@@ -156,26 +156,27 @@ describe('setConstants', function () {
156
156
  return [4 /*yield*/, (0, setConstants_1.setConstants)()];
157
157
  case 1:
158
158
  _a.sent();
159
- verifySasjsConstants();
159
+ verifySasjsConstants(undefined, false, false);
160
160
  return [2 /*return*/];
161
161
  }
162
162
  });
163
163
  }); });
164
164
  });
165
- var verifySasjsConstants = function (appFolder, hasSasjsCore) {
165
+ var verifySasjsConstants = function (appFolder, hasSasjsCore, isLocal) {
166
166
  if (hasSasjsCore === void 0) { hasSasjsCore = false; }
167
+ if (isLocal === void 0) { isLocal = true; }
167
168
  var prefixAppFolder = appFolder !== null && appFolder !== void 0 ? appFolder : require('os').homedir();
168
169
  var sasjsConstants = process.sasjsConstants;
169
170
  expect(sasjsConstants.buildSourceFolder).toEqual(prefixAppFolder);
170
171
  expect(sasjsConstants.buildSourceDbFolder).toEqual([prefixAppFolder, 'sasjs', 'db'].join(path_1.default.sep));
171
- expect(sasjsConstants.buildDestinationFolder).toEqual([prefixAppFolder, 'sasjsbuild'].join(path_1.default.sep));
172
- expect(sasjsConstants.buildDestinationServicesFolder).toEqual([prefixAppFolder, 'sasjsbuild', 'services'].join(path_1.default.sep));
173
- expect(sasjsConstants.buildDestinationJobsFolder).toEqual([prefixAppFolder, 'sasjsbuild', 'jobs'].join(path_1.default.sep));
174
- expect(sasjsConstants.buildDestinationDbFolder).toEqual([prefixAppFolder, 'sasjsbuild', 'db'].join(path_1.default.sep));
175
- expect(sasjsConstants.buildDestinationDocsFolder).toEqual([prefixAppFolder, 'sasjsbuild', 'docs'].join(path_1.default.sep));
176
- expect(sasjsConstants.buildDestinationResultsFolder).toEqual([prefixAppFolder, 'sasjsresults'].join(path_1.default.sep));
177
- expect(sasjsConstants.buildDestinationResultsLogsFolder).toEqual([prefixAppFolder, 'sasjsresults', 'logs'].join(path_1.default.sep));
178
- expect(sasjsConstants.buildDestinationTestFolder).toEqual([prefixAppFolder, 'sasjsbuild', 'tests'].join(path_1.default.sep));
172
+ expect(sasjsConstants.buildDestinationFolder).toEqual(path_1.default.join(prefixAppFolder, isLocal ? '' : '.sasjs', 'sasjsbuild'));
173
+ expect(sasjsConstants.buildDestinationServicesFolder).toEqual(path_1.default.join(prefixAppFolder, isLocal ? '' : '.sasjs', 'sasjsbuild', 'services'));
174
+ expect(sasjsConstants.buildDestinationJobsFolder).toEqual(path_1.default.join(prefixAppFolder, isLocal ? '' : '.sasjs', 'sasjsbuild', 'jobs'));
175
+ expect(sasjsConstants.buildDestinationDbFolder).toEqual(path_1.default.join(prefixAppFolder, isLocal ? '' : '.sasjs', 'sasjsbuild', 'db'));
176
+ expect(sasjsConstants.buildDestinationDocsFolder).toEqual(path_1.default.join(prefixAppFolder, isLocal ? '' : '.sasjs', 'sasjsbuild', 'docs'));
177
+ expect(sasjsConstants.buildDestinationResultsFolder).toEqual(path_1.default.join(prefixAppFolder, isLocal ? '' : '.sasjs', 'sasjsresults'));
178
+ expect(sasjsConstants.buildDestinationResultsLogsFolder).toEqual(path_1.default.join(prefixAppFolder, isLocal ? '' : '.sasjs', 'sasjsresults', 'logs'));
179
+ expect(sasjsConstants.buildDestinationTestFolder).toEqual(path_1.default.join(prefixAppFolder, isLocal ? '' : '.sasjs', 'sasjsbuild', 'tests'));
179
180
  var corePath = hasSasjsCore
180
181
  ? 'core'
181
182
  : path_1.default.join('cli', 'node_modules', '@sasjs', 'core');
package/package.json CHANGED
@@ -50,7 +50,7 @@
50
50
  "access": "public"
51
51
  },
52
52
  "dependencies": {
53
- "@sasjs/adapter": "4.1.0",
53
+ "@sasjs/adapter": "4.1.3",
54
54
  "@sasjs/core": "4.45.4",
55
55
  "@sasjs/lint": "2.2.0",
56
56
  "@sasjs/utils": "2.52.0",
@@ -101,5 +101,5 @@
101
101
  "typescript": "4.5.4",
102
102
  "util": "0.12.4"
103
103
  },
104
- "version": "3.27.0"
104
+ "version": "3.27.2"
105
105
  }