UNPKG

flagpole

Version:

Simple and fast DOM integration, headless or headful browser, and REST API testing framework.

224 lines 8.32 kB
"use strict"; 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