@sasjs/cli 3.12.1 → 3.12.4

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.
@@ -82,6 +82,7 @@ describe('addTarget', function () {
82
82
  var viyaTargetName = "test-viya-".concat((0, utils_1.generateTimestamp)());
83
83
  var sas9TargetName = "test-sas9-".concat((0, utils_1.generateTimestamp)());
84
84
  var sasjsTargetName = "test-server-".concat((0, utils_1.generateTimestamp)());
85
+ var serverUrl = process.env.VIYA_SERVER_URL || '';
85
86
  var globalTestTarget;
86
87
  beforeAll(function () { return __awaiter(void 0, void 0, void 0, function () {
87
88
  return __generator(this, function (_a) {
@@ -138,7 +139,7 @@ describe('addTarget', function () {
138
139
  serverType: utils_1.ServerType.SasViya,
139
140
  name: viyaTargetName,
140
141
  appLoc: '/Public/app',
141
- serverUrl: process.env.VIYA_SERVER_URL,
142
+ serverUrl: serverUrl,
142
143
  existingTarget: {}
143
144
  };
144
145
  jest
@@ -175,7 +176,7 @@ describe('addTarget', function () {
175
176
  serverType: utils_1.ServerType.Sasjs,
176
177
  name: sasjsTargetName,
177
178
  appLoc: '/Public/app',
178
- serverUrl: process.env.SASJS_SERVER_URL || '',
179
+ serverUrl: serverUrl,
179
180
  existingTarget: {}
180
181
  };
181
182
  jest
@@ -211,7 +212,7 @@ describe('addTarget', function () {
211
212
  serverType: utils_1.ServerType.Sas9,
212
213
  name: sas9TargetName,
213
214
  appLoc: '/Public/app',
214
- serverUrl: process.env.SAS9_SERVER_URL,
215
+ serverUrl: serverUrl,
215
216
  existingTarget: {}
216
217
  };
217
218
  jest
@@ -248,7 +249,7 @@ describe('addTarget', function () {
248
249
  serverType: utils_1.ServerType.SasViya,
249
250
  name: viyaTargetName,
250
251
  appLoc: '/Public/app',
251
- serverUrl: process.env.VIYA_SERVER_URL,
252
+ serverUrl: serverUrl,
252
253
  existingTarget: {}
253
254
  };
254
255
  jest
@@ -285,12 +286,13 @@ describe('addTarget', function () {
285
286
  case 1:
286
287
  config = _a.sent();
287
288
  targetJson = (config.targets || []).find(function (t) { return t.name === 'viya'; });
289
+ targetJson.streamConfig.streamWeb = false;
288
290
  commonFields = {
289
291
  scope: targetScope_1.TargetScope.Local,
290
292
  serverType: utils_1.ServerType.SasViya,
291
293
  name: 'viya',
292
294
  appLoc: '/Public/app/new/location',
293
- serverUrl: process.env.VIYA_SERVER_URL,
295
+ serverUrl: serverUrl,
294
296
  existingTarget: targetJson
295
297
  };
296
298
  jest
@@ -332,7 +334,7 @@ describe('addTarget', function () {
332
334
  serverType: utils_1.ServerType.Sas9,
333
335
  name: 'sas9',
334
336
  appLoc: '/Public/app/new/location/2',
335
- serverUrl: process.env.VIYA_SERVER_URL,
337
+ serverUrl: serverUrl,
336
338
  existingTarget: target
337
339
  };
338
340
  jest
@@ -374,7 +376,7 @@ describe('addTarget', function () {
374
376
  serverType: utils_1.ServerType.Sasjs,
375
377
  name: 'server',
376
378
  appLoc: '/Public/app/new/location/2',
377
- serverUrl: process.env.SASJS_SERVER_URL || '',
379
+ serverUrl: serverUrl,
378
380
  existingTarget: targetJson
379
381
  };
380
382
  jest
@@ -410,7 +412,7 @@ describe('addTarget', function () {
410
412
  serverType: globalTestTarget.serverType,
411
413
  name: globalTestTarget.name,
412
414
  appLoc: '/Public/app/new/location/3',
413
- serverUrl: process.env.VIYA_SERVER_URL,
415
+ serverUrl: serverUrl,
414
416
  existingTarget: globalTestTarget
415
417
  };
416
418
  jest
@@ -324,6 +324,7 @@ function recreateBuildFolder() {
324
324
  });
325
325
  });
326
326
  }
327
+ // REFACTOR: combine compileServiceFolder and compileJobFolder
327
328
  var compileServiceFolder = function (target, serviceFolder, macroFolders, programFolders, compileTree) { return __awaiter(void 0, void 0, void 0, function () {
328
329
  var destinationPath, subFolders, filesNamesInPath;
329
330
  return __generator(this, function (_a) {
@@ -333,9 +334,30 @@ var compileServiceFolder = function (target, serviceFolder, macroFolders, progra
333
334
  return [4 /*yield*/, (0, utils_1.listSubFoldersInFolder)(destinationPath)];
334
335
  case 1:
335
336
  subFolders = _a.sent();
336
- return [4 /*yield*/, (0, utils_1.listFilesInFolder)(destinationPath)];
337
+ return [4 /*yield*/, (0, utils_1.listFilesInFolder)(destinationPath)
338
+ // Checks if file in sasjsbuild folder exists in source folder.
339
+ // If not, it means that the file shouldn't be compiled.
340
+ ];
337
341
  case 2:
338
342
  filesNamesInPath = _a.sent();
343
+ // Checks if file in sasjsbuild folder exists in source folder.
344
+ // If not, it means that the file shouldn't be compiled.
345
+ return [4 /*yield*/, (0, utils_1.asyncForEach)(filesNamesInPath, function (fileName, i) { return __awaiter(void 0, void 0, void 0, function () {
346
+ return __generator(this, function (_a) {
347
+ switch (_a.label) {
348
+ case 0: return [4 /*yield*/, (0, utils_1.fileExists)(path_1.default.join(serviceFolder, fileName))];
349
+ case 1:
350
+ if (!(_a.sent())) {
351
+ filesNamesInPath.splice(i, 1);
352
+ }
353
+ return [2 /*return*/];
354
+ }
355
+ });
356
+ }); })];
357
+ case 3:
358
+ // Checks if file in sasjsbuild folder exists in source folder.
359
+ // If not, it means that the file shouldn't be compiled.
360
+ _a.sent();
339
361
  return [4 /*yield*/, (0, utils_1.asyncForEach)(filesNamesInPath, function (fileName) { return __awaiter(void 0, void 0, void 0, function () {
340
362
  var filePath;
341
363
  return __generator(this, function (_a) {
@@ -355,7 +377,7 @@ var compileServiceFolder = function (target, serviceFolder, macroFolders, progra
355
377
  }
356
378
  });
357
379
  }); })];
358
- case 3:
380
+ case 4:
359
381
  _a.sent();
360
382
  return [4 /*yield*/, (0, utils_1.asyncForEach)(subFolders, function (subFolder) { return __awaiter(void 0, void 0, void 0, function () {
361
383
  var fileNames;
@@ -389,7 +411,7 @@ var compileServiceFolder = function (target, serviceFolder, macroFolders, progra
389
411
  }
390
412
  });
391
413
  }); })];
392
- case 4:
414
+ case 5:
393
415
  _a.sent();
394
416
  compileTree.saveTree();
395
417
  return [2 /*return*/];
@@ -405,9 +427,30 @@ var compileJobFolder = function (target, jobFolder, macroFolders, programFolders
405
427
  return [4 /*yield*/, (0, utils_1.listSubFoldersInFolder)(destinationPath)];
406
428
  case 1:
407
429
  subFolders = _a.sent();
408
- return [4 /*yield*/, (0, utils_1.listFilesInFolder)(destinationPath)];
430
+ return [4 /*yield*/, (0, utils_1.listFilesInFolder)(destinationPath)
431
+ // Checks if file in sasjsbuild folder exists in source folder.
432
+ // If not, it means that the file shouldn't be compiled.
433
+ ];
409
434
  case 2:
410
435
  filesNamesInPath = _a.sent();
436
+ // Checks if file in sasjsbuild folder exists in source folder.
437
+ // If not, it means that the file shouldn't be compiled.
438
+ return [4 /*yield*/, (0, utils_1.asyncForEach)(filesNamesInPath, function (fileName, i) { return __awaiter(void 0, void 0, void 0, function () {
439
+ return __generator(this, function (_a) {
440
+ switch (_a.label) {
441
+ case 0: return [4 /*yield*/, (0, utils_1.fileExists)(path_1.default.join(jobFolder, fileName))];
442
+ case 1:
443
+ if (!(_a.sent())) {
444
+ filesNamesInPath.splice(i, 1);
445
+ }
446
+ return [2 /*return*/];
447
+ }
448
+ });
449
+ }); })];
450
+ case 3:
451
+ // Checks if file in sasjsbuild folder exists in source folder.
452
+ // If not, it means that the file shouldn't be compiled.
453
+ _a.sent();
411
454
  return [4 /*yield*/, (0, utils_1.asyncForEach)(filesNamesInPath, function (fileName) { return __awaiter(void 0, void 0, void 0, function () {
412
455
  var filePath;
413
456
  return __generator(this, function (_a) {
@@ -427,7 +470,7 @@ var compileJobFolder = function (target, jobFolder, macroFolders, programFolders
427
470
  }
428
471
  });
429
472
  }); })];
430
- case 3:
473
+ case 4:
431
474
  _a.sent();
432
475
  return [4 /*yield*/, (0, utils_1.asyncForEach)(subFolders, function (subFolder) { return __awaiter(void 0, void 0, void 0, function () {
433
476
  var fileNames;
@@ -461,7 +504,7 @@ var compileJobFolder = function (target, jobFolder, macroFolders, programFolders
461
504
  }
462
505
  });
463
506
  }); })];
464
- case 4:
507
+ case 5:
465
508
  _a.sent();
466
509
  return [2 /*return*/];
467
510
  }
@@ -739,10 +739,10 @@ describe('sasjs compile outside project', function () {
739
739
  return [4 /*yield*/, (0, config_1.saveGlobalRcFile)('')];
740
740
  case 1:
741
741
  _a.sent();
742
- process.projectDir = '';
743
742
  return [4 /*yield*/, (0, utils_2.setConstants)()];
744
743
  case 2:
745
744
  _a.sent();
745
+ process.projectDir = '';
746
746
  process.currentDir = path_1.default.join(__dirname, appName);
747
747
  return [4 /*yield*/, (0, utils_1.createFolder)(process.currentDir)];
748
748
  case 3:
@@ -785,6 +785,38 @@ describe('sasjs compile outside project', function () {
785
785
  }
786
786
  });
787
787
  }); });
788
+ it('should compile without duplicates', function () { return __awaiter(void 0, void 0, void 0, function () {
789
+ var testServicePath, appPath, command, compiledTestService;
790
+ var _a;
791
+ return __generator(this, function (_b) {
792
+ switch (_b.label) {
793
+ case 0:
794
+ testServicePath = path_1.default.join('services', 'admin', 'test.sas');
795
+ appPath = path_1.default.join(__dirname, appName);
796
+ return [4 /*yield*/, (0, test_1.createTestApp)(__dirname, appName)];
797
+ case 1:
798
+ _b.sent();
799
+ return [4 /*yield*/, (0, utils_1.createFile)(path_1.default.join(appPath, 'sasjs', 'targets', 'viya', testServicePath), '')];
800
+ case 2:
801
+ _b.sent();
802
+ command = new compileCommand_1.CompileCommand([
803
+ 'node',
804
+ 'sasjs',
805
+ 'compile',
806
+ '-t',
807
+ 'viya'
808
+ ]);
809
+ return [4 /*yield*/, command.executeCompile()];
810
+ case 3:
811
+ _b.sent();
812
+ return [4 /*yield*/, (0, utils_1.readFile)(path_1.default.join(appPath, 'sasjsbuild', testServicePath))];
813
+ case 4:
814
+ compiledTestService = _b.sent();
815
+ expect((_a = compiledTestService.match(/^\*\sService start;$/gm)) === null || _a === void 0 ? void 0 : _a.length).toEqual(1);
816
+ return [2 /*return*/];
817
+ }
818
+ });
819
+ }); });
788
820
  });
789
821
  });
790
822
  var prefixConfigWithPath = function (prefixPath) { return ({
@@ -1,8 +1,8 @@
1
- import { TestResults } from '../../../types';
1
+ import { TestResults, TestResultCsv } from '../../../types';
2
2
  export declare const saveLog: (outDirectory: string, test: string, log: string, lineBreak?: boolean) => Promise<void>;
3
3
  export declare const saveResultJson: (outDirectory: string, result: TestResults) => Promise<string | false>;
4
4
  export declare const saveResultCsv: (outDirectory: string, result: TestResults, options?: {}) => Promise<{
5
- csvData: {}[];
5
+ csvData: TestResultCsv[];
6
6
  csvPath: string;
7
7
  }>;
8
8
  export declare const saveResultXml: (outDirectory: string, result: TestResults) => Promise<string>;
@@ -19,5 +19,15 @@ exports.testResponses = {
19
19
  TEST_DESCRIPTION: 'examplemacro test.1 description',
20
20
  TEST_RESULT: 'PASS'
21
21
  }
22
+ ],
23
+ 'notexisting.test': [
24
+ {
25
+ TEST_DESCRIPTION: 'examplemacro test.1 description',
26
+ TEST_RESULT: 'PASS'
27
+ },
28
+ {
29
+ TEST_DESCRIPTION: 'examplemacro test.1 description',
30
+ TEST_RESULT: 'FAIL'
31
+ }
22
32
  ]
23
33
  };
@@ -71,6 +71,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
71
71
  Object.defineProperty(exports, "__esModule", { value: true });
72
72
  var path_1 = __importDefault(require("path"));
73
73
  var test_1 = require("../test");
74
+ var types_1 = require("../../../types");
74
75
  var utils_1 = require("@sasjs/utils");
75
76
  var test_2 = require("../../../utils/test");
76
77
  var setConstants_1 = require("../../../utils/setConstants");
@@ -78,6 +79,9 @@ var dotenv_1 = __importDefault(require("dotenv"));
78
79
  var __1 = require("../..");
79
80
  var sasJsModules = __importStar(require("../../../utils/createSASjsInstance"));
80
81
  var testResponses_1 = require("./mockedAdapter/testResponses");
82
+ var fileModule = __importStar(require("@sasjs/utils/file"));
83
+ var utilsModule = __importStar(require("@sasjs/utils/utils"));
84
+ var chalk_1 = __importDefault(require("chalk"));
81
85
  describe('sasjs test', function () {
82
86
  var expectedCoverageLcov = "TN:testsetup.sas\nSF:standalone\nFNF:1\nFNH:1\nLF:1\nLH:1\nBRF:1\nBRH:1\nend_of_record\nTN:exampleprogram.test.sas\nSF:jobs/jobs/exampleprogram.sas\nFNF:1\nFNH:1\nLF:1\nLH:1\nBRF:1\nBRH:1\nend_of_record\nTN:standalone.test.sas\nSF:standalone\nFNF:1\nFNH:1\nLF:1\nLH:1\nBRF:1\nBRH:1\nend_of_record\nTN:examplemacro.test.sas\nSF:standalone\nFNF:1\nFNH:1\nLF:1\nLH:1\nBRF:1\nBRH:1\nend_of_record\nTN:shouldFail.test.sas\nSF:standalone\nFNF:1\nFNH:1\nLF:1\nLH:1\nBRF:1\nBRH:1\nend_of_record\nTN:dostuff.test.0.sas\nSF:services/admin/dostuff.sas\nFNF:1\nFNH:1\nLF:1\nLH:1\nBRF:1\nBRH:1\nend_of_record\nTN:dostuff.test.1.sas\nSF:services/admin/dostuff.sas\nFNF:1\nFNH:1\nLF:1\nLH:1\nBRF:1\nBRH:1\nend_of_record\nTN:testteardown.sas\nSF:standalone\nFNF:1\nFNH:1\nLF:1\nLH:1\nBRF:1\nBRH:1\nend_of_record";
83
87
  describe('SASVIYA', function () {
@@ -576,6 +580,25 @@ describe('sasjs test', function () {
576
580
  }
577
581
  });
578
582
  }); });
583
+ it('should FAIL test suit if any test has status FAIL', function () { return __awaiter(void 0, void 0, void 0, function () {
584
+ var testService;
585
+ return __generator(this, function (_a) {
586
+ switch (_a.label) {
587
+ case 0:
588
+ testService = 'notexisting';
589
+ jest.spyOn(process.logger, 'table');
590
+ jest.spyOn(utilsModule, 'uuidv4').mockImplementation(function () { return 'uuidv4'; });
591
+ jest.spyOn(fileModule, 'readFile').mockImplementation(function () {
592
+ return Promise.resolve("{\n \"tests\": [\n \"tests/macros/".concat(testService, ".test.sas\"\n ],\n \"testSetUp\": \"\",\n \"testTearDown\": \"\"\n}"));
593
+ });
594
+ return [4 /*yield*/, (0, test_1.runTest)(target, undefined, undefined, undefined)];
595
+ case 1:
596
+ _a.sent();
597
+ expect(process.logger.table).toHaveBeenCalledWith([['uuidv4', testService, chalk_1.default.redBright(types_1.TestResultStatus.fail)]], { head: ['SASjs Test ID', 'Test Target', 'Test Suite Result'] });
598
+ return [2 /*return*/];
599
+ }
600
+ });
601
+ }); });
579
602
  });
580
603
  });
581
604
  function generateTarget(serverType) {
@@ -86,11 +86,12 @@ var path_1 = __importDefault(require("path"));
86
86
  var chalk_1 = __importDefault(require("chalk"));
87
87
  var utils_2 = require("../../utils/utils");
88
88
  var createSASjsInstance_1 = require("../../utils/createSASjsInstance");
89
+ // interface
89
90
  function runTest(target, testRegExps, outDirectory, flowSourcePath) {
90
91
  var _a, _b;
91
92
  if (testRegExps === void 0) { testRegExps = []; }
92
93
  return __awaiter(this, void 0, void 0, function () {
93
- var testFlowData, testFlow, flow, sasjs, authConfig, username, password, _c, sas9CredentialsError, e_1, result, isCodeExamplePrinted, printCodeExample, jsonPath, xmlPath, _d, csvData, csvPath, coverageReportPath, resultTable, testsCount, passedTestsCount, testsWithResultsCount;
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;
94
95
  var _this = this;
95
96
  return __generator(this, function (_e) {
96
97
  switch (_e.label) {
@@ -300,7 +301,8 @@ function runTest(target, testRegExps, outDirectory, flowSourcePath) {
300
301
  });
301
302
  }
302
303
  }
303
- else if (target.serverType !== utils_1.ServerType.Sasjs) {
304
+ else if (target.serverType === utils_1.ServerType.SasViya ||
305
+ target.serverType === utils_1.ServerType.Sas9) {
304
306
  (0, displayResult_1.displayError)({}, "'test_results' not found in server response, to debug click ".concat(testUrl));
305
307
  printCodeExample();
306
308
  }
@@ -353,11 +355,26 @@ function runTest(target, testRegExps, outDirectory, flowSourcePath) {
353
355
  coverageReportPath = _e.sent();
354
356
  resultTable = {};
355
357
  if (Array.isArray(csvData)) {
356
- csvData.forEach(function (item) {
357
- return (resultTable[item.sasjs_test_id] = {
358
- test_target: item.test_target,
359
- test_suite_result: item.test_suite_result
358
+ testSuites = csvData.reduce(function (acc, item) {
359
+ if (!acc.filter(function (i) { return i.sasjs_test_id === item.sasjs_test_id; }).length)
360
+ acc.push(item);
361
+ return acc;
362
+ }, []);
363
+ testSuites.forEach(function (test) {
364
+ var passedTests = csvData.filter(function (item) {
365
+ return item.sasjs_test_id === test.sasjs_test_id &&
366
+ item.test_suite_result === types_1.TestResultStatus.pass;
360
367
  });
368
+ var failedTests = csvData.filter(function (item) {
369
+ return item.sasjs_test_id === test.sasjs_test_id &&
370
+ item.test_suite_result === types_1.TestResultStatus.fail;
371
+ });
372
+ resultTable[test.sasjs_test_id] = {
373
+ test_target: test.test_target,
374
+ test_suite_result: passedTests.length && !failedTests.length
375
+ ? types_1.TestResultStatus.pass
376
+ : types_1.TestResultStatus.fail
377
+ };
361
378
  });
362
379
  }
363
380
  (_a = process.logger) === null || _a === void 0 ? void 0 : _a.table(Object.keys(resultTable).map(function (key) { return [
@@ -2,6 +2,6 @@ export { CommandBase } from './command/commandBase';
2
2
  export { File, FilePath } from './file';
3
3
  export { Folder } from './folder';
4
4
  export { TargetScope } from './targetScope';
5
- export { TestFlow, Coverage, CoverageType, CoverageState, TestResults, TestResultStatus, TestDescription, TestResult, TestResultDescription } from './testing';
5
+ export { TestFlow, Coverage, CoverageType, CoverageState, TestResults, TestResultStatus, TestDescription, TestResult, TestResultDescription, TestResultCsv } from './testing';
6
6
  export { Flow, FlowWave, FlowWaveJob } from './flow';
7
7
  export { ServicePack, ServicePackMember } from './servicePack';
@@ -42,3 +42,11 @@ export interface TestResult {
42
42
  export interface TestResults {
43
43
  sasjs_test_meta: TestDescription[];
44
44
  }
45
+ export interface TestResultCsv {
46
+ test_target: string;
47
+ test_loc: string;
48
+ sasjs_test_id: string;
49
+ test_suite_result: TestResultStatus.pass | TestResultStatus.fail;
50
+ test_description: string;
51
+ test_url: string;
52
+ }
@@ -413,6 +413,9 @@ var updateTarget = function (targetJson, targetName, isLocal) {
413
413
  targetIndex = config.targets.findIndex(function (t) { return t.name === targetName; });
414
414
  if (!(targetIndex >= 0)) return [3 /*break*/, 9];
415
415
  config.targets.splice(targetIndex, 1, __assign(__assign({}, config.targets[targetIndex]), targetJson));
416
+ config = __assign(__assign({}, config), { targets: config.targets.map(function (target) { return (__assign(__assign({}, target), { serverUrl: process.env["".concat(target.serverType === types_1.ServerType.SasViya
417
+ ? 'VIYA'
418
+ : target.serverType, "_SERVER_URL")] })); }) });
416
419
  if (!isLocal) return [3 /*break*/, 6];
417
420
  return [4 /*yield*/, (0, config_1.saveLocalConfigFile)(JSON.stringify(config, null, 2))];
418
421
  case 5:
package/package.json CHANGED
@@ -47,10 +47,10 @@
47
47
  "access": "public"
48
48
  },
49
49
  "dependencies": {
50
- "@sasjs/adapter": "3.8.0",
50
+ "@sasjs/adapter": "3.8.1",
51
51
  "@sasjs/core": "4.15.3",
52
52
  "@sasjs/lint": "1.11.2",
53
- "@sasjs/utils": "2.40.1",
53
+ "@sasjs/utils": "2.41.0",
54
54
  "chalk": "4.1.2",
55
55
  "csv-stringify": "5.6.5",
56
56
  "dotenv": "10.0.0",
@@ -94,5 +94,5 @@
94
94
  "typescript": "4.5.4",
95
95
  "util": "0.12.4"
96
96
  },
97
- "version": "3.12.1"
97
+ "version": "3.12.4"
98
98
  }