// Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: BUSL-1.1 package refactoring import ( "testing" "github.com/google/go-cmp/cmp" "github.com/hashicorp/hcl/v2" "github.com/hashicorp/terraform/internal/addrs" "github.com/hashicorp/terraform/internal/tfdiags" ) func TestFindRemoveStatements(t *testing.T) { // LAZY: We don't need the expanded instances from loadRefactoringFixture // but reuse the helper function anyway. rootCfg, _ := loadRefactoringFixture(t, "testdata/remove-statements") configResourceBasic := addrs.ConfigResource{ Module: addrs.RootModule, Resource: addrs.Resource{ Mode: addrs.ManagedResourceMode, Type: "test_resource", Name: "foo", }, } configResourceWithModule := addrs.ConfigResource{ Module: addrs.Module{"gone"}, Resource: addrs.Resource{ Mode: addrs.ManagedResourceMode, Type: "test_resource", Name: "bar", }, } configModuleBasic := addrs.Module{"gone", "gonechild"} configResourceOverridden := addrs.ConfigResource{ Module: addrs.Module{"child"}, Resource: addrs.Resource{ Mode: addrs.ManagedResourceMode, Type: "test_resource", Name: "baz", }, } configResourceInModule := addrs.ConfigResource{ Module: addrs.Module{"child"}, Resource: addrs.Resource{ Mode: addrs.ManagedResourceMode, Type: "test_resource", Name: "boo", }, } configModuleInModule := addrs.Module{"child", "grandchild"} want := addrs.MakeMap[addrs.ConfigMoveable, RemoveStatement]( addrs.MakeMapElem[addrs.ConfigMoveable, RemoveStatement](configResourceBasic, RemoveStatement{ From: configResourceBasic, Destroy: false, DeclRange: tfdiags.SourceRangeFromHCL(hcl.Range{ Filename: "testdata/remove-statements/main.tf", Start: hcl.Pos{Line: 2, Column: 1, Byte: 27}, End: hcl.Pos{Line: 2, Column: 8, Byte: 34}, }), }), addrs.MakeMapElem[addrs.ConfigMoveable, RemoveStatement](configResourceWithModule, RemoveStatement{ From: configResourceWithModule, Destroy: false, DeclRange: tfdiags.SourceRangeFromHCL(hcl.Range{ Filename: "testdata/remove-statements/main.tf", Start: hcl.Pos{Line: 10, Column: 1, Byte: 138}, End: hcl.Pos{Line: 10, Column: 8, Byte: 145}, }), }), addrs.MakeMapElem[addrs.ConfigMoveable, RemoveStatement](configModuleBasic, RemoveStatement{ From: configModuleBasic, Destroy: false, DeclRange: tfdiags.SourceRangeFromHCL(hcl.Range{ Filename: "testdata/remove-statements/main.tf", Start: hcl.Pos{Line: 18, Column: 1, Byte: 253}, End: hcl.Pos{Line: 18, Column: 8, Byte: 260}, }), }), addrs.MakeMapElem[addrs.ConfigMoveable, RemoveStatement](configResourceOverridden, RemoveStatement{ From: configResourceOverridden, Destroy: true, DeclRange: tfdiags.SourceRangeFromHCL(hcl.Range{ Filename: "testdata/remove-statements/main.tf", // the statement in the parent module takes precedence Start: hcl.Pos{Line: 30, Column: 1, Byte: 428}, End: hcl.Pos{Line: 30, Column: 8, Byte: 435}, }), }), addrs.MakeMapElem[addrs.ConfigMoveable, RemoveStatement](configResourceInModule, RemoveStatement{ From: configResourceInModule, Destroy: true, DeclRange: tfdiags.SourceRangeFromHCL(hcl.Range{ Filename: "testdata/remove-statements/child/main.tf", Start: hcl.Pos{Line: 10, Column: 1, Byte: 141}, End: hcl.Pos{Line: 10, Column: 8, Byte: 148}, }), }), addrs.MakeMapElem[addrs.ConfigMoveable, RemoveStatement](configModuleInModule, RemoveStatement{ From: configModuleInModule, Destroy: false, DeclRange: tfdiags.SourceRangeFromHCL(hcl.Range{ Filename: "testdata/remove-statements/child/main.tf", Start: hcl.Pos{Line: 18, Column: 1, Byte: 247}, End: hcl.Pos{Line: 18, Column: 8, Byte: 254}, }), }), ) got, diags := FindRemoveStatements(rootCfg) if diags.HasErrors() { t.Fatal(diags.Err().Error()) } if diff := cmp.Diff(want, got); diff != "" { t.Errorf("wrong result\n%s", diff) } }