package jsonconfig import ( "encoding/json" "reflect" "testing" "github.com/zclconf/go-cty/cty" "github.com/hashicorp/hcl/v2" "github.com/hashicorp/hcl/v2/hclsyntax" "github.com/hashicorp/hcl/v2/hcltest" "github.com/hashicorp/terraform/internal/configs/configschema" ) func TestMarshalExpressions(t *testing.T) { tests := []struct { Input hcl.Body Want expressions }{ { &hclsyntax.Body{ Attributes: hclsyntax.Attributes{ "foo": &hclsyntax.Attribute{ Expr: &hclsyntax.LiteralValueExpr{ Val: cty.StringVal("bar"), }, }, }, }, expressions{ "foo": expression{ ConstantValue: json.RawMessage([]byte(`"bar"`)), References: []string(nil), }, }, }, { hcltest.MockBody(&hcl.BodyContent{ Attributes: hcl.Attributes{ "foo": { Name: "foo", Expr: hcltest.MockExprTraversalSrc(`var.list[1]`), }, }, }), expressions{ "foo": expression{ References: []string{"var.list[1]", "var.list"}, }, }, }, { hcltest.MockBody(&hcl.BodyContent{ Attributes: hcl.Attributes{ "foo": { Name: "foo", Expr: hcltest.MockExprTraversalSrc(`data.template_file.foo[1].vars["baz"]`), }, }, }), expressions{ "foo": expression{ References: []string{"data.template_file.foo[1].vars[\"baz\"]", "data.template_file.foo[1].vars", "data.template_file.foo[1]", "data.template_file.foo"}, }, }, }, { hcltest.MockBody(&hcl.BodyContent{ Attributes: hcl.Attributes{ "foo": { Name: "foo", Expr: hcltest.MockExprTraversalSrc(`module.foo.bar`), }, }, }), expressions{ "foo": expression{ References: []string{"module.foo.bar", "module.foo"}, }, }, }, { hcltest.MockBody(&hcl.BodyContent{ Blocks: hcl.Blocks{ { Type: "block_to_attr", Body: hcltest.MockBody(&hcl.BodyContent{ Attributes: hcl.Attributes{ "foo": { Name: "foo", Expr: hcltest.MockExprTraversalSrc(`module.foo.bar`), }, }, }), }, }, }), expressions{ "block_to_attr": expression{ References: []string{"module.foo.bar", "module.foo"}, }, }, }, } for _, test := range tests { schema := &configschema.Block{ Attributes: map[string]*configschema.Attribute{ "foo": { Type: cty.String, Optional: true, }, "block_to_attr": { Type: cty.List(cty.Object(map[string]cty.Type{ "foo": cty.String, })), }, }, } got := marshalExpressions(test.Input, schema) if !reflect.DeepEqual(got, test.Want) { t.Errorf("wrong result:\nGot: %#v\nWant: %#v\n", got, test.Want) } } } func TestMarshalExpression(t *testing.T) { tests := []struct { Input hcl.Expression Want expression }{ { nil, expression{}, }, } for _, test := range tests { got := marshalExpression(test.Input) if !reflect.DeepEqual(got, test.Want) { t.Fatalf("wrong result:\nGot: %#v\nWant: %#v\n", got, test.Want) } } }