Skip to content

Commit 9d97c41

Browse files
committed
fix(report): handle empty OPA result sets in findReports
Adds a check for empty result sets from OPA evaluation to prevent panics when no documents are returned. Includes a regression test.
1 parent d4db03b commit 9d97c41

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

cli/report/report.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,12 @@ func findReports(paths []string) (results interface{}, err error) {
9090
if err != nil {
9191
return nil, err
9292
}
93+
if len(rs) == 0 || len(rs[0].Expressions) == 0 {
94+
// Return an empty map to prevent panics in calling functions.
95+
return make(map[string]interface{}), nil
96+
}
9397
results = rs[0].Expressions[0].Value
94-
return results, err
98+
return results, nil
9599
}
96100

97101
func generateReportData(rawAssetFileName string, queryPath string, outputPath string) (results interface{}, err error) {

cli/report/report_test.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package report
2+
3+
import (
4+
"os"
5+
"path/filepath"
6+
"testing"
7+
)
8+
9+
func TestFindReports_EmptyResults(t *testing.T) {
10+
// Create a temporary directory for test files
11+
tempDir, err := os.MkdirTemp("", "report_test")
12+
if err != nil {
13+
t.Fatalf("Failed to create temp dir: %v", err)
14+
}
15+
defer os.RemoveAll(tempDir)
16+
17+
// Create a dummy rego file that produces no results for data.reports
18+
regoContent := `package not_reports
19+
# No rules defined
20+
`
21+
regoFile := filepath.Join(tempDir, "empty.rego")
22+
if err := os.WriteFile(regoFile, []byte(regoContent), 0644); err != nil {
23+
t.Fatalf("Failed to write rego file: %v", err)
24+
}
25+
26+
// Create a dummy data file (can be empty json object)
27+
dataContent := `{}`
28+
dataFile := filepath.Join(tempDir, "data.json")
29+
if err := os.WriteFile(dataFile, []byte(dataContent), 0644); err != nil {
30+
t.Fatalf("Failed to write data file: %v", err)
31+
}
32+
33+
// Call findReports
34+
results, err := findReports([]string{regoFile, dataFile})
35+
if err != nil {
36+
t.Fatalf("findReports returned error: %v", err)
37+
}
38+
39+
// Check if results is a map (expected empty map)
40+
resultsMap, ok := results.(map[string]interface{})
41+
if !ok {
42+
t.Errorf("Expected results to be map[string]interface{}, got %T", results)
43+
}
44+
if len(resultsMap) != 0 {
45+
t.Errorf("Expected empty results map, got length %d", len(resultsMap))
46+
}
47+
}

0 commit comments

Comments
 (0)