@@ -8,21 +8,15 @@ import (
88)
99
1010func Test_AwsS3NoGlobalEndpoint (t * testing.T ) {
11+ filename := "resource.tf"
12+
1113 cases := []struct {
1214 Name string
1315 Content string
1416 Expected helper.Issues
1517 }{
1618 {
17- Name : "unrelated expression" ,
18- Content : `
19- output "test" {
20- value = "testing"
21- }` ,
22- Expected : helper.Issues {},
23- },
24- {
25- Name : "multiple unrelated expressions" ,
19+ Name : "unrelated expressions" ,
2620 Content : `
2721output "test1" {
2822 value = var.whatever
@@ -34,11 +28,9 @@ output "test2" {
3428
3529output "test3" {
3630 value = aws_iam_role.test.arn
37- }
38- ` ,
31+ }` ,
3932 Expected : helper.Issues {},
4033 },
41- // TODO: nested expressions ?
4234 {
4335 Name : "regional endpoint used" ,
4436 Content : `
@@ -47,9 +39,8 @@ output "test" {
4739}` ,
4840 Expected : helper.Issues {},
4941 },
50- // TODO: strings of the form "bucket_name.s3.amazonaws.com" ?
5142 {
52- Name : "legacy global endpoint used" ,
43+ Name : "global endpoint used" ,
5344 Content : `
5445output "test" {
5546 value = aws_s3_bucket.test.bucket_domain_name
@@ -59,19 +50,220 @@ output "test" {
5950 Rule : NewAwsS3NoGlobalEndpointRule (),
6051 Message : "`bucket_domain_name` returns the legacy s3 global endpoint, use `bucket_regional_domain_name` instead" ,
6152 Range : hcl.Range {
62- Filename : "resource.tf" ,
53+ Filename : filename ,
6354 Start : hcl.Pos {Line : 3 , Column : 11 },
6455 End : hcl.Pos {Line : 3 , Column : 48 },
6556 },
6657 },
6758 },
6859 },
60+ {
61+ Name : "global endpoint used from aws_s3_bucket data source" ,
62+ Content : `
63+ output "test" {
64+ value = data.aws_s3_bucket.test.bucket_domain_name
65+ }` ,
66+ Expected : helper.Issues {
67+ {
68+ Rule : NewAwsS3NoGlobalEndpointRule (),
69+ Message : "`bucket_domain_name` returns the legacy s3 global endpoint, use `bucket_regional_domain_name` instead" ,
70+ Range : hcl.Range {
71+ Filename : filename ,
72+ Start : hcl.Pos {Line : 3 , Column : 11 },
73+ End : hcl.Pos {Line : 3 , Column : 53 },
74+ },
75+ },
76+ },
77+ },
78+ {
79+ Name : "global endpoint interpolation" ,
80+ Content : `
81+ output "test" {
82+ value = "interpolation test: ${aws_s3_bucket.test.bucket_domain_name}"
83+ }` ,
84+ Expected : helper.Issues {
85+ {
86+ Rule : NewAwsS3NoGlobalEndpointRule (),
87+ Message : "`bucket_domain_name` returns the legacy s3 global endpoint, use `bucket_regional_domain_name` instead" ,
88+ Range : hcl.Range {
89+ Filename : filename ,
90+ Start : hcl.Pos {Line : 3 , Column : 34 },
91+ End : hcl.Pos {Line : 3 , Column : 71 },
92+ },
93+ },
94+ },
95+ },
96+ {
97+ Name : "global endpoint interpolation multiple expressions" ,
98+ Content : `
99+ output "test" {
100+ value = "interpolation test: ${aws_s3_bucket.test.bucket_domain_name} ${var.whatever}"
101+ }` ,
102+ Expected : helper.Issues {
103+ {
104+ Rule : NewAwsS3NoGlobalEndpointRule (),
105+ Message : "`bucket_domain_name` returns the legacy s3 global endpoint, use `bucket_regional_domain_name` instead" ,
106+ Range : hcl.Range {
107+ Filename : filename ,
108+ Start : hcl.Pos {Line : 3 , Column : 34 },
109+ End : hcl.Pos {Line : 3 , Column : 71 },
110+ },
111+ },
112+ },
113+ },
114+ {
115+ Name : "global endpoint with count" ,
116+ Content : `
117+ output "test1" {
118+ value = aws_s3_bucket.test[0].bucket_domain_name
119+ }
120+
121+ output "test2" {
122+ value = aws_s3_bucket.test[length(var.bucket_names) - 1].bucket_domain_name
123+ }
124+ ` ,
125+ Expected : helper.Issues {
126+ {
127+ Rule : NewAwsS3NoGlobalEndpointRule (),
128+ Message : "`bucket_domain_name` returns the legacy s3 global endpoint, use `bucket_regional_domain_name` instead" ,
129+ Range : hcl.Range {
130+ Filename : filename ,
131+ Start : hcl.Pos {Line : 3 , Column : 11 },
132+ End : hcl.Pos {Line : 3 , Column : 51 },
133+ },
134+ },
135+ {
136+ Rule : NewAwsS3NoGlobalEndpointRule (),
137+ Message : "`bucket_domain_name` returns the legacy s3 global endpoint, use `bucket_regional_domain_name` instead" ,
138+ Range : hcl.Range {
139+ Filename : filename ,
140+ Start : hcl.Pos {Line : 7 , Column : 11 },
141+ End : hcl.Pos {Line : 7 , Column : 78 },
142+ },
143+ },
144+ },
145+ },
146+ {
147+ Name : "global endpoint in a for expression" ,
148+ Content : `
149+ output "test" {
150+ value = {
151+ for bucket_name, bucket in aws_s3_bucket.test: bucket_name => bucket.bucket_domain_name
152+ }
153+ }` ,
154+ Expected : helper.Issues {
155+ {
156+ Rule : NewAwsS3NoGlobalEndpointRule (),
157+ Message : "`bucket_domain_name` returns the legacy s3 global endpoint, use `bucket_regional_domain_name` instead" ,
158+ Range : hcl.Range {
159+ Filename : filename ,
160+ Start : hcl.Pos {Line : 4 , Column : 67 },
161+ End : hcl.Pos {Line : 4 , Column : 92 },
162+ },
163+ },
164+ },
165+ },
166+ {
167+ Name : "global endpoint with foreach" ,
168+ Content : `
169+ resource "aws_s3_bucket" "test" {
170+ for_each = toset(var.bucket_names)
171+
172+ bucket = each.key
173+ }
174+
175+ resource "aws_ssm_parameter" "test" {
176+ for_each = aws_s3_bucket.test
177+
178+ name = each.value.id
179+ type = "String"
180+ value = each.value.bucket_domain_name
181+ }` ,
182+ Expected : helper.Issues {
183+ {
184+ Rule : NewAwsS3NoGlobalEndpointRule (),
185+ Message : "`bucket_domain_name` returns the legacy s3 global endpoint, use `bucket_regional_domain_name` instead" ,
186+ Range : hcl.Range {
187+ Filename : filename ,
188+ Start : hcl.Pos {Line : 13 , Column : 11 },
189+ End : hcl.Pos {Line : 13 , Column : 40 },
190+ },
191+ },
192+ },
193+ },
194+ {
195+ Name : "global endpoint in a dynamic block" ,
196+ Content : `
197+ resource "aws_s3_bucket" "test" {
198+ for_each = toset(var.bucket_names)
199+
200+ bucket = each.key
201+ }
202+
203+ resource "aws_cloudfront_distribution" "test" {
204+ dynamic "origin" {
205+ for_each = aws_s3_bucket.test
206+
207+ content {
208+ origin_id = origin.value.id
209+ domain_name = origin.value.bucket_domain_name
210+ }
211+ }
212+ }` ,
213+ Expected : helper.Issues {
214+ {
215+ Rule : NewAwsS3NoGlobalEndpointRule (),
216+ Message : "`bucket_domain_name` returns the legacy s3 global endpoint, use `bucket_regional_domain_name` instead" ,
217+ Range : hcl.Range {
218+ Filename : filename ,
219+ Start : hcl.Pos {Line : 14 , Column : 11 },
220+ End : hcl.Pos {Line : 14 , Column : 40 },
221+ },
222+ },
223+ },
224+ },
225+ {
226+ Name : "global endpoint literal" ,
227+ Content : `
228+ output "test" {
229+ value = "test.s3.amazonaws.com"
230+ }` ,
231+ Expected : helper.Issues {
232+ {
233+ Rule : NewAwsS3NoGlobalEndpointRule (),
234+ Message : "`bucket_domain_name` returns the legacy s3 global endpoint, use `bucket_regional_domain_name` instead" ,
235+ Range : hcl.Range {
236+ Filename : filename ,
237+ Start : hcl.Pos {Line : 3 , Column : 12 },
238+ End : hcl.Pos {Line : 3 , Column : 33 },
239+ },
240+ },
241+ },
242+ },
243+ {
244+ Name : "global endpoint literal with interpolation" ,
245+ Content : `
246+ output "test" {
247+ value = "${var.bucket_name}.s3.amazonaws.com"
248+ }` ,
249+ Expected : helper.Issues {
250+ {
251+ Rule : NewAwsS3NoGlobalEndpointRule (),
252+ Message : "`bucket_domain_name` returns the legacy s3 global endpoint, use `bucket_regional_domain_name` instead" ,
253+ Range : hcl.Range {
254+ Filename : filename ,
255+ Start : hcl.Pos {Line : 3 , Column : 12 },
256+ End : hcl.Pos {Line : 3 , Column : 47 },
257+ },
258+ },
259+ },
260+ },
69261 }
70262
71263 rule := NewAwsS3NoGlobalEndpointRule ()
72264
73265 for _ , tc := range cases {
74- runner := helper .TestRunner (t , map [string ]string {"resource.tf" : tc .Content })
266+ runner := helper .TestRunner (t , map [string ]string {filename : tc .Content })
75267
76268 if err := rule .Check (runner ); err != nil {
77269 t .Fatalf ("Unexpected error occurred: %s" , err )
0 commit comments