//go:build unit || all
// +build unit all

package common

import (
	"testing"

	"github.com/onsi/gomega"
	"k8s.io/apimachinery/pkg/api/resource"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

	apiv1 "github.com/tidbcloud/eks-provider/api/v1alpha1"
	"github.com/tidbcloud/eks-provider/controllers/dm/task"
	"github.com/tidbcloud/infra-provider/pkg/config"
	"github.com/tidbcloud/infra-provider/pkg/namer"
)

func TestDescribeDMClusterBuildsDeterministicNodeSelector(t *testing.T) {
	g := gomega.NewWithT(t)

	dmTask := &DMCluster{
		BaseTask: &task.BaseTask{
			Context: &task.Context{
				Namer: namer.NewNamer().WithClusterName("cluster-1").WithTiDBNamespace("tc-cluster-1"),
				Config: config.RootConfig{
					ControllerConfig: config.ControllerConfig{
						Provider: "aws",
						Network: config.NetworkConfig{
							Region: "us-west-2",
						},
					},
				},
				TenantID:  "tenant-1",
				ProjectID: "project-1",
				DMJob: &apiv1.DMJob{
					ObjectMeta: metav1.ObjectMeta{
						Name:      "dmjob-1",
						Namespace: "tenant-ns",
						Labels:    map[string]string{},
					},
					Spec: apiv1.DMJobSpec{
						ClusterName: "cluster-1",
					},
				},
				DMMasterSpec: &apiv1.DMSpec{
					SpecCode:       "master-spec",
					InstanceNumber: 1,
					StorageClass: apiv1.DMStorageClass{
						Name: "gp3",
					},
					StorageSize: resource.MustParse("100Gi"),
				},
				DMWorkerSpec: &apiv1.DMSpec{
					SpecCode:       "worker-spec",
					InstanceNumber: 1,
					StorageClass: apiv1.DMStorageClass{
						Name: "gp3",
					},
					StorageSize: resource.MustParse("200Gi"),
				},
				MasterImage: "pingcap/dm-master:v8.5.0",
				WorkerImage: "pingcap/dm-worker:v8.5.0",
			},
		},
	}

	dmCluster, err := dmTask.describeDMCluster()
	g.Expect(err).NotTo(gomega.HaveOccurred())

	masterSelector := dmCluster.Spec.Master.ComponentSpec.NodeSelector
	workerSelector := dmCluster.Spec.Worker.ComponentSpec.NodeSelector

	g.Expect(masterSelector).NotTo(gomega.BeEmpty())
	g.Expect(workerSelector).NotTo(gomega.BeEmpty())

	g.Expect(masterSelector).To(gomega.HaveKeyWithValue(namer.DMMemberSpecLabelKey, "master-spec"))
	g.Expect(masterSelector).To(gomega.HaveKeyWithValue(namer.DMJobNameLabelKey, "dmjob-1"))
	g.Expect(workerSelector).To(gomega.HaveKeyWithValue(namer.DMMemberSpecLabelKey, "worker-spec"))
	g.Expect(workerSelector).To(gomega.HaveKeyWithValue(namer.DMJobNameLabelKey, "dmjob-1"))

	g.Expect(masterSelector).To(gomega.Equal(dmTask.GetMasterNodeLabels()))
	g.Expect(workerSelector).To(gomega.Equal(dmTask.GetWorkerNodeLabels()))
}
