package globalref import ( "sort" "testing" "github.com/google/go-cmp/cmp" "github.com/hashicorp/terraform/internal/addrs" ) func TestAnalyzerContributingResources(t *testing.T) { azr := testAnalyzer(t, "contributing-resources") tests := map[string]struct { StartRefs func() []Reference WantAddrs []string }{ "root output 'network'": { func() []Reference { return azr.ReferencesFromOutputValue( addrs.OutputValue{Name: "network"}.Absolute(addrs.RootModuleInstance), ) }, []string{ `data.test_thing.environment`, `module.network.test_thing.subnet`, `module.network.test_thing.vpc`, }, }, "root output 'c10s_url'": { func() []Reference { return azr.ReferencesFromOutputValue( addrs.OutputValue{Name: "c10s_url"}.Absolute(addrs.RootModuleInstance), ) }, []string{ `data.test_thing.environment`, `module.compute.test_thing.load_balancer`, `module.network.test_thing.subnet`, `module.network.test_thing.vpc`, // NOTE: module.compute.test_thing.controller isn't here // because we can see statically that the output value refers // only to the "string" attribute of // module.compute.test_thing.load_balancer , and so we // don't consider references inside the "list" blocks. }, }, "module.compute.test_thing.load_balancer": { func() []Reference { return azr.ReferencesFromResourceInstance( addrs.Resource{ Mode: addrs.ManagedResourceMode, Type: "test_thing", Name: "load_balancer", }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance.Child("compute", addrs.NoKey)), ) }, []string{ `data.test_thing.environment`, `module.compute.test_thing.controller`, `module.network.test_thing.subnet`, `module.network.test_thing.vpc`, }, }, "data.test_thing.environment": { func() []Reference { return azr.ReferencesFromResourceInstance( addrs.Resource{ Mode: addrs.DataResourceMode, Type: "test_thing", Name: "environment", }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), ) }, []string{ // Nothing! This one only refers to an input variable. }, }, } for name, test := range tests { t.Run(name, func(t *testing.T) { startRefs := test.StartRefs() addrs := azr.ContributingResources(startRefs...) want := test.WantAddrs got := make([]string, len(addrs)) for i, addr := range addrs { got[i] = addr.String() } if diff := cmp.Diff(want, got); diff != "" { t.Errorf("wrong addresses\n%s", diff) } }) } } func TestAnalyzerContributingResourceAttrs(t *testing.T) { azr := testAnalyzer(t, "contributing-resources") tests := map[string]struct { StartRefs func() []Reference WantAttrs []string }{ "root output 'network'": { func() []Reference { return azr.ReferencesFromOutputValue( addrs.OutputValue{Name: "network"}.Absolute(addrs.RootModuleInstance), ) }, []string{ `data.test_thing.environment.any.base_cidr_block`, `data.test_thing.environment.any.subnet_count`, `module.network.test_thing.subnet`, `module.network.test_thing.vpc.string`, }, }, "root output 'c10s_url'": { func() []Reference { return azr.ReferencesFromOutputValue( addrs.OutputValue{Name: "c10s_url"}.Absolute(addrs.RootModuleInstance), ) }, []string{ `data.test_thing.environment.any.base_cidr_block`, `data.test_thing.environment.any.subnet_count`, `module.compute.test_thing.load_balancer.string`, `module.network.test_thing.subnet`, `module.network.test_thing.vpc.string`, }, }, "module.compute.test_thing.load_balancer": { func() []Reference { return azr.ReferencesFromResourceInstance( addrs.Resource{ Mode: addrs.ManagedResourceMode, Type: "test_thing", Name: "load_balancer", }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance.Child("compute", addrs.NoKey)), ) }, []string{ `data.test_thing.environment.any.base_cidr_block`, `data.test_thing.environment.any.subnet_count`, `module.compute.test_thing.controller`, `module.network.test_thing.subnet`, `module.network.test_thing.vpc.string`, }, }, "data.test_thing.environment": { func() []Reference { return azr.ReferencesFromResourceInstance( addrs.Resource{ Mode: addrs.DataResourceMode, Type: "test_thing", Name: "environment", }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), ) }, []string{ // Nothing! This one only refers to an input variable. }, }, } for name, test := range tests { t.Run(name, func(t *testing.T) { startRefs := test.StartRefs() refs := azr.ContributingResourceReferences(startRefs...) want := test.WantAttrs got := make([]string, len(refs)) for i, ref := range refs { resAttr, ok := ref.ResourceAttr() if !ok { t.Errorf("%s is not a resource attr reference", resAttr.DebugString()) continue } got[i] = resAttr.DebugString() } sort.Strings(got) if diff := cmp.Diff(want, got); diff != "" { t.Errorf("wrong addresses\n%s", diff) } }) } }