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 }