Skip to content

Commit 24214b1

Browse files
committed
ocm: added unit tests and increased coverage
Closes rh-ecosystem-edge#544 by adding unit tests for the list and validate functions in the OCM package and modifying a few existing test cases to improve coverage a bit. This PR also resets the resourceversion during force updates to preemptively address situations like in rh-ecosystem-edge#483.
1 parent f92fd0f commit 24214b1

20 files changed

+731
-15
lines changed

pkg/ocm/kac.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,8 @@ func (builder *KACBuilder) Update(force bool) (*KACBuilder, error) {
180180
glog.V(100).Infof(msg.FailToUpdateNotification("klusterletAddonConfig", builder.Definition.Name))
181181

182182
err := builder.Delete()
183+
builder.Definition.ResourceVersion = ""
184+
183185
if err != nil {
184186
glog.V(100).Infof(msg.FailToUpdateError("klusterletAddonConfig", builder.Definition.Name))
185187

pkg/ocm/kac_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,11 @@ func TestKACUpdate(t *testing.T) {
238238
assert.True(t, kacBuilder.Exists())
239239
}
240240

241+
// This causes an error while updating and allows us to test the code path for force updates.
242+
if testCase.force {
243+
kacBuilder.Definition.ResourceVersion = kacBuilder.Definition.Name
244+
}
245+
241246
assert.NotNil(t, kacBuilder.Definition)
242247
assert.False(t, kacBuilder.Definition.Spec.SearchCollectorConfig.Enabled)
243248

pkg/ocm/managedcluster_test.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,10 @@ func TestManagedClusterDelete(t *testing.T) {
191191
testBuilder: buildValidManagedClusterTestBuilder(buildTestClientWithDummyManagedCluster()),
192192
expectedError: nil,
193193
},
194+
{
195+
testBuilder: buildValidManagedClusterTestBuilder(clients.GetTestClients(clients.TestClientParams{})),
196+
expectedError: nil,
197+
},
194198
{
195199
testBuilder: buildInvalidManagedClusterTestBuilder(buildTestClientWithDummyManagedCluster()),
196200
expectedError: fmt.Errorf("managedCluster 'name' cannot be empty"),
@@ -244,6 +248,82 @@ func TestManagedClusterUpdate(t *testing.T) {
244248
}
245249
}
246250

251+
func TestManagedClusterValidate(t *testing.T) {
252+
testCases := []struct {
253+
builderNil bool
254+
definitionNil bool
255+
apiClientNil bool
256+
builderErrorMsg string
257+
expectedError error
258+
}{
259+
{
260+
builderNil: false,
261+
definitionNil: false,
262+
apiClientNil: false,
263+
builderErrorMsg: "",
264+
expectedError: nil,
265+
},
266+
{
267+
builderNil: true,
268+
definitionNil: false,
269+
apiClientNil: false,
270+
builderErrorMsg: "",
271+
expectedError: fmt.Errorf("error: received nil managedCluster builder"),
272+
},
273+
{
274+
builderNil: false,
275+
definitionNil: true,
276+
apiClientNil: false,
277+
builderErrorMsg: "",
278+
expectedError: fmt.Errorf("can not redefine the undefined managedCluster"),
279+
},
280+
{
281+
builderNil: false,
282+
definitionNil: false,
283+
apiClientNil: true,
284+
builderErrorMsg: "",
285+
expectedError: fmt.Errorf("managedCluster builder cannot have nil apiClient"),
286+
},
287+
{
288+
builderNil: false,
289+
definitionNil: false,
290+
apiClientNil: false,
291+
builderErrorMsg: "test error",
292+
expectedError: fmt.Errorf("test error"),
293+
},
294+
}
295+
296+
for _, testCase := range testCases {
297+
managedClusterBuilder := buildValidManagedClusterTestBuilder(clients.GetTestClients(clients.TestClientParams{}))
298+
299+
if testCase.builderNil {
300+
managedClusterBuilder = nil
301+
}
302+
303+
if testCase.definitionNil {
304+
managedClusterBuilder.Definition = nil
305+
}
306+
307+
if testCase.apiClientNil {
308+
managedClusterBuilder.apiClient = nil
309+
}
310+
311+
if testCase.builderErrorMsg != "" {
312+
managedClusterBuilder.errorMsg = testCase.builderErrorMsg
313+
}
314+
315+
valid, err := managedClusterBuilder.validate()
316+
317+
if testCase.expectedError != nil {
318+
assert.False(t, valid)
319+
assert.Equal(t, testCase.expectedError, err)
320+
} else {
321+
assert.True(t, valid)
322+
assert.Nil(t, err)
323+
}
324+
}
325+
}
326+
247327
// buildDummyManagedCluster returns a ManagedCluster with the provided name.
248328
func buildDummyManagedCluster(name string) *clusterv1.ManagedCluster {
249329
return &clusterv1.ManagedCluster{

pkg/ocm/ocm_test.go

Lines changed: 0 additions & 1 deletion
This file was deleted.

pkg/ocm/placementbinding.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -204,15 +204,13 @@ func (builder *PlacementBindingBuilder) Update(force bool) (*PlacementBindingBui
204204
if err != nil {
205205
if force {
206206
glog.V(100).Infof(
207-
"Failed to update the placementBinding object %s. "+
208-
"Note: Force flag set, executed delete/create methods instead", builder.Definition.Name)
207+
msg.FailToUpdateNotification("placementBinding", builder.Definition.Name, builder.Definition.Namespace))
209208

210209
builder, err := builder.Delete()
210+
builder.Definition.ResourceVersion = ""
211211

212212
if err != nil {
213-
glog.V(100).Infof(
214-
"Failed to update the placementBinding object %s, "+
215-
"due to error in delete function", builder.Definition.Name)
213+
glog.V(100).Infof(msg.FailToUpdateError("placementBinding", builder.Definition.Name, builder.Definition.Namespace))
216214

217215
return nil, err
218216
}

pkg/ocm/placementbindingList.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@ import (
1414
func ListPlacementBindingsInAllNamespaces(apiClient *clients.Settings,
1515
options ...runtimeclient.ListOptions) (
1616
[]*PlacementBindingBuilder, error) {
17+
if apiClient == nil {
18+
glog.V(100).Info("PlacementBindings 'apiClient' parameter cannot be nil")
19+
20+
return nil, fmt.Errorf("failed to list placementBindings, 'apiClient' parameter is nil")
21+
}
22+
1723
logMessage := string("Listing all placementBindings in all namespaces")
1824
passedOptions := runtimeclient.ListOptions{}
1925

pkg/ocm/placementbinding_test.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,11 @@ func TestPlacementBindingUpdate(t *testing.T) {
295295
assert.Nil(t, err)
296296
}
297297

298+
// This causes an error while updating and allows us to test the code path for force updates.
299+
if testCase.force {
300+
testBuilder.Definition.ResourceVersion = testBuilder.Definition.Name
301+
}
302+
298303
assert.NotNil(t, testBuilder.Definition)
299304
assert.Empty(t, testBuilder.Definition.SubFilter)
300305

@@ -430,6 +435,82 @@ func TestValidateSubject(t *testing.T) {
430435
}
431436
}
432437

438+
func TestPlacementBindingValidate(t *testing.T) {
439+
testCases := []struct {
440+
builderNil bool
441+
definitionNil bool
442+
apiClientNil bool
443+
builderErrorMsg string
444+
expectedError error
445+
}{
446+
{
447+
builderNil: false,
448+
definitionNil: false,
449+
apiClientNil: false,
450+
builderErrorMsg: "",
451+
expectedError: nil,
452+
},
453+
{
454+
builderNil: true,
455+
definitionNil: false,
456+
apiClientNil: false,
457+
builderErrorMsg: "",
458+
expectedError: fmt.Errorf("error: received nil PlacementBinding builder"),
459+
},
460+
{
461+
builderNil: false,
462+
definitionNil: true,
463+
apiClientNil: false,
464+
builderErrorMsg: "",
465+
expectedError: fmt.Errorf("can not redefine the undefined PlacementBinding"),
466+
},
467+
{
468+
builderNil: false,
469+
definitionNil: false,
470+
apiClientNil: true,
471+
builderErrorMsg: "",
472+
expectedError: fmt.Errorf("PlacementBinding builder cannot have nil apiClient"),
473+
},
474+
{
475+
builderNil: false,
476+
definitionNil: false,
477+
apiClientNil: false,
478+
builderErrorMsg: "test error",
479+
expectedError: fmt.Errorf("test error"),
480+
},
481+
}
482+
483+
for _, testCase := range testCases {
484+
placementBindingBuilder := buildValidPlacementBindingTestBuilder(clients.GetTestClients(clients.TestClientParams{}))
485+
486+
if testCase.builderNil {
487+
placementBindingBuilder = nil
488+
}
489+
490+
if testCase.definitionNil {
491+
placementBindingBuilder.Definition = nil
492+
}
493+
494+
if testCase.apiClientNil {
495+
placementBindingBuilder.apiClient = nil
496+
}
497+
498+
if testCase.builderErrorMsg != "" {
499+
placementBindingBuilder.errorMsg = testCase.builderErrorMsg
500+
}
501+
502+
valid, err := placementBindingBuilder.validate()
503+
504+
if testCase.expectedError != nil {
505+
assert.False(t, valid)
506+
assert.Equal(t, testCase.expectedError, err)
507+
} else {
508+
assert.True(t, valid)
509+
assert.Nil(t, err)
510+
}
511+
}
512+
}
513+
433514
// buildDummyPlacementBinding returns a PlacementBinding with the provided name and namespace.
434515
func buildDummyPlacementBinding(name, nsname string) *policiesv1.PlacementBinding {
435516
return &policiesv1.PlacementBinding{

pkg/ocm/placementbindinglist_test.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package ocm
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/openshift-kni/eco-goinfra/pkg/clients"
8+
"github.com/stretchr/testify/assert"
9+
"k8s.io/apimachinery/pkg/labels"
10+
runtimeclient "sigs.k8s.io/controller-runtime/pkg/client"
11+
)
12+
13+
func TestListPlacementBindingsInAllNamespaces(t *testing.T) {
14+
testCases := []struct {
15+
placementBindings []*PlacementBindingBuilder
16+
listOptions []runtimeclient.ListOptions
17+
expectedError error
18+
client bool
19+
}{
20+
{
21+
placementBindings: []*PlacementBindingBuilder{
22+
buildValidPlacementBindingTestBuilder(buildTestClientWithDummyPlacementBinding()),
23+
},
24+
listOptions: nil,
25+
expectedError: nil,
26+
client: true,
27+
},
28+
{
29+
placementBindings: []*PlacementBindingBuilder{
30+
buildValidPlacementBindingTestBuilder(buildTestClientWithDummyPlacementBinding()),
31+
},
32+
listOptions: []runtimeclient.ListOptions{{LabelSelector: labels.NewSelector()}},
33+
expectedError: nil,
34+
client: true,
35+
},
36+
{
37+
placementBindings: []*PlacementBindingBuilder{
38+
buildValidPlacementBindingTestBuilder(buildTestClientWithDummyPlacementBinding()),
39+
},
40+
listOptions: []runtimeclient.ListOptions{
41+
{LabelSelector: labels.NewSelector()},
42+
{LabelSelector: labels.NewSelector()},
43+
},
44+
expectedError: fmt.Errorf("error: more than one ListOptions was passed"),
45+
client: true,
46+
},
47+
{
48+
placementBindings: []*PlacementBindingBuilder{
49+
buildValidPlacementBindingTestBuilder(buildTestClientWithDummyPlacementBinding()),
50+
},
51+
listOptions: []runtimeclient.ListOptions{{LabelSelector: labels.NewSelector()}},
52+
expectedError: fmt.Errorf("failed to list placementBindings, 'apiClient' parameter is nil"),
53+
client: false,
54+
},
55+
}
56+
57+
for _, testCase := range testCases {
58+
var testSettings *clients.Settings
59+
60+
if testCase.client {
61+
testSettings = buildTestClientWithDummyPlacementBinding()
62+
}
63+
64+
builders, err := ListPlacementBindingsInAllNamespaces(testSettings, testCase.listOptions...)
65+
assert.Equal(t, err, testCase.expectedError)
66+
67+
if testCase.expectedError == nil && len(testCase.listOptions) == 0 {
68+
assert.Equal(t, len(testCase.placementBindings), len(builders))
69+
}
70+
}
71+
}

pkg/ocm/placementrule.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -194,15 +194,13 @@ func (builder *PlacementRuleBuilder) Update(force bool) (*PlacementRuleBuilder,
194194
if err != nil {
195195
if force {
196196
glog.V(100).Infof(
197-
"Failed to update the placementrule object %s. "+
198-
"Note: Force flag set, executed delete/create methods instead", builder.Definition.Name)
197+
msg.FailToUpdateNotification("placementrule", builder.Definition.Name, builder.Definition.Namespace))
199198

200199
builder, err := builder.Delete()
200+
builder.Definition.ResourceVersion = ""
201201

202202
if err != nil {
203-
glog.V(100).Infof(
204-
"Failed to update the placementrule object %s, "+
205-
"due to error in delete function", builder.Definition.Name)
203+
glog.V(100).Infof(msg.FailToUpdateError("placementrule", builder.Definition.Name, builder.Definition.Namespace))
206204

207205
return nil, err
208206
}

0 commit comments

Comments
 (0)