UNPKG

theia-extension-tester

Version:

A testing library built on Selenium to test Eclipse Theia extensions / plugins. Eclipse Che is supported as well.

194 lines 7.91 kB
"use strict"; 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()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.CheExTester = exports.TheiaExTester = void 0; const fs = require("fs-extra"); const path = require("path"); const options_1 = require("./options"); const _1 = require("./"); const dotenv_1 = require("dotenv"); const parser_1 = require("./parser"); const adapters_1 = require("@theia-extension-tester/adapters"); const TRUE_STRINGS = ['true', '1', 'yes', 'y']; const FALSE_STRINGS = ['false', '0', 'no', 'n']; class ExTester { constructor(options, defaultOptions) { this._frontendOptions = options !== null && options !== void 0 ? options : {}; this._backendOptions = this.getBackendOptions(defaultOptions); } get frontendOptions() { return this._frontendOptions; } get backendOptions() { return this._backendOptions; } getBackendOptions(defaultOptions) { const options = this._frontendOptions; let output = Object.assign({}, options); for (const key of Object.keys(defaultOptions)) { output[key] = options[key] !== undefined ? options[key] : defaultOptions[key]; } return output; } } class TheiaExTester extends ExTester { constructor(options) { super(options, options_1.THEIA_DEFAULT_OPTIONS); } runTests() { return __awaiter(this, void 0, void 0, function* () { adapters_1.theia(); const browser = yield createBrowser(this.backendOptions, _1.TheiaBrowser); let folder = this.backendOptions[options_1.FOLDER_OPTION]; let filesToCopy = this.backendOptions[options_1.COPY_FILES_OPTION]; if (filesToCopy !== undefined) { if (folder === undefined) { throw new Error(`Cannot use --${options_1.COPY_FILES_OPTION} without --${options_1.FOLDER_OPTION}.`); } yield prepareWorkspace(folder); for (const file of filesToCopy) { yield copyFile(file, path.join(folder, path.basename(file))); } } const runner = new _1.TheiaBrowserRunner(browser, { theiaUrl: this.backendOptions[options_1.URL_OPTION], openFolder: folder, mochaOptions: yield parser_1.parseObjectJsonArgument({ object: this.backendOptions[options_1.MOCHA_OPTION], optional: true, name: options_1.MOCHA_OPTION }), query: yield parser_1.parseObjectJsonArgument({ object: this.backendOptions[options_1.QUERY_OPTION], optional: true, name: options_1.QUERY_OPTION, }) }); return yield runner.runTests(this.backendOptions[options_1.TESTS_ARGUMENT]); }); } } exports.TheiaExTester = TheiaExTester; class CheExTester extends ExTester { constructor(options) { super(options, options_1.CHE_DEFAULT_OPTIONS); } runTests() { return __awaiter(this, void 0, void 0, function* () { try { adapters_1.theia(); } catch (e) { if (!(e instanceof adapters_1.AdapterModuleNotFound)) { throw e; } } if (this.backendOptions[options_1.ENV_OPTION]) { dotenv_1.config({ path: this.backendOptions[options_1.ENV_OPTION] }); } const browser = yield createBrowser(this.backendOptions, _1.CheTheiaBrowser); const runner = new _1.CheTheiaFactoryRunner(browser, { cheUrl: this.backendOptions[options_1.URL_OPTION], factoryUrl: this.backendOptions[options_1.DEVFILE_ARGUMENT], mochaOptions: yield parser_1.parseObjectJsonArgument({ object: this.backendOptions[options_1.MOCHA_OPTION], optional: true, name: options_1.MOCHA_OPTION }), factoryAttributes: yield parser_1.parseObjectJsonArgument({ object: this.backendOptions[options_1.DEVFILE_ATTRIBUTES_OPTIONS], optional: true, name: options_1.DEVFILE_ATTRIBUTES_OPTIONS }) }, createAuthenticator(this.backendOptions)); return yield runner.runTests(this.backendOptions[options_1.TESTS_ARGUMENT]); }); } } exports.CheExTester = CheExTester; function createBrowser(options, ctor) { return __awaiter(this, void 0, void 0, function* () { return new ctor(parser_1.getBrowserName(options[options_1.BROWSER_OPTION]), { browserLocation: yield parser_1.getBrowserLocation(options[options_1.BROWSER_OPTION]), cleanSession: options[options_1.CLEAN_OPTION], driverLocation: options[options_1.DRIVER_OPTION], logLevel: options[options_1.LOG_OPTION], timeouts: yield parser_1.parseObjectJsonArgument({ object: options.timeouts, optional: true, name: 'timeouts' }) }); }); } function createAuthenticator(options) { if (options_1.isAuthenticationOptionSupported(options)) { switch (options[options_1.AUTHENTICATION_OPTION]) { case 'openshift': return createOpenshiftAuthenticator(); default: throw new Error(`Unsupported authentication method "${options[options_1.AUTHENTICATION_OPTION]}".`); } } } function createOpenshiftAuthenticator() { var _a; const errors = []; if (process.env.CHE_USERNAME === undefined) { errors.push('CHE_USERNAME is not defined'); } if (process.env.CHE_PASSWORD === undefined) { errors.push('CHE_PASSWORD is not defined'); } if (errors.length > 0) { throw new Error(errors.join('\n')); } return new _1.OpenShiftAuthenticator({ inputData: [ { name: 'username', value: process.env.CHE_USERNAME }, { name: 'password', value: process.env.CHE_PASSWORD } ], multiStepForm: process.env.CHE_MULTI_STEP_FORM ? stringToBoolean(process.env.CHE_MULTI_STEP_FORM) : true, loginMethod: (_a = process.env.CHE_LOGIN_METHOD) !== null && _a !== void 0 ? _a : 'DevSandbox' }); } function stringToBoolean(str) { str = str.trim().toLocaleLowerCase(); if (TRUE_STRINGS.includes(str)) { return true; } if (FALSE_STRINGS.includes(str)) { return false; } throw new TypeError(`Invalid value "${str}".`); } function prepareWorkspace(workspace) { return __awaiter(this, void 0, void 0, function* () { yield fs.remove(workspace); yield fs.mkdir(workspace); return workspace; }); } function copyFile(source, destination) { return __awaiter(this, void 0, void 0, function* () { yield fs.copy(source, destination); return destination; }); } //# sourceMappingURL=api.js.map