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 }