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  }