ForestAdmin/devops

View on GitHub
services/badge-coverage-updater.js

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
const lcovParse = require('lcov-parse'); // eslint-disable-line
const fs = require('fs');

const BADGE_URL = 'https://img.shields.io/badge/';
const BADGE_UNKNOWN = `${BADGE_URL}coverage-unknown-critical`;

async function createBadge(report) {
  if (!report) { return BADGE_UNKNOWN; }

  return new Promise((resolve) => {
    lcovParse(report, (error, data) => {
      let hit = 0;
      let found = 0;

      for (let i = 0; i < data.length; i += 1) {
        hit += data[i].lines.hit;
        found += data[i].lines.found;
      }
      const percentage = (hit / found) * 100;

      let color = 'critical';
      if (percentage > 89) { color = 'important'; }
      if (percentage > 99) { color = 'success'; }

      resolve(`${BADGE_URL}coverage-${Math.floor(percentage)}%25%0A-${color}`);
    });
  });
}

async function readCoverageAndCreateBadge() {
  try {
    const report = fs.readFileSync('coverage/lcov.info', 'utf8');
    return createBadge(report);
  } catch (error) {
    return BADGE_UNKNOWN;
  }
}

async function updateReadmeCoverageBadge() {
  const data = fs.readFileSync('README.md').toString();
  const badge = await readCoverageAndCreateBadge();
  const newData = data.replace(/!\[Coverage\]\(https:\/\/img\.shields\.io\/badge\/coverage-.*\)/, `![Coverage](${badge})`);
  fs.writeFileSync('README.md', newData);
}

function BadgeCoverageUpdater() {
  this.perform = async () => {
    await updateReadmeCoverageBadge();
  };
}

module.exports = BadgeCoverageUpdater;