async function collectCoverage()

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,
  };
}