Skip to content

Commit 254f09d

Browse files
committed
test(cloudflare_ruleset): add coverage for redirect action
1 parent d7b51a6 commit 254f09d

File tree

7 files changed

+300
-11
lines changed

7 files changed

+300
-11
lines changed

internal/services/ruleset/model.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -140,14 +140,14 @@ type RulesetRulesActionParametersOverridesRulesModel struct {
140140
}
141141

142142
type RulesetRulesActionParametersFromListModel struct {
143-
Key types.String `tfsdk:"key" json:"key,optional"`
144-
Name types.String `tfsdk:"name" json:"name,optional"`
143+
Key types.String `tfsdk:"key" json:"key,required"`
144+
Name types.String `tfsdk:"name" json:"name,required"`
145145
}
146146

147147
type RulesetRulesActionParametersFromValueModel struct {
148-
PreserveQueryString types.Bool `tfsdk:"preserve_query_string" json:"preserve_query_string,optional"`
149-
StatusCode types.Float64 `tfsdk:"status_code" json:"status_code,optional"`
150-
TargetURL customfield.NestedObject[RulesetRulesActionParametersFromValueTargetURLModel] `tfsdk:"target_url" json:"target_url,optional"`
148+
PreserveQueryString types.Bool `tfsdk:"preserve_query_string" json:"preserve_query_string,computed_optional"`
149+
StatusCode types.Int64 `tfsdk:"status_code" json:"status_code,optional"`
150+
TargetURL customfield.NestedObject[RulesetRulesActionParametersFromValueTargetURLModel] `tfsdk:"target_url" json:"target_url,required"`
151151
}
152152

