package format import ( "fmt" "testing" "github.com/hashicorp/terraform/internal/lang/marks" "github.com/zclconf/go-cty/cty" ) func TestObjectValueIDOrName(t *testing.T) { tests := []struct { obj cty.Value id [2]string name [2]string either [2]string }{ { cty.NullVal(cty.EmptyObject), [...]string{"", ""}, [...]string{"", ""}, [...]string{"", ""}, }, { cty.UnknownVal(cty.EmptyObject), [...]string{"", ""}, [...]string{"", ""}, [...]string{"", ""}, }, { cty.EmptyObjectVal, [...]string{"", ""}, [...]string{"", ""}, [...]string{"", ""}, }, { cty.ObjectVal(map[string]cty.Value{ "id": cty.StringVal("foo-123"), }), [...]string{"id", "foo-123"}, [...]string{"", ""}, [...]string{"id", "foo-123"}, }, { cty.ObjectVal(map[string]cty.Value{ "id": cty.StringVal("foo-123"), "name": cty.StringVal("awesome-foo"), }), [...]string{"id", "foo-123"}, [...]string{"name", "awesome-foo"}, [...]string{"id", "foo-123"}, }, { cty.ObjectVal(map[string]cty.Value{ "name": cty.StringVal("awesome-foo"), }), [...]string{"name", "awesome-foo"}, [...]string{"name", "awesome-foo"}, [...]string{"name", "awesome-foo"}, }, { cty.ObjectVal(map[string]cty.Value{ "name": cty.StringVal("awesome-foo").Mark(marks.Sensitive), }), [...]string{"", ""}, [...]string{"", ""}, [...]string{"", ""}, }, { cty.ObjectVal(map[string]cty.Value{ "name": cty.StringVal("awesome-foo"), "tags": cty.MapVal(map[string]cty.Value{ "Name": cty.StringVal("My Awesome Foo"), }), }), [...]string{"name", "awesome-foo"}, [...]string{"name", "awesome-foo"}, [...]string{"name", "awesome-foo"}, }, { cty.ObjectVal(map[string]cty.Value{ "tags": cty.MapVal(map[string]cty.Value{ "Name": cty.StringVal("My Awesome Foo"), "name": cty.StringVal("awesome-foo"), }), }), [...]string{"", ""}, [...]string{"tags.name", "awesome-foo"}, [...]string{"tags.name", "awesome-foo"}, }, { cty.ObjectVal(map[string]cty.Value{ "tags": cty.MapVal(map[string]cty.Value{ "Name": cty.StringVal("My Awesome Foo"), }), }), [...]string{"", ""}, [...]string{"tags.Name", "My Awesome Foo"}, [...]string{"tags.Name", "My Awesome Foo"}, }, // The following are degenerate cases, included to make sure we don't // crash when we encounter them. If you're here fixing a reported panic // in this formatter, this is the place to add a new test case. { cty.ObjectVal(map[string]cty.Value{ "id": cty.True, }), [...]string{"", ""}, [...]string{"", ""}, [...]string{"", ""}, }, { cty.ObjectVal(map[string]cty.Value{ "id": cty.NullVal(cty.String), }), [...]string{"", ""}, [...]string{"", ""}, [...]string{"", ""}, }, { cty.ObjectVal(map[string]cty.Value{ "id": cty.UnknownVal(cty.String), }), [...]string{"", ""}, [...]string{"", ""}, [...]string{"", ""}, }, { cty.ObjectVal(map[string]cty.Value{ "tags": cty.StringVal("foo"), }), [...]string{"", ""}, [...]string{"", ""}, [...]string{"", ""}, }, { cty.ObjectVal(map[string]cty.Value{ "tags": cty.NullVal(cty.Map(cty.String)), }), [...]string{"", ""}, [...]string{"", ""}, [...]string{"", ""}, }, { cty.ObjectVal(map[string]cty.Value{ "tags": cty.UnknownVal(cty.Map(cty.String)), }), [...]string{"", ""}, [...]string{"", ""}, [...]string{"", ""}, }, { cty.ObjectVal(map[string]cty.Value{ "tags": cty.MapVal(map[string]cty.Value{ "Name": cty.True, }), }), [...]string{"", ""}, [...]string{"", ""}, [...]string{"", ""}, }, { cty.ObjectVal(map[string]cty.Value{ "tags": cty.MapVal(map[string]cty.Value{ "Name": cty.UnknownVal(cty.String), }), }), [...]string{"", ""}, [...]string{"", ""}, [...]string{"", ""}, }, { cty.ObjectVal(map[string]cty.Value{ "tags": cty.MapVal(map[string]cty.Value{ "Name": cty.UnknownVal(cty.String).Mark(marks.Sensitive), }), }), [...]string{"", ""}, [...]string{"", ""}, [...]string{"", ""}, }, { cty.ObjectVal(map[string]cty.Value{ "tags": cty.MapVal(map[string]cty.Value{ "Name": cty.NullVal(cty.String), }), }), [...]string{"", ""}, [...]string{"", ""}, [...]string{"", ""}, }, } for _, test := range tests { t.Run(fmt.Sprintf("%#v", test.obj), func(t *testing.T) { obj := test.obj gotIDKey, gotIDVal := ObjectValueID(obj) gotNameKey, gotNameVal := ObjectValueName(obj) gotEitherKey, gotEitherVal := ObjectValueIDOrName(obj) if got, want := [...]string{gotIDKey, gotIDVal}, test.id; got != want { t.Errorf("wrong ObjectValueID result\ngot: %#v\nwant: %#v", got, want) } if got, want := [...]string{gotNameKey, gotNameVal}, test.name; got != want { t.Errorf("wrong ObjectValueName result\ngot: %#v\nwant: %#v", got, want) } if got, want := [...]string{gotEitherKey, gotEitherVal}, test.either; got != want { t.Errorf("wrong ObjectValueIDOrName result\ngot: %#v\nwant: %#v", got, want) } }) } }