Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cluster/constants.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package cluster

// Constants for common test values
const (
// Namespace constants
testNamespace = "test-namespace"
Expand Down Expand Up @@ -67,6 +66,7 @@ const (
deploymentName1 = "deployment1"
deploymentName2 = "deployment2"
deploymentName3 = "deployment3"
nginxDeployment = "nginx-deployment"

// Namespace test constants
testNamespace1 = "test-ns-1"
Expand Down
94 changes: 60 additions & 34 deletions cluster/deployment_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,50 +13,76 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/util/intstr"
"k8s.io/client-go/dynamic"
dynamicfake "k8s.io/client-go/dynamic/fake"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/kubernetes/fake"
)

// TestNewDeployment tests deployment creation with defaults
func TestNewDeployment(t *testing.T) {
deployment := &Deployment{
Name: deploymentName1,
Namespace: defaultNamespace,
Replicas: 1, // Default to 1 replica
}

assert.Equal(t, deploymentName1, deployment.Name)
assert.Equal(t, defaultNamespace, deployment.Namespace)
assert.Equal(t, float64(1), deployment.Replicas) // Default value
assert.Nil(t, deployment.Labels)
assert.Empty(t, deployment.ContainerPort)
assert.Nil(t, deployment.Env)
assert.Empty(t, deployment.ImagePullPolicy)
assert.Nil(t, deployment.ImagePullSecrets)
}

// TestDeployment_Create tests the Create method's error paths
// TestDeployment_Create tests the Create method
func TestDeployment_Create(t *testing.T) {
ctx := context.Background()

t.Run("Error getting dynamic client", func(t *testing.T) {
deployment := &Deployment{
Name: deploymentName1,
Namespace: defaultNamespace,
Replicas: 1, // Default to 1 replica,
Image: nginxImage,
}
scheme := runtime.NewScheme()

mockCM := testmocks.NewMockClusterManager()
mockCM.On("GetCurrentDynamicClient").Return(nil, errors.New("client unavailable"))
testCases := []struct {
name string
deployment *Deployment
setupMock func(*testmocks.MockClusterManager) dynamic.Interface
expectedResult string
expectedError string
}{
{
name: "Successful deployment creation",
deployment: &Deployment{
Name: nginxDeployment,
Namespace: defaultNamespace,
Replicas: 2,
Image: nginxImage,
ContainerPort: "80/TCP",
ImagePullPolicy: "IfNotPresent",
},
setupMock: func(cm *testmocks.MockClusterManager) dynamic.Interface {
dynClient := dynamicfake.NewSimpleDynamicClient(scheme)
cm.On("GetCurrentDynamicClient").Return(dynClient, nil)
return dynClient
},
expectedResult: fmt.Sprintf("Deployment %q created successfully in namespace %q with 2 replica(s)", nginxDeployment, defaultNamespace),
},
{
name: "Dynamic client error",
deployment: &Deployment{
Name: nginxDeployment,
Namespace: defaultNamespace,
Replicas: 1,
Image: nginxImage,
},
setupMock: func(cm *testmocks.MockClusterManager) dynamic.Interface {
cm.On("GetCurrentDynamicClient").Return(nil, errors.New("client error"))
return nil
},
expectedError: "failed to get a dynamic client: client error",
},
}

result, err := deployment.Create(ctx, mockCM)
assert.Error(t, err)
assert.Contains(t, err.Error(), "failed to get a dynamic client: client unavailable")
assert.Empty(t, result)
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
mockCM := testmocks.NewMockClusterManager()
_ = tc.setupMock(mockCM)

result, err := tc.deployment.Create(ctx, mockCM)

mockCM.AssertExpectations(t)
})
if tc.expectedError != "" {
assert.Error(t, err)
assert.Contains(t, err.Error(), tc.expectedError)
} else {
assert.NoError(t, err)
assert.Equal(t, tc.expectedResult, result)
}

mockCM.AssertExpectations(t)
})
}
}

// TestDeployment_Update tests the Update method
Expand Down
1 change: 1 addition & 0 deletions tools/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ const (
nonexistentPodName = "non-existent-pod"
defaultNamespace = "default"
testNamespace = "test-namespace"
testDeployment = "test-deployment"
nginxPodName = "nginx-pod"
nginxImage = "nginx:latest"
myAppImage = "myapp:v1.2.3"
Expand Down
7 changes: 1 addition & 6 deletions tools/deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,6 @@ type DeploymentFactory interface {
// DefaultDeploymentFactory implements the DeploymentFactory interface
type DefaultDeploymentFactory struct{}

// NewDefaultDeploymentFactory creates a new DefaultDeploymentFactory
func NewDefaultDeploymentFactory() *DefaultDeploymentFactory {
return &DefaultDeploymentFactory{}
}

// NewDeployment creates a new deployment operator
func (f *DefaultDeploymentFactory) NewDeployment(params kai.DeploymentParams) kai.DeploymentOperator {
return &cluster.Deployment{
Expand All @@ -38,7 +33,7 @@ func (f *DefaultDeploymentFactory) NewDeployment(params kai.DeploymentParams) ka

// RegisterDeploymentTools registers all deployment-related tools with the server
func RegisterDeploymentTools(s kai.ServerInterface, cm kai.ClusterManager) {
factory := NewDefaultDeploymentFactory()
factory := &DefaultDeploymentFactory{}
RegisterDeploymentToolsWithFactory(s, cm, factory)
}

Expand Down
Loading