Files
story/internal/ratelimit/limiter_integration_test.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)
}
}