@sasjs/cli 3.26.0 → 3.27.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.
@@ -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
  });
@@ -1,4 +1,5 @@
1
1
  import { JSDOM } from 'jsdom';
2
+ export declare const getSasjsTags: (parsedHtml: JSDOM) => Element[];
2
3
  export declare const getScriptTags: (parsedHtml: JSDOM) => HTMLScriptElement[];
3
4
  export declare const getStyleInPageTags: (parsedHtml: JSDOM) => HTMLStyleElement[];
4
5
  export declare const getStyleTags: (parsedHtml: JSDOM) => HTMLLinkElement[];
@@ -1,6 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getSourceTags = exports.getImgTags = exports.getFaviconTags = exports.getStyleTags = exports.getStyleInPageTags = exports.getScriptTags = void 0;
3
+ exports.getSourceTags = exports.getImgTags = exports.getFaviconTags = exports.getStyleTags = exports.getStyleInPageTags = exports.getScriptTags = exports.getSasjsTags = void 0;
4
+ var getSasjsTags = function (parsedHtml) {
5
+ return Array.from(parsedHtml.window.document.getElementsByTagName('sasjs'));
6
+ };
7
+ exports.getSasjsTags = getSasjsTags;
4
8
  var getScriptTags = function (parsedHtml) {
5
9
  return Array.from(parsedHtml.window.document.getElementsByTagName('script'));
6
10
  };
