From 2e2374cfcb11a33f65b424db105614ea7ee5405c Mon Sep 17 00:00:00 2001 From: James Bardin Date: Fri, 1 Feb 2019 21:34:12 -0500 Subject: [PATCH] add failing test for set elements with custom diff Adding a DiffSuppressFunc for set elements can cause them to be missed in the set diff entirely. --- builtin/providers/test/provider.go | 1 + builtin/providers/test/resource_list_set.go | 73 +++++++++++++++++++ .../providers/test/resource_list_set_test.go | 55 ++++++++++++++ 3 files changed, 129 insertions(+) create mode 100644 builtin/providers/test/resource_list_set.go create mode 100644 builtin/providers/test/resource_list_set_test.go diff --git a/builtin/providers/test/provider.go b/builtin/providers/test/provider.go index f2c9d376dd..5f7f8c7877 100644 --- a/builtin/providers/test/provider.go +++ b/builtin/providers/test/provider.go @@ -30,6 +30,7 @@ func Provider() terraform.ResourceProvider { "test_resource_deprecated": testResourceDeprecated(), "test_resource_defaults": testResourceDefaults(), "test_resource_list": testResourceList(), + "test_resource_list_set": testResourceListSet(), "test_resource_map": testResourceMap(), "test_resource_computed_set": testResourceComputedSet(), }, diff --git a/builtin/providers/test/resource_list_set.go b/builtin/providers/test/resource_list_set.go new file mode 100644 index 0000000000..6e83903641 --- /dev/null +++ b/builtin/providers/test/resource_list_set.go @@ -0,0 +1,73 @@ +package test + +import ( + "fmt" + "math/rand" + + "github.com/hashicorp/terraform/helper/schema" +) + +func testResourceListSet() *schema.Resource { + return &schema.Resource{ + Create: testResourceListSetCreate, + Read: testResourceListSetRead, + Delete: testResourceListSetDelete, + Update: testResourceListSetUpdate, + + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + + Schema: map[string]*schema.Schema{ + "list": { + Type: schema.TypeList, + Optional: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "set": { + Type: schema.TypeSet, + Optional: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "elem": { + Type: schema.TypeString, + Optional: true, + DiffSuppressFunc: func(_, o, n string, _ *schema.ResourceData) bool { + return o == n + }, + }, + }, + }, + Set: func(v interface{}) int { + raw := v.(map[string]interface{}) + if el, ok := raw["elem"]; ok { + return schema.HashString(el) + } + return 42 + }, + }, + }, + }, + }, + }, + } +} + +func testResourceListSetCreate(d *schema.ResourceData, meta interface{}) error { + d.SetId(fmt.Sprintf("%x", rand.Int63())) + return testResourceListSetRead(d, meta) +} + +func testResourceListSetUpdate(d *schema.ResourceData, meta interface{}) error { + return testResourceListSetRead(d, meta) +} + +func testResourceListSetRead(d *schema.ResourceData, meta interface{}) error { + return nil +} + +func testResourceListSetDelete(d *schema.ResourceData, meta interface{}) error { + d.SetId("") + return nil +} diff --git a/builtin/providers/test/resource_list_set_test.go b/builtin/providers/test/resource_list_set_test.go new file mode 100644 index 0000000000..11cb742e8a --- /dev/null +++ b/builtin/providers/test/resource_list_set_test.go @@ -0,0 +1,55 @@ +package test + +import ( + "strings" + "testing" + + "github.com/hashicorp/terraform/helper/resource" +) + +func TestResourceListSet_basic(t *testing.T) { + resource.UnitTest(t, resource.TestCase{ + Providers: testAccProviders, + CheckDestroy: testAccCheckResourceDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: strings.TrimSpace(` +resource "test_resource_list_set" "foo" { + list { + set { + elem = "A" + } + set { + elem = "B" + } + } +} + `), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr("test_resource_list_set.foo", "list.0.set.1255198513.elem", "B"), + resource.TestCheckResourceAttr("test_resource_list_set.foo", "list.0.set.3554254475.elem", "A"), + resource.TestCheckResourceAttr("test_resource_list_set.foo", "list.0.set.#", "2"), + ), + }, + resource.TestStep{ + Config: strings.TrimSpace(` +resource "test_resource_list_set" "foo" { + list { + set { + elem = "B" + } + set { + elem = "C" + } + } +} + `), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr("test_resource_list_set.foo", "list.0.set.1255198513.elem", "B"), + resource.TestCheckResourceAttr("test_resource_list_set.foo", "list.0.set.1037565863.elem", "C"), + resource.TestCheckResourceAttr("test_resource_list_set.foo", "list.0.set.#", "2"), + ), + }, + }, + }) +}