Skip to content

Commit eed9c38

Browse files
author
Per Goncalves da Silva
committed
Harden ToUnstructured and add unit tests
Signed-off-by: Per Goncalves da Silva <[email protected]>
1 parent 6530081 commit eed9c38

File tree

2 files changed

+64
-9
lines changed

2 files changed

+64
-9
lines changed

internal/operator-controller/rukpak/util/util.go

+13
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package util
22

33
import (
4+
"errors"
45
"fmt"
56
"io"
67

@@ -19,8 +20,20 @@ func ObjectNameForBaseAndSuffix(base string, suffix string) string {
1920
return fmt.Sprintf("%s-%s", base, suffix)
2021
}
2122

23+
// ToUnstructured converts obj into an Unstructured. It expects the obj's gvk to be defined. If it is not,
24+
// an error will be returned.
2225
func ToUnstructured(obj client.Object) (*unstructured.Unstructured, error) {
26+
if obj == nil {
27+
return nil, errors.New("object is nil")
28+
}
29+
2330
gvk := obj.GetObjectKind().GroupVersionKind()
31+
if len(gvk.Kind) == 0 {
32+
return nil, errors.New("object has no kind")
33+
}
34+
if len(gvk.Version) == 0 {
35+
return nil, errors.New("object has no version")
36+
}
2437

2538
var u unstructured.Unstructured
2639
uObj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(obj)

internal/operator-controller/rukpak/util/util_test.go

+51-9
Original file line numberDiff line numberDiff line change
@@ -56,15 +56,6 @@ func TestMergeMaps(t *testing.T) {
5656
}
5757
}
5858

59-
// Mock reader for testing that always returns an error when Read is called
60-
type errorReader struct {
61-
io.Reader
62-
}
63-
64-
func (m errorReader) Read(p []byte) (int, error) {
65-
return 0, errors.New("Oh no!")
66-
}
67-
6859
func TestManifestObjects(t *testing.T) {
6960
tests := []struct {
7061
name string
@@ -152,3 +143,54 @@ spec:
152143
})
153144
}
154145
}
146+
147+
func Test_ToUnstructured(t *testing.T) {
148+
for _, tc := range []struct {
149+
name string
150+
obj client.Object
151+
err error
152+
}{
153+
{
154+
name: "converts object to unstructured",
155+
obj: &corev1.Service{
156+
TypeMeta: metav1.TypeMeta{Kind: "Service", APIVersion: "v1"},
157+
ObjectMeta: metav1.ObjectMeta{Name: "my-service", Namespace: "my-namespace"},
158+
},
159+
}, {
160+
name: "fails if object doesn't define kind",
161+
obj: &corev1.Service{
162+
TypeMeta: metav1.TypeMeta{Kind: "", APIVersion: "v1"},
163+
ObjectMeta: metav1.ObjectMeta{Name: "my-service", Namespace: "my-namespace"},
164+
},
165+
err: errors.New("object has no kind"),
166+
}, {
167+
name: "fails if object doesn't define version",
168+
obj: &corev1.Service{
169+
TypeMeta: metav1.TypeMeta{Kind: "Service", APIVersion: ""},
170+
ObjectMeta: metav1.ObjectMeta{Name: "my-service", Namespace: "my-namespace"},
171+
},
172+
err: errors.New("object has no version"),
173+
}, {
174+
name: "fails if object is nil",
175+
err: errors.New("object is nil"),
176+
},
177+
} {
178+
t.Run(tc.name, func(t *testing.T) {
179+
out, err := util.ToUnstructured(tc.obj)
180+
if tc.err != nil {
181+
require.Error(t, err)
182+
} else {
183+
assert.Equal(t, tc.obj.GetObjectKind().GroupVersionKind(), out.GroupVersionKind())
184+
}
185+
})
186+
}
187+
}
188+
189+
// Mock reader for testing that always returns an error when Read is called
190+
type errorReader struct {
191+
io.Reader
192+
}
193+
194+
func (m errorReader) Read(p []byte) (int, error) {
195+
return 0, errors.New("Oh no!")
196+
}

0 commit comments

Comments
 (0)