This is an automated email from the ASF dual-hosted git repository.

jimin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-seata-k8s.git


The following commit(s) were added to refs/heads/master by this push:
     new 58a499d  optimize: add some UT for pkg  (#51)
58a499d is described below

commit 58a499d7fa9f73efa4f6686f6c00303ff732e1e8
Author: jimin <[email protected]>
AuthorDate: Sat Jan 10 18:17:00 2026 +0800

    optimize: add some UT for pkg  (#51)
---
 controllers/seataserver_controller_test.go | 226 +++++++++++++++++++++++++++++
 pkg/finalizer/cleanup_handler_test.go      | 147 +++++++++++++++++++
 pkg/finalizer/finalizer_manager_test.go    | 166 +++++++++++++++++++++
 pkg/webhook/validating_webhook_test.go     | 210 +++++++++++++++++++++++++++
 4 files changed, 749 insertions(+)

diff --git a/controllers/seataserver_controller_test.go 
b/controllers/seataserver_controller_test.go
index dbe4097..4bde78e 100644
--- a/controllers/seataserver_controller_test.go
+++ b/controllers/seataserver_controller_test.go
@@ -614,6 +614,232 @@ func TestSeataServerReconciler_RecordError(t *testing.T) {
        }
 }
 
+func TestSeataServerReconciler_RecordError_MaxErrors(t *testing.T) {
+       scheme := createTestScheme()
+
+       // Create a SeataServer with maximum errors
+       errors := make([]seatav1alpha1.SeataServerError, MaxRecentErrorRecords)
+       for i := 0; i < MaxRecentErrorRecords; i++ {
+               errors[i] = seatav1alpha1.SeataServerError{
+                       Type:      "test-error",
+                       Message:   "old error",
+                       Timestamp: metav1.Now(),
+               }
+       }
+
+       seataServer := &seatav1alpha1.SeataServer{
+               ObjectMeta: metav1.ObjectMeta{
+                       Name:      "test-seata",
+                       Namespace: "default",
+               },
+               Status: seatav1alpha1.SeataServerStatus{
+                       Errors: errors,
+               },
+       }
+
+       fakeClient := fake.NewClientBuilder().
+               WithScheme(scheme).
+               WithObjects(seataServer).
+               WithStatusSubresource(seataServer).
+               Build()
+
+       reconciler := &SeataServerReconciler{
+               Client: fakeClient,
+               Scheme: scheme,
+               Log:    logr.Discard(),
+       }
+
+       err := reconciler.recordError(
+               context.Background(),
+               types.NamespacedName{Name: "test-seata", Namespace: "default"},
+               seatav1alpha1.ErrorTypeK8s_SeataServer,
+               "New error message",
+               reconcile.TerminalError(nil),
+       )
+
+       if err != nil {
+               t.Errorf("recordError failed: %v", err)
+       }
+}
+
+func TestSeataServerReconciler_ReconcileClientObject_CreateSuccess(t 
*testing.T) {
+       scheme := createTestScheme()
+
+       seataServer := &seatav1alpha1.SeataServer{
+               ObjectMeta: metav1.ObjectMeta{
+                       Name:      "test-seata",
+                       Namespace: "default",
+               },
+               Spec: seatav1alpha1.SeataServerSpec{
+                       ServiceName: "test-svc",
+                       Ports: seatav1alpha1.Ports{
+                               ServicePort: 8091,
+                               ConsolePort: 7091,
+                               RaftPort:    9091,
+                       },
+               },
+       }
+
+       fakeClient := fake.NewClientBuilder().
+               WithScheme(scheme).
+               WithObjects(seataServer).
+               Build()
+
+       reconciler := &SeataServerReconciler{
+               Client: fakeClient,
+               Scheme: scheme,
+               Log:    logr.Discard(),
+       }
+
+       svc := &apiv1.Service{
+               ObjectMeta: metav1.ObjectMeta{
+                       Name:      "test-svc",
+                       Namespace: "default",
+               },
+               Spec: apiv1.ServiceSpec{
+                       Ports: []apiv1.ServicePort{
+                               {Name: "service-port", Port: 8091},
+                       },
+               },
+       }
+
+       err := reconciler.reconcileClientObject(
+               context.Background(),
+               seataServer,
+               svc,
+               func() client.Object { return &apiv1.Service{} },
+               func(found, desired client.Object) {},
+               seatav1alpha1.ErrorTypeK8s_HeadlessService,
+               "Service",
+       )
+
+       if err != nil {
+               t.Errorf("reconcileClientObject create failed: %v", err)
+       }
+}
+
+func TestSeataServerReconciler_ReconcileClientObject_UpdateSuccess(t 
*testing.T) {
+       scheme := createTestScheme()
+
+       seataServer := &seatav1alpha1.SeataServer{
+               ObjectMeta: metav1.ObjectMeta{
+                       Name:      "test-seata",
+                       Namespace: "default",
+                       UID:       types.UID("test-uid"),
+               },
+               Spec: seatav1alpha1.SeataServerSpec{
+                       ServiceName: "test-svc",
+                       Ports: seatav1alpha1.Ports{
+                               ServicePort: 8091,
+                               ConsolePort: 7091,
+                               RaftPort:    9091,
+                       },
+               },
+       }
+
+       existingSvc := &apiv1.Service{
+               ObjectMeta: metav1.ObjectMeta{
+                       Name:      "test-svc",
+                       Namespace: "default",
+                       OwnerReferences: []metav1.OwnerReference{
+                               {
+                                       APIVersion: 
"operator.seata.apache.org/v1alpha1",
+                                       Kind:       "SeataServer",
+                                       Name:       "test-seata",
+                                       UID:        "test-uid",
+                               },
+                       },
+               },
+               Spec: apiv1.ServiceSpec{
+                       Ports: []apiv1.ServicePort{
+                               {Name: "old-port", Port: 8080},
+                       },
+               },
+       }
+
+       fakeClient := fake.NewClientBuilder().
+               WithScheme(scheme).
+               WithObjects(seataServer, existingSvc).
+               Build()
+
+       reconciler := &SeataServerReconciler{
+               Client: fakeClient,
+               Scheme: scheme,
+               Log:    logr.Discard(),
+       }
+
+       newSvc := &apiv1.Service{
+               ObjectMeta: metav1.ObjectMeta{
+                       Name:      "test-svc",
+                       Namespace: "default",
+               },
+               Spec: apiv1.ServiceSpec{
+                       Ports: []apiv1.ServicePort{
+                               {Name: "service-port", Port: 8091},
+                       },
+               },
+       }
+
+       err := reconciler.reconcileClientObject(
+               context.Background(),
+               seataServer,
+               newSvc,
+               func() client.Object { return &apiv1.Service{} },
+               func(found, desired client.Object) {
+                       found.(*apiv1.Service).Spec.Ports = 
desired.(*apiv1.Service).Spec.Ports
+               },
+               seatav1alpha1.ErrorTypeK8s_HeadlessService,
+               "Service",
+       )
+
+       if err != nil {
+               t.Errorf("reconcileClientObject update failed: %v", err)
+       }
+}
+
+func TestSeataServerReconciler_Reconcile_WithDefaults(t *testing.T) {
+       scheme := createTestScheme()
+
+       seataServer := &seatav1alpha1.SeataServer{
+               ObjectMeta: metav1.ObjectMeta{
+                       Name:      "test-seata",
+                       Namespace: "default",
+               },
+               Spec: seatav1alpha1.SeataServerSpec{
+                       // Empty spec to trigger WithDefaults
+               },
+       }
+
+       fakeClient := fake.NewClientBuilder().
+               WithScheme(scheme).
+               WithObjects(seataServer).
+               WithStatusSubresource(seataServer).
+               Build()
+
+       reconciler := &SeataServerReconciler{
+               Client: fakeClient,
+               Scheme: scheme,
+               Log:    logr.Discard(),
+       }
+
+       req := ctrl.Request{
+               NamespacedName: types.NamespacedName{
+                       Name:      "test-seata",
+                       Namespace: "default",
+               },
+       }
+
+       result, err := reconciler.Reconcile(context.Background(), req)
+       if err != nil {
+               t.Errorf("Reconcile with defaults failed: %v", err)
+       }
+
+       // Should requeue after applying defaults
+       if !result.Requeue {
+               t.Error("Expected requeue after applying defaults")
+       }
+}
+
 func TestSeataServerReconciler_ReconcileClientObject(t *testing.T) {
        scheme := createTestScheme()
 
diff --git a/pkg/finalizer/cleanup_handler_test.go 
b/pkg/finalizer/cleanup_handler_test.go
index b6c04a0..09e2dd9 100644
--- a/pkg/finalizer/cleanup_handler_test.go
+++ b/pkg/finalizer/cleanup_handler_test.go
@@ -222,6 +222,153 @@ func TestCleanupAllPVCs(t *testing.T) {
        }
 }
 
+func TestCleanupAllPVCs_EmptyList(t *testing.T) {
+       scheme := createCleanupTestScheme()
+
+       fakeClient := fake.NewClientBuilder().
+               WithScheme(scheme).
+               Build()
+
+       handler := NewCleanupHandler(fakeClient, logr.Discard())
+
+       err := handler.cleanupAllPVCs(context.Background(), "test-seata", 
"default", types.UID("test-uid-123"))
+       if err != nil {
+               t.Errorf("cleanupAllPVCs with empty list failed: %v", err)
+       }
+}
+
+func TestHandleCleanupV1_ErrorInPVCCleanup(t *testing.T) {
+       scheme := createCleanupTestScheme()
+
+       seataServer := &seatav1.SeataServer{
+               ObjectMeta: metav1.ObjectMeta{
+                       Name:      "test-seata",
+                       Namespace: "default",
+                       UID:       types.UID("test-uid-123"),
+               },
+               Spec: seatav1.SeataServerSpec{
+                       Persistence: seatav1.Persistence{
+                               VolumeReclaimPolicy: 
seatav1.VolumeReclaimPolicyDelete,
+                       },
+               },
+       }
+
+       fakeClient := fake.NewClientBuilder().
+               WithScheme(scheme).
+               WithObjects(seataServer).
+               Build()
+
+       handler := NewCleanupHandler(fakeClient, logr.Discard())
+
+       // Test cleanup with non-existent PVCs (should not error)
+       err := handler.handleCleanupV1(context.Background(), seataServer)
+       if err != nil {
+               t.Errorf("handleCleanupV1 failed: %v", err)
+       }
+}
+
+func TestCleanupConfigMaps_EmptyList(t *testing.T) {
+       scheme := createCleanupTestScheme()
+
+       fakeClient := fake.NewClientBuilder().
+               WithScheme(scheme).
+               Build()
+
+       handler := NewCleanupHandler(fakeClient, logr.Discard())
+
+       err := handler.cleanupConfigMaps(context.Background(), "test-seata", 
"default")
+       if err != nil {
+               t.Errorf("cleanupConfigMaps with empty list failed: %v", err)
+       }
+}
+
+func TestCleanupSecrets_EmptyList(t *testing.T) {
+       scheme := createCleanupTestScheme()
+
+       fakeClient := fake.NewClientBuilder().
+               WithScheme(scheme).
+               Build()
+
+       handler := NewCleanupHandler(fakeClient, logr.Discard())
+
+       err := handler.cleanupSecrets(context.Background(), "test-seata", 
"default")
+       if err != nil {
+               t.Errorf("cleanupSecrets with empty list failed: %v", err)
+       }
+}
+
+func TestDeletePVC_AlreadyDeleted(t *testing.T) {
+       scheme := createCleanupTestScheme()
+
+       pvc := &apiv1.PersistentVolumeClaim{
+               ObjectMeta: metav1.ObjectMeta{
+                       Name:      "test-pvc",
+                       Namespace: "default",
+               },
+       }
+
+       fakeClient := fake.NewClientBuilder().
+               WithScheme(scheme).
+               Build()
+
+       handler := NewCleanupHandler(fakeClient, logr.Discard())
+
+       // Try to delete non-existent PVC (should not error due to IsNotFound 
check)
+       err := handler.deletePVC(context.Background(), pvc)
+       if err != nil {
+               t.Errorf("deletePVC for non-existent PVC failed: %v", err)
+       }
+}
+
+func TestHandleCleanupV1Alpha1_WithConfigMapsAndSecrets(t *testing.T) {
+       scheme := createCleanupTestScheme()
+
+       seataServer := &seatav1alpha1.SeataServer{
+               ObjectMeta: metav1.ObjectMeta{
+                       Name:      "test-seata",
+                       Namespace: "default",
+                       UID:       types.UID("test-uid-123"),
+               },
+               Spec: seatav1alpha1.SeataServerSpec{
+                       Persistence: seatav1alpha1.Persistence{
+                               VolumeReclaimPolicy: 
seatav1alpha1.VolumeReclaimPolicyDelete,
+                       },
+               },
+       }
+
+       cm := &apiv1.ConfigMap{
+               ObjectMeta: metav1.ObjectMeta{
+                       Name:      "test-cm",
+                       Namespace: "default",
+                       Labels: map[string]string{
+                               "app": "test-seata",
+                       },
+               },
+       }
+
+       secret := &apiv1.Secret{
+               ObjectMeta: metav1.ObjectMeta{
+                       Name:      "test-secret",
+                       Namespace: "default",
+                       Labels: map[string]string{
+                               "app": "test-seata",
+                       },
+               },
+       }
+
+       fakeClient := fake.NewClientBuilder().
+               WithScheme(scheme).
+               WithObjects(seataServer, cm, secret).
+               Build()
+
+       handler := NewCleanupHandler(fakeClient, logr.Discard())
+
+       err := handler.handleCleanupV1Alpha1(context.Background(), seataServer)
+       if err != nil {
+               t.Errorf("handleCleanupV1Alpha1 failed: %v", err)
+       }
+}
+
 func TestGetPVCList(t *testing.T) {
        scheme := createCleanupTestScheme()
 
diff --git a/pkg/finalizer/finalizer_manager_test.go 
b/pkg/finalizer/finalizer_manager_test.go
index 90af00c..493751e 100644
--- a/pkg/finalizer/finalizer_manager_test.go
+++ b/pkg/finalizer/finalizer_manager_test.go
@@ -526,6 +526,172 @@ func 
TestFinalizerManager_IsBeingDeleted_UnsupportedType(t *testing.T) {
        }
 }
 
