package tidbscaler

import (
	"context"
	"testing"

	"github.com/go-logr/logr"
	. "github.com/onsi/gomega"
	"github.com/tidbcloud/aws-shared-provider/pkg/scheme"
	"github.com/tidbcloud/aws-shared-provider/pkg/types"
	"github.com/tidbcloud/aws-shared-provider/pkg/utils/clientfake"
	corev1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"sigs.k8s.io/controller-runtime/pkg/client"
	"sigs.k8s.io/controller-runtime/pkg/client/fake"
	"sigs.k8s.io/controller-runtime/pkg/log"
)

func TestTidbScaler_Expand(t *testing.T) {
	revision := "1234567"
	tests := []struct {
		name    string
		tidbPod *corev1.Pod
		step    int
	}{
		{
			name: "expand",
			tidbPod: &corev1.Pod{
				ObjectMeta: metav1.ObjectMeta{
					GenerateName: types.TidbServerNamePrefix + revision + "-",
					Namespace:    "tidb-pool",
				},
			},
			step: 3,
		},
	}
	for _, tt := range tests {
		g := NewGomegaWithT(t)
		t.Run(tt.name, func(t *testing.T) {
			kubeClient := fake.NewClientBuilder().WithScheme(scheme.Scheme).Build()

			fakeTidbPool := &clientfake.FakeTidbPool{
				TidbPod:       tt.tidbPod,
				PoolNamespace: "tidb-pool",
			}

			fakeTManager := &clientfake.FakeTidbManager{
				TidbPool: fakeTidbPool,
				TryCreatePodFn: func(ctx context.Context, pod *corev1.Pod) error {
					return kubeClient.Create(ctx, pod)
				},
			}

			ts := &TidbScaler{
				Logger:            logr.New(log.NullLogSink{}),
				tidbPoolNamespace: tt.tidbPod.Namespace,
				client:            kubeClient,
				tManager:          fakeTManager,
			}
			g.Expect(ts.Expand(tt.step)).To(Equal(tt.step))

			pods := &corev1.PodList{}
			g.Expect(ts.client.List(context.Background(), pods, client.InNamespace(ts.tidbPoolNamespace))).To(Succeed())
			g.Expect(len(pods.Items)).To(Equal(tt.step))
			for _, po := range pods.Items {
				g.Expect(po.Name).To(HavePrefix(tt.tidbPod.GenerateName))
			}
		})
	}
}
