diff --git a/command/hook_count.go b/command/hook_count.go index 12fb229abfc1..5f3f514c2cf6 100644 --- a/command/hook_count.go +++ b/command/hook_count.go @@ -97,7 +97,7 @@ func (h *CountHook) PostDiff( h.ToAdd += 1 case terraform.DiffDestroy: h.ToRemove += 1 - default: + case terraform.DiffUpdate: h.ToChange += 1 } diff --git a/command/hook_count_test.go b/command/hook_count_test.go index 37fc72b69c88..deb822699774 100644 --- a/command/hook_count_test.go +++ b/command/hook_count_test.go @@ -1,6 +1,7 @@ package command import ( + "reflect" "testing" "github.com/hashicorp/terraform/terraform" @@ -9,3 +10,175 @@ import ( func TestCountHook_impl(t *testing.T) { var _ terraform.Hook = new(CountHook) } + +func TestCountHookPostDiff_DestroyOnly(t *testing.T) { + h := new(CountHook) + + resources := map[string]*terraform.InstanceDiff{ + "foo": &terraform.InstanceDiff{Destroy: true}, + "bar": &terraform.InstanceDiff{Destroy: true}, + "lorem": &terraform.InstanceDiff{Destroy: true}, + "ipsum": &terraform.InstanceDiff{Destroy: true}, + } + + n := &terraform.InstanceInfo{} // TODO + + for _, d := range resources { + h.PostDiff(n, d) + } + + expected := new(CountHook) + expected.ToAdd = 0 + expected.ToChange = 0 + expected.ToRemoveAndAdd = 0 + expected.ToRemove = 4 + + if !reflect.DeepEqual(expected, h) { + t.Fatalf("Expected %#v, got %#v instead.", + expected, h) + } +} + +func TestCountHookPostDiff_AddOnly(t *testing.T) { + h := new(CountHook) + + resources := map[string]*terraform.InstanceDiff{ + "foo": &terraform.InstanceDiff{ + Attributes: map[string]*terraform.ResourceAttrDiff{ + "foo": &terraform.ResourceAttrDiff{RequiresNew: true}, + }, + }, + "bar": &terraform.InstanceDiff{ + Attributes: map[string]*terraform.ResourceAttrDiff{ + "foo": &terraform.ResourceAttrDiff{RequiresNew: true}, + }, + }, + "lorem": &terraform.InstanceDiff{ + Attributes: map[string]*terraform.ResourceAttrDiff{ + "foo": &terraform.ResourceAttrDiff{RequiresNew: true}, + }, + }, + } + + n := &terraform.InstanceInfo{} + + for _, d := range resources { + h.PostDiff(n, d) + } + + expected := new(CountHook) + expected.ToAdd = 3 + expected.ToChange = 0 + expected.ToRemoveAndAdd = 0 + expected.ToRemove = 0 + + if !reflect.DeepEqual(expected, h) { + t.Fatalf("Expected %#v, got %#v instead.", + expected, h) + } +} + +func TestCountHookPostDiff_ChangeOnly(t *testing.T) { + h := new(CountHook) + + resources := map[string]*terraform.InstanceDiff{ + "foo": &terraform.InstanceDiff{ + Destroy: false, + Attributes: map[string]*terraform.ResourceAttrDiff{ + "foo": &terraform.ResourceAttrDiff{}, + }, + }, + "bar": &terraform.InstanceDiff{ + Destroy: false, + Attributes: map[string]*terraform.ResourceAttrDiff{ + "foo": &terraform.ResourceAttrDiff{}, + }, + }, + "lorem": &terraform.InstanceDiff{ + Destroy: false, + Attributes: map[string]*terraform.ResourceAttrDiff{ + "foo": &terraform.ResourceAttrDiff{}, + }, + }, + } + + n := &terraform.InstanceInfo{} + + for _, d := range resources { + h.PostDiff(n, d) + } + + expected := new(CountHook) + expected.ToAdd = 0 + expected.ToChange = 3 + expected.ToRemoveAndAdd = 0 + expected.ToRemove = 0 + + if !reflect.DeepEqual(expected, h) { + t.Fatalf("Expected %#v, got %#v instead.", + expected, h) + } +} + +func TestCountHookPostDiff_Mixed(t *testing.T) { + h := new(CountHook) + + resources := map[string]*terraform.InstanceDiff{ + "foo": &terraform.InstanceDiff{ + Destroy: true, + }, + "bar": &terraform.InstanceDiff{}, + "lorem": &terraform.InstanceDiff{ + Destroy: false, + Attributes: map[string]*terraform.ResourceAttrDiff{ + "foo": &terraform.ResourceAttrDiff{}, + }, + }, + "ipsum": &terraform.InstanceDiff{Destroy: true}, + } + + n := &terraform.InstanceInfo{} + + for _, d := range resources { + h.PostDiff(n, d) + } + + expected := new(CountHook) + expected.ToAdd = 0 + expected.ToChange = 1 + expected.ToRemoveAndAdd = 0 + expected.ToRemove = 2 + + if !reflect.DeepEqual(expected, h) { + t.Fatalf("Expected %#v, got %#v instead.", + expected, h) + } +} + +func TestCountHookPostDiff_NoChange(t *testing.T) { + h := new(CountHook) + + resources := map[string]*terraform.InstanceDiff{ + "foo": &terraform.InstanceDiff{}, + "bar": &terraform.InstanceDiff{}, + "lorem": &terraform.InstanceDiff{}, + "ipsum": &terraform.InstanceDiff{}, + } + + n := &terraform.InstanceInfo{} + + for _, d := range resources { + h.PostDiff(n, d) + } + + expected := new(CountHook) + expected.ToAdd = 0 + expected.ToChange = 0 + expected.ToRemoveAndAdd = 0 + expected.ToRemove = 0 + + if !reflect.DeepEqual(expected, h) { + t.Fatalf("Expected %#v, got %#v instead.", + expected, h) + } +}