package handler

import (
	"context"
	"testing"
	"time"

	"github.com/stretchr/testify/require"
)

// ---------------------------------------------------------------------------
// sleepAntigravitySingleAccountBackoff 测试
// ---------------------------------------------------------------------------

func TestSleepAntigravitySingleAccountBackoff_ReturnsTrue(t *testing.T) {
	ctx := context.Background()
	start := time.Now()
	ok := sleepAntigravitySingleAccountBackoff(ctx, 1)
	elapsed := time.Since(start)

	require.True(t, ok, "should return true when context is not canceled")
	// 固定延迟 2s
	require.GreaterOrEqual(t, elapsed, 1500*time.Millisecond, "should wait approximately 2s")
	require.Less(t, elapsed, 5*time.Second, "should not wait too long")
}

func TestSleepAntigravitySingleAccountBackoff_ContextCanceled(t *testing.T) {
	ctx, cancel := context.WithCancel(context.Background())
	cancel() // 立即取消

	start := time.Now()
	ok := sleepAntigravitySingleAccountBackoff(ctx, 1)
	elapsed := time.Since(start)

	require.False(t, ok, "should return false when context is canceled")
	require.Less(t, elapsed, 500*time.Millisecond, "should return immediately on cancel")
}

func TestSleepAntigravitySingleAccountBackoff_FixedDelay(t *testing.T) {
	// 验证不同 retryCount 都使用固定 2s 延迟
	ctx := context.Background()

	start := time.Now()
	ok := sleepAntigravitySingleAccountBackoff(ctx, 5)
	elapsed := time.Since(start)

	require.True(t, ok)
	// 即使 retryCount=5，延迟仍然是固定的 2s
	require.GreaterOrEqual(t, elapsed, 1500*time.Millisecond)
	require.Less(t, elapsed, 5*time.Second)
}
