package namespace_test

import (
	"context"
	"testing"

	"github.com/stretchr/testify/require"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/resourcemanager/namespace"
	corev1 "k8s.io/api/core/v1"
	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/runtime"
	"sigs.k8s.io/controller-runtime/pkg/client"
	"sigs.k8s.io/controller-runtime/pkg/client/fake"
)

func TestNamespaceReader(t *testing.T) {
	ctx := context.Background()
	s := runtime.NewScheme()
	require.Nil(t, corev1.SchemeBuilder.AddToScheme(s))
	foo := &corev1.Namespace{
		ObjectMeta: v1.ObjectMeta{Name: "foo"},
	}
	kubeClient := fake.NewClientBuilder().WithScheme(s).WithObjects(foo).WithStatusSubresource(foo).Build()
	reader := namespace.NewNamespaceReader(kubeClient)
	{
		l := new(corev1.NamespaceList)
		require.Nil(t, reader.List(ctx, l))
	}
	{
		ns := new(corev1.Namespace)
		ns.Name = "foo"
		require.Nil(t, reader.Get(ctx, client.ObjectKeyFromObject(ns), ns))
	}
}

func TestNamespaceWriter(t *testing.T) {
	ctx := context.Background()
	s := runtime.NewScheme()
	require.Nil(t, corev1.SchemeBuilder.AddToScheme(s))
	kubeClient := fake.NewClientBuilder().WithScheme(s).Build()
	writer := namespace.NewNamespaceWriter(kubeClient)
	{
		foo := new(corev1.Namespace)
		foo.Name = "foo"
		require.Nil(t, writer.Create(ctx, foo))
	}
	{
		foo := new(corev1.Namespace)
		foo.Name = "foo"
		foo.Annotations = map[string]string{}
		foo.Annotations["foo"] = "foo"
		require.Nil(t, writer.Update(ctx, foo))
	}
	{
		foo := new(corev1.Namespace)
		foo.Name = "foo"
		foo.Status.Phase = corev1.NamespaceActive
		require.Nil(t, writer.UpdateStatus(ctx, foo))
	}
	{
		foo := new(corev1.Namespace)
		foo.Name = "foo"
		require.Nil(t, writer.Delete(ctx, foo))
	}
}
