mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-30 10:47:14 -06:00
ac2a870ea0
In order to marshal config blocks using ConfigModeAttr, we need to insert the fixup body to map hcl blocks to the attribute in the schema.
148 lines
3.0 KiB
Go
148 lines
3.0 KiB
Go
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)
|
|
}
|
|
}
|
|
}
|