Skip to content

Commit f349d96

Browse files
authored
Merge pull request #1281 from vincepri/fake-client-builder
✨ Add fake.NewClientBuilder to build new fake clients
2 parents 2879800 + d915eb1 commit f349d96

File tree

3 files changed

+77
-11
lines changed

3 files changed

+77
-11
lines changed

pkg/client/fake/client.go

+67-7
Original file line numberDiff line numberDiff line change
@@ -59,24 +59,84 @@ const (
5959

6060
// NewFakeClient creates a new fake client for testing.
6161
// You can choose to initialize it with a slice of runtime.Object.
62+
//
63+
// Deprecated: Please use NewClientBuilder instead.
6264
func NewFakeClient(initObjs ...runtime.Object) client.Client {
63-
return NewFakeClientWithScheme(scheme.Scheme, initObjs...)
65+
return NewClientBuilder().WithRuntimeObjects(initObjs...).Build()
6466
}
6567

6668
// NewFakeClientWithScheme creates a new fake client with the given scheme
6769
// for testing.
6870
// You can choose to initialize it with a slice of runtime.Object.
71+
//
72+
// Deprecated: Please use NewClientBuilder instead.
6973
func NewFakeClientWithScheme(clientScheme *runtime.Scheme, initObjs ...runtime.Object) client.Client {
70-
tracker := testing.NewObjectTracker(clientScheme, scheme.Codecs.UniversalDecoder())
71-
for _, obj := range initObjs {
72-
err := tracker.Add(obj)
73-
if err != nil {
74+
return NewClientBuilder().WithScheme(clientScheme).WithRuntimeObjects(initObjs...).Build()
75+
}
76+
77+
// NewClientBuilder returns a new builder to create a fake client.
78+
func NewClientBuilder() *ClientBuilder {
79+
return &ClientBuilder{}
80+
}
81+
82+
// ClientBuilder builds a fake client.
83+
type ClientBuilder struct {
84+
scheme *runtime.Scheme
85+
initObject []client.Object
86+
initLists []client.ObjectList
87+
initRuntimeObjects []runtime.Object
88+
}
89+
90+
// WithScheme sets this builder's internal scheme.
91+
// If not set, defaults to client-go's global scheme.Scheme.
92+
func (f *ClientBuilder) WithScheme(scheme *runtime.Scheme) *ClientBuilder {
93+
f.scheme = scheme
94+
return f
95+
}
96+
97+
// WithObjects can be optionally used to initialize this fake client with client.Object(s).
98+
func (f *ClientBuilder) WithObjects(initObjs ...client.Object) *ClientBuilder {
99+
f.initObject = append(f.initObject, initObjs...)
100+
return f
101+
}
102+
103+
// WithLists can be optionally used to initialize this fake client with client.ObjectList(s).
104+
func (f *ClientBuilder) WithLists(initLists ...client.ObjectList) *ClientBuilder {
105+
f.initLists = append(f.initLists, initLists...)
106+
return f
107+
}
108+
109+
// WithRuntimeObjects can be optionally used to initialize this fake client with runtime.Object(s).
110+
func (f *ClientBuilder) WithRuntimeObjects(initRuntimeObjs ...runtime.Object) *ClientBuilder {
111+
f.initRuntimeObjects = append(f.initRuntimeObjects, initRuntimeObjs...)
112+
return f
113+
}
114+
115+
// Build builds and returns a new fake client.
116+
func (f *ClientBuilder) Build() client.Client {
117+
if f.scheme == nil {
118+
f.scheme = scheme.Scheme
119+
}
120+
121+
tracker := testing.NewObjectTracker(f.scheme, scheme.Codecs.UniversalDecoder())
122+
for _, obj := range f.initObject {
123+
if err := tracker.Add(obj); err != nil {
74124
panic(fmt.Errorf("failed to add object %v to fake client: %w", obj, err))
75125
}
76126
}
127+
for _, obj := range f.initLists {
128+
if err := tracker.Add(obj); err != nil {
129+
panic(fmt.Errorf("failed to add list %v to fake client: %w", obj, err))
130+
}
131+
}
132+
for _, obj := range f.initRuntimeObjects {
133+
if err := tracker.Add(obj); err != nil {
134+
panic(fmt.Errorf("failed to add runtime object %v to fake client: %w", obj, err))
135+
}
136+
}
77137
return &fakeClient{
78-
tracker: versionedTracker{ObjectTracker: tracker, scheme: clientScheme},
79-
scheme: clientScheme,
138+
tracker: versionedTracker{ObjectTracker: tracker, scheme: f.scheme},
139+
scheme: f.scheme,
80140
}
81141
}
82142

pkg/client/fake/client_test.go

+8-2
Original file line numberDiff line numberDiff line change
@@ -529,7 +529,9 @@ var _ = Describe("Fake client", func() {
529529

530530
Context("with default scheme.Scheme", func() {
531531
BeforeEach(func(done Done) {
532-
cl = NewFakeClient(dep, dep2, cm)
532+
cl = NewClientBuilder().
533+
WithObjects(dep, dep2, cm).
534+
Build()
533535
close(done)
534536
})
535537
AssertClientBehavior()
@@ -541,7 +543,11 @@ var _ = Describe("Fake client", func() {
541543
Expect(corev1.AddToScheme(scheme)).To(Succeed())
542544
Expect(appsv1.AddToScheme(scheme)).To(Succeed())
543545
Expect(coordinationv1.AddToScheme(scheme)).To(Succeed())
544-
cl = NewFakeClientWithScheme(scheme, &appsv1.DeploymentList{Items: []appsv1.Deployment{*dep, *dep2}}, cm)
546+
cl = NewClientBuilder().
547+
WithScheme(scheme).
548+
WithObjects(cm).
549+
WithLists(&appsv1.DeploymentList{Items: []appsv1.Deployment{*dep, *dep2}}).
550+
Build()
545551
close(done)
546552
})
547553
AssertClientBehavior()

pkg/runtime/inject/inject_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ var _ = Describe("runtime inject", func() {
8787
})
8888

8989
It("should set client", func() {
90-
client, err := client.NewDelegatingClient(client.NewDelegatingClientInput{Client: fake.NewFakeClient()})
90+
client, err := client.NewDelegatingClient(client.NewDelegatingClientInput{Client: fake.NewClientBuilder().Build()})
9191
Expect(err).NotTo(HaveOccurred())
9292

9393
By("Validating injecting client")
@@ -153,7 +153,7 @@ var _ = Describe("runtime inject", func() {
153153
})
154154

155155
It("should set api reader", func() {
156-
apiReader, err := client.NewDelegatingClient(client.NewDelegatingClientInput{Client: fake.NewFakeClient()})
156+
apiReader, err := client.NewDelegatingClient(client.NewDelegatingClientInput{Client: fake.NewClientBuilder().Build()})
157157
Expect(err).NotTo(HaveOccurred())
158158

159159
By("Validating injecting client")

0 commit comments

Comments
 (0)