Skip to content

Commit f92cf12

Browse files
authored
Merge pull request #4707 from kersten/chore/resource-tests-use-beforeeach
🌱 (chore): refactor unit tests to isolate mutable state with BeforeEach in resource-related tests
2 parents 4ecaa69 + 0d31fb2 commit f92cf12

File tree

4 files changed

+139
-66
lines changed

4 files changed

+139
-66
lines changed

pkg/model/resource/api_test.go

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -116,24 +116,32 @@ var _ = Describe("API", func() {
116116

117117
Context("IsEmpty", func() {
118118
var (
119-
none = API{}
119+
none API
120+
cluster API
121+
namespaced API
122+
)
123+
124+
BeforeEach(func() {
125+
none = API{}
120126
cluster = API{
121127
CRDVersion: v1,
122128
}
123129
namespaced = API{
124130
CRDVersion: v1,
125131
Namespaced: true,
126132
}
127-
)
133+
})
128134

129135
It("should return true fo an empty object", func() {
130136
Expect(none.IsEmpty()).To(BeTrue())
131137
})
132138

133139
DescribeTable("should return false for non-empty objects",
134-
func(api API) { Expect(api.IsEmpty()).To(BeFalse()) },
135-
Entry("cluster-scope", cluster),
136-
Entry("namespace-scope", namespaced),
140+
func(getAPI func() API) {
141+
Expect(getAPI().IsEmpty()).To(BeFalse())
142+
},
143+
Entry("cluster-scope", func() API { return cluster }),
144+
Entry("namespace-scope", func() API { return namespaced }),
137145
)
138146
})
139147
})