153153
type RulesetRulesActionParametersFromValueTargetURLModel struct {

internal/services/ruleset/resource_test.go

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2621,3 +2621,197 @@ func TestAccCloudflareRuleset_LogCustomFieldRules(t *testing.T) {
26212621
},
26222622
})
26232623
}
2624+
2625+
func TestAccCloudflareRuleset_RedirectRules(t *testing.T) {
2626+
resource.Test(t, resource.TestCase{
2627+
PreCheck: func() { acctest.TestAccPreCheck(t) },
2628+
ProtoV6ProviderFactories: acctest.TestAccProtoV6ProviderFactories,
2629+
Steps: []resource.TestStep{
2630+
{
2631+
ConfigFile: config.TestNameFile("1.tf"),
2632+
ConfigVariables: configVariables,
2633+
ConfigPlanChecks: resource.ConfigPlanChecks{
2634+
PreApply: []plancheck.PlanCheck{
2635+
plancheck.ExpectResourceAction(
2636+
"cloudflare_ruleset.my_ruleset",
2637+
plancheck.ResourceActionCreate,
2638+
),
2639+
plancheck.ExpectKnownValue(
2640+
"cloudflare_ruleset.my_ruleset",
2641+
tfjsonpath.New("rules"),
2642+
knownvalue.ListExact([]knownvalue.Check{
2643+
knownvalue.ObjectPartial(map[string]knownvalue.Check{
2644+
"action": knownvalue.StringExact("redirect"),
2645+
"action_parameters": knownvalue.ObjectPartial(map[string]knownvalue.Check{
2646+
"from_list": knownvalue.ObjectExact(map[string]knownvalue.Check{
2647+
"key": knownvalue.StringExact("http.request.full_uri"),
2648+
"name": knownvalue.StringExact("my_list"),
2649+
}),
2650+
"from_value": knownvalue.Null(),
2651+
}),
2652+
}),
2653+
}),
2654+
),
2655+
},
2656+
},
2657+
ConfigStateChecks: []statecheck.StateCheck{
2658+
statecheck.ExpectKnownValue(
2659+
"cloudflare_ruleset.my_ruleset",
2660+
tfjsonpath.New("rules"),
2661+
knownvalue.ListExact([]knownvalue.Check{
2662+
knownvalue.ObjectPartial(map[string]knownvalue.Check{
2663+
"action": knownvalue.StringExact("redirect"),
2664+
"action_parameters": knownvalue.ObjectPartial(map[string]knownvalue.Check{
2665+
"from_list": knownvalue.ObjectExact(map[string]knownvalue.Check{
2666+
"key": knownvalue.StringExact("http.request.full_uri"),
2667+
"name": knownvalue.StringExact("my_list"),
2668+
}),
2669+
"from_value": knownvalue.Null(),
2670+
}),
2671+
}),
2672+
}),
2673+
),
2674+
},
2675+
},
2676+
{
2677+
ConfigFile: config.TestNameFile("2.tf"),
2678+
ConfigVariables: configVariables,
2679+
ConfigPlanChecks: resource.ConfigPlanChecks{
2680+
PreApply: []plancheck.PlanCheck{
2681+
plancheck.ExpectResourceAction(
2682+
"cloudflare_ruleset.my_ruleset",
2683+
plancheck.ResourceActionReplace,
2684+
),
2685+
plancheck.ExpectKnownValue(
2686+
"cloudflare_ruleset.my_ruleset",
2687+
tfjsonpath.New("rules"),
2688+
knownvalue.ListExact([]knownvalue.Check{
2689+
knownvalue.ObjectPartial(map[string]knownvalue.Check{
2690+
"action": knownvalue.StringExact("redirect"),
2691+
"action_parameters": knownvalue.ObjectPartial(map[string]knownvalue.Check{
2692+
"from_list": knownvalue.Null(),
2693+
"from_value": knownvalue.ObjectExact(map[string]knownvalue.Check{
2694+
"preserve_query_string": knownvalue.Bool(false),
2695+
"status_code": knownvalue.Null(),
2696+
"target_url": knownvalue.ObjectExact(map[string]knownvalue.Check{
2697+
"value": knownvalue.StringExact("https://example.com"),
2698+
"expression": knownvalue.Null(),
2699+
}),
2700+
}),
2701+
}),
2702+
}),
2703+
}),
2704+
),
2705+
},
2706+
},
2707+
ConfigStateChecks: []statecheck.StateCheck{
2708+
statecheck.ExpectKnownValue(
2709+
"cloudflare_ruleset.my_ruleset",
2710+
tfjsonpath.New("rules"),
2711+
knownvalue.ListExact([]knownvalue.Check{
2712+
knownvalue.ObjectPartial(map[string]knownvalue.Check{
2713+
"action": knownvalue.StringExact("redirect"),
2714+
"action_parameters": knownvalue.ObjectPartial(map[string]knownvalue.Check{
2715+
"from_list": knownvalue.Null(),
2716+
"from_value": knownvalue.ObjectExact(map[string]knownvalue.Check{
2717+
"preserve_query_string": knownvalue.Bool(false),
2718+
"status_code": knownvalue.Null(),
2719+
"target_url": knownvalue.ObjectExact(map[string]knownvalue.Check{
2720+
"value": knownvalue.StringExact("https://example.com"),
2721+
"expression": knownvalue.Null(),
2722+
}),
2723+
}),
2724+
}),
2725+
}),
2726+
}),
2727+
),
2728+
},
2729+
},
2730+
{
2731+
ConfigFile: config.TestNameFile("3.tf"),
2732+
ConfigVariables: configVariables,
2733+
ConfigPlanChecks: resource.ConfigPlanChecks{
2734+
PreApply: []plancheck.PlanCheck{
2735+
plancheck.ExpectEmptyPlan(),
2736+
},
2737+
},
2738+
ConfigStateChecks: []statecheck.StateCheck{
2739+
statecheck.ExpectKnownValue(
2740+
"cloudflare_ruleset.my_ruleset",
2741+
tfjsonpath.New("rules"),
2742+
knownvalue.ListExact([]knownvalue.Check{
2743+
knownvalue.ObjectPartial(map[string]knownvalue.Check{
2744+
"action": knownvalue.StringExact("redirect"),
2745+
"action_parameters": knownvalue.ObjectPartial(map[string]knownvalue.Check{
2746+
"from_list": knownvalue.Null(),
2747+
"from_value": knownvalue.ObjectExact(map[string]knownvalue.Check{
2748+
"preserve_query_string": knownvalue.Bool(false),
2749+
"status_code": knownvalue.Null(),
2750+
"target_url": knownvalue.ObjectExact(map[string]knownvalue.Check{
2751+
"value": knownvalue.StringExact("https://example.com"),
2752+
"expression": knownvalue.Null(),
2753+
}),
2754+
}),
2755+
}),
2756+
}),
2757+
}),
2758+
),
2759+
},
2760+
},
2761+
{
2762+
ConfigFile: config.TestNameFile("4.tf"),
2763+
ConfigVariables: configVariables,
2764+
ConfigPlanChecks: resource.ConfigPlanChecks{
2765+
PreApply: []plancheck.PlanCheck{
2766+
plancheck.ExpectResourceAction(
2767+
"cloudflare_ruleset.my_ruleset",
2768+
plancheck.ResourceActionUpdate,
2769+
),
2770+
plancheck.ExpectKnownValue(
2771+
"cloudflare_ruleset.my_ruleset",
2772+
tfjsonpath.New("rules"),
2773+
knownvalue.ListExact([]knownvalue.Check{
2774+
knownvalue.ObjectPartial(map[string]knownvalue.Check{
2775+
"action": knownvalue.StringExact("redirect"),
2776+
"action_parameters": knownvalue.ObjectPartial(map[string]knownvalue.Check{
2777+
"from_list": knownvalue.Null(),
2778+
"from_value": knownvalue.ObjectExact(map[string]knownvalue.Check{
2779+
"preserve_query_string": knownvalue.Bool(true),
2780+
"status_code": knownvalue.Int64Exact(301),
2781+
"target_url": knownvalue.ObjectExact(map[string]knownvalue.Check{
2782+
"value": knownvalue.Null(),
2783+
"expression": knownvalue.StringExact("concat(\"https://m.example.com\", http.request.uri.path)"),
2784+
}),
2785+
}),
2786+
}),
2787+
}),
2788+
}),
2789+
),
2790+
},
2791+
},
2792+
ConfigStateChecks: []statecheck.StateCheck{
2793+
statecheck.ExpectKnownValue(
2794+
"cloudflare_ruleset.my_ruleset",
2795+
tfjsonpath.New("rules"),
2796+
knownvalue.ListExact([]knownvalue.Check{
2797+
knownvalue.ObjectPartial(map[string]knownvalue.Check{
2798+
"action": knownvalue.StringExact("redirect"),
2799+
"action_parameters": knownvalue.ObjectPartial(map[string]knownvalue.Check{
2800+
"from_list": knownvalue.Null(),
2801+
"from_value": knownvalue.ObjectExact(map[string]knownvalue.Check{
2802+
"preserve_query_string": knownvalue.Bool(true),
2803+
"status_code": knownvalue.Int64Exact(301),
2804+
"target_url": knownvalue.ObjectExact(map[string]knownvalue.Check{
2805+
"value": knownvalue.Null(),
2806+
"expression": knownvalue.StringExact("concat(\"https://m.example.com\", http.request.uri.path)"),
2807+
}),
2808+
}),
2809+
}),
2810+
}),
2811+
}),
2812+
),
2813+
},
2814+
},
2815+
},
2816+
})
2817+
}

