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 }