package gc

import (
	"context"
	"testing"
	"time"

	"github.com/go-logr/logr"
	"github.com/stretchr/testify/assert"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/config"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"sigs.k8s.io/controller-runtime/pkg/client/fake"
)

var fakeGCConfig = config.GCConfig{
	CheckIdleInterval: metav1.Duration{Duration: 10 * time.Second},
	IdleTimeThreshold: metav1.Duration{Duration: 10 * time.Second},
	IdleTimeRetention: metav1.Duration{Duration: 10 * time.Second},
}

func TestNewGC(t *testing.T) {
	cli := fake.NewClientBuilder().Build()
	log := logr.Discard()
	gc := NewGC(fakeGCConfig, cli, log)
	assert.NotNil(t, gc)
}

func TestGC_Run(t *testing.T) {
	cli := fake.NewClientBuilder().Build()
	log := logr.Discard()

	gc := NewGC(fakeGCConfig, cli, log)

	ctx, cancel := context.WithCancel(context.Background())
	go func() {
		time.Sleep(2 * time.Second)
		cancel()
	}()

	gc.Run(ctx)
	assert.ErrorIs(t, ctx.Err(), context.Canceled)
}
