@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.
- package/build/commands/testing/internal/saveOutput.d.ts +4 -7
- package/build/commands/testing/internal/saveOutput.js +20 -28
- package/build/commands/testing/spec/testing.spec.js +56 -20
- package/build/commands/testing/test.js +43 -21
- package/build/commands/web/internal/getTags.d.ts +1 -0
- package/build/commands/web/internal/getTags.js +5 -1
- package/build/commands/web/internal/spec/updateSasjstag.spec.d.ts +4 -0
- package/build/commands/web/internal/spec/updateSasjstag.spec.js +61 -0
- package/build/commands/web/internal/updateAllTags.d.ts +2 -2
- package/build/commands/web/internal/updateAllTags.js +7 -2
- package/build/commands/web/internal/updateSasjsTag.d.ts +5 -0
- package/build/commands/web/internal/updateSasjsTag.js +11 -0
- package/build/commands/web/web.js +1 -1
- package/build/types/testing.d.ts +14 -0
- package/package.json +1 -1
|
@@ -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: (
|
|
4
|
-
export declare const saveResultCsv: (
|
|
5
|
-
|
|
6
|
-
|
|
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 (
|
|
95
|
-
var finaleResult,
|
|
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
|
-
|
|
100
|
-
|
|
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:
|
|
113
|
-
|
|
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 (
|
|
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(
|
|
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 (
|
|
182
|
-
var
|
|
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)(
|
|
254
|
+
return [4 /*yield*/, (0, utils_1.createFile)(xmlPath, xmlString)];
|
|
262
255
|
case 1:
|
|
263
256
|
_a.sent();
|
|
264
|
-
return [2 /*return
|
|
257
|
+
return [2 /*return*/];
|
|
265
258
|
}
|
|
266
259
|
});
|
|
267
260
|
}); };
|
|
268
261
|
exports.saveResultXml = saveResultXml;
|
|
269
|
-
var saveCoverageLcov = function (
|
|
270
|
-
var testsPrefixRegExp, coverageReport, coveringFile
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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
|
-
|
|
161
|
-
switch (
|
|
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
|
-
|
|
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
|
-
|
|
349
|
-
|
|
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
|
-
|
|
354
|
-
return [4 /*yield*/, (0, saveOutput_1.
|
|
366
|
+
csvData = _e.sent();
|
|
367
|
+
return [4 /*yield*/, (0, saveOutput_1.saveCoverageLcov)(coverageReportPath, flow)];
|
|
355
368
|
case 15:
|
|
356
|
-
|
|
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
|
-
|
|
399
|
-
|
|
400
|
-
|
|
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
|
-
|
|
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,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,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,
|
package/build/types/testing.d.ts
CHANGED
|
@@ -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