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