| package globalref |
| |
| import ( |
| "sort" |
| "testing" |
| |
| "github.com/google/go-cmp/cmp" |
| "github.com/hashicorp/terraform/internal/addrs" |
| ) |
| |
| func TestAnalyzerMetaReferences(t *testing.T) { |
| tests := []struct { |
| InputContainer string |
| InputRef string |
| WantRefs []string |
| }{ |
| { |
| ``, |
| `local.a`, |
| nil, |
| }, |
| { |
| ``, |
| `local.single`, |
| []string{ |
| "::test_thing.single.id", |
| }, |
| }, |
| { |
| ``, |
| `test_thing.single`, |
| []string{ |
| "::local.a", |
| "::local.b", |
| }, |
| }, |
| { |
| ``, |
| `test_thing.single.string`, |
| []string{ |
| "::local.a", |
| }, |
| }, |
| { |
| ``, |
| `test_thing.for_each`, |
| []string{ |
| "::local.a", |
| "::test_thing.single.string", |
| }, |
| }, |
| { |
| ``, |
| `test_thing.for_each["whatever"]`, |
| []string{ |
| "::local.a", |
| "::test_thing.single.string", |
| }, |
| }, |
| { |
| ``, |
| `test_thing.for_each["whatever"].single`, |
| []string{ |
| "::test_thing.single.string", |
| }, |
| }, |
| { |
| ``, |
| `test_thing.for_each["whatever"].single.z`, |
| []string{ |
| "::test_thing.single.string", |
| }, |
| }, |
| { |
| ``, |
| `test_thing.count`, |
| []string{ |
| "::local.a", |
| }, |
| }, |
| { |
| ``, |
| `test_thing.count[0]`, |
| []string{ |
| "::local.a", |
| }, |
| }, |
| { |
| ``, |
| `module.single.a`, |
| []string{ |
| "module.single::test_thing.foo", |
| "module.single::var.a", |
| }, |
| }, |
| { |
| ``, |
| `module.for_each["whatever"].a`, |
| []string{ |
| `module.for_each["whatever"]::test_thing.foo`, |
| `module.for_each["whatever"]::var.a`, |
| }, |
| }, |
| { |
| ``, |
| `module.count[0].a`, |
| []string{ |
| `module.count[0]::test_thing.foo`, |
| `module.count[0]::var.a`, |
| }, |
| }, |
| { |
| `module.single`, |
| `var.a`, |
| []string{ |
| "::test_thing.single", |
| }, |
| }, |
| { |
| `module.single`, |
| `test_thing.foo`, |
| []string{ |
| "module.single::var.a", |
| }, |
| }, |
| } |
| |
| azr := testAnalyzer(t, "assorted") |
| |
| for _, test := range tests { |
| name := test.InputRef |
| if test.InputContainer != "" { |
| name = test.InputContainer + " " + test.InputRef |
| } |
| t.Run(name, func(t *testing.T) { |
| t.Logf("testing %s", name) |
| var containerAddr addrs.Targetable |
| containerAddr = addrs.RootModuleInstance |
| if test.InputContainer != "" { |
| moduleAddrTarget, diags := addrs.ParseTargetStr(test.InputContainer) |
| if diags.HasErrors() { |
| t.Fatalf("input module address is invalid: %s", diags.Err()) |
| } |
| containerAddr = moduleAddrTarget.Subject |
| } |
| |
| localRef, diags := addrs.ParseRefStr(test.InputRef) |
| if diags.HasErrors() { |
| t.Fatalf("input reference is invalid: %s", diags.Err()) |
| } |
| |
| ref := Reference{ |
| ContainerAddr: containerAddr, |
| LocalRef: localRef, |
| } |
| |
| refs := azr.MetaReferences(ref) |
| |
| want := test.WantRefs |
| var got []string |
| for _, ref := range refs { |
| got = append(got, ref.DebugString()) |
| } |
| sort.Strings(got) |
| if diff := cmp.Diff(want, got); diff != "" { |
| t.Errorf("wrong references\n%s", diff) |
| } |
| }) |
| } |
| } |