@villedemontreal/scripting
Version:
Scripting core utilities
127 lines • 5.16 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.setTestingConfigs = setTestingConfigs;
exports.timeout = timeout;
exports.containsText = containsText;
exports.run = run;
exports.runCore = runCore;
exports.isShortHelpDisplayed = isShortHelpDisplayed;
exports.isMainHelpDisplayed = isMainHelpDisplayed;
exports.withCustomRunFile = withCustomRunFile;
exports.withLogNodeInstance = withLogNodeInstance;
const caporal_1 = require("@villedemontreal/caporal");
const general_utils_1 = require("@villedemontreal/general-utils");
const chai_1 = require("chai");
const child_process_1 = require("child_process");
const fs = require("fs-extra");
const path = require("path");
const node_util_1 = require("node:util");
const configs_1 = require("../config/configs");
function setTestingConfigs() {
configs_1.configs.setCaporal(caporal_1.program);
configs_1.configs.setProjectRoot(path.resolve(`${__dirname}/../../..`));
configs_1.configs.setProjectOutDir(`${configs_1.configs.projectRoot}/dist`);
}
/**
* The "--no-timeouts" arg doesn't work to disable
* the Mocha timeouts (while debugging) if a timeout
* is specified in the code itself. Using this to set the
* timeouts does.
*/
function timeout(mocha, milliSec) {
mocha.timeout(process.argv.includes('--no-timeouts') ? 0 : milliSec);
}
function containsText(corpus, text) {
const lines = text
.split('\n')
.map((line) => line.trim())
.filter((line) => line.trim() !== '');
if (lines.length === 0) {
return false;
}
let lastIdx = -1;
for (const line of lines) {
const idx = corpus.indexOf(line, lastIdx);
if (idx < 0) {
console.log('Could not find line', line, 'in corpus', corpus);
return false;
}
lastIdx = idx;
}
return true;
}
async function run(...args) {
return await runCore(configs_1.configs.isWindows ? 'run.cmd' : './run', ...args);
}
async function runCore(runFilePath, ...args) {
let output = ``;
let isSuccess = true;
try {
await general_utils_1.utils.exec(runFilePath, args, {
escapeArgs: true,
outputHandler: (stdoutData, stderrData) => {
const newOut = `${stdoutData ? ` ${stdoutData}` : ''} ${stderrData ? ` ${stderrData}` : ''} `;
output += (0, node_util_1.stripVTControlCharacters)(newOut);
},
});
}
catch {
isSuccess = false;
// we have the output
}
return {
output,
isSuccess,
};
}
function isShortHelpDisplayed(output) {
return (output.indexOf(`error: Unspecified command. Available commands are:`) > -1 &&
output.indexOf(`For more help, type run --help`) > -1);
}
function isMainHelpDisplayed(output) {
return (output.indexOf(`to get some help about a command`) > -1 &&
output.indexOf(`A simple testing script`) > -1 &&
output.indexOf(`A testing hidden script`) <= -1);
}
async function withCustomRunFile(toReplaceInRunFile, replacement, ...runArgs) {
const runTestingFilePath = path.join(configs_1.configs.libRoot, 'runTesting');
let runContent = fs.readFileSync(path.join(configs_1.configs.libRoot, 'run'), 'utf-8');
runContent = runContent.replace(toReplaceInRunFile, replacement);
const runCmdTestingFilePath = path.join(configs_1.configs.libRoot, 'runTesting.cmd');
let runCmdContent = fs.readFileSync(path.join(configs_1.configs.libRoot, 'run.cmd'), 'utf-8');
runCmdContent = runCmdContent.replace(`"%~dp0\\run"`, `"%~dp0\\runTesting"`);
try {
fs.writeFileSync(runTestingFilePath, runContent, 'utf-8');
if (!configs_1.configs.isWindows) {
(0, child_process_1.execSync)(`chmod +x ${runTestingFilePath}`);
}
fs.writeFileSync(runCmdTestingFilePath, runCmdContent, 'utf-8');
const { output, isSuccess } = await runCore(configs_1.configs.isWindows ? 'runTesting.cmd' : './runTesting', ...runArgs);
return { output, isSuccess };
}
finally {
if (fs.existsSync(runTestingFilePath)) {
fs.unlinkSync(runTestingFilePath);
}
if (fs.existsSync(runCmdTestingFilePath)) {
fs.unlinkSync(runCmdTestingFilePath);
}
}
}
async function withLogNodeInstance(...runArgs) {
const mainJsPath = path.join(configs_1.configs.libRoot, 'dist', 'src', 'main.js');
const mainJsCodeOriginal = fs.readFileSync(mainJsPath, 'utf8');
try {
const anchor = `addUnhandledRejectionHandler();`;
chai_1.assert.isTrue(mainJsCodeOriginal.indexOf(anchor) > -1);
const outputCode = `console.info('MAIN NODE_APP_INSTANCE: ' + process.env.${general_utils_1.globalConstants.envVariables.NODE_APP_INSTANCE});`;
const newCode = mainJsCodeOriginal.replace(anchor, `${anchor}\n${outputCode}`);
fs.writeFileSync(mainJsPath, newCode, 'utf8');
const { output, isSuccess } = await run(...runArgs);
return { output, isSuccess };
}
finally {
fs.writeFileSync(mainJsPath, mainJsCodeOriginal, 'utf8');
}
}
//# sourceMappingURL=testingUtils.js.map