github.com/graywolf-at-work-2/terraform-vendor@v1.4.5/internal/lang/globalref/analyzer_contributing_resources_test.go (about) 1 package globalref 2 3 import ( 4 "sort" 5 "testing" 6 7 "github.com/google/go-cmp/cmp" 8 "github.com/hashicorp/terraform/internal/addrs" 9 ) 10 11 func TestAnalyzerContributingResources(t *testing.T) { 12 azr := testAnalyzer(t, "contributing-resources") 13 14 tests := map[string]struct { 15 StartRefs func() []Reference 16 WantAddrs []string 17 }{ 18 "root output 'network'": { 19 func() []Reference { 20 return azr.ReferencesFromOutputValue( 21 addrs.OutputValue{Name: "network"}.Absolute(addrs.RootModuleInstance), 22 ) 23 }, 24 []string{ 25 `data.test_thing.environment`, 26 `module.network.test_thing.subnet`, 27 `module.network.test_thing.vpc`, 28 }, 29 }, 30 "root output 'c10s_url'": { 31 func() []Reference { 32 return azr.ReferencesFromOutputValue( 33 addrs.OutputValue{Name: "c10s_url"}.Absolute(addrs.RootModuleInstance), 34 ) 35 }, 36 []string{ 37 `data.test_thing.environment`, 38 `module.compute.test_thing.load_balancer`, 39 `module.network.test_thing.subnet`, 40 `module.network.test_thing.vpc`, 41 42 // NOTE: module.compute.test_thing.controller isn't here 43 // because we can see statically that the output value refers 44 // only to the "string" attribute of 45 // module.compute.test_thing.load_balancer , and so we 46 // don't consider references inside the "list" blocks. 47 }, 48 }, 49 "module.compute.test_thing.load_balancer": { 50 func() []Reference { 51 return azr.ReferencesFromResourceInstance( 52 addrs.Resource{ 53 Mode: addrs.ManagedResourceMode, 54 Type: "test_thing", 55 Name: "load_balancer", 56 }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance.Child("compute", addrs.NoKey)), 57 ) 58 }, 59 []string{ 60 `data.test_thing.environment`, 61 `module.compute.test_thing.controller`, 62 `module.network.test_thing.subnet`, 63 `module.network.test_thing.vpc`, 64 }, 65 }, 66 "data.test_thing.environment": { 67 func() []Reference { 68 return azr.ReferencesFromResourceInstance( 69 addrs.Resource{ 70 Mode: addrs.DataResourceMode, 71 Type: "test_thing", 72 Name: "environment", 73 }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), 74 ) 75 }, 76 []string{ 77 // Nothing! This one only refers to an input variable. 78 }, 79 }, 80 } 81 82 for name, test := range tests { 83 t.Run(name, func(t *testing.T) { 84 startRefs := test.StartRefs() 85 addrs := azr.ContributingResources(startRefs...) 86 87 want := test.WantAddrs 88 got := make([]string, len(addrs)) 89 for i, addr := range addrs { 90 got[i] = addr.String() 91 } 92 if diff := cmp.Diff(want, got); diff != "" { 93 t.Errorf("wrong addresses\n%s", diff) 94 } 95 }) 96 } 97 } 98 99 func TestAnalyzerContributingResourceAttrs(t *testing.T) { 100 azr := testAnalyzer(t, "contributing-resources") 101 102 tests := map[string]struct { 103 StartRefs func() []Reference 104 WantAttrs []string 105 }{ 106 "root output 'network'": { 107 func() []Reference { 108 return azr.ReferencesFromOutputValue( 109 addrs.OutputValue{Name: "network"}.Absolute(addrs.RootModuleInstance), 110 ) 111 }, 112 []string{ 113 `data.test_thing.environment.any.base_cidr_block`, 114 `data.test_thing.environment.any.subnet_count`, 115 `module.network.test_thing.subnet`, 116 `module.network.test_thing.vpc.string`, 117 }, 118 }, 119 "root output 'c10s_url'": { 120 func() []Reference { 121 return azr.ReferencesFromOutputValue( 122 addrs.OutputValue{Name: "c10s_url"}.Absolute(addrs.RootModuleInstance), 123 ) 124 }, 125 []string{ 126 `data.test_thing.environment.any.base_cidr_block`, 127 `data.test_thing.environment.any.subnet_count`, 128 `module.compute.test_thing.load_balancer.string`, 129 `module.network.test_thing.subnet`, 130 `module.network.test_thing.vpc.string`, 131 }, 132 }, 133 "module.compute.test_thing.load_balancer": { 134 func() []Reference { 135 return azr.ReferencesFromResourceInstance( 136 addrs.Resource{ 137 Mode: addrs.ManagedResourceMode, 138 Type: "test_thing", 139 Name: "load_balancer", 140 }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance.Child("compute", addrs.NoKey)), 141 ) 142 }, 143 []string{ 144 `data.test_thing.environment.any.base_cidr_block`, 145 `data.test_thing.environment.any.subnet_count`, 146 `module.compute.test_thing.controller`, 147 `module.network.test_thing.subnet`, 148 `module.network.test_thing.vpc.string`, 149 }, 150 }, 151 "data.test_thing.environment": { 152 func() []Reference { 153 return azr.ReferencesFromResourceInstance( 154 addrs.Resource{ 155 Mode: addrs.DataResourceMode, 156 Type: "test_thing", 157 Name: "environment", 158 }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), 159 ) 160 }, 161 []string{ 162 // Nothing! This one only refers to an input variable. 163 }, 164 }, 165 } 166 167 for name, test := range tests { 168 t.Run(name, func(t *testing.T) { 169 startRefs := test.StartRefs() 170 refs := azr.ContributingResourceReferences(startRefs...) 171 172 want := test.WantAttrs 173 got := make([]string, len(refs)) 174 for i, ref := range refs { 175 resAttr, ok := ref.ResourceAttr() 176 if !ok { 177 t.Errorf("%s is not a resource attr reference", resAttr.DebugString()) 178 continue 179 } 180 got[i] = resAttr.DebugString() 181 } 182 183 sort.Strings(got) 184 185 if diff := cmp.Diff(want, got); diff != "" { 186 t.Errorf("wrong addresses\n%s", diff) 187 } 188 }) 189 } 190 }