package k8s import ( "context" "testing" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" fakedynamic "k8s.io/client-go/dynamic/fake" "k8s.io/client-go/kubernetes/fake" ) func TestEnsureNamespace(t *testing.T) { t.Run("creates_new_namespace", func(t *testing.T) { client := NewClientWithClientset(fake.NewSimpleClientset(), fakedynamic.NewSimpleDynamicClient(runtime.NewScheme()), testCfg) ctx := context.Background() err := client.EnsureNamespace(ctx, "alice") if err != nil { t.Fatalf("unexpected error: %v", err) } ns, err := client.Clientset.CoreV1().Namespaces().Get(ctx, "dev-alice", metav1.GetOptions{}) if err != nil { t.Fatalf("failed to get namespace: %v", err) } if ns.Name != "dev-alice" { t.Errorf("expected namespace dev-alice, got %s", ns.Name) } if ns.Labels["app"] != "dev-pod" { t.Errorf("expected label app=dev-pod, got %s", ns.Labels["app"]) } if ns.Labels["managed-by"] != "dev-pod-api" { t.Errorf("expected label managed-by=dev-pod-api, got %s", ns.Labels["managed-by"]) } if ns.Labels["user"] != "alice" { t.Errorf("expected label user=alice, got %s", ns.Labels["user"]) } }) t.Run("idempotent_on_existing_namespace", func(t *testing.T) { client := NewClientWithClientset(fake.NewSimpleClientset(), fakedynamic.NewSimpleDynamicClient(runtime.NewScheme()), testCfg) ctx := context.Background() // Create twice - second call should not error err := client.EnsureNamespace(ctx, "bob") if err != nil { t.Fatalf("first create failed: %v", err) } err = client.EnsureNamespace(ctx, "bob") if err != nil { t.Fatalf("second create should be idempotent, got: %v", err) } }) } func TestDeleteNamespace(t *testing.T) { t.Run("deletes_existing_namespace", func(t *testing.T) { client := NewClientWithClientset(fake.NewSimpleClientset(), fakedynamic.NewSimpleDynamicClient(runtime.NewScheme()), testCfg) ctx := context.Background() err := client.EnsureNamespace(ctx, "alice") if err != nil { t.Fatalf("setup failed: %v", err) } err = client.DeleteNamespace(ctx, "alice") if err != nil { t.Fatalf("delete failed: %v", err) } _, err = client.Clientset.CoreV1().Namespaces().Get(ctx, "dev-alice", metav1.GetOptions{}) if err == nil { t.Error("expected namespace to be deleted") } }) t.Run("no_error_on_nonexistent_namespace", func(t *testing.T) { client := NewClientWithClientset(fake.NewSimpleClientset(), fakedynamic.NewSimpleDynamicClient(runtime.NewScheme()), testCfg) ctx := context.Background() err := client.DeleteNamespace(ctx, "nonexistent") if err != nil { t.Fatalf("expected no error for nonexistent namespace, got: %v", err) } }) }