flagpole
Version:
Simple and fast DOM integration, headless or headful browser, and REST API testing framework.
224 lines • 8.32 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const config_1 = require("./config");
const clortho_lite_1 = require("clortho-lite");
const cli_helper_1 = require("./cli-helper");
const util_1 = require("../util");
const fs = require('fs');
const path = require('path');
class Cli {
static isInitialized() {
return (Cli.configPath && fs.existsSync(Cli.configPath) &&
Cli.config && Cli.config.isValid());
}
static log(message) {
if (typeof message !== 'undefined') {
Cli.consoleLog.push(message.replace(/\n$/, ''));
}
}
static list(list) {
list.forEach(function (message) {
Cli.log(' » ' + message);
});
}
static exit(exitCode) {
if (!Cli.hideBanner) {
cli_helper_1.printHeader();
}
Cli.consoleLog.forEach(function (message) {
console.log(message);
});
process.exit(exitCode);
}
;
static refreshConfig() {
if (Cli.configPath && fs.existsSync(Cli.configPath)) {
let configContent = fs.readFileSync(Cli.configPath);
let configDir = util_1.normalizePath(path.dirname(Cli.configPath));
let configData;
try {
configData = JSON.parse(configContent);
}
catch (_a) {
configData = {};
}
configData.configDir = configDir;
Cli.config = new config_1.FlagpoleConfig(configData);
}
else {
Cli.config = new config_1.FlagpoleConfig();
}
Cli.config.onSave(Cli.refreshConfig);
return Cli.config;
}
static parseConfigFile(configPath) {
Cli.configPath = configPath;
return Cli.refreshConfig();
}
static getCredentials() {
const serviceName = 'Flagpole JS';
const service = new clortho_lite_1.ClorthoService(serviceName);
let token;
let email;
return new Promise((resolve, reject) => {
Promise.all([
new Promise((resolve, reject) => {
service.get('token')
.then(function (credentials) {
token = credentials.password;
resolve();
}).catch(function () {
reject('No saved token.');
});
}),
new Promise((resolve, reject) => {
service.get('email')
.then(function (credentials) {
email = credentials.password;
resolve();
}).catch(function () {
reject('No saved email.');
});
})
]).then(function () {
resolve({
email: email,
token: token
});
}).catch(function (err) {
reject('Not logged in. ' + err);
});
});
}
static findJsFilesInTestFolder() {
let startFolder = Cli.config.getTestsFolder();
let suitesInFolder = [];
function findSuites(dir, isSubFolder = false) {
if (fs.existsSync(dir)) {
let files = fs.readdirSync(dir);
files.forEach(function (file) {
if (!isSubFolder && fs.statSync(dir + file).isDirectory()) {
findSuites(dir + file + '/', true);
}
else if (file.match(/.js$/)) {
let name = (dir + file).replace(startFolder, '').replace(/\.js$/i, '');
suitesInFolder.push(name);
}
});
}
}
;
findSuites(startFolder);
return suitesInFolder;
}
static findDetachedSuites() {
const suitesInFolder = Cli.findJsFilesInTestFolder();
let suitesAvailableToImport = [];
let suitesInConfig = Cli.config.getSuiteNames();
suitesInFolder.forEach(function (suiteName) {
if (!suitesInConfig.includes(suiteName)) {
suitesAvailableToImport.push(suiteName);
}
});
return suitesAvailableToImport;
}
static addScenario(suite, scenario) {
return new Promise((resolve, reject) => {
const suitePath = suite.getPath();
const fileContents = "\n\n" +
`suite.${scenario.type}("${scenario.description}")` + "\n" +
` .open("${scenario.path}")` + "\n" +
` .next(async context => {` + "\n" +
` ` + "\n" +
` });` + "\n";
if (!fs.existsSync(suitePath)) {
reject(`Suite file ${suitePath} does not exist.`);
}
fs.appendFile(suitePath, fileContents, function (err) {
if (err) {
reject(err);
}
resolve();
});
});
}
static addSuite(opts) {
return new Promise((resolve, reject) => {
const suitePath = Cli.config.getTestsFolder() + opts.suiteName + '.js';
let domains = '';
if (typeof opts.baseDomain == 'string') {
domains = `'${opts.baseDomain}'`;
}
else if (util_1.toType(opts.baseDomain) == 'object') {
domains += "{\n";
for (let env in opts.baseDomain) {
let domain = opts.baseDomain[env];
domains += ` ${env}: '${domain}',` + "\n";
}
;
domains += " }";
}
let fileContents = `const { Flagpole } = require('flagpole');` + "\n\n";
fileContents += `const suite = Flagpole.suite('${opts.suiteDescription}')` + "\n";
fileContents += ` .base(${domains});` + "\n\n";
fileContents += `suite.${opts.scenarioType}("${opts.scenarioDescription}")` + "\n";
fileContents += ` .open("${opts.scenarioPath}")` + "\n";
fileContents += ` .next(async context => {` + "\n";
fileContents += ` ` + "\n";
fileContents += ` });` + "\n\n";
fs.writeFile(suitePath, fileContents, function (err) {
if (err) {
return reject(err);
}
Cli.config.addSuite(opts.suiteName);
Cli.config.save().then(() => {
Cli.refreshConfig();
resolve(opts);
}).catch(reject);
});
});
}
static init(opts) {
return new Promise((resolve, reject) => {
const testsFolder = process.cwd() + '/' + opts.testsPath;
const configFilePath = process.cwd() + '/flagpole.json';
const configFile = new config_1.FlagpoleConfig({
configPath: configFilePath,
project: {
name: opts.projectName,
path: opts.testsPath
}
});
let tasks = [];
opts.environments.forEach(envName => {
configFile.addEnvironment(envName);
});
if (!fs.existsSync(testsFolder)) {
fs.mkdirSync(testsFolder);
tasks.push('Created tests folder: ' + testsFolder);
}
else {
tasks.push('Tests folder already existed: ' + testsFolder);
}
configFile.save()
.then(() => {
tasks.push('Saved config file.');
Cli.parseConfigFile(configFilePath);
resolve(tasks);
})
.catch((err) => {
reject(`Error creating project config file: ${configFilePath}. ${err}`);
});
});
}
}
Cli.consoleLog = [];
Cli.hideBanner = false;
Cli.rootPath = __dirname;
Cli.configPath = __dirname + '/flagpole.json';
Cli.command = null;
Cli.commandArg = null;
Cli.commandArg2 = null;
Cli.apiDomain = 'https://us-central1-flagpolejs-5ea61.cloudfunctions.net';
exports.Cli = Cli;
//# sourceMappingURL=cli.js.map