@@ -0,0 +1,4 @@
1
+ /**
2
+ * @jest-environment jsdom
3
+ */
4
+ export {};
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ /**
3
+ * @jest-environment jsdom
4
+ */
5
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
6
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
7
+ return new (P || (P = Promise))(function (resolve, reject) {
8
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
9
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
10
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
11
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
12
+ });
13
+ };
14
+ var __generator = (this && this.__generator) || function (thisArg, body) {
15
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
16
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
17
+ function verb(n) { return function (v) { return step([n, v]); }; }
18
+ function step(op) {
19
+ if (f) throw new TypeError("Generator is already executing.");
20
+ while (_) try {
21
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
22
+ if (y = 0, t) op = [op[0] & 2, t.value];
23
+ switch (op[0]) {
24
+ case 0: case 1: t = op; break;
25
+ case 4: _.label++; return { value: op[1], done: false };
26
+ case 5: _.label++; y = op[1]; op = [0]; continue;
27
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
28
+ default:
29
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
30
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
31
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
32
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
33
+ if (t[2]) _.ops.pop();
34
+ _.trys.pop(); continue;
35
+ }
36
+ op = body.call(thisArg, _);
37
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
38
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
39
+ }
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ var utils_1 = require("@sasjs/utils");
43
+ var updateSasjsTag_1 = require("../updateSasjsTag");
44
+ describe('updateSasjsTag', function () {
45
+ it("should update links in js script", function () { return __awaiter(void 0, void 0, void 0, function () {
46
+ var target, tag;
47
+ return __generator(this, function (_a) {
48
+ target = {
49
+ serverType: utils_1.ServerType.Sasjs,
50
+ appLoc: '/public/app/test'
51
+ };
52
+ tag = document.createElement('sasjs');
53
+ tag.setAttribute('appLoc', 'need/to/update');
54
+ tag.setAttribute('serverType', 'sas');
55
+ (0, updateSasjsTag_1.updateSasjsTag)(tag, target);
56
+ expect(tag.getAttribute('appLoc')).toEqual('/public/app/test');
57
+ expect(tag.getAttribute('serverType')).toEqual(utils_1.ServerType.Sasjs);
58
+ return [2 /*return*/];
59
+ });
60
+ }); });
61
+ });
@@ -1,5 +1,5 @@
1
1
  import { JSDOM } from 'jsdom';
2
- import { ServerType } from '@sasjs/utils';
2
+ import { ServerType, Target } from '@sasjs/utils';
3
3
  import { AssetPathMap } from './createAssetServices';
4
4
  interface paramsType {
5
5
  webSourcePathFull: string;
@@ -12,5 +12,5 @@ interface paramsType {
12
12
  * Also updates contents to update included asset references
13
13
  * @param {JSDOM} parsedHtml- DOMWindow for index.html
14
14
  */
15
- export declare const updateAllTags: (parsedHtml: JSDOM, { webSourcePathFull, destinationPath, serverType, assetPathMap }: paramsType) => Promise<void>;
15
+ export declare const updateAllTags: (parsedHtml: JSDOM, target: Target, { webSourcePathFull, destinationPath, serverType, assetPathMap }: paramsType) => Promise<void>;
16
16
  export {};
@@ -67,19 +67,24 @@ var getTags_1 = require("./getTags");
67
67
  var updateScriptTag_1 = require("./updateScriptTag");
68
68
  var updateLinkTag_1 = require("./updateLinkTag");
69
69
  var updateStyleTag_1 = require("./updateStyleTag");
70
+ var updateSasjsTag_1 = require("./updateSasjsTag");
70
71
  /**
71
72
  * Updates HTML Tags with correct link.
72
73
  * Also updates contents to update included asset references
73
74
  * @param {JSDOM} parsedHtml- DOMWindow for index.html
74
75
  */
75
- var updateAllTags = function (parsedHtml, _a) {
76
+ var updateAllTags = function (parsedHtml, target, _a) {
76
77
  var webSourcePathFull = _a.webSourcePathFull, destinationPath = _a.destinationPath, serverType = _a.serverType, assetPathMap = _a.assetPathMap;
77
78
  return __awaiter(void 0, void 0, void 0, function () {
78
- var assetsNotFound, scriptTags, styleExternalTags, styleInPageTags, styleTags, faviconTags, imgTags, sourceTags, srcTags, notFoundErrors;
79
+ var assetsNotFound, sasjsTags, scriptTags, styleExternalTags, styleInPageTags, styleTags, faviconTags, imgTags, sourceTags, srcTags, notFoundErrors;
79
80
  return __generator(this, function (_b) {
80
81
  switch (_b.label) {
81
82
  case 0:
82
83
  assetsNotFound = [];
84
+ sasjsTags = (0, getTags_1.getSasjsTags)(parsedHtml);
85
+ if (sasjsTags.length) {
86
+ (0, updateSasjsTag_1.updateSasjsTag)(sasjsTags[0], target);
87
+ }
83
88
  scriptTags = (0, getTags_1.getScriptTags)(parsedHtml);
84
89
  return [4 /*yield*/, (0, utils_1.asyncForEach)(scriptTags, function (tag) { return __awaiter(void 0, void 0, void 0, function () {
85
90
  return __generator(this, function (_a) {
@@ -0,0 +1,5 @@
1
+ import { Target } from '@sasjs/utils';
2
+ /**
3
+ * Updates sasjs adapter's config in index.html if present.
4
+ */
5
+ export declare const updateSasjsTag: (tag: Element, target: Target) => void;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateSasjsTag = void 0;
4
+ /**
5
+ * Updates sasjs adapter's config in index.html if present.
6
+ */
7
+ var updateSasjsTag = function (tag, target) {
8
+ tag.setAttribute('appLoc', target.appLoc);
9
+ tag.setAttribute('serverType', target.serverType);
10
+ };
11
+ exports.updateSasjsTag = updateSasjsTag;
@@ -98,7 +98,7 @@ function createWebAppServices(target) {
98
98
  return [4 /*yield*/, (0, utils_1.readFile)(indexHtmlPath).then(function (content) { return new jsdom_1.default.JSDOM(content); })];
99
99
  case 8:
100
100
  indexHtml = _e.sent();
101
- return [4 /*yield*/, (0, updateAllTags_1.updateAllTags)(indexHtml, {
101
+ return [4 /*yield*/, (0, updateAllTags_1.updateAllTags)(indexHtml, target, {
102
102
  webSourcePathFull: webSourcePathFull,
103
103
  destinationPath: destinationPath,
104
104
  serverType: target.serverType,
@@ -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;
package/package.json CHANGED
@@ -101,5 +101,5 @@
101
101
  "typescript": "4.5.4",
102
102
  "util": "0.12.4"
103
103
  },
104
- "version": "3.26.0"
104
+ "version": "3.27.1"
105
105
  }