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