The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
grafana/scripts/test-coverage-by-codeowner.js

88 lines
2.5 KiB

#!/usr/bin/env node
const { AutoComplete } = require('enquirer');
const cp = require('node:child_process');
const { hideBin } = require('yargs/helpers');
const yargs = require('yargs/yargs');
const { getCodeowners } = require('./codeowners-manifest/utils.js');
const JEST_CONFIG_PATH = 'jest.config.codeowner.js';
async function promptCodeownerName() {
const teams = await getCodeowners();
const prompt = new AutoComplete({
name: 'flavor',
message: 'Select your team to run tests by codeowner.',
limit: 10,
choices: teams.filter((team) => team.startsWith('@grafana/')),
});
return await prompt.run();
}
/**
* Run test coverage for a specific codeowner
* @param {string} codeownerName - The codeowner name to run coverage for
* @param {boolean} noOpen - Whether to skip opening the coverage report in the browser
*/
async function runTestCoverageByCodeowner(codeownerName, noOpen = process.env.CI === 'true') {
const teams = await getCodeowners();
if (!teams.includes(codeownerName)) {
throw new Error(`Codeowner "${codeownerName}" was not found.`);
}
process.env.CODEOWNER_NAME = codeownerName;
process.env.SHOULD_OPEN_COVERAGE_REPORT = String(!noOpen);
return new Promise((resolve, reject) => {
const child = cp.spawn('jest', [`--config=${JEST_CONFIG_PATH}`], {
stdio: 'inherit',
shell: true,
});
child.on('error', (error) => {
reject(new Error(`Failed to start Jest: ${error.message}`));
});
child.on('close', (code) => {
if (code === 0) {
resolve();
} else {
reject(new Error(`Jest exited with code ${code}`));
}
});
});
}
if (require.main === module) {
(async () => {
try {
const argv = yargs(hideBin(process.argv)).parse();
const teams = await getCodeowners();
let codeownerName = argv._[0];
if (codeownerName != null && !teams.includes(codeownerName)) {
const msg = `Codeowner "${codeownerName}" was not found.`;
codeownerName = null;
if (process.env.CI === 'true') {
throw new Error(msg);
} else {
console.warn(` ${msg}`);
}
}
if (!codeownerName) {
codeownerName = await promptCodeownerName();
}
const noOpen = argv['open'] === false;
console.log(`🧪 Running test coverage for codeowner: ${codeownerName}`);
await runTestCoverageByCodeowner(codeownerName, noOpen);
} catch (e) {
console.error(e.message);
process.exit(1);
}
})();
}
module.exports = { runTestCoverageByCodeowner };