github.com/aquasecurity/trivy-iac@v0.8.1-0.20240127024015-3d8e412cf0ab/pkg/scanners/terraform/parser/evaluator_test.go (about) 1 package parser 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/assert" 7 "github.com/zclconf/go-cty/cty" 8 ) 9 10 func TestValidateForEachArg(t *testing.T) { 11 tests := []struct { 12 name string 13 arg cty.Value 14 expectedError string 15 }{ 16 { 17 name: "empty set", 18 arg: cty.SetValEmpty(cty.String), 19 }, 20 { 21 name: "set of strings", 22 arg: cty.SetVal([]cty.Value{cty.StringVal("val1"), cty.StringVal("val2")}), 23 }, 24 { 25 name: "set of non-strings", 26 arg: cty.SetVal([]cty.Value{cty.NumberIntVal(1), cty.NumberIntVal(2)}), 27 expectedError: "is not set of strings", 28 }, 29 { 30 name: "set with null", 31 arg: cty.SetVal([]cty.Value{cty.StringVal("val1"), cty.NullVal(cty.String)}), 32 expectedError: "arg is set of strings, but contains null", 33 }, 34 { 35 name: "set with unknown", 36 arg: cty.SetVal([]cty.Value{cty.StringVal("val1"), cty.UnknownVal(cty.String)}), 37 expectedError: "arg is set of strings, but contains unknown", 38 }, 39 { 40 name: "set with unknown", 41 arg: cty.SetVal([]cty.Value{cty.StringVal("val1"), cty.UnknownVal(cty.String)}), 42 expectedError: "arg is set of strings, but contains unknown", 43 }, 44 { 45 name: "non empty map", 46 arg: cty.MapVal(map[string]cty.Value{ 47 "val1": cty.StringVal("..."), 48 "val2": cty.StringVal("..."), 49 }), 50 }, 51 { 52 name: "map with unknown", 53 arg: cty.MapVal(map[string]cty.Value{ 54 "val1": cty.UnknownVal(cty.String), 55 "val2": cty.StringVal("..."), 56 }), 57 }, 58 { 59 name: "empty obj", 60 arg: cty.EmptyObjectVal, 61 }, 62 { 63 name: "obj with strings", 64 arg: cty.ObjectVal(map[string]cty.Value{ 65 "val1": cty.StringVal("..."), 66 "val2": cty.StringVal("..."), 67 }), 68 }, 69 { 70 name: "null", 71 arg: cty.NullVal(cty.Set(cty.String)), 72 expectedError: "arg is null", 73 }, 74 { 75 name: "unknown", 76 arg: cty.UnknownVal(cty.Set(cty.String)), 77 }, 78 { 79 name: "dynamic", 80 arg: cty.DynamicVal, 81 }, 82 } 83 84 for _, tt := range tests { 85 t.Run(tt.name, func(t *testing.T) { 86 err := validateForEachArg(tt.arg) 87 if tt.expectedError != "" && err != nil { 88 assert.ErrorContains(t, err, tt.expectedError) 89 return 90 } 91 assert.NoError(t, err) 92 }) 93 } 94 }