package ratelimit import ( "context" "fmt" "os" "testing" "time" "github.com/redis/go-redis/v9" ) func TestLimiterEnforcesBurstAndRefills(t *testing.T) { redisAddr := os.Getenv("TEST_REDIS_ADDR") if redisAddr == "" { t.Skip("TEST_REDIS_ADDR is not set") } client := redis.NewClient(&redis.Options{Addr: redisAddr}) defer func() { _ = client.Close() }() limiter, err := New(client, "integration", Policy{RatePerSecond: 10, Burst: 2}) if err != nil { t.Fatal(err) } identifier := fmt.Sprintf("test-%d", time.Now().UnixNano()) for attempt := 0; attempt < 2; attempt++ { result, err := limiter.Allow(context.Background(), "user", identifier) if err != nil || !result.Allowed { t.Fatalf("attempt %d result=%#v err=%v", attempt, result, err) } } limited, err := limiter.Allow(context.Background(), "user", identifier) if err != nil || limited.Allowed || limited.RetryAfter <= 0 { t.Fatalf("limited result=%#v err=%v", limited, err) } time.Sleep(150 * time.Millisecond) refilled, err := limiter.Allow(context.Background(), "user", identifier) if err != nil || !refilled.Allowed { t.Fatalf("refilled result=%#v err=%v", refilled, err) } }