github.com/rstandt/terraform@v0.12.32-0.20230710220336-b1063613405c/addrs/provider_config_test.go (about)

     1  package addrs
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/go-test/deep"
     7  
     8  	"github.com/hashicorp/hcl/v2"
     9  	"github.com/hashicorp/hcl/v2/hclsyntax"
    10  )
    11  
    12  func TestParseAbsProviderConfig(t *testing.T) {
    13  	tests := []struct {
    14  		Input    string
    15  		Want     AbsProviderConfig
    16  		WantDiag string
    17  	}{
    18  		{
    19  			`provider.aws`,
    20  			AbsProviderConfig{
    21  				Module: RootModuleInstance,
    22  				ProviderConfig: ProviderConfig{
    23  					Type: NewLegacyProvider("aws"),
    24  				},
    25  			},
    26  			``,
    27  		},
    28  		{
    29  			`provider.aws.foo`,
    30  			AbsProviderConfig{
    31  				Module: RootModuleInstance,
    32  				ProviderConfig: ProviderConfig{
    33  					Type:  NewLegacyProvider("aws"),
    34  					Alias: "foo",
    35  				},
    36  			},
    37  			``,
    38  		},
    39  		{
    40  			`module.baz.provider.aws`,
    41  			AbsProviderConfig{
    42  				Module: ModuleInstance{
    43  					{
    44  						Name: "baz",
    45  					},
    46  				},
    47  				ProviderConfig: ProviderConfig{
    48  					Type: NewLegacyProvider("aws"),
    49  				},
    50  			},
    51  			``,
    52  		},
    53  		{
    54  			`module.baz.provider.aws.foo`,
    55  			AbsProviderConfig{
    56  				Module: ModuleInstance{
    57  					{
    58  						Name: "baz",
    59  					},
    60  				},
    61  				ProviderConfig: ProviderConfig{
    62  					Type:  NewLegacyProvider("aws"),
    63  					Alias: "foo",
    64  				},
    65  			},
    66  			``,
    67  		},
    68  		{
    69  			`module.baz["foo"].provider.aws`,
    70  			AbsProviderConfig{
    71  				Module: ModuleInstance{
    72  					{
    73  						Name:        "baz",
    74  						InstanceKey: StringKey("foo"),
    75  					},
    76  				},
    77  				ProviderConfig: ProviderConfig{
    78  					Type: NewLegacyProvider("aws"),
    79  				},
    80  			},
    81  			``,
    82  		},
    83  		{
    84  			`module.baz[1].provider.aws`,
    85  			AbsProviderConfig{
    86  				Module: ModuleInstance{
    87  					{
    88  						Name:        "baz",
    89  						InstanceKey: IntKey(1),
    90  					},
    91  				},
    92  				ProviderConfig: ProviderConfig{
    93  					Type: NewLegacyProvider("aws"),
    94  				},
    95  			},
    96  			``,
    97  		},
    98  		{
    99  			`module.baz[1].module.bar.provider.aws`,
   100  			AbsProviderConfig{
   101  				Module: ModuleInstance{
   102  					{
   103  						Name:        "baz",
   104  						InstanceKey: IntKey(1),
   105  					},
   106  					{
   107  						Name: "bar",
   108  					},
   109  				},
   110  				ProviderConfig: ProviderConfig{
   111  					Type: NewLegacyProvider("aws"),
   112  				},
   113  			},
   114  			``,
   115  		},
   116  		{
   117  			`aws`,
   118  			AbsProviderConfig{},
   119  			`Provider address must begin with "provider.", followed by a provider type name.`,
   120  		},
   121  		{
   122  			`aws.foo`,
   123  			AbsProviderConfig{},
   124  			`Provider address must begin with "provider.", followed by a provider type name.`,
   125  		},
   126  		{
   127  			`provider`,
   128  			AbsProviderConfig{},
   129  			`Provider address must begin with "provider.", followed by a provider type name.`,
   130  		},
   131  		{
   132  			`provider.aws.foo.bar`,
   133  			AbsProviderConfig{},
   134  			`Extraneous operators after provider configuration alias.`,
   135  		},
   136  		{
   137  			`provider["aws"]`,
   138  			AbsProviderConfig{},
   139  			`The prefix "provider." must be followed by a provider type name.`,
   140  		},
   141  		{
   142  			`provider.aws["foo"]`,
   143  			AbsProviderConfig{},
   144  			`Provider type name must be followed by a configuration alias name.`,
   145  		},
   146  		{
   147  			`module.foo`,
   148  			AbsProviderConfig{},
   149  			`Provider address must begin with "provider.", followed by a provider type name.`,
   150  		},
   151  		{
   152  			`module.foo["provider"]`,
   153  			AbsProviderConfig{},
   154  			`Provider address must begin with "provider.", followed by a provider type name.`,
   155  		},
   156  	}
   157  
   158  	for _, test := range tests {
   159  		t.Run(test.Input, func(t *testing.T) {
   160  			traversal, parseDiags := hclsyntax.ParseTraversalAbs([]byte(test.Input), "", hcl.Pos{})
   161  			if len(parseDiags) != 0 {
   162  				t.Errorf("unexpected diagnostics during parse")
   163  				for _, diag := range parseDiags {
   164  					t.Logf("- %s", diag)
   165  				}
   166  				return
   167  			}
   168  
   169  			got, diags := ParseAbsProviderConfig(traversal)
   170  
   171  			if test.WantDiag != "" {
   172  				if len(diags) != 1 {
   173  					t.Fatalf("got %d diagnostics; want 1", len(diags))
   174  				}
   175  				gotDetail := diags[0].Description().Detail
   176  				if gotDetail != test.WantDiag {
   177  					t.Fatalf("wrong diagnostic detail\ngot:  %s\nwant: %s", gotDetail, test.WantDiag)
   178  				}
   179  				return
   180  			} else {
   181  				if len(diags) != 0 {
   182  					t.Fatalf("got %d diagnostics; want 0", len(diags))
   183  				}
   184  			}
   185  
   186  			for _, problem := range deep.Equal(got, test.Want) {
   187  				t.Error(problem)
   188  			}
   189  		})
   190  	}
   191  }