168 lines
3.4 KiB
Go
168 lines
3.4 KiB
Go
|
package hcl2shim
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"strings"
|
||
|
"testing"
|
||
|
|
||
|
"github.com/go-test/deep"
|
||
|
"github.com/zclconf/go-cty/cty"
|
||
|
)
|
||
|
|
||
|
func TestPathFromFlatmap(t *testing.T) {
|
||
|
tests := []struct {
|
||
|
Flatmap string
|
||
|
Type cty.Type
|
||
|
Want cty.Path
|
||
|
WantErr string
|
||
|
}{
|
||
|
{
|
||
|
Flatmap: "",
|
||
|
Type: cty.EmptyObject,
|
||
|
Want: nil,
|
||
|
},
|
||
|
{
|
||
|
Flatmap: "attr",
|
||
|
Type: cty.EmptyObject,
|
||
|
Want: nil,
|
||
|
WantErr: `attribute "attr" not found`,
|
||
|
},
|
||
|
{
|
||
|
Flatmap: "foo",
|
||
|
Type: cty.Object(map[string]cty.Type{
|
||
|
"foo": cty.String,
|
||
|
}),
|
||
|
Want: cty.Path{
|
||
|
cty.GetAttrStep{Name: "foo"},
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
Flatmap: "foo.#",
|
||
|
Type: cty.Object(map[string]cty.Type{
|
||
|
"foo": cty.List(cty.String),
|
||
|
}),
|
||
|
Want: cty.Path{
|
||
|
cty.GetAttrStep{Name: "foo"},
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
Flatmap: "foo.1",
|
||
|
Type: cty.Object(map[string]cty.Type{
|
||
|
"foo": cty.List(cty.String),
|
||
|
}),
|
||
|
Want: cty.Path{
|
||
|
cty.GetAttrStep{Name: "foo"},
|
||
|
cty.IndexStep{Key: cty.NumberIntVal(1)},
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
Flatmap: "foo.1",
|
||
|
Type: cty.Object(map[string]cty.Type{
|
||
|
"foo": cty.Tuple([]cty.Type{
|
||
|
cty.String,
|
||
|
cty.Bool,
|
||
|
}),
|
||
|
}),
|
||
|
Want: cty.Path{
|
||
|
cty.GetAttrStep{Name: "foo"},
|
||
|
cty.IndexStep{Key: cty.NumberIntVal(1)},
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
Flatmap: "foo.24534534",
|
||
|
Type: cty.Object(map[string]cty.Type{
|
||
|
"foo": cty.Set(cty.String),
|
||
|
}),
|
||
|
Want: cty.Path{
|
||
|
cty.GetAttrStep{Name: "foo"},
|
||
|
cty.IndexStep{Key: cty.NumberIntVal(24534534)},
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
Flatmap: "foo.%",
|
||
|
Type: cty.Object(map[string]cty.Type{
|
||
|
"foo": cty.Map(cty.String),
|
||
|
}),
|
||
|
Want: cty.Path{
|
||
|
cty.GetAttrStep{Name: "foo"},
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
Flatmap: "foo.baz",
|
||
|
//FlatMap: "foo.bar.baz",
|
||
|
Type: cty.Object(map[string]cty.Type{
|
||
|
"foo": cty.Map(cty.Bool),
|
||
|
}),
|
||
|
Want: cty.Path{
|
||
|
cty.GetAttrStep{Name: "foo"},
|
||
|
cty.IndexStep{Key: cty.StringVal("baz")},
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
Flatmap: "foo.bar.baz",
|
||
|
Type: cty.Object(map[string]cty.Type{
|
||
|
"foo": cty.Map(
|
||
|
cty.Map(cty.Bool),
|
||
|
),
|
||
|
}),
|
||
|
Want: cty.Path{
|
||
|
cty.GetAttrStep{Name: "foo"},
|
||
|
cty.IndexStep{Key: cty.StringVal("bar")},
|
||
|
cty.IndexStep{Key: cty.StringVal("baz")},
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
Flatmap: "foo.0.bar",
|
||
|
Type: cty.Object(map[string]cty.Type{
|
||
|
"foo": cty.List(cty.Object(map[string]cty.Type{
|
||
|
"bar": cty.String,
|
||
|
"baz": cty.Bool,
|
||
|
})),
|
||
|
}),
|
||
|
Want: cty.Path{
|
||
|
cty.GetAttrStep{Name: "foo"},
|
||
|
cty.IndexStep{Key: cty.NumberIntVal(0)},
|
||
|
cty.GetAttrStep{Name: "bar"},
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
Flatmap: "foo.34534534.baz",
|
||
|
Type: cty.Object(map[string]cty.Type{
|
||
|
"foo": cty.Set(cty.Object(map[string]cty.Type{
|
||
|
"bar": cty.String,
|
||
|
"baz": cty.Bool,
|
||
|
})),
|
||
|
}),
|
||
|
Want: cty.Path{
|
||
|
cty.GetAttrStep{Name: "foo"},
|
||
|
cty.IndexStep{Key: cty.NumberIntVal(34534534)},
|
||
|
cty.GetAttrStep{Name: "baz"},
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
|
||
|
for _, test := range tests {
|
||
|
t.Run(fmt.Sprintf("%s as %#v", test.Flatmap, test.Type), func(t *testing.T) {
|
||
|
got, err := PathFromFlatmapKey(test.Flatmap, test.Type)
|
||
|
|
||
|
if test.WantErr != "" {
|
||
|
if err == nil {
|
||
|
t.Fatalf("succeeded; want error: %s", test.WantErr)
|
||
|
}
|
||
|
if got, want := err.Error(), test.WantErr; !strings.Contains(got, want) {
|
||
|
t.Fatalf("wrong error\ngot: %s\nwant: %s", got, want)
|
||
|
}
|
||
|
return
|
||
|
} else {
|
||
|
if err != nil {
|
||
|
t.Fatalf("unexpected error: %s", err.Error())
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for _, problem := range deep.Equal(got, test.Want) {
|
||
|
t.Error(problem)
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
}
|