package addrs import ( "reflect" "testing" "github.com/go-test/deep" "github.com/hashicorp/hcl/v2" "github.com/hashicorp/hcl/v2/hclsyntax" ) func TestParseAbsProviderConfig(t *testing.T) { tests := []struct { Input string Want AbsProviderConfig WantDiag string }{ { `provider["registry.terraform.io/hashicorp/aws"]`, AbsProviderConfig{ Module: RootModule, Provider: Provider{ Type: "aws", Namespace: "hashicorp", Hostname: "registry.terraform.io", }, }, ``, }, { `provider["registry.terraform.io/hashicorp/aws"].foo`, AbsProviderConfig{ Module: RootModule, Provider: Provider{ Type: "aws", Namespace: "hashicorp", Hostname: "registry.terraform.io", }, Alias: "foo", }, ``, }, { `module.baz.provider["registry.terraform.io/hashicorp/aws"]`, AbsProviderConfig{ Module: Module{"baz"}, Provider: Provider{ Type: "aws", Namespace: "hashicorp", Hostname: "registry.terraform.io", }, }, ``, }, { `module.baz.provider["registry.terraform.io/hashicorp/aws"].foo`, AbsProviderConfig{ Module: Module{"baz"}, Provider: Provider{ Type: "aws", Namespace: "hashicorp", Hostname: "registry.terraform.io", }, Alias: "foo", }, ``, }, { `module.baz["foo"].provider["registry.terraform.io/hashicorp/aws"]`, AbsProviderConfig{}, `Provider address cannot contain module indexes`, }, { `module.baz[1].provider["registry.terraform.io/hashicorp/aws"]`, AbsProviderConfig{}, `Provider address cannot contain module indexes`, }, { `module.baz[1].module.bar.provider["registry.terraform.io/hashicorp/aws"]`, AbsProviderConfig{}, `Provider address cannot contain module indexes`, }, { `aws`, AbsProviderConfig{}, `Provider address must begin with "provider.", followed by a provider type name.`, }, { `aws.foo`, AbsProviderConfig{}, `Provider address must begin with "provider.", followed by a provider type name.`, }, { `provider`, AbsProviderConfig{}, `Provider address must begin with "provider.", followed by a provider type name.`, }, { `provider.aws.foo.bar`, AbsProviderConfig{}, `Extraneous operators after provider configuration alias.`, }, { `provider["aws"]["foo"]`, AbsProviderConfig{}, `Provider type name must be followed by a configuration alias name.`, }, { `module.foo`, AbsProviderConfig{}, `Provider address must begin with "provider.", followed by a provider type name.`, }, { `provider[0]`, AbsProviderConfig{}, `The prefix "provider." must be followed by a provider type name.`, }, } for _, test := range tests { t.Run(test.Input, func(t *testing.T) { traversal, parseDiags := hclsyntax.ParseTraversalAbs([]byte(test.Input), "", hcl.Pos{}) if len(parseDiags) != 0 { t.Errorf("unexpected diagnostics during parse") for _, diag := range parseDiags { t.Logf("- %s", diag) } return } got, diags := ParseAbsProviderConfig(traversal) if test.WantDiag != "" { if len(diags) != 1 { t.Fatalf("got %d diagnostics; want 1", len(diags)) } gotDetail := diags[0].Description().Detail if gotDetail != test.WantDiag { t.Fatalf("wrong diagnostic detail\ngot: %s\nwant: %s", gotDetail, test.WantDiag) } return } else { if len(diags) != 0 { t.Fatalf("got %d diagnostics; want 0", len(diags)) } } for _, problem := range deep.Equal(got, test.Want) { t.Error(problem) } }) } } func TestAbsProviderConfigString(t *testing.T) { tests := []struct { Config AbsProviderConfig Want string }{ { AbsProviderConfig{ Module: RootModule, Provider: NewLegacyProvider("foo"), }, `provider["registry.terraform.io/-/foo"]`, }, { AbsProviderConfig{ Module: RootModule.Child("child_module"), Provider: NewDefaultProvider("foo"), }, `module.child_module.provider["registry.terraform.io/hashicorp/foo"]`, }, { AbsProviderConfig{ Module: RootModule, Alias: "bar", Provider: NewDefaultProvider("foo"), }, `provider["registry.terraform.io/hashicorp/foo"].bar`, }, { AbsProviderConfig{ Module: RootModule.Child("child_module"), Alias: "bar", Provider: NewDefaultProvider("foo"), }, `module.child_module.provider["registry.terraform.io/hashicorp/foo"].bar`, }, } for _, test := range tests { got := test.Config.String() if got != test.Want { t.Errorf("wrong result. Got %s, want %s\n", got, test.Want) } } } func TestAbsProviderConfigLegacyString(t *testing.T) { tests := []struct { Config AbsProviderConfig Want string }{ { AbsProviderConfig{ Module: RootModule, Provider: NewLegacyProvider("foo"), }, `provider.foo`, }, { AbsProviderConfig{ Module: RootModule.Child("child_module"), Provider: NewLegacyProvider("foo"), }, `module.child_module.provider.foo`, }, { AbsProviderConfig{ Module: RootModule, Alias: "bar", Provider: NewLegacyProvider("foo"), }, `provider.foo.bar`, }, { AbsProviderConfig{ Module: RootModule.Child("child_module"), Alias: "bar", Provider: NewLegacyProvider("foo"), }, `module.child_module.provider.foo.bar`, }, } for _, test := range tests { got := test.Config.LegacyString() if got != test.Want { t.Errorf("wrong result. Got %s, want %s\n", got, test.Want) } } } func TestParseLegacyAbsProviderConfigStr(t *testing.T) { tests := []struct { Config string Want AbsProviderConfig }{ { `provider.foo`, AbsProviderConfig{ Module: RootModule, Provider: NewLegacyProvider("foo"), }, }, { `module.child_module.provider.foo`, AbsProviderConfig{ Module: RootModule.Child("child_module"), Provider: NewLegacyProvider("foo"), }, }, { `provider.terraform`, AbsProviderConfig{ Module: RootModule, Provider: NewBuiltInProvider("terraform"), }, }, } for _, test := range tests { got, _ := ParseLegacyAbsProviderConfigStr(test.Config) if !reflect.DeepEqual(got, test.Want) { t.Errorf("wrong result. Got %s, want %s\n", got, test.Want) } } }