| 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) |
| } |
| }) |
| } |
| } |