package collectors

import (
	"strings"
	"testing"

	"github.com/go-logr/logr"
	"github.com/prometheus/client_golang/prometheus/testutil"
	"github.com/stretchr/testify/require"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/runtime"
	"sigs.k8s.io/controller-runtime/pkg/client/fake"

	"github.com/tidbcloud/infra-provider/regional-server/api/v1alpha1"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/consts"
)

func TestAppBoxCollectorExportsLabelsInDescriptorOrder(t *testing.T) {
	scheme := runtime.NewScheme()
	require.NoError(t, v1alpha1.AddToScheme(scheme))

	obj := &v1alpha1.APPBox{
		ObjectMeta: metav1.ObjectMeta{
			Name: "appbox-1",
			Labels: map[string]string{
				consts.TenantLabelKey:      "tenant-1",
				consts.ServiceTypeLabelKey: "byoc",
			},
		},
		Spec: v1alpha1.APPBoxSpec{
			Region:   "us-east-1",
			Provider: "eks",
			VPCRef: &v1alpha1.Reference{
				Name: "vpc-1",
			},
		},
		Status: v1alpha1.APPBoxStatus{
			KubernetesClusterName: "dataplane-1",
			Phase:                 v1alpha1.APPBoxPhaseCreating,
		},
	}

	collector := &appBox{
		cli: fake.NewClientBuilder().WithScheme(scheme).WithObjects(obj).Build(),
		log: logr.Discard(),
	}

	expected := `
# HELP dataplane_manager_appbox_info Information about appBox CR.
# TYPE dataplane_manager_appbox_info gauge
dataplane_manager_appbox_info{dataplane="dataplane-1",name="appbox-1",paused="false",provider="eks",region="us-east-1",service_type="byoc",status="Creating",tenant_id="tenant-1",vpc="vpc-1"} 1
`
	require.NoError(t, testutil.CollectAndCompare(collector, strings.NewReader(expected), "dataplane_manager_appbox_info"))
}
