package tidbscaler

import (
	"context"
	"testing"

	. "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"
)

func TestTidbScaler_Lock(t *testing.T) {
	tests := []struct {
		name string
		cm   *corev1.ConfigMap
	}{
		{
			name: "Lock",
			cm: &corev1.ConfigMap{
				ObjectMeta: metav1.ObjectMeta{Name: types.TidbServerPodTemplateCm, Namespace: "tidb-pool"},
			},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			g := NewGomegaWithT(t)
			ts := &TidbScaler{
				client: fake.NewClientBuilder().WithScheme(scheme.Scheme).WithRuntimeObjects(tt.cm).Build(),
				pool:   &clientfake.FakeTidbPool{PoolNamespace: "tidb-pool"},
			}
			ts.Lock()

			tidbServerPodTemplateCm := &corev1.ConfigMap{}
			g.Expect(ts.client.Get(context.Background(), client.ObjectKeyFromObject(tt.cm), tidbServerPodTemplateCm)).
				To(Succeed())
			g.Expect(tidbServerPodTemplateCm.Annotations[types.AnnoTidbScalerLock]).To(Equal("true"))
		})
	}
}
