dev-pod-api-build/internal/k8s/namespace_test.go
2026-04-16 04:16:36 +00:00

87 lines
2.7 KiB
Go

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)
}
})
}