Skip to content

Commit 1832dfc

Browse files
authored
Merge pull request #5878 from zakcutner/ruleset/top-level
Add tests for top-level `cloudflare_ruleset` resource attributes
2 parents d886aa8 + 63b6155 commit 1832dfc

File tree

11 files changed

+285
-4
lines changed

11 files changed

+285
-4
lines changed

internal/services/ruleset/resource.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,11 @@ func (r *RulesetResource) ModifyPlan(ctx context.Context, req resource.ModifyPla
304304
return
305305
}
306306

307+
// Do nothing if there is no rules attribute in the state or the plan.
308+
if state.Rules.IsNullOrUnknown() || plan.Rules.IsNullOrUnknown() {
309+
return
310+
}
311+
307312
rulesByRef := make(map[string]*RulesetRulesModel)
308313

309314
stateRules, diags := state.Rules.AsStructSliceT(ctx)

internal/services/ruleset/resource_test.go

Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,210 @@ var configVariables = config.Variables{
1818
"zone_id": config.StringVariable(os.Getenv("CLOUDFLARE_ZONE_ID")),
1919
}
2020

21+
func TestAccCloudflareRuleset_Name(t *testing.T) {
22+
resource.Test(t, resource.TestCase{
23+
PreCheck: func() { acctest.TestAccPreCheck(t) },
24+
ProtoV6ProviderFactories: acctest.TestAccProtoV6ProviderFactories,
25+
Steps: []resource.TestStep{
26+
{
27+
ConfigFile: config.TestNameFile("before.tf"),
28+
ConfigVariables: configVariables,
29+
ConfigPlanChecks: resource.ConfigPlanChecks{
30+
PreApply: []plancheck.PlanCheck{
31+
plancheck.ExpectResourceAction("cloudflare_ruleset.my_ruleset", plancheck.ResourceActionCreate),
32+
plancheck.ExpectKnownValue(
33+
"cloudflare_ruleset.my_ruleset",
34+
tfjsonpath.New("name"),
35+
knownvalue.StringExact("My ruleset"),
36+
),
37+
},
38+
},
39+
ConfigStateChecks: []statecheck.StateCheck{
40+
statecheck.ExpectKnownValue(
41+
"cloudflare_ruleset.my_ruleset",
42+
tfjsonpath.New("name"),
43+
knownvalue.StringExact("My ruleset"),
44+
),
45+
},
46+
},
47+
{
48+
ConfigFile: config.TestNameFile("after.tf"),
49+
ConfigVariables: configVariables,
50+
ConfigPlanChecks: resource.ConfigPlanChecks{
51+
PreApply: []plancheck.PlanCheck{
52+
plancheck.ExpectResourceAction("cloudflare_ruleset.my_ruleset", plancheck.ResourceActionReplace),
53+
plancheck.ExpectKnownValue(
54+
"cloudflare_ruleset.my_ruleset",
55+
tfjsonpath.New("name"),
56+
knownvalue.StringExact("My updated ruleset"),
57+
),
58+
},
59+
},
60+
ConfigStateChecks: []statecheck.StateCheck{
61+
statecheck.ExpectKnownValue(
62+
"cloudflare_ruleset.my_ruleset",
63+
tfjsonpath.New("name"),
64+
knownvalue.StringExact("My updated ruleset"),
65+
),
66+
},
67+
},
68+
},
69+
})
70+
}
71+
72+
func TestAccCloudflareRuleset_Description(t *testing.T) {
73+
resource.Test(t, resource.TestCase{
74+
PreCheck: func() { acctest.TestAccPreCheck(t) },
75+
ProtoV6ProviderFactories: acctest.TestAccProtoV6ProviderFactories,
76+
Steps: []resource.TestStep{
77+
{
78+
ConfigFile: config.TestNameFile("before.tf"),
79+
ConfigVariables: configVariables,
80+
ConfigPlanChecks: resource.ConfigPlanChecks{
81+
PreApply: []plancheck.PlanCheck{
82+
plancheck.ExpectResourceAction("cloudflare_ruleset.my_ruleset", plancheck.ResourceActionCreate),
83+
plancheck.ExpectKnownValue(
84+
"cloudflare_ruleset.my_ruleset",
85+
tfjsonpath.New("description"),
86+
knownvalue.StringExact("My ruleset description"),
87+
),
88+
},
89+
},
90+
ConfigStateChecks: []statecheck.StateCheck{
91+
statecheck.ExpectKnownValue(
92+
"cloudflare_ruleset.my_ruleset",
93+
tfjsonpath.New("description"),
94+
knownvalue.StringExact("My ruleset description"),
95+
),
96+
},
97+
},
98+
{
99+
ConfigFile: config.TestNameFile("after.tf"),
100+
ConfigVariables: configVariables,
101+
ConfigPlanChecks: resource.ConfigPlanChecks{
102+
PreApply: []plancheck.PlanCheck{
103+
plancheck.ExpectResourceAction("cloudflare_ruleset.my_ruleset", plancheck.ResourceActionUpdate),
104+
plancheck.ExpectKnownValue(
105+
"cloudflare_ruleset.my_ruleset",
106+
tfjsonpath.New("name"),
107+
knownvalue.StringExact("My updated ruleset description"),
108+
),
109+
},
110+
},
111+
ConfigStateChecks: []statecheck.StateCheck{
112+
statecheck.ExpectKnownValue(
113+
"cloudflare_ruleset.my_ruleset",
114+
tfjsonpath.New("name"),
115+
knownvalue.StringExact("My updated ruleset"),
116+
),
117+
},
118+
},
119+
},
120+
})
121+
}
122+
123+
func TestAccCloudflareRuleset_Phase(t *testing.T) {
124+
resource.Test(t, resource.TestCase{
125+
PreCheck: func() { acctest.TestAccPreCheck(t) },
126+
ProtoV6ProviderFactories: acctest.TestAccProtoV6ProviderFactories,
127+
Steps: []resource.TestStep{
128+
{
129+
ConfigFile: config.TestNameFile("before.tf"),
130+
ConfigVariables: configVariables,
131+
ConfigPlanChecks: resource.ConfigPlanChecks{
132+
PreApply: []plancheck.PlanCheck{
133+
plancheck.ExpectResourceAction("cloudflare_ruleset.my_ruleset", plancheck.ResourceActionCreate),
134+
plancheck.ExpectKnownValue(
135+
"cloudflare_ruleset.my_ruleset",
136+
tfjsonpath.New("phase"),
137+
knownvalue.StringExact("http_request_firewall_custom"),
138+
),
139+
},
140+
},
141+
ConfigStateChecks: []statecheck.StateCheck{
142+
statecheck.ExpectKnownValue(
143+
"cloudflare_ruleset.my_ruleset",
144+
tfjsonpath.New("phase"),
145+
knownvalue.StringExact("http_request_firewall_custom"),
146+
),
147+
},
148+
},
149+
{
150+
ConfigFile: config.TestNameFile("after.tf"),
151+
ConfigVariables: configVariables,
152+
ConfigPlanChecks: resource.ConfigPlanChecks{
153+
PreApply: []plancheck.PlanCheck{
154+
plancheck.ExpectResourceAction("cloudflare_ruleset.my_ruleset", plancheck.ResourceActionReplace),
155+
plancheck.ExpectKnownValue(
156+
"cloudflare_ruleset.my_ruleset",
157+
tfjsonpath.New("phase"),
158+
knownvalue.StringExact("http_request_firewall_managed"),
159+
),
160+
},
161+
},
162+
ConfigStateChecks: []statecheck.StateCheck{
163+
statecheck.ExpectKnownValue(
164+
"cloudflare_ruleset.my_ruleset",
165+
tfjsonpath.New("phase"),
166+
knownvalue.StringExact("http_request_firewall_managed"),
167+
),
168+
},
169+
},
170+
},
171+
})
172+
}
173+
174+
func TestAccCloudflareRuleset_Kind(t *testing.T) {
175+
resource.Test(t, resource.TestCase{
176+
PreCheck: func() { acctest.TestAccPreCheck(t) },
177+
ProtoV6ProviderFactories: acctest.TestAccProtoV6ProviderFactories,
178+
Steps: []resource.TestStep{
179+
{
180+
ConfigFile: config.TestNameFile("before.tf"),
181+
ConfigVariables: configVariables,
182+
ConfigPlanChecks: resource.ConfigPlanChecks{
183+
PreApply: []plancheck.PlanCheck{
184+
plancheck.ExpectResourceAction("cloudflare_ruleset.my_ruleset", plancheck.ResourceActionCreate),
185+
plancheck.ExpectKnownValue(
186+
"cloudflare_ruleset.my_ruleset",
187+
tfjsonpath.New("kind"),
188+
knownvalue.StringExact("root"),
189+
),
190+
},
191+
},
192+
ConfigStateChecks: []statecheck.StateCheck{
193+
statecheck.ExpectKnownValue(
194+
"cloudflare_ruleset.my_ruleset",
195+
tfjsonpath.New("kind"),
196+
knownvalue.StringExact("root"),
197+
),
198+
},
199+
},
200+
{
201+
ConfigFile: config.TestNameFile("after.tf"),
202+
ConfigVariables: configVariables,
203+
ConfigPlanChecks: resource.ConfigPlanChecks{
204+
PreApply: []plancheck.PlanCheck{
205+
plancheck.ExpectResourceAction("cloudflare_ruleset.my_ruleset", plancheck.ResourceActionReplace),
206+
plancheck.ExpectKnownValue(
207+
"cloudflare_ruleset.my_ruleset",
208+
tfjsonpath.New("kind"),
209+
knownvalue.StringExact("custom"),
210+
),
211+
},
212+
},
213+
ConfigStateChecks: []statecheck.StateCheck{
214+
statecheck.ExpectKnownValue(
215+
"cloudflare_ruleset.my_ruleset",
216+
tfjsonpath.New("kind"),
217+
knownvalue.StringExact("custom"),
218+
),
219+
},
220+
},
221+
},
222+
})
223+
}
224+
21225
func TestAccCloudflareRuleset_RuleLogging(t *testing.T) {
22226
resource.Test(t, resource.TestCase{
23227
PreCheck: func() { acctest.TestAccPreCheck(t) },

internal/services/ruleset/schema.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,19 @@ func ResourceSchema(ctx context.Context) schema.Schema {
3434
PlanModifiers: []planmodifier.String{stringplanmodifier.UseStateForUnknown()},
3535
},
3636
"account_id": schema.StringAttribute{
37-
Description: "The Account ID to use for this endpoint. Mutually exclusive with the Zone ID.",
38-
Optional: true,
37+
Description: "The unique ID of the account.",
38+
Optional: true,
39+
Validators: []validator.String{
40+
stringvalidator.ConflictsWith(path.MatchRoot("zone_id")),
41+
},
3942
PlanModifiers: []planmodifier.String{stringplanmodifier.RequiresReplace()},
4043
},
4144
"zone_id": schema.StringAttribute{
42-
Description: "The Zone ID to use for this endpoint. Mutually exclusive with the Account ID.",
43-
Optional: true,
45+
Description: "The unique ID of the zone.",
46+
Optional: true,
47+
Validators: []validator.String{
48+
stringvalidator.ConflictsWith(path.MatchRoot("account_id")),
49+
},
4450
PlanModifiers: []planmodifier.String{stringplanmodifier.RequiresReplace()},
4551
},
4652
"kind": schema.StringAttribute{
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
variable "zone_id" {}
2+
3+
resource "cloudflare_ruleset" "my_ruleset" {
4+
zone_id = var.zone_id
5+
name = "My ruleset"
6+
description = "My updated ruleset description"
7+
phase = "http_request_firewall_custom"
8+
kind = "zone"
9+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
variable "zone_id" {}
2+
3+
resource "cloudflare_ruleset" "my_ruleset" {
4+
zone_id = var.zone_id
5+
name = "My ruleset"
6+
description = "My ruleset description"
7+
phase = "http_request_firewall_custom"
8+
kind = "zone"
9+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
variable "account_id" {}
2+
3+
resource "cloudflare_ruleset" "my_ruleset" {
4+
account_id = var.account_id
5+
name = "My ruleset"
6+
phase = "http_request_firewall_custom"
7+
kind = "custom"
8+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
variable "account_id" {}
2+
3+
resource "cloudflare_ruleset" "my_ruleset" {
4+
account_id = var.account_id
5+
name = "My ruleset"
6+
phase = "http_request_firewall_custom"
7+
kind = "root"
8+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
variable "zone_id" {}
2+
3+
resource "cloudflare_ruleset" "my_ruleset" {
4+
zone_id = var.zone_id
5+
name = "My updated ruleset"
6+
phase = "http_request_firewall_custom"
7+
kind = "zone"
8+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
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_firewall_custom"
7+
kind = "zone"
8+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
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_firewall_managed"
7+
kind = "zone"
8+
}

0 commit comments

Comments
 (0)