mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-28 01:41:48 -06:00
c6598a3f86
This is for parsing the type of provider configuration address we write into state in order to remember which provider configuration is responsible for each resource.
192 lines
3.7 KiB
Go
192 lines
3.7 KiB
Go
package addrs
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/go-test/deep"
|
|
|
|
"github.com/hashicorp/hcl2/hcl"
|
|
"github.com/hashicorp/hcl2/hcl/hclsyntax"
|
|
)
|
|
|
|
func TestParseAbsProviderConfig(t *testing.T) {
|
|
tests := []struct {
|
|
Input string
|
|
Want AbsProviderConfig
|
|
WantDiag string
|
|
}{
|
|
{
|
|
`provider.aws`,
|
|
AbsProviderConfig{
|
|
Module: RootModuleInstance,
|
|
ProviderConfig: ProviderConfig{
|
|
Type: "aws",
|
|
},
|
|
},
|
|
``,
|
|
},
|
|
{
|
|
`provider.aws.foo`,
|
|
AbsProviderConfig{
|
|
Module: RootModuleInstance,
|
|
ProviderConfig: ProviderConfig{
|
|
Type: "aws",
|
|
Alias: "foo",
|
|
},
|
|
},
|
|
``,
|
|
},
|
|
{
|
|
`module.baz.provider.aws`,
|
|
AbsProviderConfig{
|
|
Module: ModuleInstance{
|
|
{
|
|
Name: "baz",
|
|
},
|
|
},
|
|
ProviderConfig: ProviderConfig{
|
|
Type: "aws",
|
|
},
|
|
},
|
|
``,
|
|
},
|
|
{
|
|
`module.baz.provider.aws.foo`,
|
|
AbsProviderConfig{
|
|
Module: ModuleInstance{
|
|
{
|
|
Name: "baz",
|
|
},
|
|
},
|
|
ProviderConfig: ProviderConfig{
|
|
Type: "aws",
|
|
Alias: "foo",
|
|
},
|
|
},
|
|
``,
|
|
},
|
|
{
|
|
`module.baz["foo"].provider.aws`,
|
|
AbsProviderConfig{
|
|
Module: ModuleInstance{
|
|
{
|
|
Name: "baz",
|
|
InstanceKey: StringKey("foo"),
|
|
},
|
|
},
|
|
ProviderConfig: ProviderConfig{
|
|
Type: "aws",
|
|
},
|
|
},
|
|
``,
|
|
},
|
|
{
|
|
`module.baz[1].provider.aws`,
|
|
AbsProviderConfig{
|
|
Module: ModuleInstance{
|
|
{
|
|
Name: "baz",
|
|
InstanceKey: IntKey(1),
|
|
},
|
|
},
|
|
ProviderConfig: ProviderConfig{
|
|
Type: "aws",
|
|
},
|
|
},
|
|
``,
|
|
},
|
|
{
|
|
`module.baz[1].module.bar.provider.aws`,
|
|
AbsProviderConfig{
|
|
Module: ModuleInstance{
|
|
{
|
|
Name: "baz",
|
|
InstanceKey: IntKey(1),
|
|
},
|
|
{
|
|
Name: "bar",
|
|
},
|
|
},
|
|
ProviderConfig: ProviderConfig{
|
|
Type: "aws",
|
|
},
|
|
},
|
|
``,
|
|
},
|
|
{
|
|
`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"]`,
|
|
AbsProviderConfig{},
|
|
`The prefix "provider." must be followed by a provider type name.`,
|
|
},
|
|
{
|
|
`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.`,
|
|
},
|
|
{
|
|
`module.foo["provider"]`,
|
|
AbsProviderConfig{},
|
|
`Provider address must begin with "provider.", 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)
|
|
}
|
|
})
|
|
}
|
|
}
|