github.com/jpreese/tflint@v0.19.2-0.20200908152133-b01686250fb6/rules/terraformrules/terraform_required_providers_test.go (about)

     1  package terraformrules
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/hashicorp/hcl/v2"
     7  	"github.com/terraform-linters/tflint/tflint"
     8  )
     9  
    10  func Test_TerraformRequiredProvidersRule(t *testing.T) {
    11  	cases := []struct {
    12  		Name     string
    13  		Content  string
    14  		Expected tflint.Issues
    15  	}{
    16  		{
    17  			Name: "no version",
    18  			Content: `
    19  provider "template" {}
    20  `,
    21  			Expected: tflint.Issues{
    22  				{
    23  					Rule:    NewTerraformRequiredProvidersRule(),
    24  					Message: `Missing version constraint for provider "template" in "required_providers"`,
    25  					Range: hcl.Range{
    26  						Filename: "module.tf",
    27  						Start: hcl.Pos{
    28  							Line:   2,
    29  							Column: 1,
    30  						},
    31  						End: hcl.Pos{
    32  							Line:   2,
    33  							Column: 20,
    34  						},
    35  					},
    36  				},
    37  			},
    38  		},
    39  		{
    40  			Name: "implicit provider - resource",
    41  			Content: `
    42  resource "random_string" "foo" {
    43  	length = 16
    44  }
    45  `,
    46  			Expected: tflint.Issues{
    47  				{
    48  					Rule:    NewTerraformRequiredProvidersRule(),
    49  					Message: `Missing version constraint for provider "random" in "required_providers"`,
    50  					Range: hcl.Range{
    51  						Filename: "module.tf",
    52  						Start: hcl.Pos{
    53  							Line:   2,
    54  							Column: 1,
    55  						},
    56  						End: hcl.Pos{
    57  							Line:   2,
    58  							Column: 31,
    59  						},
    60  					},
    61  				},
    62  			},
    63  		},
    64  		{
    65  			Name: "implicit provider - data source",
    66  			Content: `
    67  data "template_file" "foo" {
    68  	template = ""
    69  }
    70  `,
    71  			Expected: tflint.Issues{
    72  				{
    73  					Rule:    NewTerraformRequiredProvidersRule(),
    74  					Message: `Missing version constraint for provider "template" in "required_providers"`,
    75  					Range: hcl.Range{
    76  						Filename: "module.tf",
    77  						Start: hcl.Pos{
    78  							Line:   2,
    79  							Column: 1,
    80  						},
    81  						End: hcl.Pos{
    82  							Line:   2,
    83  							Column: 27,
    84  						},
    85  					},
    86  				},
    87  			},
    88  		},
    89  		{
    90  			Name: "required_providers set",
    91  			Content: `
    92  terraform {
    93  	required_providers {
    94  		template = "~> 2"
    95  	}
    96  }
    97  
    98  provider "template" {} 
    99  `,
   100  			Expected: tflint.Issues{},
   101  		},
   102  		{
   103  			Name: "single provider with alias",
   104  			Content: `
   105  provider "template" {
   106  	alias = "b"
   107  }
   108  `,
   109  			Expected: tflint.Issues{
   110  				{
   111  					Rule:    NewTerraformRequiredProvidersRule(),
   112  					Message: `Missing version constraint for provider "template" in "required_providers"`,
   113  					Range: hcl.Range{
   114  						Filename: "module.tf",
   115  						Start: hcl.Pos{
   116  							Line:   2,
   117  							Column: 1,
   118  						},
   119  						End: hcl.Pos{
   120  							Line:   2,
   121  							Column: 20,
   122  						},
   123  					},
   124  				},
   125  			},
   126  		},
   127  		{
   128  			Name: "version set with alias",
   129  			Content: `
   130  terraform {
   131    required_providers {
   132      template = "~> 2"
   133    }
   134  }
   135  
   136  provider "template" {
   137  	version = "~> 2"
   138  } 
   139  `,
   140  			Expected: tflint.Issues{
   141  				{
   142  					Rule:    NewTerraformRequiredProvidersRule(),
   143  					Message: `provider.template: version constraint should be specified via "required_providers"`,
   144  					Range: hcl.Range{
   145  						Filename: "module.tf",
   146  						Start: hcl.Pos{
   147  							Line:   8,
   148  							Column: 1,
   149  						},
   150  						End: hcl.Pos{
   151  							Line:   8,
   152  							Column: 20,
   153  						},
   154  					},
   155  				},
   156  			},
   157  		},
   158  		{
   159  			Name: "version set",
   160  			Content: `
   161  terraform {
   162    required_providers {
   163      template = "~> 2"
   164    }
   165  }
   166  
   167  provider "template" {
   168  	alias   = "foo"
   169  	version = "~> 2"
   170  } 
   171  `,
   172  			Expected: tflint.Issues{
   173  				{
   174  					Rule:    NewTerraformRequiredProvidersRule(),
   175  					Message: `provider.template.foo: version constraint should be specified via "required_providers"`,
   176  					Range: hcl.Range{
   177  						Filename: "module.tf",
   178  						Start: hcl.Pos{
   179  							Line:   8,
   180  							Column: 1,
   181  						},
   182  						End: hcl.Pos{
   183  							Line:   8,
   184  							Column: 20,
   185  						},
   186  					},
   187  				},
   188  			},
   189  		},
   190  	}
   191  
   192  	rule := NewTerraformRequiredProvidersRule()
   193  
   194  	for _, tc := range cases {
   195  		tc := tc
   196  
   197  		t.Run(tc.Name, func(t *testing.T) {
   198  			runner := tflint.TestRunner(t, map[string]string{"module.tf": tc.Content})
   199  
   200  			if err := rule.Check(runner); err != nil {
   201  				t.Fatalf("Unexpected error occurred: %s", err)
   202  			}
   203  
   204  			tflint.AssertIssues(t, tc.Expected, runner.Issues)
   205  		})
   206  	}
   207  }