mirror of
https://github.com/usebruno/bruno.git
synced 2024-11-21 15:33:11 +01:00
feat: Feature/cli support multiple reporters (#2911)
* Support multiple reporters at once in the CLI * Typos * Better logging string after writing file * Remove double blank line * More double blank lines * Switch reporter schema to one from discussion * Typo * Add comment
This commit is contained in:
parent
4419634db7
commit
5e4a96792e
@ -235,6 +235,18 @@ const builder = async (yargs) => {
|
||||
default: 'json',
|
||||
type: 'string'
|
||||
})
|
||||
.option('reporter-json', {
|
||||
describe: 'Path to write json file results to',
|
||||
type: 'string'
|
||||
})
|
||||
.option('reporter-junit', {
|
||||
describe: 'Path to write junit file results to',
|
||||
type: 'string'
|
||||
})
|
||||
.option('reporter-html', {
|
||||
describe: 'Path to write html file results to',
|
||||
type: 'string'
|
||||
})
|
||||
.option('insecure', {
|
||||
type: 'boolean',
|
||||
description: 'Allow insecure server connections'
|
||||
@ -267,6 +279,10 @@ const builder = async (yargs) => {
|
||||
'$0 run request.bru --output results.html --format html',
|
||||
'Run a request and write the results to results.html in html format in the current directory'
|
||||
)
|
||||
.example(
|
||||
'$0 run request.bru --reporter-junit results.xml --reporter-html results.html',
|
||||
'Run a request and write the results to results.html in html format and results.xml in junit format in the current directory'
|
||||
)
|
||||
|
||||
.example('$0 run request.bru --tests-only', 'Run all requests that have a test')
|
||||
.example(
|
||||
@ -291,6 +307,9 @@ const handler = async function (argv) {
|
||||
r: recursive,
|
||||
output: outputPath,
|
||||
format,
|
||||
reporterJson,
|
||||
reporterJunit,
|
||||
reporterHtml,
|
||||
sandbox,
|
||||
testsOnly,
|
||||
bail
|
||||
@ -392,6 +411,25 @@ const handler = async function (argv) {
|
||||
process.exit(constants.EXIT_STATUS.ERROR_INCORRECT_OUTPUT_FORMAT);
|
||||
}
|
||||
|
||||
let formats = {};
|
||||
|
||||
// Maintains back compat with --format and --output
|
||||
if (outputPath && outputPath.length) {
|
||||
formats[format] = outputPath;
|
||||
}
|
||||
|
||||
if (reporterHtml && reporterHtml.length) {
|
||||
formats['html'] = reporterHtml;
|
||||
}
|
||||
|
||||
if (reporterJson && reporterJson.length) {
|
||||
formats['json'] = reporterJson;
|
||||
}
|
||||
|
||||
if (reporterJunit && reporterJunit.length) {
|
||||
formats['junit'] = reporterJunit;
|
||||
}
|
||||
|
||||
// load .env file at root of collection if it exists
|
||||
const dotEnvPath = path.join(collectionPath, '.env');
|
||||
const dotEnvExists = await exists(dotEnvPath);
|
||||
@ -524,28 +562,45 @@ const handler = async function (argv) {
|
||||
const totalTime = results.reduce((acc, res) => acc + res.response.responseTime, 0);
|
||||
console.log(chalk.dim(chalk.grey(`Ran all requests - ${totalTime} ms`)));
|
||||
|
||||
if (outputPath && outputPath.length) {
|
||||
const outputDir = path.dirname(outputPath);
|
||||
const outputDirExists = await exists(outputDir);
|
||||
if (!outputDirExists) {
|
||||
console.error(chalk.red(`Output directory ${outputDir} does not exist`));
|
||||
process.exit(constants.EXIT_STATUS.ERROR_MISSING_OUTPUT_DIR);
|
||||
}
|
||||
|
||||
const formatKeys = Object.keys(formats);
|
||||
if (formatKeys && formatKeys.length > 0) {
|
||||
const outputJson = {
|
||||
summary,
|
||||
results
|
||||
};
|
||||
|
||||
if (format === 'json') {
|
||||
fs.writeFileSync(outputPath, JSON.stringify(outputJson, null, 2));
|
||||
} else if (format === 'junit') {
|
||||
makeJUnitOutput(results, outputPath);
|
||||
} else if (format === 'html') {
|
||||
makeHtmlOutput(outputJson, outputPath);
|
||||
const reporters = {
|
||||
'json': (path) => fs.writeFileSync(path, JSON.stringify(outputJson, null, 2)),
|
||||
'junit': (path) => makeJUnitOutput(results, path),
|
||||
'html': (path) => makeHtmlOutput(outputJson, path),
|
||||
}
|
||||
|
||||
console.log(chalk.dim(chalk.grey(`Wrote results to ${outputPath}`)));
|
||||
for (const formatter of Object.keys(formats))
|
||||
{
|
||||
const reportPath = formats[formatter];
|
||||
const reporter = reporters[formatter];
|
||||
|
||||
// Skip formatters lacking an output path.
|
||||
if (!reportPath || reportPath.length === 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const outputDir = path.dirname(reportPath);
|
||||
const outputDirExists = await exists(outputDir);
|
||||
if (!outputDirExists) {
|
||||
console.error(chalk.red(`Output directory ${outputDir} does not exist`));
|
||||
process.exit(constants.EXIT_STATUS.ERROR_MISSING_OUTPUT_DIR);
|
||||
}
|
||||
|
||||
if (!reporter) {
|
||||
console.error(chalk.red(`Reporter ${formatter} does not exist`));
|
||||
process.exit(constants.EXIT_STATUS.ERROR_INCORRECT_OUTPUT_FORMAT);
|
||||
}
|
||||
|
||||
reporter(reportPath);
|
||||
|
||||
console.log(chalk.dim(chalk.grey(`Wrote ${formatter} results to ${reportPath}`)));
|
||||
}
|
||||
}
|
||||
|
||||
if (summary.failedAssertions + summary.failedTests + summary.failedRequests > 0) {
|
||||
|
Loading…
Reference in New Issue
Block a user