diff --git a/terraformstate/terraform_state.go b/terraformstate/terraform_state.go index 26e3892..9f67da0 100644 --- a/terraformstate/terraform_state.go +++ b/terraformstate/terraform_state.go @@ -3,7 +3,7 @@ package terraformstate import ( "encoding/json" "fmt" - "sort" + "sort" tfjson "github.com/hashicorp/terraform-json" ) @@ -113,13 +113,13 @@ func GetAllResourceChanges(plan tfjson.Plan) map[string]ResourceChanges { return resources[i].Address < resources[j].Address }) } - + sortResources(addedResources) sortResources(deletedResources) sortResources(updatedResources) sortResources(recreatedResources) sortResources(importedResources) - + return map[string]ResourceChanges{ "import": importedResources, "add": addedResources, @@ -135,11 +135,11 @@ func GetAllOutputChanges(plan tfjson.Plan) map[string][]string { addedResources := filterOutputs(plan.OutputChanges, "create") deletedResources := filterOutputs(plan.OutputChanges, "delete") updatedResources := filterOutputs(plan.OutputChanges, "update") - + sort.Strings(addedResources) - sort.Strings(deletedResources) - sort.Strings(updatedResources) - + sort.Strings(deletedResources) + sort.Strings(updatedResources) + return map[string][]string{ "add": addedResources, "delete": deletedResources, diff --git a/terraformstate/terraform_state_test.go b/terraformstate/terraform_state_test.go index d155a78..00caaa7 100644 --- a/terraformstate/terraform_state_test.go +++ b/terraformstate/terraform_state_test.go @@ -32,6 +32,73 @@ func TestResourceChangeColor(t *testing.T) { assert.Equal(t, color, ColorMagenta) } +func TestGetAllResourceChanges(t *testing.T) { + resourceChanges := ResourceChanges{ + &ResourceChange{Address: "create2", Change: &Change{Actions: Actions{ActionCreate}}}, + &ResourceChange{Address: "create1", Change: &Change{Actions: Actions{ActionCreate}}}, + &ResourceChange{Address: "delete2", Change: &Change{Actions: Actions{ActionDelete}}}, + &ResourceChange{Address: "delete1", Change: &Change{Actions: Actions{ActionDelete}}}, + &ResourceChange{Address: "update2", Change: &Change{Actions: Actions{ActionUpdate}}}, + &ResourceChange{Address: "update1", Change: &Change{Actions: Actions{ActionUpdate}}}, + &ResourceChange{Address: "import2", Change: &Change{Importing: &Importing{ID: "id1"}}}, + &ResourceChange{Address: "import1", Change: &Change{Importing: &Importing{ID: "id2"}}}, + &ResourceChange{Address: "recreate2", Change: &Change{Actions: Actions{ActionDelete, ActionCreate}}}, + &ResourceChange{Address: "recreate1", Change: &Change{Actions: Actions{ActionDelete, ActionCreate}}}, + } + plan := tfjson.Plan{ResourceChanges: resourceChanges} + + result := GetAllResourceChanges(plan) + + expectedResourceChanges := map[string]ResourceChanges{ + "add": { + &ResourceChange{Address: "create1", Change: &Change{Actions: Actions{ActionCreate}}}, + &ResourceChange{Address: "create2", Change: &Change{Actions: Actions{ActionCreate}}}, + }, + "delete": { + &ResourceChange{Address: "delete1", Change: &Change{Actions: Actions{ActionDelete}}}, + &ResourceChange{Address: "delete2", Change: &Change{Actions: Actions{ActionDelete}}}, + }, + "update": { + &ResourceChange{Address: "update1", Change: &Change{Actions: Actions{ActionUpdate}}}, + &ResourceChange{Address: "update2", Change: &Change{Actions: Actions{ActionUpdate}}}, + }, + "recreate": { + &ResourceChange{Address: "recreate1", Change: &Change{Actions: Actions{ActionDelete, ActionCreate}}}, + &ResourceChange{Address: "recreate2", Change: &Change{Actions: Actions{ActionDelete, ActionCreate}}}, + }, + "import": { + &ResourceChange{Address: "import1", Change: &Change{Importing: &Importing{ID: "id2"}}}, + &ResourceChange{Address: "import2", Change: &Change{Importing: &Importing{ID: "id1"}}}, + }, + } + + assert.Equal(t, expectedResourceChanges, result) +} + +func TestGetAllOutputChanges(t *testing.T) { + + outputChanges := map[string]*Change{ + "create2": {Actions: Actions{ActionCreate}}, + "create1": {Actions: Actions{ActionCreate}}, + "delete2": {Actions: Actions{ActionDelete}}, + "delete1": {Actions: Actions{ActionDelete}}, + "update2": {Actions: Actions{ActionUpdate}}, + "update1": {Actions: Actions{ActionUpdate}}, + } + + plan := tfjson.Plan{OutputChanges: outputChanges} + + result := GetAllOutputChanges(plan) + + expectedResourceChanges := map[string][]string{ + "add": {"create1", "create2"}, + "delete": {"delete1", "delete2"}, + "update": {"update1", "update2"}, + } + + assert.Equal(t, expectedResourceChanges, result) +} + func TestResourceChangeSuffix(t *testing.T) { ExpectedSuffix := map[Action]string{ ActionCreate: "(+)",