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
JavaScript
;
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