terraform/builtin/providers/test/splat_flatten_test.go

80 lines
2.1 KiB
Go

package test
import (
"errors"
"testing"
"github.com/hashicorp/terraform/helper/resource"
"github.com/hashicorp/terraform/terraform"
)
// This is actually a test of some core functionality in conjunction with
// helper/schema, rather than of the test provider itself.
//
// Here we're just verifying that unknown splats get flattened when assigned
// to list and set attributes. A variety of other situations are tested in
// an apply context test in the core package, but for this part we lean on
// helper/schema and thus need to exercise it at a higher level.
func TestSplatFlatten(t *testing.T) {
resource.UnitTest(t, resource.TestCase{
Providers: testAccProviders,
CheckDestroy: testAccCheckResourceDestroy,
Steps: []resource.TestStep{
resource.TestStep{
Config: `
resource "test_resource" "source" {
required = "foo ${count.index}"
required_map = {
key = "value"
}
count = 3
}
resource "test_resource" "splatted" {
# This legacy form of splatting into a list is still supported for
# backward-compatibility but no longer suggested.
set = ["${test_resource.source.*.computed_from_required}"]
list = ["${test_resource.source.*.computed_from_required}"]
required = "yep"
required_map = {
key = "value"
}
}
`,
Check: func(s *terraform.State) error {
gotAttrs := s.RootModule().Resources["test_resource.splatted"].Primary.Attributes
t.Logf("attrs %#v", gotAttrs)
wantAttrs := map[string]string{
"list.#": "3",
"list.0": "foo 0",
"list.1": "foo 1",
"list.2": "foo 2",
// This depends on the default set hash implementation.
// If that changes, these keys will need to be updated.
"set.#": "3",
"set.1136855734": "foo 0",
"set.885275168": "foo 1",
"set.2915920794": "foo 2",
}
errored := false
for k, want := range wantAttrs {
got := gotAttrs[k]
if got != want {
t.Errorf("Wrong %s value %q; want %q", k, got, want)
errored = true
}
}
if errored {
return errors.New("incorrect attribute values")
}
return nil
},
},
},
})
}