e1c-test-tools
Version:
Набор инструментов для тестирования (предварительная версия)
95 lines (92 loc) • 5.39 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateMockedExternalBinFile = exports.getRootSrcFiles = void 0;
const path_1 = require("path");
const E1cDispatcher_1 = __importDefault(require("e1c-repo-tools/dist/E1cDispatcher"));
const os_1 = require("os");
const glob_1 = __importDefault(require("glob"));
const fs_extra_1 = require("fs-extra");
const fs_1 = require("fs");
const NameToReplace = 'TesterSpecialLongNameForSelfTesting_afd1dd579eec439eb41e09c4b84f3222';
// TODO: move to utils
const promiseGlob = (pattern, options) => new Promise((resolve, reject) => {
glob_1.default(pattern, options, (err, matches) => {
if (err) {
reject(err);
}
else {
resolve(matches);
}
});
});
// FIXME: till Great refactoring
const getRootSrcFiles = async (dispatcher) => Promise.all((await fs_1.promises.readdir(dispatcher.pathToSrcDir, { 'encoding': 'utf8', 'withFileTypes': true }))
.filter((file) => file.isDirectory && !file.name.match(/.bak\d*$/gmi))
.map(async (dir) => path_1.join(dispatcher.pathToSrcDir, dir.name, (await fs_1.promises.readdir(path_1.join(dispatcher.pathToSrcDir, dir.name), { 'encoding': 'utf8', 'withFileTypes': true }))
.filter((file) => file.isFile && file.name.match(/.xml$/gmi))[0].name)));
exports.getRootSrcFiles = getRootSrcFiles;
const getTextForInsert = (pathToFile) => {
let prefix = '';
if (!path_1.basename(pathToFile).startsWith('ObjectModule')) {
prefix = '&НаКлиенте';
}
return `
${prefix}
Функция ЭкспортируемыйМетод(ИмяМетода, ПараметрыМетода) Экспорт
ИнициализацияПараметров = "";
ИменаПараметров = "";
Для Инд = 0 По ПараметрыМетода.Количество() - 1 Цикл
ИмяПараметра = "__Парам" + Инд;
ИменаПараметров = ИменаПараметров + ИмяПараметра + ", ";
ИнициализацияПараметров = ИнициализацияПараметров + ИмяПараметра + " = ПараметрыМетода[" + Инд + "];" + Символы.ПС;
КонецЦикла;
Если СтрДлина(ИменаПараметров) > 0 Тогда
ИменаПараметров = Лев(ИменаПараметров, СтрДлина(ИменаПараметров) - 2);
КонецЕсли;
Результат = Неопределено;
Выполнить(ИнициализацияПараметров + "Результат = " + ИмяМетода + "(" + ИменаПараметров + ");");
Возврат Результат;
КонецФункции
`;
};
const generateMockedExternalBinFile = async (pathToExternalBinFile) => {
const workDir = await fs_extra_1.mkdtemp(path_1.join(os_1.tmpdir(), 'mock_'));
const distDir = path_1.join(workDir, 'dist');
await fs_extra_1.ensureDir(distDir);
const srcDir = path_1.join(workDir, 'src');
await fs_extra_1.ensureDir(srcDir);
const logsDir = path_1.join(workDir, 'logs');
await fs_extra_1.ensureDir(logsDir);
const repoConfig = {
'pathToExecutable': process.env.PATH_TO_E1C_EXECUTABLE,
'pathToDistDir': distDir,
'pathToSrcDir': srcDir,
'pathToLogsDir': logsDir,
'filesExtensions': [path_1.extname(pathToExternalBinFile)],
};
const repoDispatcher = new E1cDispatcher_1.default(repoConfig);
const result = await repoDispatcher.DumpExternalBinFile(pathToExternalBinFile);
await Promise.all((await promiseGlob('**/*.bsl', { 'cwd': result.pathToSrcFiles }))
.map((filename) => path_1.join(result.pathToSrcFiles, filename))
.map(async (filename) => [filename, (await fs_extra_1.readFile(filename, 'utf8')).concat(getTextForInsert(filename))])
.map(async (fileData) => (fs_extra_1.outputFile(...(await fileData)))));
await Promise.all((await promiseGlob('**/*.xml', { 'cwd': result.pathToSrcFiles }))
.map((filename) => path_1.join(result.pathToSrcFiles, filename))
.map(async (filename) => [filename, (await fs_extra_1.readFile(filename, 'utf8')).split(NameToReplace).join('Tester')])
.map(async (fileData) => (fs_extra_1.outputFile(...(await fileData)))));
const pathToMockedExternalBinFiles = process.env.PATH_TO_MOCKED_EXTERNAL_BIN_FILES;
const rootSrcFiles = await exports.getRootSrcFiles(repoDispatcher);
for (let i = 0; i < rootSrcFiles.length; i += 1) {
// eslint-disable-next-line no-await-in-loop
const dumpedFileInfo = await repoDispatcher.BuildExternalBinFile(rootSrcFiles[i]);
if (pathToMockedExternalBinFiles) {
const parsedPath = path_1.parse(dumpedFileInfo.pathToBinFile);
// eslint-disable-next-line no-await-in-loop
await fs_extra_1.move(dumpedFileInfo.pathToBinFile, path_1.join(pathToMockedExternalBinFiles, `${parsedPath.base}`), { 'overwrite': true });
}
}
};
exports.generateMockedExternalBinFile = generateMockedExternalBinFile;