Skip to content

Commit 1b90b9f

Browse files
committed
more robust tests
1 parent d783ff9 commit 1b90b9f

File tree

1 file changed

+208
-16
lines changed

1 file changed

+208
-16
lines changed

rules/aws_s3_no_global_endpoint_test.go

Lines changed: 208 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,15 @@ import (
88
)
99

1010
func 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: `
2721
output "test1" {
2822
value = var.whatever
@@ -34,11 +28,9 @@ output "test2" {
3428
3529
output "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: `
5445
output "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

Comments
 (0)