+func TestFinalizerManager_IsBeingDeleted_V1Alpha1(t *testing.T) {
+       now := metav1.Now()
+
+       testCases := []struct {
+               name     string
+               server   *seatav1alpha1.SeataServer
+               expected bool
+       }{
+               {
+                       name: "being deleted",
+                       server: &seatav1alpha1.SeataServer{
+                               ObjectMeta: metav1.ObjectMeta{
+                                       Name:              "test-seata",
+                                       Namespace:         "default",
+                                       DeletionTimestamp: &now,
+                               },
+                       },
+                       expected: true,
+               },
+               {
+                       name: "not being deleted",
+                       server: &seatav1alpha1.SeataServer{
+                               ObjectMeta: metav1.ObjectMeta{
+                                       Name:      "test-seata",
+                                       Namespace: "default",
+                               },
+                       },
+                       expected: false,
+               },
+       }
+
+       fm := &FinalizerManager{
+               Client: nil,
+               Log:    logr.Discard(),
+       }
+
+       for _, tc := range testCases {
+               t.Run(tc.name, func(t *testing.T) {
+                       result := fm.IsBeingDeleted(tc.server)
+                       if result != tc.expected {
+                               t.Errorf("expected %v, got %v", tc.expected, 
result)
+                       }
+               })
+       }
+}
+
+func TestFinalizerManager_AddFinalizer_V1_UpdateError(t *testing.T) {
+       scheme := runtime.NewScheme()
+       _ = seatav1.AddToScheme(scheme)
+
+       seataServer := &seatav1.SeataServer{
+               ObjectMeta: metav1.ObjectMeta{
+                       Name:       "test-seata",
+                       Namespace:  "default",
+                       Finalizers: []string{},
+               },
+       }
+
+       // Don't add the object to the fake client, so update will fail
+       fakeClient := fake.NewClientBuilder().
+               WithScheme(scheme).
+               Build()
+
+       fm := &FinalizerManager{
+               Client: fakeClient,
+               Log:    logr.Discard(),
+       }
+
+       ctx := context.Background()
+       err := fm.AddFinalizer(ctx, seataServer, SeataFinalizerName)
+
+       if err == nil {
+               t.Error("Expected error when updating non-existent object")
+       }
+}
+
+func TestFinalizerManager_RemoveFinalizer_V1_UpdateError(t *testing.T) {
+       scheme := runtime.NewScheme()
+       _ = seatav1.AddToScheme(scheme)
+
+       seataServer := &seatav1.SeataServer{
+               ObjectMeta: metav1.ObjectMeta{
+                       Name:       "test-seata",
+                       Namespace:  "default",
+                       Finalizers: []string{SeataFinalizerName},
+               },
+       }
+
+       // Don't add the object to the fake client, so update will fail
+       fakeClient := fake.NewClientBuilder().
+               WithScheme(scheme).
+               Build()
+
+       fm := &FinalizerManager{
+               Client: fakeClient,
+               Log:    logr.Discard(),
+       }
+
+       ctx := context.Background()
+       err := fm.RemoveFinalizer(ctx, seataServer, SeataFinalizerName)
+
+       if err == nil {
+               t.Error("Expected error when updating non-existent object")
+       }
+}
+
+func TestFinalizerManager_AddFinalizer_V1Alpha1_UpdateError(t *testing.T) {
+       scheme := runtime.NewScheme()
+       _ = seatav1alpha1.AddToScheme(scheme)
+
+       seataServer := &seatav1alpha1.SeataServer{
+               ObjectMeta: metav1.ObjectMeta{
+                       Name:       "test-seata",
+                       Namespace:  "default",
+                       Finalizers: []string{},
+               },
+       }
+
+       // Don't add the object to the fake client, so update will fail
+       fakeClient := fake.NewClientBuilder().
+               WithScheme(scheme).
+               Build()
+
+       fm := &FinalizerManager{
+               Client: fakeClient,
+               Log:    logr.Discard(),
+       }
+
+       ctx := context.Background()
+       err := fm.AddFinalizer(ctx, seataServer, SeataFinalizerName)
+
+       if err == nil {
+               t.Error("Expected error when updating non-existent object")
+       }
+}
+
+func TestFinalizerManager_RemoveFinalizer_V1Alpha1_UpdateError(t *testing.T) {
+       scheme := runtime.NewScheme()
+       _ = seatav1alpha1.AddToScheme(scheme)
+
+       seataServer := &seatav1alpha1.SeataServer{
+               ObjectMeta: metav1.ObjectMeta{
+                       Name:       "test-seata",
+                       Namespace:  "default",
+                       Finalizers: []string{SeataFinalizerName},
+               },
+       }
+
+       // Don't add the object to the fake client, so update will fail
+       fakeClient := fake.NewClientBuilder().
+               WithScheme(scheme).
+               Build()
+
+       fm := &FinalizerManager{
+               Client: fakeClient,
+               Log:    logr.Discard(),
+       }
+
+       ctx := context.Background()
+       err := fm.RemoveFinalizer(ctx, seataServer, SeataFinalizerName)
+
+       if err == nil {
+               t.Error("Expected error when updating non-existent object")
+       }
+}
+
 func createTestScheme() *runtime.Scheme {
        scheme := fake.NewClientBuilder().Build().Scheme()
        _ = seatav1.AddToScheme(scheme)
diff --git a/pkg/webhook/validating_webhook_test.go 
b/pkg/webhook/validating_webhook_test.go
index 9cffb35..d5466eb 100644
--- a/pkg/webhook/validating_webhook_test.go
+++ b/pkg/webhook/validating_webhook_test.go
@@ -18,11 +18,18 @@
 package webhook
 
 import (
+       "bytes"
+       "encoding/json"
+       "net/http"
+       "net/http/httptest"
        "testing"
 
+       admissionv1 "k8s.io/api/admission/v1"
        apiv1 "k8s.io/api/core/v1"
        "k8s.io/apimachinery/pkg/api/resource"
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+       "k8s.io/apimachinery/pkg/runtime"
+       "k8s.io/apimachinery/pkg/runtime/serializer"
 
        seatav1 "github.com/apache/seata-k8s/api/v1"
 )
@@ -400,6 +407,209 @@ func TestValidateResourceQuantity(t *testing.T) {
        }
 }
 
