github.com/kanishk98/terraform@v1.3.0-dev.0.20220917174235-661ca8088a6a/internal/command/jsonconfig/expression_test.go (about)

     1  package jsonconfig
     2  
     3  import (
     4  	"encoding/json"
     5  	"reflect"
     6  	"testing"
     7  
     8  	"github.com/zclconf/go-cty/cty"
     9  
    10  	"github.com/hashicorp/hcl/v2"
    11  	"github.com/hashicorp/hcl/v2/hclsyntax"
    12  	"github.com/hashicorp/hcl/v2/hcltest"
    13  	"github.com/hashicorp/terraform/internal/configs/configschema"
    14  )
    15  
    16  func TestMarshalExpressions(t *testing.T) {
    17  	tests := []struct {
    18  		Input hcl.Body
    19  		Want  expressions
    20  	}{
    21  		{
    22  			&hclsyntax.Body{
    23  				Attributes: hclsyntax.Attributes{
    24  					"foo": &hclsyntax.Attribute{
    25  						Expr: &hclsyntax.LiteralValueExpr{
    26  							Val: cty.StringVal("bar"),
    27  						},
    28  					},
    29  				},
    30  			},
    31  			expressions{
    32  				"foo": expression{
    33  					ConstantValue: json.RawMessage([]byte(`"bar"`)),
    34  					References:    []string(nil),
    35  				},
    36  			},
    37  		},
    38  		{
    39  			hcltest.MockBody(&hcl.BodyContent{
    40  				Attributes: hcl.Attributes{
    41  					"foo": {
    42  						Name: "foo",
    43  						Expr: hcltest.MockExprTraversalSrc(`var.list[1]`),
    44  					},
    45  				},
    46  			}),
    47  			expressions{
    48  				"foo": expression{
    49  					References: []string{"var.list[1]", "var.list"},
    50  				},
    51  			},
    52  		},
    53  		{
    54  			hcltest.MockBody(&hcl.BodyContent{
    55  				Attributes: hcl.Attributes{
    56  					"foo": {
    57  						Name: "foo",
    58  						Expr: hcltest.MockExprTraversalSrc(`data.template_file.foo[1].vars["baz"]`),
    59  					},
    60  				},
    61  			}),
    62  			expressions{
    63  				"foo": expression{
    64  					References: []string{"data.template_file.foo[1].vars[\"baz\"]", "data.template_file.foo[1].vars", "data.template_file.foo[1]", "data.template_file.foo"},
    65  				},
    66  			},
    67  		},
    68  		{
    69  			hcltest.MockBody(&hcl.BodyContent{
    70  				Attributes: hcl.Attributes{
    71  					"foo": {
    72  						Name: "foo",
    73  						Expr: hcltest.MockExprTraversalSrc(`module.foo.bar`),
    74  					},
    75  				},
    76  			}),
    77  			expressions{
    78  				"foo": expression{
    79  					References: []string{"module.foo.bar", "module.foo"},
    80  				},
    81  			},
    82  		},
    83  		{
    84  			hcltest.MockBody(&hcl.BodyContent{
    85  				Blocks: hcl.Blocks{
    86  					{
    87  						Type: "block_to_attr",
    88  						Body: hcltest.MockBody(&hcl.BodyContent{
    89  
    90  							Attributes: hcl.Attributes{
    91  								"foo": {
    92  									Name: "foo",
    93  									Expr: hcltest.MockExprTraversalSrc(`module.foo.bar`),
    94  								},
    95  							},
    96  						}),
    97  					},
    98  				},
    99  			}),
   100  			expressions{
   101  				"block_to_attr": expression{
   102  					References: []string{"module.foo.bar", "module.foo"},
   103  				},
   104  			},
   105  		},
   106  	}
   107  
   108  	for _, test := range tests {
   109  		schema := &configschema.Block{
   110  			Attributes: map[string]*configschema.Attribute{
   111  				"foo": {
   112  					Type:     cty.String,
   113  					Optional: true,
   114  				},
   115  				"block_to_attr": {
   116  					Type: cty.List(cty.Object(map[string]cty.Type{
   117  						"foo": cty.String,
   118  					})),
   119  				},
   120  			},
   121  		}
   122  
   123  		got := marshalExpressions(test.Input, schema)
   124  		if !reflect.DeepEqual(got, test.Want) {
   125  			t.Errorf("wrong result:\nGot: %#v\nWant: %#v\n", got, test.Want)
   126  		}
   127  	}
   128  }
   129  
   130  func TestMarshalExpression(t *testing.T) {
   131  	tests := []struct {
   132  		Input hcl.Expression
   133  		Want  expression
   134  	}{
   135  		{
   136  			nil,
   137  			expression{},
   138  		},
   139  	}
   140  
   141  	for _, test := range tests {
   142  		got := marshalExpression(test.Input)
   143  		if !reflect.DeepEqual(got, test.Want) {
   144  			t.Fatalf("wrong result:\nGot: %#v\nWant: %#v\n", got, test.Want)
   145  		}
   146  	}
   147  }