UNPKG

@sasjs/cli

Version:

Command line interface for SASjs

814 lines (813 loc) 40.6 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { 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; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var config_1 = require("../config"); var authUtils = __importStar(require("../auth")); var fileUtils = __importStar(require("@sasjs/utils/file")); var dotenv_1 = __importDefault(require("dotenv")); var path_1 = __importDefault(require("path")); var utils_1 = require("@sasjs/utils"); var test_1 = require("../test"); var setConstants_1 = require("../setConstants"); describe('getAccessToken', function () { beforeEach(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: process.projectDir = process.cwd(); return [4 /*yield*/, (0, setConstants_1.setConstants)()]; case 1: _a.sent(); dotenv_1.default.config(); process.env.ACCESS_TOKEN = undefined; process.env.CLIENT = undefined; process.env.SECRET = undefined; return [2 /*return*/]; } }); }); }); afterEach(function () { process.env.ACCESS_TOKEN = undefined; process.env.CLIENT = undefined; process.env.SECRET = undefined; process.env.REFRESH_TOKEN = undefined; jest.resetAllMocks(); }); it('should get access token from authInfo', function () { return __awaiter(void 0, void 0, void 0, function () { var target, token; return __generator(this, function (_a) { switch (_a.label) { case 0: target = { authConfig: { access_token: 'T0K3N' } }; return [4 /*yield*/, (0, config_1.getAccessToken)(target, false)]; case 1: token = _a.sent(); expect(token).toEqual('T0K3N'); return [2 /*return*/]; } }); }); }); it('should prioritise the access token from matching env file if available', function () { return __awaiter(void 0, void 0, void 0, function () { var target, token; return __generator(this, function (_a) { switch (_a.label) { case 0: process.env.ACCESS_TOKEN = '3NVT0K3N'; target = { name: 'ConfigTest' }; return [4 /*yield*/, (0, utils_1.createFile)(path_1.default.join(__dirname, '.env.ConfigTest'), 'ACCESS_TOKEN=T4RG3TT0K3N')]; case 1: _a.sent(); process.projectDir = __dirname; return [4 /*yield*/, (0, setConstants_1.setConstants)()]; case 2: _a.sent(); return [4 /*yield*/, (0, config_1.getAccessToken)(target, false)]; case 3: token = _a.sent(); expect(token).toEqual('T4RG3TT0K3N'); return [4 /*yield*/, (0, utils_1.deleteFile)(path_1.default.join(__dirname, '.env.ConfigTest'))]; case 4: _a.sent(); return [2 /*return*/]; } }); }); }); it('should throw an error when access token is unavailable', function () { return __awaiter(void 0, void 0, void 0, function () { var target; return __generator(this, function (_a) { switch (_a.label) { case 0: target = { authConfig: { access_token: '' } }; return [4 /*yield*/, expect((0, config_1.getAccessToken)(target, false)).rejects.toThrow()]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }); it('should throw an error when auth config is unavailable', function () { return __awaiter(void 0, void 0, void 0, function () { var target; return __generator(this, function (_a) { switch (_a.label) { case 0: target = null; return [4 /*yield*/, expect((0, config_1.getAccessToken)(target, false)).rejects.toThrow()]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }); it('should get access token from environment', function () { return __awaiter(void 0, void 0, void 0, function () { var target, token; return __generator(this, function (_a) { switch (_a.label) { case 0: target = null; process.env.ACCESS_TOKEN = '3NVT0K3N'; return [4 /*yield*/, (0, config_1.getAccessToken)(target, false)]; case 1: token = _a.sent(); expect(token).toEqual('3NVT0K3N'); return [2 /*return*/]; } }); }); }); it('should refresh access token when it is expiring and refresh token is available & not expired', function () { return __awaiter(void 0, void 0, void 0, function () { var target, token; return __generator(this, function (_a) { switch (_a.label) { case 0: jest .spyOn(authUtils, 'isAccessTokenExpiring') .mockImplementation(function () { return true; }); jest .spyOn(authUtils, 'isRefreshTokenExpiring') .mockImplementation(function () { return false; }); jest.spyOn(authUtils, 'getNewAccessToken'); jest.spyOn(authUtils, 'refreshTokens').mockImplementation(function () { return Promise.resolve({ access_token: 'N3WT0K3N' }); }); target = { authConfig: { access_token: 'T0K3N', refresh_token: 'R3FR35H', client: 'CL13NT', secret: '53CR3T' } }; return [4 /*yield*/, (0, config_1.getAccessToken)(target, true)]; case 1: token = _a.sent(); expect(authUtils.isAccessTokenExpiring).toHaveBeenCalledTimes(1); expect(authUtils.isRefreshTokenExpiring).toHaveBeenCalledTimes(1); expect(authUtils.refreshTokens).toHaveBeenCalledTimes(1); expect(authUtils.getNewAccessToken).not.toHaveBeenCalled(); expect(token).toEqual('N3WT0K3N'); return [2 /*return*/]; } }); }); }); it('should get new access token when it is expiring and refresh token is available & expired', function () { return __awaiter(void 0, void 0, void 0, function () { var target, token; return __generator(this, function (_a) { switch (_a.label) { case 0: jest .spyOn(authUtils, 'isAccessTokenExpiring') .mockImplementation(function () { return true; }); jest .spyOn(authUtils, 'isRefreshTokenExpiring') .mockImplementation(function () { return true; }); jest.spyOn(authUtils, 'refreshTokens'); jest.spyOn(authUtils, 'getNewAccessToken').mockImplementation(function () { return Promise.resolve({ access_token: 'N3WT0K3N' }); }); target = { authConfig: { access_token: 'T0K3N', refresh_token: 'R3FR35H', client: 'CL13NT', secret: '53CR3T' } }; process.env.REFRESH_TOKEN = undefined; return [4 /*yield*/, (0, config_1.getAccessToken)(target, true)]; case 1: token = _a.sent(); expect(authUtils.isAccessTokenExpiring).toHaveBeenCalledTimes(1); expect(authUtils.isRefreshTokenExpiring).toHaveBeenCalledTimes(1); expect(authUtils.refreshTokens).not.toHaveBeenCalled(); expect(authUtils.getNewAccessToken).toHaveBeenCalledTimes(1); expect(token).toEqual('N3WT0K3N'); return [2 /*return*/]; } }); }); }); it('should get new access token when it is expiring and refresh token is not available', function () { return __awaiter(void 0, void 0, void 0, function () { var target, token; return __generator(this, function (_a) { switch (_a.label) { case 0: jest .spyOn(authUtils, 'isAccessTokenExpiring') .mockImplementation(function () { return true; }); jest .spyOn(authUtils, 'isRefreshTokenExpiring') .mockImplementation(function () { return true; }); jest.spyOn(authUtils, 'refreshTokens'); jest.spyOn(authUtils, 'getNewAccessToken').mockImplementation(function () { return Promise.resolve({ access_token: 'N3WT0K3N' }); }); target = { authConfig: { access_token: 'T0K3N', client: 'CL13NT', secret: '53CR3T' } }; process.env.REFRESH_TOKEN = undefined; return [4 /*yield*/, (0, config_1.getAccessToken)(target, true)]; case 1: token = _a.sent(); expect(authUtils.isAccessTokenExpiring).toHaveBeenCalledTimes(1); expect(authUtils.isRefreshTokenExpiring).toHaveBeenCalledTimes(1); expect(authUtils.refreshTokens).not.toHaveBeenCalled(); expect(authUtils.getNewAccessToken).toHaveBeenCalledTimes(1); expect(token).toEqual('N3WT0K3N'); return [2 /*return*/]; } }); }); }); it('should throw an error if access token is expiring and client ID is not available', function () { return __awaiter(void 0, void 0, void 0, function () { var target; return __generator(this, function (_a) { switch (_a.label) { case 0: jest .spyOn(authUtils, 'isAccessTokenExpiring') .mockImplementation(function () { return true; }); target = { authConfig: { access_token: 'T0K3N', secret: '53CR3T' } }; process.env.CLIENT = undefined; return [4 /*yield*/, expect((0, config_1.getAccessToken)(target)).rejects.toThrow()]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }); it('should throw an error if access token is expiring and client secret is not available', function () { return __awaiter(void 0, void 0, void 0, function () { var target; return __generator(this, function (_a) { switch (_a.label) { case 0: jest .spyOn(authUtils, 'isAccessTokenExpiring') .mockImplementation(function () { return true; }); target = { authConfig: { access_token: 'T0K3N', client: 'CL13NT' } }; process.env.SECRET = undefined; return [4 /*yield*/, expect((0, config_1.getAccessToken)(target)).rejects.toThrow()]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }); }); describe('sanitizeAppLoc', function () { var notValidAppLoc = '///Public/app///'; var validAppLoc = '/Public/app'; it('should remove trailing slash', function () { expect((0, config_1.sanitizeAppLoc)(notValidAppLoc)).toEqual(validAppLoc); }); it('should remove multiple leading slashes', function () { expect((0, config_1.sanitizeAppLoc)(notValidAppLoc)).toEqual(validAppLoc); }); notValidAppLoc = 'Public/app///'; it('should add leading slash', function () { expect((0, config_1.sanitizeAppLoc)(notValidAppLoc)).toEqual(validAppLoc); }); }); describe('overrideEnvVariables', function () { it('should do nothing when the target name is falsy', function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: jest.spyOn(fileUtils, 'readFile'); jest.spyOn(dotenv_1.default, 'parse'); return [4 /*yield*/, (0, config_1.overrideEnvVariables)('')]; case 1: _a.sent(); expect(fileUtils.readFile).not.toHaveBeenCalled(); expect(dotenv_1.default.parse).not.toHaveBeenCalled(); return [2 /*return*/]; } }); }); }); it('should display a warning when the target env file is not found', function () { return __awaiter(void 0, void 0, void 0, function () { var _a; return __generator(this, function (_b) { switch (_b.label) { case 0: process.logger = new utils_1.Logger(utils_1.LogLevel.Off); process.projectDir = __dirname; return [4 /*yield*/, (0, setConstants_1.setConstants)()]; case 1: _b.sent(); jest .spyOn(fileUtils, 'readFile') .mockImplementationOnce(function () { return Promise.reject(); }); jest.spyOn(process.logger, 'warn'); jest.spyOn(dotenv_1.default, 'parse'); return [4 /*yield*/, (0, config_1.overrideEnvVariables)('test')]; case 2: _b.sent(); expect((_a = process.logger) === null || _a === void 0 ? void 0 : _a.warn).toHaveBeenCalledWith('A .env.test file was not found in your project directory. Defaulting to variables from the main .env file.'); expect(dotenv_1.default.parse).not.toHaveBeenCalled(); return [2 /*return*/]; } }); }); }); it('should override env variables with values from the target-specific file', function () { return __awaiter(void 0, void 0, void 0, function () { var _a; return __generator(this, function (_b) { switch (_b.label) { case 0: process.logger = new utils_1.Logger(utils_1.LogLevel.Off); process.projectDir = __dirname; return [4 /*yield*/, (0, setConstants_1.setConstants)()]; case 1: _b.sent(); jest .spyOn(fileUtils, 'readFile') .mockImplementationOnce(function () { return Promise.resolve('ACCESS_TOKEN=T4RG3TT0K3N'); }); jest.spyOn(process.logger, 'warn'); jest.spyOn(dotenv_1.default, 'parse'); return [4 /*yield*/, (0, config_1.overrideEnvVariables)('OverrideTest')]; case 2: _b.sent(); expect((_a = process.logger) === null || _a === void 0 ? void 0 : _a.warn).not.toHaveBeenCalled(); expect(dotenv_1.default.parse).toHaveBeenCalledWith('ACCESS_TOKEN=T4RG3TT0K3N'); expect(process.env.ACCESS_TOKEN).toEqual('T4RG3TT0K3N'); return [2 /*return*/]; } }); }); }); }); describe('saveToGlobalConfig', function () { beforeEach(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: process.projectDir = __dirname; return [4 /*yield*/, (0, setConstants_1.setConstants)()]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }); it('should set the target as default when isDefault is true', function () { return __awaiter(void 0, void 0, void 0, function () { var appName, target, config, configTarget; var _a; return __generator(this, function (_b) { switch (_b.label) { case 0: appName = 'cli-tests-config-' + (0, utils_1.generateTimestamp)(); target = (0, test_1.generateTestTarget)(appName, "/Public/app/cli-tests/".concat(appName)); return [4 /*yield*/, (0, config_1.saveToGlobalConfig)(target, true)]; case 1: _b.sent(); return [4 /*yield*/, (0, config_1.getGlobalRcFile)()]; case 2: config = (_b.sent()); expect(config.defaultTarget).toEqual(target.name); configTarget = (_a = config.targets) === null || _a === void 0 ? void 0 : _a.find(function (t) { return t.name === target.name; }); expect(configTarget).toBeTruthy(); return [4 /*yield*/, (0, config_1.removeFromGlobalConfig)(target.name)]; case 3: _b.sent(); return [2 /*return*/]; } }); }); }); it('should not set the target as default when isDefault is false', function () { return __awaiter(void 0, void 0, void 0, function () { var appName, target, config, configTarget; var _a; return __generator(this, function (_b) { switch (_b.label) { case 0: appName = 'cli-tests-config-' + (0, utils_1.generateTimestamp)(); target = (0, test_1.generateTestTarget)(appName, "/Public/app/cli-tests/".concat(appName)); return [4 /*yield*/, (0, config_1.saveToGlobalConfig)(target, false)]; case 1: _b.sent(); return [4 /*yield*/, (0, config_1.getGlobalRcFile)()]; case 2: config = (_b.sent()); expect(config.defaultTarget).not.toEqual(target.name); configTarget = (_a = config.targets) === null || _a === void 0 ? void 0 : _a.find(function (t) { return t.name === target.name; }); expect(configTarget).toBeTruthy(); return [4 /*yield*/, (0, config_1.removeFromGlobalConfig)(target.name)]; case 3: _b.sent(); return [2 /*return*/]; } }); }); }); }); describe('removeFromGlobalConfig', function () { beforeEach(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: process.projectDir = __dirname; return [4 /*yield*/, (0, setConstants_1.setConstants)()]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }); it('should reset the default target when that target is removed', function () { return __awaiter(void 0, void 0, void 0, function () { var appName, target, config, configTarget; var _a; return __generator(this, function (_b) { switch (_b.label) { case 0: appName = 'cli-tests-config-' + (0, utils_1.generateTimestamp)(); target = (0, test_1.generateTestTarget)(appName, "/Public/app/cli-tests/".concat(appName)); return [4 /*yield*/, (0, config_1.saveToGlobalConfig)(target, true)]; case 1: _b.sent(); return [4 /*yield*/, (0, config_1.getGlobalRcFile)()]; case 2: config = (_b.sent()); expect(config.defaultTarget).toEqual(target.name); return [4 /*yield*/, (0, config_1.removeFromGlobalConfig)(target.name)]; case 3: _b.sent(); return [4 /*yield*/, (0, config_1.getGlobalRcFile)()]; case 4: config = (_b.sent()); configTarget = (_a = config.targets) === null || _a === void 0 ? void 0 : _a.find(function (t) { return t.name === target.name; }); expect(configTarget).toBeFalsy(); expect(config.defaultTarget).toEqual(''); return [2 /*return*/]; } }); }); }); it('should not change the default target when another target is removed', function () { return __awaiter(void 0, void 0, void 0, function () { var appName1, appName2, target1, target2, config, configTarget1, configTarget2; var _a, _b, _c; return __generator(this, function (_d) { switch (_d.label) { case 0: appName1 = 'cli-tests-config-1-' + (0, utils_1.generateTimestamp)(); appName2 = 'cli-tests-config-2-' + (0, utils_1.generateTimestamp)(); target1 = (0, test_1.generateTestTarget)(appName1, "/Public/app/cli-tests/".concat(appName1)); target2 = (0, test_1.generateTestTarget)(appName2, "/Public/app/cli-tests/".concat(appName2)); return [4 /*yield*/, (0, config_1.saveToGlobalConfig)(target1, true)]; case 1: _d.sent(); return [4 /*yield*/, (0, config_1.saveToGlobalConfig)(target2, false)]; case 2: _d.sent(); return [4 /*yield*/, (0, config_1.getGlobalRcFile)()]; case 3: config = (_d.sent()); expect(config.defaultTarget).toEqual(target1.name); configTarget1 = (_a = config.targets) === null || _a === void 0 ? void 0 : _a.find(function (t) { return t.name === target1.name; }); expect(configTarget1).toBeTruthy(); configTarget2 = (_b = config.targets) === null || _b === void 0 ? void 0 : _b.find(function (t) { return t.name === target2.name; }); expect(configTarget2).toBeTruthy(); return [4 /*yield*/, (0, config_1.removeFromGlobalConfig)(target2.name)]; case 4: _d.sent(); return [4 /*yield*/, (0, config_1.getGlobalRcFile)()]; case 5: config = (_d.sent()); configTarget2 = (_c = config.targets) === null || _c === void 0 ? void 0 : _c.find(function (t) { return t.name === target2.name; }); expect(configTarget2).toBeFalsy(); expect(config.defaultTarget).toEqual(target1.name); return [2 /*return*/]; } }); }); }); }); describe('saveToLocalConfig', function () { var appName; beforeEach(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: appName = "cli-tests-config-".concat((0, utils_1.generateTimestamp)()); return [4 /*yield*/, (0, test_1.createTestMinimalApp)(__dirname, appName)]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }); afterEach(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, (0, test_1.removeTestApp)(__dirname, appName)]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }); it('should set the target as default when isDefault is true', function () { return __awaiter(void 0, void 0, void 0, function () { var appName, target, config, configTarget; var _a; return __generator(this, function (_b) { switch (_b.label) { case 0: appName = 'cli-tests-cb-' + (0, utils_1.generateTimestamp)(); target = (0, test_1.generateTestTarget)(appName, "/Public/app/cli-tests/".concat(appName)); return [4 /*yield*/, (0, config_1.saveToLocalConfig)(target, true)]; case 1: _b.sent(); return [4 /*yield*/, (0, config_1.getLocalConfig)()]; case 2: config = (_b.sent()); expect(config.defaultTarget).toEqual(target.name); configTarget = (_a = config.targets) === null || _a === void 0 ? void 0 : _a.find(function (t) { return t.name === target.name; }); expect(configTarget).toBeTruthy(); return [4 /*yield*/, (0, config_1.removeFromLocalConfig)(target.name)]; case 3: _b.sent(); return [2 /*return*/]; } }); }); }); it('should not set the target as default when isDefault is false', function () { return __awaiter(void 0, void 0, void 0, function () { var appName, target, config, configTarget; var _a; return __generator(this, function (_b) { switch (_b.label) { case 0: appName = 'cli-tests-cb-' + (0, utils_1.generateTimestamp)(); target = (0, test_1.generateTestTarget)(appName, "/Public/app/cli-tests/".concat(appName)); return [4 /*yield*/, (0, config_1.saveToLocalConfig)(target, false)]; case 1: _b.sent(); return [4 /*yield*/, (0, config_1.getLocalConfig)()]; case 2: config = (_b.sent()); expect(config.defaultTarget).not.toEqual(target.name); configTarget = (_a = config.targets) === null || _a === void 0 ? void 0 : _a.find(function (t) { return t.name === target.name; }); expect(configTarget).toBeTruthy(); return [4 /*yield*/, (0, config_1.removeFromLocalConfig)(target.name)]; case 3: _b.sent(); return [2 /*return*/]; } }); }); }); }); describe('removeFromLocalConfig', function () { var appName; beforeEach(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: appName = "cli-tests-config-".concat((0, utils_1.generateTimestamp)()); return [4 /*yield*/, (0, test_1.createTestMinimalApp)(__dirname, appName)]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }); afterEach(function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, (0, test_1.removeTestApp)(__dirname, appName)]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }); it('should reset the default target when that target is removed', function () { return __awaiter(void 0, void 0, void 0, function () { var appName, target, config, configTarget; var _a; return __generator(this, function (_b) { switch (_b.label) { case 0: appName = 'cli-tests-config-' + (0, utils_1.generateTimestamp)(); target = (0, test_1.generateTestTarget)(appName, "/Public/app/cli-tests/".concat(appName)); return [4 /*yield*/, (0, config_1.saveToLocalConfig)(target, true)]; case 1: _b.sent(); return [4 /*yield*/, (0, config_1.getLocalConfig)()]; case 2: config = (_b.sent()); expect(config.defaultTarget).toEqual(target.name); return [4 /*yield*/, (0, config_1.removeFromLocalConfig)(target.name)]; case 3: _b.sent(); return [4 /*yield*/, (0, config_1.getLocalConfig)()]; case 4: config = (_b.sent()); configTarget = (_a = config.targets) === null || _a === void 0 ? void 0 : _a.find(function (t) { return t.name === target.name; }); expect(configTarget).toBeFalsy(); expect(config.defaultTarget).toEqual(''); return [2 /*return*/]; } }); }); }); it('should not change the default target when another target is removed', function () { return __awaiter(void 0, void 0, void 0, function () { var appName1, appName2, target1, target2, config, configTarget1, configTarget2; var _a, _b, _c; return __generator(this, function (_d) { switch (_d.label) { case 0: appName1 = 'cli-tests-config-1-' + (0, utils_1.generateTimestamp)(); appName2 = 'cli-tests-config-2-' + (0, utils_1.generateTimestamp)(); target1 = (0, test_1.generateTestTarget)(appName1, "/Public/app/cli-tests/".concat(appName1)); target2 = (0, test_1.generateTestTarget)(appName2, "/Public/app/cli-tests/".concat(appName2)); return [4 /*yield*/, (0, config_1.saveToLocalConfig)(target1, true)]; case 1: _d.sent(); return [4 /*yield*/, (0, config_1.saveToLocalConfig)(target2, false)]; case 2: _d.sent(); return [4 /*yield*/, (0, config_1.getLocalConfig)()]; case 3: config = (_d.sent()); expect(config.defaultTarget).toEqual(target1.name); configTarget1 = (_a = config.targets) === null || _a === void 0 ? void 0 : _a.find(function (t) { return t.name === target1.name; }); expect(configTarget1).toBeTruthy(); configTarget2 = (_b = config.targets) === null || _b === void 0 ? void 0 : _b.find(function (t) { return t.name === target2.name; }); expect(configTarget2).toBeTruthy(); return [4 /*yield*/, (0, config_1.removeFromLocalConfig)(target2.name)]; case 4: _d.sent(); return [4 /*yield*/, (0, config_1.getLocalConfig)()]; case 5: config = (_d.sent()); configTarget2 = (_c = config.targets) === null || _c === void 0 ? void 0 : _c.find(function (t) { return t.name === target2.name; }); expect(configTarget2).toBeFalsy(); expect(config.defaultTarget).toEqual(target1.name); return [2 /*return*/]; } }); }); }); }); describe('getSASjs', function () { it('should set sasjsConfig according to target', function () { var target = { serverUrl: 'test_serverUrl', appLoc: 'test_appLoc', serverType: utils_1.ServerType.SasViya, contextName: 'test_contextName', httpsAgentOptions: { caPath: 'test_caPath', keyPath: 'test_keyPath', certPath: 'test_certPath', allowInsecureRequests: false } }; var sasjs = (0, config_1.getSASjs)(target); var sasjsConfig = sasjs.getSasjsConfig(); var serverUrl = sasjsConfig.serverUrl, appLoc = sasjsConfig.appLoc, serverType = sasjsConfig.serverType, contextName = sasjsConfig.contextName, httpsAgentOptions = sasjsConfig.httpsAgentOptions; expect(serverUrl).toEqual(target.serverUrl); expect(appLoc).toEqual(target.appLoc); expect(serverType).toEqual(target.serverType); expect(contextName).toEqual(target.contextName); expect(httpsAgentOptions).toEqual(target.httpsAgentOptions); }); it('should set debug to true by default', function () { var sasjs = (0, config_1.getSASjs)({}); var sasjsConfig = sasjs.getSasjsConfig(); var debug = sasjsConfig.debug; expect(debug).toEqual(true); }); it('should set useComputeApi to true if server type is Viya', function () { var sasjs = (0, config_1.getSASjs)({ serverType: utils_1.ServerType.SasViya }); var sasjsConfig = sasjs.getSasjsConfig(); var useComputeApi = sasjsConfig.useComputeApi; expect(useComputeApi).toEqual(true); }); it('should set useComputeApi to false if server type is not Viya', function () { var sasjs = (0, config_1.getSASjs)({ serverType: utils_1.ServerType.Sas9 }); var sasjsConfig = sasjs.getSasjsConfig(); var useComputeApi = sasjsConfig.useComputeApi; expect(useComputeApi).toEqual(false); sasjs = (0, config_1.getSASjs)({ serverType: utils_1.ServerType.Sasjs }); sasjsConfig = sasjs.getSasjsConfig(); useComputeApi = sasjsConfig.useComputeApi; expect(useComputeApi).toEqual(false); }); it("should enable verbose mode if VERBOSE env is present and is equal to 'on'(case insensitive)", function () { process.env.VERBOSE = 'on'; var sasjs = (0, config_1.getSASjs)({}); var sasjsConfig = sasjs.getSasjsConfig(); var verbose = sasjsConfig.verbose; expect(verbose).toEqual(true); process.env.VERBOSE = 'ON'; sasjs = (0, config_1.getSASjs)({}); sasjsConfig = sasjs.getSasjsConfig(); verbose = sasjsConfig.verbose; expect(verbose).toEqual(true); }); it("should enable verbose mode if LOG_LEVEL env is present and is equal to 'trace'(case insensitive)", function () { process.env.LOG_LEVEL = 'trace'; var sasjs = (0, config_1.getSASjs)({}); var sasjsConfig = sasjs.getSasjsConfig(); var verbose = sasjsConfig.verbose; expect(verbose).toEqual(true); process.env.LOG_LEVEL = 'TRACE'; sasjs = (0, config_1.getSASjs)({}); sasjsConfig = sasjs.getSasjsConfig(); verbose = sasjsConfig.verbose; expect(verbose).toEqual(true); }); it('should disable verbose mode if VERBOSE and LOG_LEVEL env are not present', function () { process.env.VERBOSE = ''; process.env.LOG_LEVEL = ''; var sasjs = (0, config_1.getSASjs)({}); var sasjsConfig = sasjs.getSasjsConfig(); var verbose = sasjsConfig.verbose; expect(verbose).toEqual(false); }); it("should disable verbose mode if VERBOSE env is present and is not equal to 'on'(case insensitive) and LOG_LEVEL env is present and is not equal to 'trace'(case insensitive)", function () { process.env.VERBOSE = 'start'; process.env.LOG_LEVEL = 'Info'; var sasjs = (0, config_1.getSASjs)({}); var sasjsConfig = sasjs.getSasjsConfig(); var verbose = sasjsConfig.verbose; expect(verbose).toEqual(false); }); });