package subscriber

import (
	"context"
	"testing"

	. "github.com/onsi/gomega"
	eb_event "github.com/tidbcloud/eventbus-datastruct/event"
	"github.com/tidbcloud/serverless-service/internal/domain/repo/mock_repo"
	"github.com/tidbcloud/serverless-service/internal/service/event_svc"
	"go.uber.org/mock/gomock"
)

func TestSpendLimitEventHandler(t *testing.T) {
	g := NewGomegaWithT(t)
	ctrl := gomock.NewController(t)
	defer ctrl.Finish()
	clusterTidbPoolRepo := mock_repo.NewMockClusterTidbPoolRepo(ctrl)
	svc := event_svc.NewSpendLimitService(clusterTidbPoolRepo)
	handler := NewSpendLimitEventHandler(svc)

	{
		event := &eb_event.SpendLimitEvent{RangeType: "project"}
		g.Expect(handler.Handle(context.Background(), event)).To(Succeed())

		event = &eb_event.SpendLimitEvent{RangeID: 0}
		g.Expect(handler.Handle(context.Background(), event)).To(Succeed())

		event = &eb_event.SpendLimitEvent{Status: "unknown"}
		g.Expect(handler.Handle(context.Background(), event)).To(Succeed())

		event = &eb_event.SpendLimitEvent{
			TenantID:  101,
			RangeID:   1,
			RangeType: "cluster",
			Status:    "excessive",
			BizType:   "other_cluster",
		}
		g.Expect(handler.Handle(context.Background(), event)).To(Succeed())
	}
	{
		event := &eb_event.SpendLimitEvent{
			TenantID:  101,
			RangeID:   1,
			RangeType: "cluster",
			Status:    "excessive",
			BizType:   "serverless_cluster",
		}

		clusterTidbPoolRepo.EXPECT().Save(gomock.Any(), gomock.Any()).Return(nil)
		g.Expect(handler.Handle(context.Background(), event)).To(Succeed())
	}
}