+func TestNewValidatingWebhookHandler(t *testing.T) {
+       scheme := runtime.NewScheme()
+       _ = seatav1.AddToScheme(scheme)
+       _ = apiv1.AddToScheme(scheme)
+       
+       codecs := serializer.NewCodecFactory(scheme)
+       decoder := codecs.UniversalDeserializer()
+
+       handler := NewValidatingWebhookHandler(decoder)
+
+       if handler == nil {
+               t.Fatal("NewValidatingWebhookHandler returned nil")
+       }
+
+       if handler.decoder == nil {
+               t.Error("decoder should not be nil")
+       }
+}
+
+func TestHandleSeataServerValidation_ValidRequest(t *testing.T) {
+       scheme := runtime.NewScheme()
+       _ = seatav1.AddToScheme(scheme)
+       _ = apiv1.AddToScheme(scheme)
+       
+       codecs := serializer.NewCodecFactory(scheme)
+       decoder := codecs.UniversalDeserializer()
+
+       handler := NewValidatingWebhookHandler(decoder)
+
+       seataServer := &seatav1.SeataServer{
+               ObjectMeta: metav1.ObjectMeta{
+                       Name:      "test-seata",
+                       Namespace: "default",
+               },
+               Spec: seatav1.SeataServerSpec{
+                       ContainerSpec: seatav1.ContainerSpec{
+                               Image: "apache/seata-server:latest",
+                       },
+                       Replicas:    3,
+                       ServiceName: "seata-server",
+                       Ports: seatav1.Ports{
+                               ServicePort: 8091,
+                               ConsolePort: 7091,
+                               RaftPort:    9091,
+                       },
+                       Persistence: seatav1.Persistence{
+                               VolumeReclaimPolicy: 
seatav1.VolumeReclaimPolicyRetain,
+                               PersistentVolumeClaimSpec: 
apiv1.PersistentVolumeClaimSpec{
+                                       Resources: apiv1.ResourceRequirements{
+                                               Requests: apiv1.ResourceList{
+                                                       apiv1.ResourceStorage: 
resource.MustParse("5Gi"),
+                                               },
+                                       },
+                               },
+                       },
+               },
+       }
+
+       seataServerJSON, _ := json.Marshal(seataServer)
+
+       admissionReview := admissionv1.AdmissionReview{
+               TypeMeta: metav1.TypeMeta{
+                       APIVersion: "admission.k8s.io/v1",
+                       Kind:       "AdmissionReview",
+               },
+               Request: &admissionv1.AdmissionRequest{
+                       UID: "test-uid",
+                       Object: runtime.RawExtension{
+                               Raw: seataServerJSON,
+                       },
+               },
+       }
+
+       body, _ := json.Marshal(admissionReview)
+       req := httptest.NewRequest(http.MethodPost, "/validate", 
bytes.NewReader(body))
+       w := httptest.NewRecorder()
+
+       handler.HandleSeataServerValidation(w, req)
+
+       if w.Code != http.StatusOK {
+               t.Errorf("expected status 200, got %d", w.Code)
+       }
+
+       var response admissionv1.AdmissionReview
+       _ = json.Unmarshal(w.Body.Bytes(), &response)
+
+       if response.Response == nil {
+               t.Fatal("response should not be nil")
+       }
+
+       if !response.Response.Allowed {
+               t.Errorf("expected allowed=true, got false with message: %s", 
response.Response.Result.Message)
+       }
+}
+
+func TestHandleSeataServerValidation_InvalidRequest(t *testing.T) {
+       scheme := runtime.NewScheme()
+       _ = seatav1.AddToScheme(scheme)
+       _ = apiv1.AddToScheme(scheme)
+       
+       codecs := serializer.NewCodecFactory(scheme)
+       decoder := codecs.UniversalDeserializer()
+
+       handler := NewValidatingWebhookHandler(decoder)
+
+       seataServer := &seatav1.SeataServer{
+               ObjectMeta: metav1.ObjectMeta{
+                       Name:      "test-seata",
+                       Namespace: "default",
+               },
+               Spec: seatav1.SeataServerSpec{
+                       ContainerSpec: seatav1.ContainerSpec{
+                               Image: "",
+                       },
+                       Replicas:    0,
+                       ServiceName: "",
+               },
+       }
+
+       seataServerJSON, _ := json.Marshal(seataServer)
+
+       admissionReview := admissionv1.AdmissionReview{
+               TypeMeta: metav1.TypeMeta{
+                       APIVersion: "admission.k8s.io/v1",
+                       Kind:       "AdmissionReview",
+               },
+               Request: &admissionv1.AdmissionRequest{
+                       UID: "test-uid",
+                       Object: runtime.RawExtension{
+                               Raw: seataServerJSON,
+                       },
+               },
+       }
+
+       body, _ := json.Marshal(admissionReview)
+       req := httptest.NewRequest(http.MethodPost, "/validate", 
bytes.NewReader(body))
+       w := httptest.NewRecorder()
+
+       handler.HandleSeataServerValidation(w, req)
+
+       if w.Code != http.StatusOK {
+               t.Errorf("expected status 200, got %d", w.Code)
+       }
+
+       var response admissionv1.AdmissionReview
+       _ = json.Unmarshal(w.Body.Bytes(), &response)
+
+       if response.Response == nil {
+               t.Fatal("response should not be nil")
+       }
+
+       if response.Response.Allowed {
+               t.Error("expected allowed=false for invalid SeataServer")
+       }
+}
+
+func TestHandleSeataServerValidation_InvalidJSON(t *testing.T) {
+       scheme := runtime.NewScheme()
+       _ = seatav1.AddToScheme(scheme)
+       
+       codecs := serializer.NewCodecFactory(scheme)
+       decoder := codecs.UniversalDeserializer()
+
+       handler := NewValidatingWebhookHandler(decoder)
+
+       req := httptest.NewRequest(http.MethodPost, "/validate", 
bytes.NewReader([]byte("invalid json")))
+       w := httptest.NewRecorder()
+
+       handler.HandleSeataServerValidation(w, req)
+
+       if w.Code != http.StatusBadRequest {
+               t.Errorf("expected status 400, got %d", w.Code)
+       }
+}
+
+func TestHandleSeataServerValidation_NilRequest(t *testing.T) {
+       scheme := runtime.NewScheme()
+       _ = seatav1.AddToScheme(scheme)
+       
+       codecs := serializer.NewCodecFactory(scheme)
+       decoder := codecs.UniversalDeserializer()
+
+       handler := NewValidatingWebhookHandler(decoder)
+
+       admissionReview := admissionv1.AdmissionReview{
+               TypeMeta: metav1.TypeMeta{
+                       APIVersion: "admission.k8s.io/v1",
+                       Kind:       "AdmissionReview",
+               },
+               Request: nil,
+       }
+
+       body, _ := json.Marshal(admissionReview)
+       req := httptest.NewRequest(http.MethodPost, "/validate", 
bytes.NewReader(body))
+       w := httptest.NewRecorder()
+
+       handler.HandleSeataServerValidation(w, req)
+
+       if w.Code != http.StatusBadRequest {
+               t.Errorf("expected status 400, got %d", w.Code)
+       }
+}
+
 func TestValidateSeataServer(t *testing.T) {
        testCases := []struct {
                name   string


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to