create-codeceptjs-bdd-tests
Version:
Create Codeceptjs BDD Tests
158 lines (119 loc) • 4.63 kB
JavaScript
const chalk = require('chalk');
const figlet = require('figlet');
const shell = require('shelljs');
const path = require('path');
const fs = require('fs');
const UpdateEnvironments = require('./update.env');
const { addNpmScripts, installDependencies } = require('./update.package');
const log = require('./logger');
const {
aboutProjectPaths,
aboutSauceLabs,
aboutDriver,
aboutScenarioExecutions,
aboutSauceLabsAccount,
} = require('./ask');
const run = async () => {
/**********************************************
* copy acceptance tests
**********************************************/
const copyAcceptanceTests = async () => {
const acceptanceTestsPath = path.join(ROOT_PATH, RELATIVE_PATH, ACCEPTANCE);
if (!fs.existsSync(acceptanceTestsPath)) {
shell.mkdir('-p', acceptanceTestsPath);
}
shell.cp('-R', path.join(__dirname, `../${ACCEPTANCE}`), path.join(ROOT_PATH, RELATIVE_PATH));
};
/**********************************************
* update driver
**********************************************/
const updateDriver = async () => {
log.shadowDomInfo();
if (DRIVER === 'WebDriver') {
const { INTEGRATE_SAUCE_LABS } = await aboutSauceLabs();
if (INTEGRATE_SAUCE_LABS) {
const { SAUCE_USERNAME, SAUCE_KEY } = await aboutSauceLabsAccount();
// shell.sed('-i', '<sauce_username>', SAUCE_USERNAME, configFile);
updateEnvs.sauceLabs({
sauceUsername: SAUCE_USERNAME,
sauceKey: SAUCE_KEY,
});
log.saucelabsInfo(SAUCE_USERNAME, SAUCE_KEY);
}
}
};
/**********************************************
* execute scenario when setup is done
**********************************************/
const executeScenario = async () => {
if (SHOULD_EXECUTE) {
shell.cd(ROOT_PATH);
console.log(
'\n' +
chalk.green(
figlet.textSync('Running Tests', {
font: 'speed',
horizontalLayout: 'default',
verticalLayout: 'default',
})
)
);
if (
shell.exec(`DRIVER=${DRIVER} ./node_modules/.bin/codeceptjs run --grep=@search_results --steps`)
.code !== 0
) {
log.failure('Execution of Acceptance Test Failed.');
}
}
};
const ACCEPTANCE = 'acceptance';
log.welcome();
// ask about project paths
const { PROJECT_NAME, ROOT_PATH, RELATIVE_PATH } = await aboutProjectPaths();
log.infoAboutPaths(path.join(ROOT_PATH, RELATIVE_PATH, ACCEPTANCE));
const { DRIVER } = await aboutDriver();
log.tipsToExecuteOnDriver();
// create directory and copy acceptance
if (!fs.existsSync(ROOT_PATH)) {
shell.mkdir('-p', ROOT_PATH);
}
// copy acceptance tests
copyAcceptanceTests();
// copy codecept conf
shell.cp('-R', path.join(__dirname, '../codecept.conf.js'), ROOT_PATH);
// copy tscofing.json
shell.cp('-R', path.join(__dirname, '../tsconfig.json'), ROOT_PATH);
// copy steps.d.ts
shell.cp('-R', path.join(__dirname, '../steps.d.ts'), ROOT_PATH);
// get config and package-json
const configFile = path.join(ROOT_PATH, 'codecept.conf.js');
const packageJson = path.join(ROOT_PATH, 'package.json');
// update project name
shell.sed('-i', '<your-acceptance-tests-name>', PROJECT_NAME, configFile);
shell.sed('-i', './acceptance', './' + RELATIVE_PATH + '/acceptance', configFile);
const updateEnvs = new UpdateEnvironments({
rootPath: ROOT_PATH,
relativePath: RELATIVE_PATH,
});
updateEnvs.relativePath({
relativePath: RELATIVE_PATH,
});
// create package.json if not exists
if (!fs.existsSync(path.join(ROOT_PATH, 'package.json'))) {
log.error(ROOT_PATH);
shell.cp('-R', path.join(__dirname, '../package.json'), ROOT_PATH);
}
shell.cd(ROOT_PATH);
await updateDriver();
updateEnvs.driver({
driver: DRIVER,
});
log.scenarioExecutions();
const { SHOULD_EXECUTE } = await aboutScenarioExecutions();
addNpmScripts(packageJson, RELATIVE_PATH, DRIVER);
installDependencies();
executeScenario();
log.success(path.join(ROOT_PATH, RELATIVE_PATH, 'acceptance'));
};
run();