github.com/terramate-io/tf@v0.0.0-20230830114523-fce866b4dfcd/addrs/provider_config_test.go (about)

     1  // Copyright (c) HashiCorp, Inc.
     2  // SPDX-License-Identifier: MPL-2.0
     3  
     4  package addrs
     5  
     6  import (
     7  	"reflect"
     8  	"testing"
     9  
    10  	"github.com/go-test/deep"
    11  
    12  	"github.com/hashicorp/hcl/v2"
    13  	"github.com/hashicorp/hcl/v2/hclsyntax"
    14  )
    15  
    16  func TestParseAbsProviderConfig(t *testing.T) {
    17  	tests := []struct {
    18  		Input    string
    19  		Want     AbsProviderConfig
    20  		WantDiag string
    21  	}{
    22  		{
    23  			`provider["registry.terraform.io/hashicorp/aws"]`,
    24  			AbsProviderConfig{
    25  				Module: RootModule,
    26  				Provider: Provider{
    27  					Type:      "aws",
    28  					Namespace: "hashicorp",
    29  					Hostname:  "registry.terraform.io",
    30  				},
    31  			},
    32  			``,
    33  		},
    34  		{
    35  			`provider["registry.terraform.io/hashicorp/aws"].foo`,
    36  			AbsProviderConfig{
    37  				Module: RootModule,
    38  				Provider: Provider{
    39  					Type:      "aws",
    40  					Namespace: "hashicorp",
    41  					Hostname:  "registry.terraform.io",
    42  				},
    43  				Alias: "foo",
    44  			},
    45  			``,
    46  		},
    47  		{
    48  			`module.baz.provider["registry.terraform.io/hashicorp/aws"]`,
    49  			AbsProviderConfig{
    50  				Module: Module{"baz"},
    51  				Provider: Provider{
    52  					Type:      "aws",
    53  					Namespace: "hashicorp",
    54  					Hostname:  "registry.terraform.io",
    55  				},
    56  			},
    57  			``,
    58  		},
    59  		{
    60  			`module.baz.provider["registry.terraform.io/hashicorp/aws"].foo`,
    61  			AbsProviderConfig{
    62  				Module: Module{"baz"},
    63  				Provider: Provider{
    64  					Type:      "aws",
    65  					Namespace: "hashicorp",
    66  					Hostname:  "registry.terraform.io",
    67  				},
    68  				Alias: "foo",
    69  			},
    70  			``,
    71  		},
    72  		{
    73  			`module.baz["foo"].provider["registry.terraform.io/hashicorp/aws"]`,
    74  			AbsProviderConfig{},
    75  			`Provider address cannot contain module indexes`,
    76  		},
    77  		{
    78  			`module.baz[1].provider["registry.terraform.io/hashicorp/aws"]`,
    79  			AbsProviderConfig{},
    80  			`Provider address cannot contain module indexes`,
    81  		},
    82  		{
    83  			`module.baz[1].module.bar.provider["registry.terraform.io/hashicorp/aws"]`,
    84  			AbsProviderConfig{},
    85  			`Provider address cannot contain module indexes`,
    86  		},
    87  		{
    88  			`aws`,
    89  			AbsProviderConfig{},
    90  			`Provider address must begin with "provider.", followed by a provider type name.`,
    91  		},
    92  		{
    93  			`aws.foo`,
    94  			AbsProviderConfig{},
    95  			`Provider address must begin with "provider.", followed by a provider type name.`,
    96  		},
    97  		{
    98  			`provider`,
    99  			AbsProviderConfig{},
   100  			`Provider address must begin with "provider.", followed by a provider type name.`,
   101  		},
   102  		{
   103  			`provider.aws.foo.bar`,
   104  			AbsProviderConfig{},
   105  			`Extraneous operators after provider configuration alias.`,
   106  		},
   107  		{
   108  			`provider["aws"]["foo"]`,
   109  			AbsProviderConfig{},
   110  			`Provider type name must be followed by a configuration alias name.`,
   111  		},
   112  		{
   113  			`module.foo`,
   114  			AbsProviderConfig{},
   115  			`Provider address must begin with "provider.", followed by a provider type name.`,
   116  		},
   117  		{
   118  			`provider[0]`,
   119  			AbsProviderConfig{},
   120  			`The prefix "provider." must be followed by a provider type name.`,
   121  		},
   122  	}
   123  
   124  	for _, test := range tests {
   125  		t.Run(test.Input, func(t *testing.T) {
   126  			traversal, parseDiags := hclsyntax.ParseTraversalAbs([]byte(test.Input), "", hcl.Pos{})
   127  			if len(parseDiags) != 0 {
   128  				t.Errorf("unexpected diagnostics during parse")
   129  				for _, diag := range parseDiags {
   130  					t.Logf("- %s", diag)
   131  				}
   132  				return
   133  			}
   134  
   135  			got, diags := ParseAbsProviderConfig(traversal)
   136  
   137  			if test.WantDiag != "" {
   138  				if len(diags) != 1 {
   139  					t.Fatalf("got %d diagnostics; want 1", len(diags))
   140  				}
   141  				gotDetail := diags[0].Description().Detail
   142  				if gotDetail != test.WantDiag {
   143  					t.Fatalf("wrong diagnostic detail\ngot:  %s\nwant: %s", gotDetail, test.WantDiag)
   144  				}
   145  				return
   146  			} else {
   147  				if len(diags) != 0 {
   148  					t.Fatalf("got %d diagnostics; want 0", len(diags))
   149  				}
   150  			}
   151  
   152  			for _, problem := range deep.Equal(got, test.Want) {
   153  				t.Error(problem)
   154  			}
   155  		})
   156  	}
   157  }
   158  
   159  func TestAbsProviderConfigString(t *testing.T) {
   160  	tests := []struct {
   161  		Config AbsProviderConfig
   162  		Want   string
   163  	}{
   164  		{
   165  			AbsProviderConfig{
   166  				Module:   RootModule,
   167  				Provider: NewLegacyProvider("foo"),
   168  			},
   169  			`provider["registry.terraform.io/-/foo"]`,
   170  		},
   171  		{
   172  			AbsProviderConfig{
   173  				Module:   RootModule.Child("child_module"),
   174  				Provider: NewDefaultProvider("foo"),
   175  			},
   176  			`module.child_module.provider["registry.terraform.io/hashicorp/foo"]`,
   177  		},
   178  		{
   179  			AbsProviderConfig{
   180  				Module:   RootModule,
   181  				Alias:    "bar",
   182  				Provider: NewDefaultProvider("foo"),
   183  			},
   184  			`provider["registry.terraform.io/hashicorp/foo"].bar`,
   185  		},
   186  		{
   187  			AbsProviderConfig{
   188  				Module:   RootModule.Child("child_module"),
   189  				Alias:    "bar",
   190  				Provider: NewDefaultProvider("foo"),
   191  			},
   192  			`module.child_module.provider["registry.terraform.io/hashicorp/foo"].bar`,
   193  		},
   194  	}
   195  
   196  	for _, test := range tests {
   197  		got := test.Config.String()
   198  		if got != test.Want {
   199  			t.Errorf("wrong result. Got %s, want %s\n", got, test.Want)
   200  		}
   201  	}
   202  }
   203  
   204  func TestAbsProviderConfigLegacyString(t *testing.T) {
   205  	tests := []struct {
   206  		Config AbsProviderConfig
   207  		Want   string
   208  	}{
   209  		{
   210  			AbsProviderConfig{
   211  				Module:   RootModule,
   212  				Provider: NewLegacyProvider("foo"),
   213  			},
   214  			`provider.foo`,
   215  		},
   216  		{
   217  			AbsProviderConfig{
   218  				Module:   RootModule.Child("child_module"),
   219  				Provider: NewLegacyProvider("foo"),
   220  			},
   221  			`module.child_module.provider.foo`,
   222  		},
   223  		{
   224  			AbsProviderConfig{
   225  				Module:   RootModule,
   226  				Alias:    "bar",
   227  				Provider: NewLegacyProvider("foo"),
   228  			},
   229  			`provider.foo.bar`,
   230  		},
   231  		{
   232  			AbsProviderConfig{
   233  				Module:   RootModule.Child("child_module"),
   234  				Alias:    "bar",
   235  				Provider: NewLegacyProvider("foo"),
   236  			},
   237  			`module.child_module.provider.foo.bar`,
   238  		},
   239  	}
   240  
   241  	for _, test := range tests {
   242  		got := test.Config.LegacyString()
   243  		if got != test.Want {
   244  			t.Errorf("wrong result. Got %s, want %s\n", got, test.Want)
   245  		}
   246  	}
   247  }
   248  
   249  func TestParseLegacyAbsProviderConfigStr(t *testing.T) {
   250  	tests := []struct {
   251  		Config string
   252  		Want   AbsProviderConfig
   253  	}{
   254  		{
   255  			`provider.foo`,
   256  			AbsProviderConfig{
   257  				Module:   RootModule,
   258  				Provider: NewLegacyProvider("foo"),
   259  			},
   260  		},
   261  		{
   262  			`module.child_module.provider.foo`,
   263  			AbsProviderConfig{
   264  				Module:   RootModule.Child("child_module"),
   265  				Provider: NewLegacyProvider("foo"),
   266  			},
   267  		},
   268  		{
   269  			`provider.terraform`,
   270  			AbsProviderConfig{
   271  				Module:   RootModule,
   272  				Provider: NewBuiltInProvider("terraform"),
   273  			},
   274  		},
   275  	}
   276  
   277  	for _, test := range tests {
   278  		got, _ := ParseLegacyAbsProviderConfigStr(test.Config)
   279  		if !reflect.DeepEqual(got, test.Want) {
   280  			t.Errorf("wrong result. Got %s, want %s\n", got, test.Want)
   281  		}
   282  	}
   283  }