pkg/model/resource/gvk_test.go

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,21 @@ var _ = Describe("GVK", func() {
3232
internalVersion = "__internal"
3333
)
3434

35-
gvk := GVK{Group: group, Domain: domain, Version: version, Kind: kind}
35+
var gvk GVK
36+
37+
BeforeEach(func() {
38+
gvk = GVK{Group: group, Domain: domain, Version: version, Kind: kind}
39+
})
3640

3741
Context("Validate", func() {
3842
DescribeTable("should pass valid GVKs",
39-
func(gvk GVK) { Expect(gvk.Validate()).To(Succeed()) },
40-
Entry("Standard GVK", gvk),
41-
Entry("Version (__internal)", GVK{Group: group, Domain: domain, Version: internalVersion, Kind: kind}),
43+
func(get func() GVK) {
44+
Expect(get().Validate()).To(Succeed())
45+
},
46+
Entry("Standard GVK", func() GVK { return gvk }),
47+
Entry("Version (__internal)", func() GVK {
48+
return GVK{Group: group, Domain: domain, Version: internalVersion, Kind: kind}
49+
}),
4250
)
4351

4452
DescribeTable("should fail for invalid GVKs",
@@ -68,10 +76,16 @@ var _ = Describe("GVK", func() {
6876

6977
Context("QualifiedGroup", func() {
7078
DescribeTable("should return the correct string",
71-
func(gvk GVK, qualifiedGroup string) { Expect(gvk.QualifiedGroup()).To(Equal(qualifiedGroup)) },
72-
Entry("fully qualified resource", gvk, group+"."+domain),
73-
Entry("empty group name", GVK{Domain: domain, Version: version, Kind: kind}, domain),
74-
Entry("empty domain", GVK{Group: group, Version: version, Kind: kind}, group),
79+
func(get func() GVK, qualifiedGroup string) {
80+
Expect(get().QualifiedGroup()).To(Equal(qualifiedGroup))
81+
},
82+
Entry("fully qualified resource", func() GVK { return gvk }, group+"."+domain),
83+
Entry("empty group name", func() GVK {
84+
return GVK{Domain: domain, Version: version, Kind: kind}
85+
}, domain),
86+
Entry("empty domain", func() GVK {
87+
return GVK{Group: group, Version: version, Kind: kind}
88+
}, group),
7589
)
7690
})
7791

@@ -81,11 +95,21 @@ var _ = Describe("GVK", func() {
8195
})
8296

8397
DescribeTable("should return false for different resources",
84-
func(other GVK) { Expect(gvk.IsEqualTo(other)).To(BeFalse()) },
85-
Entry("different kind", GVK{Group: group, Domain: domain, Version: version, Kind: "Kind2"}),
86-
Entry("different version", GVK{Group: group, Domain: domain, Version: "v2", Kind: kind}),
87-
Entry("different domain", GVK{Group: group, Domain: "other.domain", Version: version, Kind: kind}),
88-
Entry("different group", GVK{Group: "group2", Domain: domain, Version: version, Kind: kind}),
98+
func(get func() GVK) {
99+
Expect(gvk.IsEqualTo(get())).To(BeFalse())
100+
},
101+
Entry("different kind", func() GVK {
102+
return GVK{Group: group, Domain: domain, Version: version, Kind: "Kind2"}
103+
}),
104+
Entry("different version", func() GVK {
105+
return GVK{Group: group, Domain: domain, Version: "v2", Kind: kind}
106+
}),
107+
Entry("different domain", func() GVK {
108+
return GVK{Group: group, Domain: "other.domain", Version: version, Kind: kind}
109+
}),
110+
Entry("different group", func() GVK {
111+
return GVK{Group: "group2", Domain: domain, Version: version, Kind: kind}
112+
}),
89113
)
90114
})
91115
})

pkg/model/resource/resource_test.go

Lines changed: 64 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ limitations under the License.
1717
package resource
1818

1919
import (
20+
"strings"
21+
2022
. "github.com/onsi/ginkgo/v2"
2123
. "github.com/onsi/gomega"
2224
)
@@ -32,6 +34,11 @@ var _ = Describe("Resource", func() {
3234
)
3335

3436
var (
37+
gvk GVK
38+
res Resource
39+
)
40+
41+
BeforeEach(func() {
3542
gvk = GVK{
3643
Group: group,
3744
Domain: domain,
@@ -42,7 +49,7 @@ var _ = Describe("Resource", func() {
4249
GVK: gvk,
4350
Plural: plural,
4451
}
45-
)
52+
})
4653

4754
Context("Validate", func() {
4855
It("should succeed for a valid Resource", func() {
@@ -69,6 +76,13 @@ var _ = Describe("Resource", func() {
6976
)
7077

7178
var (
79+
resNoGroup Resource
80+
resNoDomain Resource
81+
resHyphenGroup Resource
82+
resDotGroup Resource
83+
)
84+
85+
BeforeEach(func() {
7286
resNoGroup = Resource{
7387
GVK: GVK{
7488
// Empty group
@@ -101,24 +115,28 @@ var _ = Describe("Resource", func() {
101115
Kind: kind,
102116
},
103117
}
104-
)
118+
})
105119

106120
DescribeTable("PackageName should return the correct string",
107-
func(res Resource, packageName string) { Expect(res.PackageName()).To(Equal(packageName)) },
108-
Entry("fully qualified resource", res, group),
109-
Entry("empty group name", resNoGroup, safeDomain),
110-
Entry("empty domain", resNoDomain, group),
111-
Entry("hyphen-containing group", resHyphenGroup, safeGroup),
112-
Entry("dot-containing group", resDotGroup, safeGroup),
121+
func(getRes func() Resource, expected string) {
122+
Expect(getRes().PackageName()).To(Equal(expected))
123+
},
124+
Entry("fully qualified resource", func() Resource { return res }, group),
125+
Entry("empty group name", func() Resource { return resNoGroup }, safeDomain),
126+
Entry("empty domain", func() Resource { return resNoDomain }, group),
127+
Entry("hyphen-containing group", func() Resource { return resHyphenGroup }, safeGroup),
128+
Entry("dot-containing group", func() Resource { return resDotGroup }, safeGroup),
113129
)
114130

115131
DescribeTable("ImportAlias",
116-
func(res Resource, importAlias string) { Expect(res.ImportAlias()).To(Equal(importAlias)) },
117-
Entry("fully qualified resource", res, groupVersion),
118-
Entry("empty group name", resNoGroup, domainVersion),
119-
Entry("empty domain", resNoDomain, groupVersion),
120-
Entry("hyphen-containing group", resHyphenGroup, safeAlias),
121-
Entry("dot-containing group", resDotGroup, safeAlias),
132+
func(getRes func() Resource, expected string) {
133+
Expect(getRes().ImportAlias()).To(Equal(expected))
134+
},
135+
Entry("fully qualified resource", func() Resource { return res }, groupVersion),
136+
Entry("empty group name", func() Resource { return resNoGroup }, domainVersion),
137+
Entry("empty domain", func() Resource { return resNoDomain }, groupVersion),
138+
Entry("hyphen-containing group", func() Resource { return resHyphenGroup }, safeAlias),
139+
Entry("dot-containing group", func() Resource { return resDotGroup }, safeAlias),
122140
)
123141
})
124142

@@ -199,22 +217,24 @@ var _ = Describe("Resource", func() {
199217
webhookVersion = "v1"
200218
)
201219

202-
res = Resource{
203-
GVK: gvk,
204-
Plural: plural,
205-
Path: path,
206-
API: &API{
207-
CRDVersion: crdVersion,
208-
Namespaced: true,
209-
},
210-
Controller: true,
211-
Webhooks: &Webhooks{
212-
WebhookVersion: webhookVersion,
213-
Defaulting: true,
214-
Validation: true,
215-
Conversion: true,
216-
},
217-
}
220+
BeforeEach(func() {
221+
res = Resource{
222+
GVK: gvk,
223+
Plural: plural,
224+
Path: path,
225+
API: &API{
226+
CRDVersion: crdVersion,
227+
Namespaced: true,
228+
},
229+
Controller: true,
230+
Webhooks: &Webhooks{
231+
WebhookVersion: webhookVersion,
232+
Defaulting: true,
233+
Validation: true,
234+
Conversion: true,
235+
},
236+
}
237+
})
218238

219239
It("should return an exact copy", func() {
220240
other := res.Copy()
@@ -423,16 +443,22 @@ var _ = Describe("Resource", func() {
423443
})
424444

425445
Context("Replacer", func() {
426-
replacer := res.Replacer()
446+
var replacer *strings.Replacer
447+
448+
BeforeEach(func() {
449+
replacer = res.Replacer()
450+
})
427451

428452
DescribeTable("should replace the following strings",
429-
func(pattern, result string) { Expect(replacer.Replace(pattern)).To(Equal(result)) },
430-
Entry("no pattern", "version", "version"),
431-
Entry("pattern `%[group]`", "%[group]", res.Group),
432-
Entry("pattern `%[version]`", "%[version]", res.Version),
433-
Entry("pattern `%[kind]`", "%[kind]", "kind"),
434-
Entry("pattern `%[plural]`", "%[plural]", res.Plural),
435-
Entry("pattern `%[package-name]`", "%[package-name]", res.PackageName()),
453+
func(pattern string, expected func() string) {
454+
Expect(replacer.Replace(pattern)).To(Equal(expected()))
455+
},
456+
Entry("no pattern", "version", func() string { return "version" }),
457+
Entry("pattern `%[group]`", "%[group]", func() string { return res.Group }),
458+
Entry("pattern `%[version]`", "%[version]", func() string { return res.Version }),
459+
Entry("pattern `%[kind]`", "%[kind]", func() string { return "kind" }),
460+
Entry("pattern `%[plural]`", "%[plural]", func() string { return res.Plural }),
461+
Entry("pattern `%[package-name]`", "%[package-name]", func() string { return res.PackageName() }),
436462
)
437463
})
438464
})

pkg/model/resource/webhooks_test.go

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,20 @@ var _ = Describe("Webhooks", func() {
195195

196196
Context("IsEmpty", func() {
197197
var (
198-
none = Webhooks{}
198+
none Webhooks
199+
defaulting Webhooks
200+
validation Webhooks
201+
conversion Webhooks
202+
203+
defaultingAndValidation Webhooks
204+
defaultingAndConversion Webhooks
205+
validationAndConversion Webhooks
206+
207+
all Webhooks
208+
)
209+
210+
BeforeEach(func() {
211+
none = Webhooks{}
199212
defaulting = Webhooks{
200213
WebhookVersion: "v1",
201214
Defaulting: true,
@@ -238,21 +251,23 @@ var _ = Describe("Webhooks", func() {
238251
Validation: true,
239252
Conversion: true,
240253
}
241-
)
254+
})
242255

243256
It("should return true fo an empty object", func() {
244257
Expect(none.IsEmpty()).To(BeTrue())
245258
})
246259

247260
DescribeTable("should return false for non-empty objects",
248-
func(webhooks Webhooks) { Expect(webhooks.IsEmpty()).To(BeFalse()) },
249-
Entry("defaulting", defaulting),
250-
Entry("validation", validation),
251-
Entry("conversion", conversion),
252-
Entry("defaulting and validation", defaultingAndValidation),
253-
Entry("defaulting and conversion", defaultingAndConversion),
254-
Entry("validation and conversion", validationAndConversion),
255-
Entry("defaulting and validation and conversion", all),
261+
func(get func() Webhooks) {
262+
Expect(get().IsEmpty()).To(BeFalse())
263+
},
264+
Entry("defaulting", func() Webhooks { return defaulting }),
265+
Entry("validation", func() Webhooks { return validation }),
266+
Entry("conversion", func() Webhooks { return conversion }),
267+
Entry("defaulting and validation", func() Webhooks { return defaultingAndValidation }),
268+
Entry("defaulting and conversion", func() Webhooks { return defaultingAndConversion }),
269+
Entry("validation and conversion", func() Webhooks { return validationAndConversion }),
270+
Entry("defaulting and validation and conversion", func() Webhooks { return all }),
256271
)
257272
})
258273
})

0 commit comments

Comments
 (0)