diff --git a/internal/lang/globalref/analyzer_contributing_resources_test.go b/internal/lang/globalref/analyzer_contributing_resources_test.go index 464bd5f0d7..0464648c42 100644 --- a/internal/lang/globalref/analyzer_contributing_resources_test.go +++ b/internal/lang/globalref/analyzer_contributing_resources_test.go @@ -1,7 +1,7 @@ // Copyright IBM Corp. 2014, 2026 // SPDX-License-Identifier: BUSL-1.1 -package globalref +package globalref_test import ( "sort" @@ -10,17 +10,18 @@ import ( "github.com/google/go-cmp/cmp" "github.com/hashicorp/terraform/internal/addrs" + "github.com/hashicorp/terraform/internal/lang/globalref" ) func TestAnalyzerContributingResources(t *testing.T) { azr := testAnalyzer(t, "contributing-resources") tests := map[string]struct { - StartRefs func() []Reference + StartRefs func() []globalref.Reference WantAddrs []string }{ "root output 'network'": { - func() []Reference { + func() []globalref.Reference { return azr.ReferencesFromOutputValue( addrs.OutputValue{Name: "network"}.Absolute(addrs.RootModuleInstance), ) @@ -32,7 +33,7 @@ func TestAnalyzerContributingResources(t *testing.T) { }, }, "root output 'c10s_url'": { - func() []Reference { + func() []globalref.Reference { return azr.ReferencesFromOutputValue( addrs.OutputValue{Name: "c10s_url"}.Absolute(addrs.RootModuleInstance), ) @@ -51,7 +52,7 @@ func TestAnalyzerContributingResources(t *testing.T) { }, }, "module.compute.test_thing.load_balancer": { - func() []Reference { + func() []globalref.Reference { return azr.ReferencesFromResourceInstance( addrs.Resource{ Mode: addrs.ManagedResourceMode, @@ -68,7 +69,7 @@ func TestAnalyzerContributingResources(t *testing.T) { }, }, "data.test_thing.environment": { - func() []Reference { + func() []globalref.Reference { return azr.ReferencesFromResourceInstance( addrs.Resource{ Mode: addrs.DataResourceMode, @@ -104,11 +105,11 @@ func TestAnalyzerContributingResourceAttrs(t *testing.T) { azr := testAnalyzer(t, "contributing-resources") tests := map[string]struct { - StartRefs func() []Reference + StartRefs func() []globalref.Reference WantAttrs []string }{ "root output 'network'": { - func() []Reference { + func() []globalref.Reference { return azr.ReferencesFromOutputValue( addrs.OutputValue{Name: "network"}.Absolute(addrs.RootModuleInstance), ) @@ -120,7 +121,7 @@ func TestAnalyzerContributingResourceAttrs(t *testing.T) { }, }, "root output 'c10s_url'": { - func() []Reference { + func() []globalref.Reference { return azr.ReferencesFromOutputValue( addrs.OutputValue{Name: "c10s_url"}.Absolute(addrs.RootModuleInstance), ) @@ -133,7 +134,7 @@ func TestAnalyzerContributingResourceAttrs(t *testing.T) { }, }, "module.compute.test_thing.load_balancer": { - func() []Reference { + func() []globalref.Reference { return azr.ReferencesFromResourceInstance( addrs.Resource{ Mode: addrs.ManagedResourceMode, @@ -150,7 +151,7 @@ func TestAnalyzerContributingResourceAttrs(t *testing.T) { }, }, "data.test_thing.environment": { - func() []Reference { + func() []globalref.Reference { return azr.ReferencesFromResourceInstance( addrs.Resource{ Mode: addrs.DataResourceMode, diff --git a/internal/lang/globalref/analyzer_meta_references_test.go b/internal/lang/globalref/analyzer_meta_references_test.go index 164fc984ae..2b7b9c129a 100644 --- a/internal/lang/globalref/analyzer_meta_references_test.go +++ b/internal/lang/globalref/analyzer_meta_references_test.go @@ -1,7 +1,7 @@ // Copyright IBM Corp. 2014, 2026 // SPDX-License-Identifier: BUSL-1.1 -package globalref +package globalref_test import ( "sort" @@ -9,6 +9,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/hashicorp/terraform/internal/addrs" + "github.com/hashicorp/terraform/internal/lang/globalref" ) func TestAnalyzerMetaReferences(t *testing.T) { @@ -152,7 +153,7 @@ func TestAnalyzerMetaReferences(t *testing.T) { t.Fatalf("input reference is invalid: %s", diags.Err()) } - ref := Reference{ + ref := globalref.Reference{ ContainerAddr: containerAddr, LocalRef: localRef, } diff --git a/internal/lang/globalref/analyzer_test.go b/internal/lang/globalref/testing_test.go similarity index 75% rename from internal/lang/globalref/analyzer_test.go rename to internal/lang/globalref/testing_test.go index 76a1190959..20a9c4a3bc 100644 --- a/internal/lang/globalref/analyzer_test.go +++ b/internal/lang/globalref/testing_test.go @@ -1,7 +1,7 @@ // Copyright IBM Corp. 2014, 2026 // SPDX-License-Identifier: BUSL-1.1 -package globalref +package globalref_test import ( "context" @@ -15,11 +15,15 @@ import ( "github.com/hashicorp/terraform/internal/configs/configload" "github.com/hashicorp/terraform/internal/configs/configschema" "github.com/hashicorp/terraform/internal/initwd" + "github.com/hashicorp/terraform/internal/lang/globalref" "github.com/hashicorp/terraform/internal/providers" "github.com/hashicorp/terraform/internal/registry" + "github.com/hashicorp/terraform/internal/terraform" ) -func testAnalyzer(t *testing.T, fixtureName string) *Analyzer { +// testAnalyzer creates an analyzer for testing by loading a configuration +// and setting up provider schemas. +func testAnalyzer(t *testing.T, fixtureName string) *globalref.Analyzer { configDir := filepath.Join("testdata", fixtureName) loader, cleanup := configload.NewLoaderForTests(t) @@ -34,22 +38,19 @@ func testAnalyzer(t *testing.T, fixtureName string) *Analyzer { t.Fatalf("failed to refresh modules after install: %s", err) } - // Note: This test uses BuildConfig instead of - // terraform.BuildConfigWithGraph to avoid an import cycle (terraform - // imports the lang package). Since this test only needs basic config - // structure without expression evaluation, the static loader is appropriate. rootMod, loadDiags := loader.LoadRootModule(configDir) if loadDiags.HasErrors() { t.Fatalf("invalid root module: %s", loadDiags.Error()) } - cfg, buildDiags := configs.BuildConfig( + cfg, buildDiags := terraform.BuildConfigWithGraph( rootMod, loader.ModuleWalker(), + nil, configs.MockDataLoaderFunc(loader.LoadExternalMockData), ) if buildDiags.HasErrors() { - t.Fatalf("invalid configuration: %s", buildDiags.Error()) + t.Fatalf("invalid configuration: %s", buildDiags.Err()) } resourceTypeSchema := &configschema.Block{ @@ -83,6 +84,14 @@ func testAnalyzer(t *testing.T, fixtureName string) *Analyzer { }, }, }, + "list_dynamic": { + Nesting: configschema.NestingList, + Block: configschema.Block{ + Attributes: map[string]*configschema.Attribute{ + "z": {Type: cty.DynamicPseudoType, Optional: true}, + }, + }, + }, "map": { Nesting: configschema.NestingMap, Block: configschema.Block{ @@ -101,6 +110,13 @@ func testAnalyzer(t *testing.T, fixtureName string) *Analyzer { }, }, } + dataSourceTypeSchema := &configschema.Block{ + Attributes: map[string]*configschema.Attribute{ + "string": {Type: cty.String, Optional: true}, + "number": {Type: cty.Number, Optional: true}, + "any": {Type: cty.DynamicPseudoType, Optional: true}, + }, + } schemas := map[addrs.Provider]providers.ProviderSchema{ addrs.MustParseProviderSourceString("hashicorp/test"): { ResourceTypes: map[string]providers.Schema{ @@ -110,11 +126,10 @@ func testAnalyzer(t *testing.T, fixtureName string) *Analyzer { }, DataSources: map[string]providers.Schema{ "test_thing": { - Body: resourceTypeSchema, + Body: dataSourceTypeSchema, }, }, }, } - - return NewAnalyzer(cfg, schemas) + return globalref.NewAnalyzer(cfg, schemas) }