Skip to content

Commit 4e0643c

Browse files
committed
fix: provide output when there are no vulns found
OS test workflow was providing no output and exit code 0 when no vulns were found. This displays a sensible summary indicating no vulnerabilities in the human readable output.
1 parent 1b8ee0a commit 4e0643c

File tree

3 files changed

+54
-35
lines changed

3 files changed

+54
-35
lines changed

internal/commands/ostest/test_execution.go

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -224,19 +224,14 @@ func extractSeverityKeys(summaries ...*testapi.FindingSummary) map[string]bool {
224224
// NewSummaryData creates a workflow.Data object containing a json_schemas.TestSummary
225225
// from a testapi.TestResult. This is used for downstream processing, like determining
226226
// the CLI exit code.
227-
func NewSummaryData(testResult testapi.TestResult, logger *zerolog.Logger, path string) (*json_schemas.TestSummary, workflow.Data, error) {
227+
func NewSummaryData(testResult testapi.TestResult, _ *zerolog.Logger, path string) (*json_schemas.TestSummary, workflow.Data, error) {
228228
rawSummary := testResult.GetRawSummary()
229229
effectiveSummary := testResult.GetEffectiveSummary()
230230

231231
if rawSummary == nil || effectiveSummary == nil {
232232
return nil, nil, fmt.Errorf("test result missing summary information")
233233
}
234234

235-
if rawSummary.Count == 0 {
236-
logger.Debug().Msg("No findings in summary, skipping summary creation.")
237-
return nil, nil, fmt.Errorf("no findings in summary: %w", ErrNoSummaryData)
238-
}
239-
240235
severityKeys := extractSeverityKeys(rawSummary, effectiveSummary)
241236

242237
var summaryResults []json_schemas.TestSummaryResult
@@ -258,27 +253,23 @@ func NewSummaryData(testResult testapi.TestResult, logger *zerolog.Logger, path
258253
}
259254
}
260255

261-
if len(summaryResults) > 0 {
262-
// Sort results for consistent output, matching the standard CLI order.
263-
sort.Slice(summaryResults, func(i, j int) bool {
264-
order := map[string]int{"critical": 4, "high": 3, "medium": 2, "low": 1}
265-
return order[summaryResults[i].Severity] > order[summaryResults[j].Severity]
266-
})
267-
268-
testSummary := json_schemas.NewTestSummary("open-source", path)
269-
testSummary.Results = summaryResults
270-
testSummary.SeverityOrderAsc = []string{"low", "medium", "high", "critical"}
256+
// Sort results for consistent output, matching the standard CLI order.
257+
sort.Slice(summaryResults, func(i, j int) bool {
258+
order := map[string]int{"critical": 4, "high": 3, "medium": 2, "low": 1}
259+
return order[summaryResults[i].Severity] > order[summaryResults[j].Severity]
260+
})
271261

272-
summaryBytes, err := json.Marshal(testSummary)
273-
if err != nil {
274-
return nil, nil, fmt.Errorf("failed to marshal test summary: %w", err)
275-
}
262+
testSummary := json_schemas.NewTestSummary("open-source", path)
263+
testSummary.Results = summaryResults
264+
testSummary.SeverityOrderAsc = []string{"low", "medium", "high", "critical"}
276265

277-
summaryWorkflowData := NewWorkflowData(content_type.TEST_SUMMARY, summaryBytes)
278-
return testSummary, summaryWorkflowData, nil
266+
summaryBytes, err := json.Marshal(testSummary)
267+
if err != nil {
268+
return nil, nil, fmt.Errorf("failed to marshal test summary: %w", err)
279269
}
280270

281-
return nil, nil, fmt.Errorf("no summary results to process: %w", ErrNoSummaryData)
271+
summaryWorkflowData := NewWorkflowData(content_type.TEST_SUMMARY, summaryBytes)
272+
return testSummary, summaryWorkflowData, nil
282273
}
283274

284275
// calculateUniqueIssueCount iterates through findings to determine the number of unique issues.

internal/commands/ostest/test_execution_test.go

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package ostest_test
33
import (
44
"context"
55
"encoding/json"
6-
"errors"
76
"testing"
87
"time"
98

@@ -13,6 +12,7 @@ import (
1312
"github.com/snyk/go-application-framework/pkg/apiclients/testapi"
1413
"github.com/snyk/go-application-framework/pkg/local_workflows/content_type"
1514
"github.com/snyk/go-application-framework/pkg/local_workflows/json_schemas"
15+
"github.com/snyk/go-application-framework/pkg/workflow"
1616
"github.com/stretchr/testify/assert"
1717
"github.com/stretchr/testify/require"
1818

@@ -90,17 +90,32 @@ func Test_NewSummaryData(t *testing.T) {
9090
logger := zerolog.Nop()
9191
path := "/test/path"
9292

93-
t.Run("no findings should not create summary data, implying exit code 0", func(t *testing.T) {
93+
t.Run("no findings creates empty summary data, exit code 0", func(t *testing.T) {
9494
testResult := &mockTestResult{
9595
rawSummary: &testapi.FindingSummary{Count: 0},
9696
effectiveSummary: &testapi.FindingSummary{Count: 0},
9797
}
9898

9999
summary, data, err := ostest.NewSummaryData(testResult, &logger, path)
100-
assert.Nil(t, data)
101-
assert.Nil(t, summary)
102-
assert.True(t, errors.Is(err, ostest.ErrNoSummaryData))
103-
assert.ErrorContains(t, err, "no findings in summary")
100+
assert.NoError(t, err)
101+
assert.Equal(t,
102+
workflow.NewData(
103+
data.GetIdentifier(),
104+
content_type.TEST_SUMMARY,
105+
[]byte(`{"results":null,"severity_order_asc":["low","medium","high","critical"],"type":"open-source","artifacts":0,"path":"/test/path"}`),
106+
),
107+
data,
108+
)
109+
assert.Equal(t,
110+
&json_schemas.TestSummary{
111+
Results: nil,
112+
SeverityOrderAsc: []string{"low", "medium", "high", "critical"},
113+
Type: "open-source",
114+
Artifacts: 0,
115+
Path: "/test/path",
116+
},
117+
summary,
118+
)
104119
})
105120

106121
t.Run("no open or total findings should not create summary data", func(t *testing.T) {
@@ -120,10 +135,23 @@ func Test_NewSummaryData(t *testing.T) {
120135
}
121136

122137
summaryStruct, data, err := ostest.NewSummaryData(testResult, &logger, path)
123-
assert.Nil(t, data)
124-
assert.Nil(t, summaryStruct)
125-
assert.True(t, errors.Is(err, ostest.ErrNoSummaryData))
126-
assert.ErrorContains(t, err, "no findings in summary")
138+
assert.NoError(t, err)
139+
assert.Equal(t,
140+
workflow.NewData(
141+
data.GetIdentifier(),
142+
content_type.TEST_SUMMARY,
143+
[]byte(`{"results":null,"severity_order_asc":["low","medium","high","critical"],"type":"open-source","artifacts":0,"path":"/test/path"}`),
144+
),
145+
data)
146+
assert.Equal(t,
147+
&json_schemas.TestSummary{
148+
Results: nil,
149+
SeverityOrderAsc: []string{"low", "medium", "high", "critical"},
150+
Type: "open-source",
151+
Artifacts: 0,
152+
Path: "/test/path",
153+
},
154+
summaryStruct)
127155
})
128156

129157
t.Run("one critical finding should create summary data, implying exit code 1", func(t *testing.T) {

internal/commands/ostest/workflow_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -532,9 +532,9 @@ func TestOSWorkflow_AllProjects_UnifiedFlow(t *testing.T) {
532532
}
533533
}
534534

535-
// Should have 1 JSON output (as an array of results) and 0 summary outputs (since there are no findings)
535+
// Should have 1 JSON output (as an array of results) and 2 summary outputs (no findings, empty summaries)
536536
assert.Len(t, jsonOutputs, 1)
537-
assert.Len(t, summaryOutputs, 0)
537+
assert.Len(t, summaryOutputs, 2)
538538

539539
// Verify JSON output is an array of 2 results
540540
var legacyResults []definitions.LegacyVulnerabilityResponse

0 commit comments

Comments
 (0)