| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- package ratelimit
- import (
- "context"
- "testing"
- "time"
- "git3.techno-world.net/lrosales/broad-announce/internal/store"
- )
- func newRedis(t *testing.T) *store.Redis {
- t.Helper()
- r, err := store.ConnectRedis(context.Background(), "redis://localhost:6379/0")
- if err != nil {
- t.Skipf("redis not available: %v", err)
- }
- return r
- }
- func TestAllow_UnderCap(t *testing.T) {
- r := newRedis(t)
- l := New(r.Client)
- for i := 0; i < 5; i++ {
- ok, _, err := l.Allow(context.Background(), "test-under-"+time.Now().Format(time.RFC3339Nano), 100)
- if err != nil {
- t.Fatal(err)
- }
- if !ok {
- t.Fatalf("denied at i=%d under cap", i)
- }
- }
- }
- func TestAllow_OverCap(t *testing.T) {
- r := newRedis(t)
- l := New(r.Client)
- key := "test-over-" + time.Now().Format(time.RFC3339Nano)
- // cap=2, try 5 in one second
- for i := 0; i < 2; i++ {
- ok, _, _ := l.Allow(context.Background(), key, 2)
- if !ok {
- t.Fatalf("denied at i=%d", i)
- }
- }
- ok, ttl, _ := l.Allow(context.Background(), key, 2)
- if ok {
- t.Fatal("expected deny at i=3")
- }
- if ttl <= 0 || ttl > 2*time.Second {
- t.Fatalf("ttl out of range: %v", ttl)
- }
- }
- func TestAllow_ZeroCapIsNoOp(t *testing.T) {
- r := newRedis(t)
- l := New(r.Client)
- for i := 0; i < 1000; i++ {
- ok, _, _ := l.Allow(context.Background(), "noop", 0)
- if !ok {
- t.Fatal("zero cap must always allow")
- }
- }
- }
|