41 lines
1.1 KiB
Go
41 lines
1.1 KiB
Go
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)
|
|
}
|
|
}
|