github.com/muratcelep/terraform@v1.1.0-beta2-not-internal-4/not-internal/terraform/transform_orphan_count_test.go (about) 1 package terraform 2 3 import ( 4 "strings" 5 "testing" 6 7 "github.com/muratcelep/terraform/not-internal/addrs" 8 "github.com/muratcelep/terraform/not-internal/states" 9 ) 10 11 func TestOrphanResourceCountTransformer(t *testing.T) { 12 state := states.NewState() 13 root := state.RootModule() 14 root.SetResourceInstanceCurrent( 15 mustResourceInstanceAddr("aws_instance.web").Resource, 16 &states.ResourceInstanceObjectSrc{ 17 Status: states.ObjectReady, 18 AttrsJSON: []byte(`{"id":"foo"}`), 19 }, 20 mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`), 21 ) 22 root.SetResourceInstanceCurrent( 23 mustResourceInstanceAddr("aws_instance.foo[0]").Resource, 24 &states.ResourceInstanceObjectSrc{ 25 Status: states.ObjectReady, 26 AttrsJSON: []byte(`{"id":"foo"}`), 27 }, 28 mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`), 29 ) 30 root.SetResourceInstanceCurrent( 31 mustResourceInstanceAddr("aws_instance.foo[2]").Resource, 32 &states.ResourceInstanceObjectSrc{ 33 Status: states.ObjectReady, 34 AttrsJSON: []byte(`{"id":"foo"}`), 35 }, 36 mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`), 37 ) 38 39 g := Graph{Path: addrs.RootModuleInstance} 40 41 { 42 tf := &OrphanResourceInstanceCountTransformer{ 43 Concrete: testOrphanResourceConcreteFunc, 44 Addr: addrs.RootModuleInstance.Resource( 45 addrs.ManagedResourceMode, "aws_instance", "foo", 46 ), 47 InstanceAddrs: []addrs.AbsResourceInstance{mustResourceInstanceAddr("aws_instance.foo[0]")}, 48 State: state, 49 } 50 if err := tf.Transform(&g); err != nil { 51 t.Fatalf("err: %s", err) 52 } 53 } 54 55 actual := strings.TrimSpace(g.String()) 56 expected := strings.TrimSpace(testTransformOrphanResourceCountBasicStr) 57 if actual != expected { 58 t.Fatalf("bad:\n\n%s", actual) 59 } 60 } 61 62 func TestOrphanResourceCountTransformer_zero(t *testing.T) { 63 state := states.NewState() 64 root := state.RootModule() 65 root.SetResourceInstanceCurrent( 66 mustResourceInstanceAddr("aws_instance.web").Resource, 67 &states.ResourceInstanceObjectSrc{ 68 Status: states.ObjectReady, 69 AttrsJSON: []byte(`{"id":"foo"}`), 70 }, 71 mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`), 72 ) 73 root.SetResourceInstanceCurrent( 74 mustResourceInstanceAddr("aws_instance.foo[0]").Resource, 75 &states.ResourceInstanceObjectSrc{ 76 Status: states.ObjectReady, 77 AttrsJSON: []byte(`{"id":"foo"}`), 78 }, 79 mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`), 80 ) 81 root.SetResourceInstanceCurrent( 82 mustResourceInstanceAddr("aws_instance.foo[2]").Resource, 83 &states.ResourceInstanceObjectSrc{ 84 Status: states.ObjectReady, 85 AttrsJSON: []byte(`{"id":"foo"}`), 86 }, 87 mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`), 88 ) 89 90 g := Graph{Path: addrs.RootModuleInstance} 91 92 { 93 tf := &OrphanResourceInstanceCountTransformer{ 94 Concrete: testOrphanResourceConcreteFunc, 95 Addr: addrs.RootModuleInstance.Resource( 96 addrs.ManagedResourceMode, "aws_instance", "foo", 97 ), 98 InstanceAddrs: []addrs.AbsResourceInstance{}, 99 State: state, 100 } 101 if err := tf.Transform(&g); err != nil { 102 t.Fatalf("err: %s", err) 103 } 104 } 105 106 actual := strings.TrimSpace(g.String()) 107 expected := strings.TrimSpace(testTransformOrphanResourceCountZeroStr) 108 if actual != expected { 109 t.Fatalf("bad:\n\n%s", actual) 110 } 111 } 112 113 func TestOrphanResourceCountTransformer_oneIndex(t *testing.T) { 114 state := states.NewState() 115 root := state.RootModule() 116 root.SetResourceInstanceCurrent( 117 mustResourceInstanceAddr("aws_instance.web").Resource, 118 &states.ResourceInstanceObjectSrc{ 119 Status: states.ObjectReady, 120 AttrsJSON: []byte(`{"id":"foo"}`), 121 }, 122 mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`), 123 ) 124 root.SetResourceInstanceCurrent( 125 mustResourceInstanceAddr("aws_instance.foo[0]").Resource, 126 &states.ResourceInstanceObjectSrc{ 127 Status: states.ObjectReady, 128 AttrsJSON: []byte(`{"id":"foo"}`), 129 }, 130 mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`), 131 ) 132 root.SetResourceInstanceCurrent( 133 mustResourceInstanceAddr("aws_instance.foo[1]").Resource, 134 &states.ResourceInstanceObjectSrc{ 135 Status: states.ObjectReady, 136 AttrsJSON: []byte(`{"id":"foo"}`), 137 }, 138 mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`), 139 ) 140 141 g := Graph{Path: addrs.RootModuleInstance} 142 143 { 144 tf := &OrphanResourceInstanceCountTransformer{ 145 Concrete: testOrphanResourceConcreteFunc, 146 Addr: addrs.RootModuleInstance.Resource( 147 addrs.ManagedResourceMode, "aws_instance", "foo", 148 ), 149 InstanceAddrs: []addrs.AbsResourceInstance{mustResourceInstanceAddr("aws_instance.foo[0]")}, 150 State: state, 151 } 152 if err := tf.Transform(&g); err != nil { 153 t.Fatalf("err: %s", err) 154 } 155 } 156 157 actual := strings.TrimSpace(g.String()) 158 expected := strings.TrimSpace(testTransformOrphanResourceCountOneIndexStr) 159 if actual != expected { 160 t.Fatalf("bad:\n\n%s", actual) 161 } 162 } 163 164 // When converting from a NoEach mode to an EachMap via a switch to for_each, 165 // an edge is necessary to ensure that the map-key'd instances 166 // are evaluated after the NoKey resource, because the final instance evaluated 167 // sets the whole resource's EachMode. 168 func TestOrphanResourceCountTransformer_ForEachEdgesAdded(t *testing.T) { 169 state := states.BuildState(func(s *states.SyncState) { 170 // "bar" key'd resource 171 s.SetResourceInstanceCurrent( 172 addrs.Resource{ 173 Mode: addrs.ManagedResourceMode, 174 Type: "aws_instance", 175 Name: "foo", 176 }.Instance(addrs.StringKey("bar")).Absolute(addrs.RootModuleInstance), 177 &states.ResourceInstanceObjectSrc{ 178 AttrsFlat: map[string]string{ 179 "id": "foo", 180 }, 181 Status: states.ObjectReady, 182 }, 183 mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`), 184 ) 185 186 // NoKey'd resource 187 s.SetResourceInstanceCurrent( 188 addrs.Resource{ 189 Mode: addrs.ManagedResourceMode, 190 Type: "aws_instance", 191 Name: "foo", 192 }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), 193 &states.ResourceInstanceObjectSrc{ 194 AttrsFlat: map[string]string{ 195 "id": "foo", 196 }, 197 Status: states.ObjectReady, 198 }, 199 mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`), 200 ) 201 }) 202 203 g := Graph{Path: addrs.RootModuleInstance} 204 205 { 206 tf := &OrphanResourceInstanceCountTransformer{ 207 Concrete: testOrphanResourceConcreteFunc, 208 Addr: addrs.RootModuleInstance.Resource( 209 addrs.ManagedResourceMode, "aws_instance", "foo", 210 ), 211 InstanceAddrs: []addrs.AbsResourceInstance{}, 212 State: state, 213 } 214 if err := tf.Transform(&g); err != nil { 215 t.Fatalf("err: %s", err) 216 } 217 } 218 219 actual := strings.TrimSpace(g.String()) 220 expected := strings.TrimSpace(testTransformOrphanResourceForEachStr) 221 if actual != expected { 222 t.Fatalf("bad:\n\n%s", actual) 223 } 224 } 225 226 const testTransformOrphanResourceCountBasicStr = ` 227 aws_instance.foo[2] (orphan) 228 ` 229 230 const testTransformOrphanResourceCountZeroStr = ` 231 aws_instance.foo[0] (orphan) 232 aws_instance.foo[2] (orphan) 233 ` 234 235 const testTransformOrphanResourceCountOneIndexStr = ` 236 aws_instance.foo[1] (orphan) 237 ` 238 239 const testTransformOrphanResourceForEachStr = ` 240 aws_instance.foo (orphan) 241 aws_instance.foo["bar"] (orphan) 242 `