tia
Version:
Time is All (logs driven test engine with ExtJs support)
258 lines (210 loc) • 7.04 kB
text/typescript
/* global gIn */
import * as path from 'path';
import * as fs from 'fs';
import * as fileUtils from './file-utils';
export function containsSuite(dir: string) {
const suiteDir = path.join(dir, gT.engineConsts.suiteDirName);
return fileUtils.isDirectory(suiteDir);
}
export function isRootDirInited(rootDir: string) {
const rootResultsDir = path.join(
rootDir,
gT.engineConsts.suiteDirName,
gT.engineConsts.rootResDirName
);
return fileUtils.isDirectory(rootResultsDir);
}
export function isSuiteDirInited(dir: string) {
const suiteResultsDir = path.join(
dir,
gT.engineConsts.suiteDirName,
gT.engineConsts.suiteResDirName
);
return fileUtils.isDirectory(suiteResultsDir);
}
export function resolveRootDirFromArgsAndEnv(argsTiaRootDir: string) {
let tiaRootDir = argsTiaRootDir || process.env[gT.engineConsts.rootDirEnvVarName];
if (tiaRootDir && !path.isAbsolute(tiaRootDir)) {
gIn.tracer.msg0(`Relative root dir "${tiaRootDir}" will be resolved to absolute one.`);
tiaRootDir = path.resolve(process.cwd(), tiaRootDir);
tiaRootDir = fileUtils.rmLastDirSep(tiaRootDir);
}
if (tiaRootDir) {
gIn.tracer.msg0(`Root dir is: ${tiaRootDir}`);
return tiaRootDir;
}
return null;
}
export function findTiaRootInParents(dir: string) {
const systemRoot = path.parse(dir).root;
let notFound = false;
try {
while (!isRootDirInited(dir)) {
if (dir === systemRoot) {
notFound = true;
break;
}
// eslint-disable-next-line no-param-reassign
dir = path.dirname(dir);
}
} catch (err) {
gIn.tracer.exc(err);
notFound = true;
}
if (notFound) return null;
return dir;
}
// export function findTiaSuiteResInParents(dir) {
//
// const systemRoot = path.parse(dir).root;
// let notFound = false;
//
// try {
// while (!isSuiteDirInited(dir)) {
// if (dir === systemRoot || isRootDirInited(dir)) {
// notFound = true;
// break;
// }
//
// // eslint-disable-next-line no-param-reassign
// dir = path.dirname(dir);
// }
// } catch (err) {
// gIn.tracer.exc(err);
// notFound = true;
// }
//
// if (notFound) return null;
// return dir;
// };
export function getTiaSuiteFromParents(dir: string) {
const startIndex = dir.indexOf(gT.engineConsts.suiteDirName);
if (startIndex === -1) {
throw new Error(`No suite found for directory: ${dir}`);
}
const result = dir.slice(0, startIndex + gT.engineConsts.suiteDirName.length);
return result;
}
export function isTiaSuiteInParents(dir: string) {
const dirArr = dir.split(path.sep);
return dirArr.includes(gT.engineConsts.suiteDirName);
}
export function findTiaRootInChildren(dir: string) {
return fileUtils.whichDirContain(
dir,
[gT.engineConsts.rootResDirName],
path.join(dir, gT.engineConsts.suiteDirName)
);
}
/**
* Resolves path specified by cmd line option or environment variable.
* Non mandatory path resolved to CWD.
* Relative paths resolved relative to CWD.
* @return {String} - resolved path.
*/
export function resolveRootDirEx(argsTiaRootDir: string): string {
let tiaRootDir = resolveRootDirFromArgsAndEnv(argsTiaRootDir);
if (tiaRootDir) {
return tiaRootDir;
}
gIn.tracer.msg0('Root dir is not specified by cmd line or env var.');
tiaRootDir = findTiaRootInParents(process.cwd());
if (!tiaRootDir) {
gIn.tracer.err('You have not initialized any directories. See tia -h for init command');
process.exit(1);
}
return tiaRootDir || '';
}
export function initTiaSuite() {
// eslint-disable-next-line no-param-reassign
const dir = process.cwd();
if (isTiaSuiteInParents(dir)) {
gIn.tracer.err(`TIA suite is existed in parent dirs here: ${dir}`);
gIn.tracer.err('You can not create suite inside suite');
process.exit(1);
}
const existedTiaRootInChildren = findTiaRootInChildren(dir);
if (existedTiaRootInChildren) {
gIn.tracer.err(`TIA root is existed in children dirs here: ${existedTiaRootInChildren}`);
gIn.tracer.err('You can not have TIA root inside TIA suite');
process.exit(1);
}
const tiaRootInParents = findTiaRootInParents(dir);
if (!tiaRootInParents) {
gIn.tracer.err(`TIA root is not found for : ${dir}`);
gIn.tracer.err('You must have TIA root, before suite creation, see tia -h for initRoot mode');
process.exit(1);
}
gIn.cLogger.msgln(`Root dir "${tiaRootInParents}" is found.`);
gIn.cLogger.msgln(`Suite dir "${dir}" is created successfully.`);
fileUtils.mkDirRecursive(dir, [gT.engineConsts.suiteDirName, gT.engineConsts.suiteResDirName]);
fs.writeFileSync(
path.join(dir, gT.engineConsts.suiteDirName, gT.engineConsts.suiteResDirName, '.gitkeep'),
'Just dummy file to commit _tia-suite to VCS',
'utf8'
);
process.exit(0);
}
export function initTiaRoot(argsTiaRootDir: string) {
const tiaRootCandidate = resolveRootDirFromArgsAndEnv(argsTiaRootDir) || process.cwd();
if (isTiaSuiteInParents(tiaRootCandidate)) {
gIn.tracer.err(`TIA suite is existed in parent dirs here: ${tiaRootCandidate}`);
gIn.tracer.err('You can not create root inside suite');
process.exit(1);
}
const existedTiaRootInChildren = findTiaRootInChildren(tiaRootCandidate);
if (existedTiaRootInChildren) {
gIn.tracer.err(`TIA root is existed in children dirs here: ${existedTiaRootInChildren}`);
gIn.tracer.err('You can not have TIA root inside TIA root');
process.exit(1);
}
const tiaRootInParents = findTiaRootInParents(tiaRootCandidate);
if (tiaRootInParents) {
gIn.tracer.err(`TIA root is found here : ${tiaRootInParents}`);
gIn.tracer.err('You can not have TIA root inside TIA root');
process.exit(1);
}
fileUtils.mkDirRecursive(tiaRootCandidate, [
gT.engineConsts.suiteDirName,
gT.engineConsts.rootResDirName,
]);
gIn.cLogger.msgln(`Root results is created successfully in "${tiaRootCandidate}"`);
process.exit(0);
}
/**
* Resolves path specified by cmd line option or environment variable.
* Relative paths resolved relative to gT.cLParams.rootDir.
* @param {Object} argsObj
* @return {String} - resolved path or empty string.
*/
export function resolvePathOptionRelativeToRootDir({
cmdLineArgsPath,
envVarName,
description,
cutLastDirSep,
mandatory,
}: {
cmdLineArgsPath: string;
envVarName: string;
description: string;
cutLastDirSep: boolean;
mandatory: boolean;
}) {
let myPath = cmdLineArgsPath || process.env[envVarName];
if (!myPath) {
if (mandatory) {
gIn.cLogger.errln(`${description} is not specified`);
process.exit(1); // TODO: change to debug-assert ??
}
gIn.tracer.msg3(`${description} is not specified`);
return '';
}
if (!path.isAbsolute(myPath)) {
myPath = path.resolve(gT.cLParams.rootDir, myPath);
if (cutLastDirSep && myPath.endsWith(path.sep)) {
myPath = myPath.slice(0, -1);
}
}
gIn.tracer.msg3(`${description}: ${myPath}`);
return myPath;
}