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 }