github.com/tetrafolium/tflint@v0.8.0/tflint/loader_test.go (about) 1 package tflint 2 3 import ( 4 "os" 5 "path/filepath" 6 "reflect" 7 "testing" 8 9 "github.com/hashicorp/terraform/terraform" 10 "github.com/zclconf/go-cty/cty" 11 ) 12 13 func Test_LoadConfig_v0_10_5(t *testing.T) { 14 currentDir, err := os.Getwd() 15 if err != nil { 16 t.Fatal(err) 17 } 18 defer os.Chdir(currentDir) 19 20 err = os.Chdir(filepath.Join(currentDir, "test-fixtures", "v0.10.5_module")) 21 if err != nil { 22 t.Fatal(err) 23 } 24 25 loader, err := NewLoader() 26 if err != nil { 27 t.Fatalf("Unexpected error occurred: %s", err) 28 } 29 config, err := loader.LoadConfig() 30 if err != nil { 31 t.Fatalf("Unexpected error occurred: %s", err) 32 } 33 34 if _, exists := config.Children["ec2_instance"]; !exists { 35 t.Fatalf("`ec2_instance` module is not loaded: %#v", config.Children) 36 } 37 38 if _, exists := config.Children["ec2_instance"].Module.ManagedResources["aws_instance.web"]; !exists { 39 t.Fatalf("`ec2_instance` module resource `aws_instance.web` is not loaded: %#v", config.Children["ec2_instance"].Module.ManagedResources) 40 } 41 } 42 43 func Test_LoadConfig_v0_10_6(t *testing.T) { 44 currentDir, err := os.Getwd() 45 if err != nil { 46 t.Fatal(err) 47 } 48 defer os.Chdir(currentDir) 49 50 err = os.Chdir(filepath.Join(currentDir, "test-fixtures", "v0.10.6_module")) 51 if err != nil { 52 t.Fatal(err) 53 } 54 55 loader, err := NewLoader() 56 if err != nil { 57 t.Fatalf("Unexpected error occurred: %s", err) 58 } 59 config, err := loader.LoadConfig() 60 if err != nil { 61 t.Fatalf("Unexpected error occurred: %s", err) 62 } 63 64 if _, exists := config.Children["ec2_instance"]; !exists { 65 t.Fatalf("`ec2_instance` module is not loaded: %#v", config.Children) 66 } 67 68 if _, exists := config.Children["ec2_instance"].Module.ManagedResources["aws_instance.web"]; !exists { 69 t.Fatalf("`ec2_instance` module resource `aws_instance.web` is not loaded: %#v", config.Children["ec2_instance"].Module.ManagedResources) 70 } 71 } 72 73 func Test_LoadConfig_v0_10_7(t *testing.T) { 74 currentDir, err := os.Getwd() 75 if err != nil { 76 t.Fatal(err) 77 } 78 defer os.Chdir(currentDir) 79 80 err = os.Chdir(filepath.Join(currentDir, "test-fixtures", "v0.10.7_module")) 81 if err != nil { 82 t.Fatal(err) 83 } 84 85 loader, err := NewLoader() 86 if err != nil { 87 t.Fatalf("Unexpected error occurred: %s", err) 88 } 89 config, err := loader.LoadConfig() 90 if err != nil { 91 t.Fatalf("Unexpected error occurred: %s", err) 92 } 93 94 if _, exists := config.Children["ec2_instance"]; !exists { 95 t.Fatalf("`ec2_instance` module is not loaded: %#v", config.Children) 96 } 97 98 if _, exists := config.Children["ec2_instance"].Module.ManagedResources["aws_instance.web"]; !exists { 99 t.Fatalf("`ec2_instance` module resource `aws_instance.web` is not loaded: %#v", config.Children["ec2_instance"].Module.ManagedResources) 100 } 101 } 102 103 func Test_LoadConfig_v0_11_0(t *testing.T) { 104 currentDir, err := os.Getwd() 105 if err != nil { 106 t.Fatal(err) 107 } 108 defer os.Chdir(currentDir) 109 110 err = os.Chdir(filepath.Join(currentDir, "test-fixtures", "v0.11.0_module")) 111 if err != nil { 112 t.Fatal(err) 113 } 114 115 loader, err := NewLoader() 116 if err != nil { 117 t.Fatalf("Unexpected error occurred: %s", err) 118 } 119 config, err := loader.LoadConfig() 120 if err != nil { 121 t.Fatalf("Unexpected error occurred: %s", err) 122 } 123 124 if _, exists := config.Children["ecs_on_spotfleet"]; !exists { 125 t.Fatalf("`ecs_on_spotfleet` module is not loaded: %#v", config.Children) 126 } 127 128 if _, exists := config.Children["ecs_on_spotfleet"].Module.ManagedResources["aws_ecs_cluster.main"]; !exists { 129 t.Fatalf("`ecs_on_spotfleet` module resource `aws_ecs_cluster.main` is not loaded: %#v", config.Children["ecs_on_spotfleet"].Module.ManagedResources) 130 } 131 132 if _, exists := config.Children["consul"]; !exists { 133 t.Fatalf("`consul` module is not loaded: %#v", config.Children) 134 } 135 136 if _, exists := config.Children["consul"].Children["consul_clients"]; !exists { 137 t.Fatalf("`consul.consul_clients` module is not loaded: %#v", config.Children["consul"].Children) 138 } 139 140 if _, exists := config.Children["consul"].Children["consul_clients"].Children["iam_policies"]; !exists { 141 t.Fatalf("`consule.consul_clients.iam_policies` module is not loaded: %#v", config.Children["consul"].Children["consul_clients"].Children) 142 } 143 144 if _, exists := config.Children["consul"].Children["consul_clients"].Children["iam_policies"].Module.ManagedResources["aws_iam_role_policy.auto_discover_cluster"]; !exists { 145 t.Fatalf("`consule.consul_clients.iam_policies` module resource `aws_iam_role_policy.auto_discover_cluster` is not loaded: %#v", config.Children["consul"].Children["consul_clients"].Children["iam_policies"].Module.ManagedResources) 146 } 147 148 if _, exists := config.Children["consul"].Children["consul_clients"].Children["security_group_rules"]; !exists { 149 t.Fatalf("`consule.consul_clients.security_group_rules` module is not loaded: %#v", config.Children["consul"].Children["consul_clients"].Children) 150 } 151 152 if _, exists := config.Children["consul"].Children["consul_clients"].Children["security_group_rules"].Module.ManagedResources["aws_security_group_rule.allow_server_rpc_inbound"]; !exists { 153 t.Fatalf("`consule.consul_clients.security_group_rules` module resource `aws_security_group_rule.allow_server_rpc_inbound` is not loaded: %#v", config.Children["consul"].Children["consul_clients"].Children["security_group_rules"].Module.ManagedResources) 154 } 155 156 if _, exists := config.Children["consul"].Children["consul_servers"]; !exists { 157 t.Fatalf("`consul.consul_servers` module is not loaded: %#v", config.Children["consul"].Children) 158 } 159 160 if _, exists := config.Children["consul"].Children["consul_servers"].Children["iam_policies"]; !exists { 161 t.Fatalf("`consule.consul_servers.iam_policies` module is not loaded: %#v", config.Children["consul"].Children["consul_servers"].Children) 162 } 163 164 if _, exists := config.Children["consul"].Children["consul_servers"].Children["iam_policies"].Module.ManagedResources["aws_iam_role_policy.auto_discover_cluster"]; !exists { 165 t.Fatalf("`consule.consul_servers.iam_policies` module resource `aws_iam_role_policy.auto_discover_cluster` is not loaded: %#v", config.Children["consul"].Children["consul_servers"].Children["iam_policies"].Module.ManagedResources) 166 } 167 168 if _, exists := config.Children["consul"].Children["consul_servers"].Children["security_group_rules"]; !exists { 169 t.Fatalf("`consule.consul_servers.security_group_rules` module is not loaded: %#v", config.Children["consul"].Children["consul_servers"].Children) 170 } 171 172 if _, exists := config.Children["consul"].Children["consul_servers"].Children["security_group_rules"].Module.ManagedResources["aws_security_group_rule.allow_server_rpc_inbound"]; !exists { 173 t.Fatalf("`consule.consul_servers.security_group_rules` module resource `aws_security_group_rule.allow_server_rpc_inbound` is not loaded: %#v", config.Children["consul"].Children["consul_servers"].Children["security_group_rules"].Module.ManagedResources) 174 } 175 } 176 177 func Test_LoadConfig_v0_12_0(t *testing.T) { 178 currentDir, err := os.Getwd() 179 if err != nil { 180 t.Fatal(err) 181 } 182 defer os.Chdir(currentDir) 183 184 err = os.Chdir(filepath.Join(currentDir, "test-fixtures", "v0.12.0_module")) 185 if err != nil { 186 t.Fatal(err) 187 } 188 189 loader, err := NewLoader() 190 if err != nil { 191 t.Fatalf("Unexpected error occurred: %s", err) 192 } 193 config, err := loader.LoadConfig() 194 if err != nil { 195 t.Fatalf("Unexpected error occurred: %s", err) 196 } 197 198 if _, exists := config.Children["ecs_on_spotfleet"]; !exists { 199 t.Fatalf("`ecs_on_spotfleet` module is not loaded: %#v", config.Children) 200 } 201 202 if _, exists := config.Children["ecs_on_spotfleet"].Module.ManagedResources["aws_ecs_cluster.main"]; !exists { 203 t.Fatalf("`ecs_on_spotfleet` module resource `aws_ecs_cluster.main` is not loaded: %#v", config.Children["ecs_on_spotfleet"].Module.ManagedResources) 204 } 205 206 if _, exists := config.Children["instance"]; !exists { 207 t.Fatalf("`instance` module is not loaded: %#v", config.Children) 208 } 209 210 if _, exists := config.Children["consul"]; !exists { 211 t.Fatalf("`consul` module is not loaded: %#v", config.Children) 212 } 213 214 if _, exists := config.Children["consul"].Children["consul_clients"]; !exists { 215 t.Fatalf("`consul.consul_clients` module is not loaded: %#v", config.Children["consul"].Children) 216 } 217 218 if _, exists := config.Children["consul"].Children["consul_clients"].Children["iam_policies"]; !exists { 219 t.Fatalf("`consule.consul_clients.iam_policies` module is not loaded: %#v", config.Children["consul"].Children["consul_clients"].Children) 220 } 221 222 if _, exists := config.Children["consul"].Children["consul_clients"].Children["iam_policies"].Module.ManagedResources["aws_iam_role_policy.auto_discover_cluster"]; !exists { 223 t.Fatalf("`consule.consul_clients.iam_policies` module resource `aws_iam_role_policy.auto_discover_cluster` is not loaded: %#v", config.Children["consul"].Children["consul_clients"].Children["iam_policies"].Module.ManagedResources) 224 } 225 226 if _, exists := config.Children["consul"].Children["consul_clients"].Children["security_group_rules"]; !exists { 227 t.Fatalf("`consule.consul_clients.security_group_rules` module is not loaded: %#v", config.Children["consul"].Children["consul_clients"].Children) 228 } 229 230 if _, exists := config.Children["consul"].Children["consul_clients"].Children["security_group_rules"].Module.ManagedResources["aws_security_group_rule.allow_server_rpc_inbound"]; !exists { 231 t.Fatalf("`consule.consul_clients.security_group_rules` module resource `aws_security_group_rule.allow_server_rpc_inbound` is not loaded: %#v", config.Children["consul"].Children["consul_clients"].Children["security_group_rules"].Module.ManagedResources) 232 } 233 234 if _, exists := config.Children["consul"].Children["consul_servers"]; !exists { 235 t.Fatalf("`consul.consul_servers` module is not loaded: %#v", config.Children["consul"].Children) 236 } 237 238 if _, exists := config.Children["consul"].Children["consul_servers"].Children["iam_policies"]; !exists { 239 t.Fatalf("`consule.consul_servers.iam_policies` module is not loaded: %#v", config.Children["consul"].Children["consul_servers"].Children) 240 } 241 242 if _, exists := config.Children["consul"].Children["consul_servers"].Children["iam_policies"].Module.ManagedResources["aws_iam_role_policy.auto_discover_cluster"]; !exists { 243 t.Fatalf("`consule.consul_servers.iam_policies` module resource `aws_iam_role_policy.auto_discover_cluster` is not loaded: %#v", config.Children["consul"].Children["consul_servers"].Children["iam_policies"].Module.ManagedResources) 244 } 245 246 if _, exists := config.Children["consul"].Children["consul_servers"].Children["security_group_rules"]; !exists { 247 t.Fatalf("`consule.consul_servers.security_group_rules` module is not loaded: %#v", config.Children["consul"].Children["consul_servers"].Children) 248 } 249 250 if _, exists := config.Children["consul"].Children["consul_servers"].Children["security_group_rules"].Module.ManagedResources["aws_security_group_rule.allow_server_rpc_inbound"]; !exists { 251 t.Fatalf("`consule.consul_servers.security_group_rules` module resource `aws_security_group_rule.allow_server_rpc_inbound` is not loaded: %#v", config.Children["consul"].Children["consul_servers"].Children["security_group_rules"].Module.ManagedResources) 252 } 253 } 254 255 func Test_LoadConfig_moduleNotFound(t *testing.T) { 256 currentDir, err := os.Getwd() 257 if err != nil { 258 t.Fatal(err) 259 } 260 defer os.Chdir(currentDir) 261 262 err = os.Chdir(filepath.Join(currentDir, "test-fixtures", "before_terraform_init")) 263 if err != nil { 264 t.Fatal(err) 265 } 266 267 loader, err := NewLoader() 268 if err != nil { 269 t.Fatalf("Unexpected error occurred: %s", err) 270 } 271 _, err = loader.LoadConfig() 272 if err == nil { 273 t.Fatal("Expected error is not occurred") 274 } 275 276 expected := "module.tf:1,1-22: `ec2_instance` module is not found. Did you run `terraform init`?; " 277 if err.Error() != expected { 278 t.Fatalf("Expected error is `%s`, but get `%s`", expected, err.Error()) 279 } 280 } 281 282 func Test_LoadConfig_invalidConfiguration(t *testing.T) { 283 currentDir, err := os.Getwd() 284 if err != nil { 285 t.Fatal(err) 286 } 287 defer os.Chdir(currentDir) 288 289 err = os.Chdir(filepath.Join(currentDir, "test-fixtures", "invalid_configuration")) 290 if err != nil { 291 t.Fatal(err) 292 } 293 294 loader, err := NewLoader() 295 if err != nil { 296 t.Fatalf("Unexpected error occurred: %s", err) 297 } 298 _, err = loader.LoadConfig() 299 if err == nil { 300 t.Fatal("Expected error is not occurred") 301 } 302 303 expected := "resource.tf:1,1-10: Unsupported block type; Blocks of type \"resources\" are not expected here. Did you mean \"resource\"?" 304 if err.Error() != expected { 305 t.Fatalf("Expected error is `%s`, but get `%s`", expected, err.Error()) 306 } 307 } 308 309 func Test_LoadValuesFiles(t *testing.T) { 310 currentDir, err := os.Getwd() 311 if err != nil { 312 t.Fatal(err) 313 } 314 defer os.Chdir(currentDir) 315 316 err = os.Chdir(filepath.Join(currentDir, "test-fixtures", "values_files")) 317 if err != nil { 318 t.Fatal(err) 319 } 320 loader, err := NewLoader() 321 if err != nil { 322 t.Fatalf("Unexpected error occurred: %s", err) 323 } 324 ret, err := loader.LoadValuesFiles("cli1.tfvars", "cli2.tfvars") 325 if err != nil { 326 t.Fatalf("Unexpected error occurred: %s", err) 327 } 328 329 expected := []terraform.InputValues{ 330 { 331 "default": { 332 Value: cty.StringVal("terraform.tfvars"), 333 SourceType: terraform.ValueFromAutoFile, 334 }, 335 }, 336 { 337 "auto1": { 338 Value: cty.StringVal("auto1.auto.tfvars"), 339 SourceType: terraform.ValueFromAutoFile, 340 }, 341 }, 342 { 343 "auto2": { 344 Value: cty.StringVal("auto2.auto.tfvars"), 345 SourceType: terraform.ValueFromAutoFile, 346 }, 347 }, 348 { 349 "cli1": { 350 Value: cty.StringVal("cli1.tfvars"), 351 SourceType: terraform.ValueFromNamedFile, 352 }, 353 }, 354 { 355 "cli2": { 356 Value: cty.StringVal("cli2.tfvars"), 357 SourceType: terraform.ValueFromNamedFile, 358 }, 359 }, 360 } 361 362 if !reflect.DeepEqual(expected, ret) { 363 t.Fatalf("Unexpected input values are received: expected=%#v actual=%#v", expected, ret) 364 } 365 } 366 367 func Test_LoadValuesFiles_invalidValuesFile(t *testing.T) { 368 currentDir, err := os.Getwd() 369 if err != nil { 370 t.Fatal(err) 371 } 372 defer os.Chdir(currentDir) 373 374 err = os.Chdir(filepath.Join(currentDir, "test-fixtures", "invalid_values_files")) 375 if err != nil { 376 t.Fatal(err) 377 } 378 loader, err := NewLoader() 379 if err != nil { 380 t.Fatalf("Unexpected error occurred: %s", err) 381 } 382 _, err = loader.LoadValuesFiles() 383 if err == nil { 384 t.Fatal("Expected error is not occurred") 385 } 386 387 expected := "terraform.tfvars:3,1-9: Unexpected \"resource\" block; Blocks are not allowed here." 388 if err.Error() != expected { 389 t.Fatalf("Expected error is `%s`, but get `%s`", expected, err.Error()) 390 } 391 } 392 393 func Test_IsConfigFile(t *testing.T) { 394 currentDir, err := os.Getwd() 395 if err != nil { 396 t.Fatal(err) 397 } 398 defer os.Chdir(currentDir) 399 400 err = os.Chdir(filepath.Join(currentDir, "test-fixtures", "is_config_file")) 401 if err != nil { 402 t.Fatal(err) 403 } 404 405 loader, err := NewLoader() 406 if err != nil { 407 t.Fatalf("Unexpected error occurred: %s", err) 408 } 409 410 cases := []struct { 411 Name string 412 File string 413 Expected bool 414 }{ 415 { 416 Name: "config file", 417 File: "template.tf", 418 Expected: true, 419 }, 420 { 421 Name: "not config file", 422 File: "README", 423 Expected: false, 424 }, 425 { 426 Name: "not found", 427 File: "not_found.tf", 428 Expected: false, 429 }, 430 } 431 432 for _, tc := range cases { 433 ret := loader.IsConfigFile(tc.File) 434 if ret != tc.Expected { 435 t.Fatalf("Test `%s` failed: expected is `%t`, but get `%t`", tc.Name, tc.Expected, ret) 436 } 437 } 438 }