Skip to content

Commit

Permalink
feat: include thrown errors in IaC failures section
Browse files Browse the repository at this point in the history
When we have mixed results, eg some paths were successful, but some threw errors, we are now displaying them in the Test Failures section.
  • Loading branch information
Ilianna Papastefanou committed May 19, 2022
1 parent b33122f commit 571d3b8
Show file tree
Hide file tree
Showing 6 changed files with 41 additions and 129 deletions.
25 changes: 17 additions & 8 deletions src/cli/commands/test/iac/index.ts
Expand Up @@ -58,6 +58,7 @@ import {
import config from '../../../../lib/config';
import { UnsupportedEntitlementError } from '../../../../lib/errors/unsupported-entitlement-error';
import * as ora from 'ora';
import { IaCTestFailure } from '../../../../lib/formatters/iac-output/v2/types';

const debug = Debug('snyk-test');
const SEPARATOR = '\n-------------------------------------------------------\n';
Expand All @@ -81,7 +82,7 @@ export default async function(
const results = [] as any[];

// Holds an array of scanned file metadata for output.
let iacScanFailures: IacFileInDirectory[] | undefined;
let iacScanFailures: IacFileInDirectory[] = [];
let iacIgnoredIssuesCount = 0;
let iacOutputMeta: IacOutputMeta | undefined;

Expand Down Expand Up @@ -130,20 +131,16 @@ export default async function(
};

res = results;
iacScanFailures = failures;
iacScanFailures = failures ? failures : [];
iacIgnoredIssuesCount += ignoreCount;
} catch (error) {
// TODO: Check if we really need this anymore.
// All errors that we throw are of Error type, so we shouldn't be needing this check/conversion.
res = formatTestError(error);
// we can store all errors here for printing the paths and errors later in the new output.
}

// Not all test results are arrays in order to be backwards compatible
// with scripts that use a callback with test. Coerce results/errors to be arrays
// and add the result options to each to be displayed
// TODO: Similarly to above, do we actually need to convert this to an array?
// I think we do not need this in IaC
const resArray: any[] = Array.isArray(res) ? res : [res];

for (let i = 0; i < resArray.length; i++) {
Expand Down Expand Up @@ -273,11 +270,23 @@ export default async function(
let summaryMessage = '';
let errorResultsLength = errorResults.length;

if (iacScanFailures?.length) {
if (iacScanFailures.length || hasErrors) {
errorResultsLength = iacScanFailures.length || errorResults.length;

const thrownErrors: IaCTestFailure[] = errorResults.map((err) => ({
filePath: err.path,
failureReason: err.message,
}));

const allTestFailures: IaCTestFailure[] = iacScanFailures
.map((f) => ({
filePath: f.filePath,
failureReason: f.failureReason,
}))
.concat(thrownErrors);

response += isNewIacOutputSupported
? EOL.repeat(2) + formatIacTestFailures(iacScanFailures)
? EOL.repeat(2) + formatIacTestFailures(allTestFailures)
: iacScanFailures
.map((reason) => chalk.bold.red(getIacDisplayErrorFileOutput(reason)))
.join('');
Expand Down
7 changes: 4 additions & 3 deletions src/lib/formatters/iac-output/v2/failures/list.ts
Expand Up @@ -2,8 +2,9 @@ import { EOL } from 'os';

import { IacFileInDirectory } from '../../../../types';
import { colors, contentPadding } from '../utils';
import { IaCTestFailure } from '../types';

export function formatIacTestFailures(testFailures: IacFileInDirectory[]) {
export function formatIacTestFailures(testFailures: IaCTestFailure[]): string {
const sectionComponents: string[] = [];

const titleOutput = colors.title(`Test Failures`);
Expand All @@ -20,7 +21,7 @@ interface TestFailuresByFailureReason {
}

function groupTestFailuresByFailureReason(
testFailures: IacFileInDirectory[],
testFailures: IaCTestFailure[],
): TestFailuresByFailureReason {
return testFailures.reduce((groupedFailures, failure) => {
const reason = failure.failureReason;
Expand All @@ -36,7 +37,7 @@ function groupTestFailuresByFailureReason(
}, {});
}

function formatFailuresList(testFailures: IacFileInDirectory[]) {
function formatFailuresList(testFailures: IaCTestFailure[]) {
const testFailuresByReason = groupTestFailuresByFailureReason(testFailures);
return Object.entries(testFailuresByReason)
.map(([failureReason, testFailures]) =>
Expand Down
5 changes: 5 additions & 0 deletions src/lib/formatters/iac-output/v2/types.ts
Expand Up @@ -6,3 +6,8 @@ export interface IacTestData {
results: IacTestResponse[];
failures?: IacFileInDirectory[];
}

export type IaCTestFailure = {
filePath: string;
failureReason: string | undefined;
};

0 comments on commit 571d3b8

Please sign in to comment.