From 845652e11501045706b62cb929bf3e507e4a52b0 Mon Sep 17 00:00:00 2001 From: teselil Date: Tue, 18 Apr 2023 01:51:17 +0300 Subject: [PATCH] rego: Fix printing duplication when parse errors length is 1 Signed-off-by: teselil --- rego/rego.go | 9 ++++++++- rego/rego_test.go | 23 +++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/rego/rego.go b/rego/rego.go index d2e8c16cec..b3211a9047 100644 --- a/rego/rego.go +++ b/rego/rego.go @@ -1731,7 +1731,14 @@ func (r *Rego) parseModules(ctx context.Context, txn storage.Transaction, m metr for _, module := range r.modules { p, err := module.Parse() if err != nil { - errs = append(errs, err) + switch errorWithType := err.(type) { + case ast.Errors: + for _, e := range errorWithType { + errs = append(errs, e) + } + default: + errs = append(errs, errorWithType) + } } r.parsedModules[module.filename] = p } diff --git a/rego/rego_test.go b/rego/rego_test.go index e407767a6f..4eaef975a6 100644 --- a/rego/rego_test.go +++ b/rego/rego_test.go @@ -937,6 +937,29 @@ func TestPrepareAndEvalOriginal(t *testing.T) { assertEval(t, r, "[[2]]") } +func TestPrepareAndEvalOnlyOneErrorOccurredPrintOnce(t *testing.T) { + module := ` + package test + package test + x = input.y + ` + + r := New( + Query("data.test.x"), + Module("", module), + Package("foo"), + Input(map[string]int{"y": 2}), + ) + + _, err := r.PrepareForEval(context.Background()) + if err == nil { + t.Fatal("Expected error but got nil") + } + if strings.Count(err.Error(), "1 error occurred") > 1 { + t.Fatalf("Expected to print '1 error occurred' only once") + } +} + func TestPrepareAndEvalNewPrintHook(t *testing.T) { module := ` package test