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]