package cluster_svc

import (
	"context"
	"testing"
	"time"

	. "github.com/smartystreets/goconvey/convey"
	"github.com/tidbcloud/pkgv2/bizerr"
	"github.com/tidbcloud/serverless-service/internal/domain/facade/mock_facade"
	"github.com/tidbcloud/serverless-service/internal/domain/repo/mock_repo"
	"go.uber.org/mock/gomock"
)

func Test_CleanupTidbPoolService_Execute(t *testing.T) {
	ctx := context.Background()
	ctrl := gomock.NewController(t)
	defer ctrl.Finish()
	timeFacade := mock_facade.NewMockTimeFacade(ctrl)
	clusterTidbPoolRepo := mock_repo.NewMockClusterTidbPoolRepo(ctrl)
	svc := NewCleanupTidbPoolService(timeFacade, clusterTidbPoolRepo)
	now := time.Now()

	Convey("Test_Execute", t, func() {
		Convey("should succeed", func() {
			timeFacade.EXPECT().Now().Return(now)
			clusterTidbPoolRepo.EXPECT().CleanUp(gomock.Any(), gomock.Any(), gomock.Any()).
				DoAndReturn(func(ctx context.Context, deleteBefore time.Time, limit int) error {
					So(deleteBefore, ShouldEqual, now.Add(-ExpireDuration))
					So(limit, ShouldEqual, CleanUpLimit)
					return nil
				})
			So(svc.Execute(ctx), ShouldBeNil)
		})

		Convey("should return err if failed", func() {
			err := bizerr.New(bizerr.ErrCodeDB, "failed to clean up")
			timeFacade.EXPECT().Now().Return(now)
			clusterTidbPoolRepo.EXPECT().CleanUp(gomock.Any(), gomock.Any(), gomock.Any()).
				DoAndReturn(func(ctx context.Context, deleteBefore time.Time, limit int) error {
					So(deleteBefore, ShouldEqual, now.Add(-ExpireDuration))
					So(limit, ShouldEqual, CleanUpLimit)
					return err
				})
			So(svc.Execute(ctx), ShouldEqual, err)
		})
	})
}
