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  }