@salesforce/apex-node
Version:
Salesforce JS library for Apex
179 lines • 7.36 kB
JavaScript
;
/*
* Copyright (c) 2020, salesforce.com, inc.
* All rights reserved.
* Licensed under the BSD 3-Clause license.
* For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.calculateCodeCoverage = exports.transformTestResult = exports.resetLimitsForTesting = exports.getBufferSize = exports.getJsonIndent = exports.queryAll = void 0;
exports.calculatePercentage = calculatePercentage;
exports.queryNamespaces = queryNamespaces;
const core_1 = require("@salesforce/core");
const i18n_1 = require("../i18n");
const DEFAULT_BUFFER_SIZE = 256;
const MIN_BUFFER_SIZE = 256;
const MAX_BUFFER_SIZE = 32_768;
const DEFAULT_JSON_INDENT = undefined;
const MIN_JSON_INDENT = 0;
const MAX_JSON_INDENT = 8;
let jsonIndent = null;
let bufferSize = null;
function calculatePercentage(dividend, divisor) {
let percentage = '0%';
if (dividend > 0) {
const calcPct = ((dividend / divisor) * 100).toFixed();
percentage = `${calcPct}%`;
}
return percentage;
}
async function queryNamespaces(connection) {
const installedNsQuery = 'SELECT NamespacePrefix FROM PackageLicense';
const installedNsPromise = connection.query(installedNsQuery);
const orgNsQuery = 'SELECT NamespacePrefix FROM Organization';
const orgNsPromise = connection.query(orgNsQuery);
const allNamespaces = await Promise.all([installedNsPromise, orgNsPromise]);
const installedNamespaces = allNamespaces[0].records.map((record) => ({
installedNs: true,
namespace: record.NamespacePrefix
}));
const orgNamespaces = allNamespaces[1].records.map((record) => ({
installedNs: false,
namespace: record.NamespacePrefix
}));
return [...orgNamespaces, ...installedNamespaces];
}
const queryAll = async (connection, query, tooling = false) => {
const conn = tooling ? connection.tooling : connection;
const allRecords = [];
let result = await conn.query(query);
allRecords.push(...result.records);
while (!result.done) {
result = (await conn.queryMore(result.nextRecordsUrl));
allRecords.push(...result.records);
}
return {
done: true,
totalSize: allRecords.length,
records: allRecords
};
};
exports.queryAll = queryAll;
const getJsonIndent = () => {
if (jsonIndent !== null) {
return jsonIndent;
}
let jsonIndentNum = DEFAULT_JSON_INDENT;
const envJsonIndent = process.env.SF_APEX_RESULTS_JSON_INDENT;
if (envJsonIndent && Number.isInteger(Number(envJsonIndent))) {
jsonIndentNum = Number(envJsonIndent);
}
if (jsonIndentNum < MIN_JSON_INDENT || jsonIndentNum > MAX_JSON_INDENT) {
const logger = core_1.Logger.childFromRoot('utils');
logger.warn(`Json indent ${jsonIndentNum} is outside of the valid range (${MIN_JSON_INDENT}-${MAX_JSON_INDENT}). Using default json indent of ${DEFAULT_JSON_INDENT}.`);
jsonIndentNum = DEFAULT_JSON_INDENT;
}
jsonIndent = jsonIndentNum;
return jsonIndent;
};
exports.getJsonIndent = getJsonIndent;
const getBufferSize = () => {
if (bufferSize !== null) {
return bufferSize;
}
let bufferSizeNum = DEFAULT_BUFFER_SIZE;
const jsonBufferSize = process.env.SF_APEX_JSON_BUFFER_SIZE;
if (jsonBufferSize && Number.isInteger(Number(jsonBufferSize))) {
bufferSizeNum = Number(jsonBufferSize);
}
if (bufferSizeNum < MIN_BUFFER_SIZE || bufferSizeNum > MAX_BUFFER_SIZE) {
const logger = core_1.Logger.childFromRoot('utils');
logger.warn(`Buffer size ${bufferSizeNum} is outside of the valid range (${MIN_BUFFER_SIZE}-${MAX_BUFFER_SIZE}). Using default buffer size of ${DEFAULT_BUFFER_SIZE}.`);
bufferSizeNum = DEFAULT_BUFFER_SIZE;
}
bufferSize = bufferSizeNum;
JSON.stringify(bufferSize);
return bufferSize;
};
exports.getBufferSize = getBufferSize;
// exported for testing
const resetLimitsForTesting = () => {
bufferSize = null;
jsonIndent = null;
};
exports.resetLimitsForTesting = resetLimitsForTesting;
const transformTestResult = (rawResult) => {
// Initialize arrays for setup methods and regular tests
const regularTests = [];
const setupMethods = [];
// Iterate through each item in rawResult.tests
rawResult.tests.forEach((test) => {
const { isTestSetup, ...rest } = test;
if (isTestSetup) {
setupMethods.push(transformToApexTestSetupData(rest));
}
else {
regularTests.push(rest);
}
});
return {
summary: {
...rawResult.summary,
testSetupTimeInMs: rawResult.summary.testSetupTimeInMs,
testTotalTimeInMs: (rawResult.summary.testSetupTimeInMs || 0) +
rawResult.summary.testExecutionTimeInMs
},
tests: regularTests,
setup: setupMethods,
codecoverage: rawResult.codecoverage
};
};
exports.transformTestResult = transformTestResult;
const calculateCodeCoverage = async (codeCoverageInstance, codeCoverage, apexTestClassIdSet, result, isAsync, progress) => {
const coveredApexClassIdSet = new Set();
if (codeCoverage) {
const perClassCovMap = await codeCoverageInstance.getPerClassCodeCoverage(apexTestClassIdSet);
if (perClassCovMap.size > 0) {
result.tests.forEach((item) => {
const keyCodeCov = `${item.apexClass.id}-${item.methodName}`;
const perClassCov = perClassCovMap.get(keyCodeCov);
// Skipped test is not in coverage map, check to see if perClassCov exists first
if (perClassCov) {
perClassCov.forEach((classCov) => coveredApexClassIdSet.add(classCov.apexClassOrTriggerId));
item.perClassCoverage = perClassCov;
}
});
}
if (isAsync) {
progress?.report({
type: 'FormatTestResultProgress',
value: 'queryingForAggregateCodeCoverage',
message: i18n_1.nls.localize('queryingForAggregateCodeCoverage')
});
}
const { codeCoverageResults, totalLines, coveredLines } = await codeCoverageInstance.getAggregateCodeCoverage(coveredApexClassIdSet);
result.codecoverage = codeCoverageResults;
result.summary.totalLines = totalLines;
result.summary.coveredLines = coveredLines;
result.summary.testRunCoverage = calculatePercentage(coveredLines, totalLines);
result.summary.orgWideCoverage =
await codeCoverageInstance.getOrgWideCoverage();
}
};
exports.calculateCodeCoverage = calculateCodeCoverage;
const transformToApexTestSetupData = (testData) =>
// Assuming all necessary properties are present and optional properties are handled
({
id: testData.id,
stackTrace: testData.stackTrace ?? null,
message: testData.message ?? null,
asyncApexJobId: testData.asyncApexJobId,
methodName: testData.methodName,
apexLogId: testData.apexLogId ?? null,
apexClass: testData.apexClass,
testSetupTime: testData.runTime,
testTimestamp: testData.testTimestamp,
fullName: testData.fullName,
diagnostic: testData.diagnostic
});
//# sourceMappingURL=utils.js.map