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 }