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_UnlockIfNeed(t *testing.T) {
	tests := []struct {
		name string
		cm   *corev1.ConfigMap
	}{
		{
			name: "UnlockIfNeed",
			cm: &corev1.ConfigMap{
				ObjectMeta: metav1.ObjectMeta{
					Name:      types.TidbServerPodTemplateCm,
					Namespace: "tidb-pool",
					Annotations: map[string]string{
						types.AnnoTidbScalerLock: "true",
					},
				},
			},
		},
	}
	for _, tt := range tests {
		g := NewGomegaWithT(t)
		t.Run(tt.name, func(t *testing.T) {
			ts := &TidbScaler{
				client: fake.NewClientBuilder().WithScheme(scheme.Scheme).WithRuntimeObjects(tt.cm).Build(),
				pool:   &clientfake.FakeTidbPool{PoolNamespace: "tidb-pool"},
			}
			ts.UnlockIfNeed()

			tidbServerPodTemplateCm := &corev1.ConfigMap{}
			g.Expect(ts.client.Get(context.Background(), client.ObjectKeyFromObject(tt.cm), tidbServerPodTemplateCm)).
				To(Succeed())
			g.Expect(tidbServerPodTemplateCm.Annotations).NotTo(HaveKey(types.AnnoTidbScalerLock))
		})
	}
}
