Skip to content

Commit 63f9d4e

Browse files
committed
fix: increased coverage for controller/crd_controller
1 parent 9e967e5 commit 63f9d4e

File tree

2 files changed

+62
-6
lines changed

2 files changed

+62
-6
lines changed

listener/controller/crd_controller.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66
"errors"
77

88
"github.com/openmfp/golang-commons/logger"
9-
"github.com/openmfp/kubernetes-graphql-gateway/listener/apischema"
109
"github.com/openmfp/kubernetes-graphql-gateway/listener/workspacefile"
1110

1211
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
@@ -22,18 +21,23 @@ var (
2221
ErrGetReconciledObj = errors.New("failed to get reconciled object")
2322
)
2423

24+
type CRDResolver interface {
25+
Resolve() ([]byte, error)
26+
ResolveApiSchema(crd *apiextensionsv1.CustomResourceDefinition) ([]byte, error)
27+
}
28+
2529
// CRDReconciler reconciles a CustomResourceDefinition object
2630
type CRDReconciler struct {
2731
ClusterName string
2832
client.Client
29-
*apischema.CRDResolver
33+
CRDResolver
3034
io workspacefile.IOHandler
3135
log *logger.Logger
3236
}
3337

3438
func NewCRDReconciler(name string,
3539
clt client.Client,
36-
cr *apischema.CRDResolver,
40+
cr CRDResolver,
3741
io workspacefile.IOHandler,
3842
log *logger.Logger,
3943
) *CRDReconciler {

listener/controller/crd_controller_test.go

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,39 @@ import (
66
"testing"
77

88
"github.com/openmfp/kubernetes-graphql-gateway/gateway/resolver/mocks"
9-
"github.com/openmfp/kubernetes-graphql-gateway/listener/apischema"
109
"github.com/openmfp/kubernetes-graphql-gateway/listener/controller"
1110
workspacefileMocks "github.com/openmfp/kubernetes-graphql-gateway/listener/workspacefile/mocks"
1211

1312
"github.com/openmfp/golang-commons/logger/testlogger"
1413
"github.com/stretchr/testify/assert"
1514
"github.com/stretchr/testify/mock"
15+
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
1616
apierrors "k8s.io/apimachinery/pkg/api/errors"
1717
"k8s.io/apimachinery/pkg/runtime/schema"
1818
"sigs.k8s.io/controller-runtime/pkg/client"
1919
"sigs.k8s.io/controller-runtime/pkg/reconcile"
2020
)
2121

22+
type mockCRDResolver struct {
23+
mock.Mock
24+
}
25+
26+
func (m *mockCRDResolver) Resolve() ([]byte, error) {
27+
args := m.Called()
28+
if args.Get(0) == nil {
29+
return nil, args.Error(1)
30+
}
31+
return args.Get(0).([]byte), args.Error(1)
32+
}
33+
34+
func (m *mockCRDResolver) ResolveApiSchema(crd *apiextensionsv1.CustomResourceDefinition) ([]byte, error) {
35+
args := m.Called(crd)
36+
if args.Get(0) == nil {
37+
return nil, args.Error(1)
38+
}
39+
return args.Get(0).([]byte), args.Error(1)
40+
}
41+
2242
// TestCRDReconciler tests the CRDReconciler's Reconcile method.
2343
// It checks if the method handles different scenarios correctly, including
2444
// errors when getting the CRD and reading the JSON schema.
@@ -43,13 +63,31 @@ func TestCRDReconciler(t *testing.T) {
4363
readErr: errors.New("read-error"),
4464
wantErr: controller.ErrReadJSON,
4565
},
66+
{
67+
name: "not found resolve error",
68+
getErr: apierrors.NewNotFound(schema.GroupResource{Group: "", Resource: "crds"}, "my-crd"),
69+
readErr: nil,
70+
wantErr: controller.ErrResolveSchema,
71+
},
72+
{
73+
name: "not found write error",
74+
getErr: apierrors.NewNotFound(schema.GroupResource{Group: "", Resource: "crds"}, "my-crd"),
75+
readErr: nil,
76+
wantErr: controller.ErrWriteJSON,
77+
},
78+
{
79+
name: "successful update",
80+
getErr: nil,
81+
readErr: nil,
82+
wantErr: nil,
83+
},
4684
}
4785

4886
for _, tc := range tests {
4987
t.Run(tc.name, func(t *testing.T) {
5088
ioHandler := workspacefileMocks.NewMockIOHandler(t)
5189
fakeClient := mocks.NewMockClient(t)
52-
crdResolver := &apischema.CRDResolver{}
90+
crdResolver := &mockCRDResolver{}
5391

5492
r := controller.NewCRDReconciler(
5593
"cluster1",
@@ -67,7 +105,21 @@ func TestCRDReconciler(t *testing.T) {
67105
).Return(tc.getErr)
68106

69107
if apierrors.IsNotFound(tc.getErr) {
70-
ioHandler.EXPECT().Read("cluster1").Return(nil, tc.readErr)
108+
ioHandler.EXPECT().Read("cluster1").Return([]byte("{}"), tc.readErr)
109+
if tc.readErr == nil {
110+
if tc.wantErr == controller.ErrResolveSchema {
111+
crdResolver.On("Resolve").Return(nil, errors.New("resolve error"))
112+
} else if tc.wantErr == controller.ErrWriteJSON {
113+
crdResolver.On("Resolve").Return([]byte(`{"new":"schema"}`), nil)
114+
ioHandler.EXPECT().Write([]byte(`{"new":"schema"}`), "cluster1").Return(errors.New("write error"))
115+
} else {
116+
crdResolver.On("Resolve").Return([]byte("{}"), nil)
117+
}
118+
}
119+
} else if tc.getErr == nil {
120+
ioHandler.EXPECT().Read("cluster1").Return([]byte("{}"), nil)
121+
crdResolver.On("ResolveApiSchema", mock.Anything).Return([]byte(`{"new":"schema"}`), nil)
122+
ioHandler.EXPECT().Write([]byte(`{"new":"schema"}`), "cluster1").Return(nil)
71123
}
72124

73125
_, err := r.Reconcile(context.Background(), req)

0 commit comments

Comments
 (0)