sfdx-hardis
Version:
Swiss-army-knife Toolbox for Salesforce. Allows you to define a complete CD/CD Pipeline. Orchestrate base commands and assist users with interactive wizards
82 lines • 3.84 kB
JavaScript
import { countRegexMatches, uxLog } from "./index.js";
import c from "chalk";
import readFilesRecursive from "fs-readdir-recursive";
import * as path from "path";
import * as fs from "fs";
import { getPullRequestScopedSfdxHardisConfig } from "./pullRequestUtils.js";
function findSubstringInFile(filePath, substring) {
return new Promise((resolve, reject) => {
fs.readFile(filePath, "utf8", (err, data) => {
if (err) {
reject(err);
return;
}
const content = data.toLowerCase();
substring = substring.toLowerCase();
resolve(content.indexOf(substring) !== -1);
});
});
}
// Detect all test classes under the repository
export async function getApexTestClasses(classRegexFilter = "", excludeSeeAllData = false) {
const pathToBrowser = process.cwd();
uxLog("log", this, c.grey(`Finding all repository APEX tests in ${c.bold(pathToBrowser)}`));
// Find all APEX classes
const testClasses = [];
const allFiles = await readFilesRecursive(pathToBrowser)
.filter((file) => !file.includes("node_modules") && file.includes("classes") && file.endsWith(".cls"))
.map((file) => {
return { fullPath: file, fileName: path.basename(file) };
});
// Detect test classes
for (const entry of allFiles) {
const isTestClass = await findSubstringInFile(entry.fullPath, "@IsTest");
if (isTestClass) {
const className = entry.fileName.substring(0, entry.fileName.length - 4);
// Check if need to exclude SeeAllData=true
if (excludeSeeAllData === true && (await findSubstringInFile(entry.fullPath, "SeeAllData=true"))) {
uxLog("log", this, c.grey(`Filtered class ${className} because is contains SeeAllData=true`));
continue;
}
// Check if regex filter
if (await matchRegexFilter(classRegexFilter, className)) {
testClasses.push(className);
}
}
}
uxLog("log", this, c.grey(`Found APEX tests: ${c.bold(testClasses.join())}`));
return testClasses;
}
export async function selectTestClassesFromPullRequests(pullRequests, allAvailableTestClasses) {
const selectedTestClasses = new Set();
const checkTestClassesExistence = allAvailableTestClasses && allAvailableTestClasses.length > 0;
for (const pr of pullRequests) {
const prConfigParsed = await getPullRequestScopedSfdxHardisConfig(pr);
if (prConfigParsed && prConfigParsed['deploymentApexTestClasses'] && Array.isArray(prConfigParsed['deploymentApexTestClasses'])) {
const prTestClasses = prConfigParsed['deploymentApexTestClasses'];
for (const testClass of prTestClasses) {
if (!checkTestClassesExistence) {
selectedTestClasses.add(testClass);
}
else if (checkTestClassesExistence && allAvailableTestClasses.includes(testClass)) {
selectedTestClasses.add(testClass);
}
else {
uxLog("warning", this, c.yellow(`Test class ${testClass} from PR ${pr.idStr} is not available in the repository and will be ignored.`));
}
}
}
}
return Array.from(selectedTestClasses).sort((a, b) => a.localeCompare(b));
}
async function matchRegexFilter(classRegexFilter, className) {
if (classRegexFilter && classRegexFilter !== "") {
if ((await countRegexMatches(new RegExp(classRegexFilter), className)) > 0) {
return true;
}
uxLog("log", this, c.grey(`Filtered class ${className} because not matching RegExp ${classRegexFilter}`));
return false;
}
return true;
}
//# sourceMappingURL=classUtils.js.map