kubeform.dev/terraform-backend-sdk@v0.0.0-20220310143633-45f07fe731c5/terraform/node_resource_plan_orphan_test.go (about)

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