internal/services/ruleset/schema.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -320,11 +320,11 @@ func ResourceSchema(ctx context.Context) schema.Schema {
320320
Attributes: map[string]schema.Attribute{
321321
"key": schema.StringAttribute{
322322
Description: "Expression that evaluates to the list lookup key.",
323-
Optional: true,
323+
Required: true,
324324
},
325325
"name": schema.StringAttribute{
326326
Description: "The name of the list to match against.",
327-
Optional: true,
327+
Required: true,
328328
},
329329
},
330330
},
@@ -335,13 +335,15 @@ func ResourceSchema(ctx context.Context) schema.Schema {
335335
Attributes: map[string]schema.Attribute{
336336
"preserve_query_string": schema.BoolAttribute{
337337
Description: "Keep the query string of the original request.",
338+
Computed: true,
338339
Optional: true,
340+
Default: booldefault.StaticBool(false),
339341
},
340-
"status_code": schema.Float64Attribute{
342+
"status_code": schema.Int64Attribute{
341343
Description: "The status code to be used for the redirect.\nAvailable values: 301, 302, 303, 307, 308.",
342344
Optional: true,
343-
Validators: []validator.Float64{
344-
float64validator.OneOf(
345+
Validators: []validator.Int64{
346+
int64validator.OneOf(
345347
301,
346348
302,
347349
303,
@@ -352,7 +354,7 @@ func ResourceSchema(ctx context.Context) schema.Schema {
352354
},
353355
"target_url": schema.SingleNestedAttribute{
354356
Description: "The URL to redirect the request to.",
355-
Optional: true,
357+
Required: true,
356358
CustomType: customfield.NewNestedObjectType[RulesetRulesActionParametersFromValueTargetURLModel](ctx),
357359
Attributes: map[string]schema.Attribute{
358360
"value": schema.StringAttribute{
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
variable "account_id" {}
2+
3+
resource "cloudflare_list" "my_list" {
4+
account_id = var.account_id
5+
kind = "redirect"
6+
name = "my_list"
7+
}
8+
9+
resource "cloudflare_ruleset" "my_ruleset" {
10+
account_id = var.account_id
11+
name = "My ruleset"
12+
phase = "http_request_redirect"
13+
kind = "root"
14+
rules = [
15+
{
16+
expression = "ip.src eq 1.1.1.1"
17+
action = "redirect"
18+
action_parameters = {
19+
from_list = {
20+
key = "http.request.full_uri"
21+
name = "my_list"
22+
}
23+
}
24+
}
25+
]
26+
depends_on = ["cloudflare_list.my_list"]
27+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
variable "zone_id" {}
2+
3+
resource "cloudflare_ruleset" "my_ruleset" {
4+
zone_id = var.zone_id
5+
name = "My ruleset"
6+
phase = "http_request_dynamic_redirect"
7+
kind = "zone"
8+
rules = [
9+
{
10+
expression = "ip.src eq 1.1.1.1"
11+
action = "redirect"
12+
action_parameters = {
13+
from_value = {
14+
target_url = {
15+
value = "https://example.com"
16+
}
17+
}
18+
}
19+
}
20+
]
21+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
variable "zone_id" {}
2+
3+
resource "cloudflare_ruleset" "my_ruleset" {
4+
zone_id = var.zone_id
5+
name = "My ruleset"
6+
phase = "http_request_dynamic_redirect"
7+
kind = "zone"
8+
rules = [
9+
{
10+
expression = "ip.src eq 1.1.1.1"
11+
action = "redirect"
12+
action_parameters = {
13+
from_value = {
14+
preserve_query_string = false
15+
target_url = {
16+
value = "https://example.com"
17+
}
18+
}
19+
}
20+
}
21+
]
22+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
variable "zone_id" {}
2+
3+
resource "cloudflare_ruleset" "my_ruleset" {
4+
zone_id = var.zone_id
5+
name = "My ruleset"
6+
phase = "http_request_dynamic_redirect"
7+
kind = "zone"
8+
rules = [
9+
{
10+
expression = "ip.src eq 1.1.1.1"
11+
action = "redirect"
12+
action_parameters = {
13+
from_value = {
14+
preserve_query_string = true
15+
status_code = 301
16+
target_url = {
17+
expression = "concat(\"https://m.example.com\", http.request.uri.path)"
18+
}
19+
}
20+
}
21+
}
22+
]
23+
}

0 commit comments

Comments
 (0)