package subscriber

import (
	"context"
	"testing"

	. "github.com/onsi/gomega"
	core_event "github.com/tidbcloud/core-svc/event"
	"github.com/tidbcloud/serverless-service/internal/domain/facade/mock_facade"
	"github.com/tidbcloud/serverless-service/internal/domain/repo/mock_repo"
	"github.com/tidbcloud/serverless-service/internal/domain/service/mock_service"
	"github.com/tidbcloud/serverless-service/internal/service/event_svc"
	"go.uber.org/mock/gomock"
)

func TestBranchClusterEventHandler(t *testing.T) {
	g := NewGomegaWithT(t)
	ctrl := gomock.NewController(t)
	defer ctrl.Finish()

	branchRepo := mock_repo.NewMockBranchRepo(ctrl)
	infraFacade := mock_facade.NewMockInfraFacade(ctrl)
	branchSvc := mock_service.NewMockBranchService(ctrl)
	mgmtFacade := mock_facade.NewMockMgmtSvcFacade(ctrl)
	svc := event_svc.NewBranchSyncEventService(branchRepo, infraFacade, branchSvc, mgmtFacade)
	handler := NewBranchClusterEventHandler(svc)

	{
		event := &core_event.ClusterEvent{IsDevTier: false}
		g.Expect(handler.Handle(context.Background(), event)).To(Succeed())
	}
	{
		event := &core_event.ClusterEvent{
			ClusterID: 1,
			TenantID:  101,
			ProjectID: 1001,
			IsDevTier: true,
			EventType: core_event.ClusterEventTypeDeleted,
		}
		branchSvc.EXPECT().DeleteBranchByClusterId(gomock.Any(), "1", uint64(0)).Return(nil)

		g.Expect(handler.Handle(context.Background(), event)).To(Succeed())
	}
}
