github.com/richardmarshall/terraform@v0.9.5-0.20170429023105-15704cc6ee35/config/merge_test.go (about) 1 package config 2 3 import ( 4 "reflect" 5 "testing" 6 ) 7 8 func TestMerge(t *testing.T) { 9 cases := []struct { 10 c1, c2, result *Config 11 err bool 12 }{ 13 // Normal good case. 14 { 15 &Config{ 16 Atlas: &AtlasConfig{ 17 Name: "foo", 18 }, 19 Modules: []*Module{ 20 &Module{Name: "foo"}, 21 }, 22 Outputs: []*Output{ 23 &Output{Name: "foo"}, 24 }, 25 ProviderConfigs: []*ProviderConfig{ 26 &ProviderConfig{Name: "foo"}, 27 }, 28 Resources: []*Resource{ 29 &Resource{Name: "foo"}, 30 }, 31 Variables: []*Variable{ 32 &Variable{Name: "foo"}, 33 }, 34 35 unknownKeys: []string{"foo"}, 36 }, 37 38 &Config{ 39 Atlas: &AtlasConfig{ 40 Name: "bar", 41 }, 42 Modules: []*Module{ 43 &Module{Name: "bar"}, 44 }, 45 Outputs: []*Output{ 46 &Output{Name: "bar"}, 47 }, 48 ProviderConfigs: []*ProviderConfig{ 49 &ProviderConfig{Name: "bar"}, 50 }, 51 Resources: []*Resource{ 52 &Resource{Name: "bar"}, 53 }, 54 Variables: []*Variable{ 55 &Variable{Name: "bar"}, 56 }, 57 58 unknownKeys: []string{"bar"}, 59 }, 60 61 &Config{ 62 Atlas: &AtlasConfig{ 63 Name: "bar", 64 }, 65 Modules: []*Module{ 66 &Module{Name: "foo"}, 67 &Module{Name: "bar"}, 68 }, 69 Outputs: []*Output{ 70 &Output{Name: "foo"}, 71 &Output{Name: "bar"}, 72 }, 73 ProviderConfigs: []*ProviderConfig{ 74 &ProviderConfig{Name: "foo"}, 75 &ProviderConfig{Name: "bar"}, 76 }, 77 Resources: []*Resource{ 78 &Resource{Name: "foo"}, 79 &Resource{Name: "bar"}, 80 }, 81 Variables: []*Variable{ 82 &Variable{Name: "foo"}, 83 &Variable{Name: "bar"}, 84 }, 85 86 unknownKeys: []string{"foo", "bar"}, 87 }, 88 89 false, 90 }, 91 92 // Test that when merging duplicates, it merges into the 93 // first, but keeps the duplicates so that errors still 94 // happen. 95 { 96 &Config{ 97 Outputs: []*Output{ 98 &Output{Name: "foo"}, 99 }, 100 ProviderConfigs: []*ProviderConfig{ 101 &ProviderConfig{Name: "foo"}, 102 }, 103 Resources: []*Resource{ 104 &Resource{Name: "foo"}, 105 }, 106 Variables: []*Variable{ 107 &Variable{Name: "foo", Default: "foo"}, 108 &Variable{Name: "foo"}, 109 }, 110 111 unknownKeys: []string{"foo"}, 112 }, 113 114 &Config{ 115 Outputs: []*Output{ 116 &Output{Name: "bar"}, 117 }, 118 ProviderConfigs: []*ProviderConfig{ 119 &ProviderConfig{Name: "bar"}, 120 }, 121 Resources: []*Resource{ 122 &Resource{Name: "bar"}, 123 }, 124 Variables: []*Variable{ 125 &Variable{Name: "foo", Default: "bar"}, 126 &Variable{Name: "bar"}, 127 }, 128 129 unknownKeys: []string{"bar"}, 130 }, 131 132 &Config{ 133 Outputs: []*Output{ 134 &Output{Name: "foo"}, 135 &Output{Name: "bar"}, 136 }, 137 ProviderConfigs: []*ProviderConfig{ 138 &ProviderConfig{Name: "foo"}, 139 &ProviderConfig{Name: "bar"}, 140 }, 141 Resources: []*Resource{ 142 &Resource{Name: "foo"}, 143 &Resource{Name: "bar"}, 144 }, 145 Variables: []*Variable{ 146 &Variable{Name: "foo", Default: "bar"}, 147 &Variable{Name: "foo"}, 148 &Variable{Name: "bar"}, 149 }, 150 151 unknownKeys: []string{"foo", "bar"}, 152 }, 153 154 false, 155 }, 156 157 // Terraform block 158 { 159 &Config{ 160 Terraform: &Terraform{ 161 RequiredVersion: "A", 162 }, 163 }, 164 &Config{}, 165 &Config{ 166 Terraform: &Terraform{ 167 RequiredVersion: "A", 168 }, 169 }, 170 false, 171 }, 172 173 { 174 &Config{}, 175 &Config{ 176 Terraform: &Terraform{ 177 RequiredVersion: "A", 178 }, 179 }, 180 &Config{ 181 Terraform: &Terraform{ 182 RequiredVersion: "A", 183 }, 184 }, 185 false, 186 }, 187 188 // Provider alias 189 { 190 &Config{ 191 ProviderConfigs: []*ProviderConfig{ 192 &ProviderConfig{Alias: "foo"}, 193 }, 194 }, 195 &Config{}, 196 &Config{ 197 ProviderConfigs: []*ProviderConfig{ 198 &ProviderConfig{Alias: "foo"}, 199 }, 200 }, 201 false, 202 }, 203 204 { 205 &Config{}, 206 &Config{ 207 ProviderConfigs: []*ProviderConfig{ 208 &ProviderConfig{Alias: "foo"}, 209 }, 210 }, 211 &Config{ 212 ProviderConfigs: []*ProviderConfig{ 213 &ProviderConfig{Alias: "foo"}, 214 }, 215 }, 216 false, 217 }, 218 219 { 220 &Config{ 221 ProviderConfigs: []*ProviderConfig{ 222 &ProviderConfig{Alias: "bar"}, 223 }, 224 }, 225 &Config{ 226 ProviderConfigs: []*ProviderConfig{ 227 &ProviderConfig{Alias: "foo"}, 228 }, 229 }, 230 &Config{ 231 ProviderConfigs: []*ProviderConfig{ 232 &ProviderConfig{Alias: "foo"}, 233 }, 234 }, 235 false, 236 }, 237 238 // Variable type 239 { 240 &Config{ 241 Variables: []*Variable{ 242 &Variable{DeclaredType: "foo"}, 243 }, 244 }, 245 &Config{}, 246 &Config{ 247 Variables: []*Variable{ 248 &Variable{DeclaredType: "foo"}, 249 }, 250 }, 251 false, 252 }, 253 254 { 255 &Config{}, 256 &Config{ 257 Variables: []*Variable{ 258 &Variable{DeclaredType: "foo"}, 259 }, 260 }, 261 &Config{ 262 Variables: []*Variable{ 263 &Variable{DeclaredType: "foo"}, 264 }, 265 }, 266 false, 267 }, 268 269 { 270 &Config{ 271 Variables: []*Variable{ 272 &Variable{DeclaredType: "bar"}, 273 }, 274 }, 275 &Config{ 276 Variables: []*Variable{ 277 &Variable{DeclaredType: "foo"}, 278 }, 279 }, 280 &Config{ 281 Variables: []*Variable{ 282 &Variable{DeclaredType: "foo"}, 283 }, 284 }, 285 false, 286 }, 287 288 // Output description 289 { 290 &Config{ 291 Outputs: []*Output{ 292 &Output{Description: "foo"}, 293 }, 294 }, 295 &Config{}, 296 &Config{ 297 Outputs: []*Output{ 298 &Output{Description: "foo"}, 299 }, 300 }, 301 false, 302 }, 303 304 { 305 &Config{}, 306 &Config{ 307 Outputs: []*Output{ 308 &Output{Description: "foo"}, 309 }, 310 }, 311 &Config{ 312 Outputs: []*Output{ 313 &Output{Description: "foo"}, 314 }, 315 }, 316 false, 317 }, 318 319 { 320 &Config{ 321 Outputs: []*Output{ 322 &Output{Description: "bar"}, 323 }, 324 }, 325 &Config{ 326 Outputs: []*Output{ 327 &Output{Description: "foo"}, 328 }, 329 }, 330 &Config{ 331 Outputs: []*Output{ 332 &Output{Description: "foo"}, 333 }, 334 }, 335 false, 336 }, 337 338 // Output depends_on 339 { 340 &Config{ 341 Outputs: []*Output{ 342 &Output{DependsOn: []string{"foo"}}, 343 }, 344 }, 345 &Config{}, 346 &Config{ 347 Outputs: []*Output{ 348 &Output{DependsOn: []string{"foo"}}, 349 }, 350 }, 351 false, 352 }, 353 354 { 355 &Config{}, 356 &Config{ 357 Outputs: []*Output{ 358 &Output{DependsOn: []string{"foo"}}, 359 }, 360 }, 361 &Config{ 362 Outputs: []*Output{ 363 &Output{DependsOn: []string{"foo"}}, 364 }, 365 }, 366 false, 367 }, 368 369 { 370 &Config{ 371 Outputs: []*Output{ 372 &Output{DependsOn: []string{"bar"}}, 373 }, 374 }, 375 &Config{ 376 Outputs: []*Output{ 377 &Output{DependsOn: []string{"foo"}}, 378 }, 379 }, 380 &Config{ 381 Outputs: []*Output{ 382 &Output{DependsOn: []string{"foo"}}, 383 }, 384 }, 385 false, 386 }, 387 388 // Output sensitive 389 { 390 &Config{ 391 Outputs: []*Output{ 392 &Output{Sensitive: true}, 393 }, 394 }, 395 &Config{}, 396 &Config{ 397 Outputs: []*Output{ 398 &Output{Sensitive: true}, 399 }, 400 }, 401 false, 402 }, 403 404 { 405 &Config{}, 406 &Config{ 407 Outputs: []*Output{ 408 &Output{Sensitive: true}, 409 }, 410 }, 411 &Config{ 412 Outputs: []*Output{ 413 &Output{Sensitive: true}, 414 }, 415 }, 416 false, 417 }, 418 419 { 420 &Config{ 421 Outputs: []*Output{ 422 &Output{Sensitive: false}, 423 }, 424 }, 425 &Config{ 426 Outputs: []*Output{ 427 &Output{Sensitive: true}, 428 }, 429 }, 430 &Config{ 431 Outputs: []*Output{ 432 &Output{Sensitive: true}, 433 }, 434 }, 435 false, 436 }, 437 438 // terraform blocks are merged, not overwritten 439 { 440 &Config{ 441 Terraform: &Terraform{ 442 RequiredVersion: "A", 443 }, 444 }, 445 &Config{ 446 Terraform: &Terraform{ 447 Backend: &Backend{ 448 Type: "test", 449 }, 450 }, 451 }, 452 &Config{ 453 Terraform: &Terraform{ 454 RequiredVersion: "A", 455 Backend: &Backend{ 456 Type: "test", 457 }, 458 }, 459 }, 460 false, 461 }, 462 } 463 464 for i, tc := range cases { 465 actual, err := Merge(tc.c1, tc.c2) 466 if err != nil != tc.err { 467 t.Fatalf("%d: error fail", i) 468 } 469 470 if !reflect.DeepEqual(actual, tc.result) { 471 t.Fatalf("%d: bad:\n\n%#v", i, actual) 472 } 473 } 474 }