in src/reporter/coverage.ts [21:88]
async function collectCoverage(coverageFolder: string): Promise<CoverageReport> {
// search for reports
const getMergedReport = (category: string) => {
const reports = readdirSync(coverageFolder)
.filter((f) => f.startsWith(`report-${category}`) && f.endsWith(".json"))
.map((f) => require(join(coverageFolder, f)));
const result: Record<string, number> = {};
for (const feature of reports.flatMap((r) => Object.keys(r))) {
result[feature] = Math.max(...reports.map((r) => r[feature] || 0));
}
return result;
};
const reports: Record<string, Record<string, number>> = {
General: getMergedReport("vanilla"),
Azure: getMergedReport("azure"),
Optional: getMergedReport("optional"),
DPG: getMergedReport("dpg"),
};
if (Object.keys(reports).every((cat) => Object.keys(reports[cat]).length === 0)) {
const cats = Object.keys(reports).join(", ");
throw new Error(`No report found in coverage folder '${coverageFolder}' for any of the categories: ${cats}`);
}
// post report
let comment = "";
const summary: Record<string, CategorySummary> = {};
for (const category of Object.keys(reports)) {
const categoryObject = reports[category];
const features = Object.keys(categoryObject)
.sort()
.map((x) => [x, categoryObject[x] > 0]);
const countTotal = features.length;
const countCovered = features.filter((x) => x[1]).length;
const countMissing = countTotal - countCovered;
summary[category] = {
covered: countCovered,
total: countTotal,
};
const percentCoverage = ((countCovered / (countTotal || 1)) * 100) | 0;
comment += `## ${percentCoverage === 100 ? "✔️" : "❌️"} ${category}: ${percentCoverage}%\n\n`;
if (countMissing > 0) {
comment += `<details><summary>${countMissing} out of ${countTotal} features are not covered by tests</summary><p>\n\n`;
let first = true;
for (const feature of features.filter((x) => !x[1])) {
if (!first) comment += `, `;
first = false;
const f = feature[0];
comment += `[\`${f}\`](https://github.com/Azure/autorest.testserver/search?q=${f})`;
}
comment += "</p></details>";
} else if (countTotal === 0) {
comment += `no tests were run for this category\n`;
}
comment += "\n\n";
}
// eslint-disable-next-line @typescript-eslint/no-var-requires
const testServerVersion = require(join(__dirname, "..", "..", "package.json")).version;
const report = `${ReportHeader}# 🤖 AutoRest automatic feature coverage report 🤖\n*feature set version ${testServerVersion}*\n\n${comment}`;
return {
summary,
report,
};
}