package rcuquota

import (
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
	"go.uber.org/mock/gomock"

	globalcommonv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/common/v1"
	globalngv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/entity"
	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/repository/rcuquota/mock_rcuquota"
)

func TestListOrgRcuQuotasIncludesAllNextgenPlans(t *testing.T) {
	ctx := t.Context()
	ctrl := gomock.NewController(t)
	repo := mock_rcuquota.NewMockRepo(ctrl)
	svc := &serviceImpl{rcuQuotaRepo: repo}
	orgID := uint64(123)

	for _, plan := range []globalcommonv1.ServicePlan{
		globalcommonv1.ServicePlan_Premium,
		globalcommonv1.ServicePlan_BYOC,
		globalcommonv1.ServicePlan_Premium_Reserved,
		globalcommonv1.ServicePlan_Essential_V2,
	} {
		repo.EXPECT().Load(gomock.Any(), orgID, plan.String()).Return(&entity.RcuQuota{
			OrganizationId: orgID,
			ServicePlan:    plan,
		}, nil)
	}

	quotas, err := svc.ListOrgRcuQuotas(ctx, &globalngv1.ListOrgRcuQuotasRequest{
		OrganizationId: orgID,
	})

	require.Nil(t, err)
	require.Len(t, quotas, 4)
	assert.Equal(t, globalcommonv1.ServicePlan_Premium, quotas[0].GetServicePlan())
	assert.Equal(t, globalcommonv1.ServicePlan_BYOC, quotas[1].GetServicePlan())
	assert.Equal(t, globalcommonv1.ServicePlan_Premium_Reserved, quotas[2].GetServicePlan())
	assert.Equal(t, globalcommonv1.ServicePlan_Essential_V2, quotas[3].GetServicePlan())
}
