github.com/kanishk98/terraform@v1.3.0-dev.0.20220917174235-661ca8088a6a/internal/terraform/node_resource_plan_orphan_test.go (about)

     1  package terraform
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/hashicorp/terraform/internal/addrs"
     7  	"github.com/hashicorp/terraform/internal/configs/configschema"
     8  	"github.com/hashicorp/terraform/internal/instances"
     9  	"github.com/hashicorp/terraform/internal/plans"
    10  	"github.com/hashicorp/terraform/internal/providers"
    11  	"github.com/hashicorp/terraform/internal/states"
    12  	"github.com/zclconf/go-cty/cty"
    13  )
    14  
    15  func TestNodeResourcePlanOrphanExecute(t *testing.T) {
    16  	state := states.NewState()
    17  	state.Module(addrs.RootModuleInstance).SetResourceInstanceCurrent(
    18  		addrs.Resource{
    19  			Mode: addrs.ManagedResourceMode,
    20  			Type: "test_object",
    21  			Name: "foo",
    22  		}.Instance(addrs.NoKey),
    23  		&states.ResourceInstanceObjectSrc{
    24  			AttrsFlat: map[string]string{
    25  				"test_string": "foo",
    26  			},
    27  			Status: states.ObjectReady,
    28  		},
    29  		addrs.AbsProviderConfig{
    30  			Provider: addrs.NewDefaultProvider("test"),
    31  			Module:   addrs.RootModule,
    32  		},
    33  	)
    34  
    35  	p := simpleMockProvider()
    36  	p.ConfigureProvider(providers.ConfigureProviderRequest{})
    37  	ctx := &MockEvalContext{
    38  		StateState:               state.SyncWrapper(),
    39  		RefreshStateState:        state.DeepCopy().SyncWrapper(),
    40  		PrevRunStateState:        state.DeepCopy().SyncWrapper(),
    41  		InstanceExpanderExpander: instances.NewExpander(),
    42  		ProviderProvider:         p,
    43  		ProviderSchemaSchema: &ProviderSchema{
    44  			ResourceTypes: map[string]*configschema.Block{
    45  				"test_object": simpleTestSchema(),
    46  			},
    47  		},
    48  		ChangesChanges: plans.NewChanges().SyncWrapper(),
    49  	}
    50  
    51  	node := NodePlannableResourceInstanceOrphan{
    52  		NodeAbstractResourceInstance: &NodeAbstractResourceInstance{
    53  			NodeAbstractResource: NodeAbstractResource{
    54  				ResolvedProvider: addrs.AbsProviderConfig{
    55  					Provider: addrs.NewDefaultProvider("test"),
    56  					Module:   addrs.RootModule,
    57  				},
    58  			},
    59  			Addr: mustResourceInstanceAddr("test_object.foo"),
    60  		},
    61  	}
    62  	diags := node.Execute(ctx, walkApply)
    63  	if diags.HasErrors() {
    64  		t.Fatalf("unexpected error: %s", diags.Err())
    65  	}
    66  	if !state.Empty() {
    67  		t.Fatalf("expected empty state, got %s", state.String())
    68  	}
    69  }
    70  
    71  func TestNodeResourcePlanOrphanExecute_alreadyDeleted(t *testing.T) {
    72  	addr := addrs.Resource{
    73  		Mode: addrs.ManagedResourceMode,
    74  		Type: "test_object",
    75  		Name: "foo",
    76  	}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance)
    77  
    78  	state := states.NewState()
    79  	state.Module(addrs.RootModuleInstance).SetResourceInstanceCurrent(
    80  		addr.Resource,
    81  		&states.ResourceInstanceObjectSrc{
    82  			AttrsFlat: map[string]string{
    83  				"test_string": "foo",
    84  			},
    85  			Status: states.ObjectReady,
    86  		},
    87  		addrs.AbsProviderConfig{
    88  			Provider: addrs.NewDefaultProvider("test"),
    89  			Module:   addrs.RootModule,
    90  		},
    91  	)
    92  	refreshState := state.DeepCopy()
    93  	prevRunState := state.DeepCopy()
    94  	changes := plans.NewChanges()
    95  
    96  	p := simpleMockProvider()
    97  	p.ConfigureProvider(providers.ConfigureProviderRequest{})
    98  	p.ReadResourceResponse = &providers.ReadResourceResponse{
    99  		NewState: cty.NullVal(p.GetProviderSchemaResponse.ResourceTypes["test_string"].Block.ImpliedType()),
   100  	}
   101  	ctx := &MockEvalContext{
   102  		StateState:               state.SyncWrapper(),
   103  		RefreshStateState:        refreshState.SyncWrapper(),
   104  		PrevRunStateState:        prevRunState.SyncWrapper(),
   105  		InstanceExpanderExpander: instances.NewExpander(),
   106  		ProviderProvider:         p,
   107  		ProviderSchemaSchema: &ProviderSchema{
   108  			ResourceTypes: map[string]*configschema.Block{
   109  				"test_object": simpleTestSchema(),
   110  			},
   111  		},
   112  		ChangesChanges: changes.SyncWrapper(),
   113  	}
   114  
   115  	node := NodePlannableResourceInstanceOrphan{
   116  		NodeAbstractResourceInstance: &NodeAbstractResourceInstance{
   117  			NodeAbstractResource: NodeAbstractResource{
   118  				ResolvedProvider: addrs.AbsProviderConfig{
   119  					Provider: addrs.NewDefaultProvider("test"),
   120  					Module:   addrs.RootModule,
   121  				},
   122  			},
   123  			Addr: mustResourceInstanceAddr("test_object.foo"),
   124  		},
   125  	}
   126  	diags := node.Execute(ctx, walkPlan)
   127  	if diags.HasErrors() {
   128  		t.Fatalf("unexpected error: %s", diags.Err())
   129  	}
   130  	if !state.Empty() {
   131  		t.Fatalf("expected empty state, got %s", state.String())
   132  	}
   133  
   134  	if got := prevRunState.ResourceInstance(addr); got == nil {
   135  		t.Errorf("no entry for %s in the prev run state; should still be present", addr)
   136  	}
   137  	if got := refreshState.ResourceInstance(addr); got != nil {
   138  		t.Errorf("refresh state has entry for %s; should've been removed", addr)
   139  	}
   140  	if got := changes.ResourceInstance(addr); got == nil {
   141  		t.Errorf("no entry for %s in the planned changes; should have a NoOp change", addr)
   142  	} else {
   143  		if got, want := got.Action, plans.NoOp; got != want {
   144  			t.Errorf("planned change for %s has wrong action\ngot:  %s\nwant: %s", addr, got, want)
   145  		}
   146  	}
   147  
   148  }