package infra import ( "strconv" "testing" "time" ) func TestRateLimitHeaders(t *testing.T) { now := time.Now() t.Run("setea X-RateLimit-Limit con el burst", func(t *testing.T) { result := RateLimitResult{Allowed: true, Remaining: 5, ResetAt: now} h := RateLimitHeaders(result, 20) if h.Get("X-RateLimit-Limit") != "20" { t.Errorf("X-RateLimit-Limit=%q, want 20", h.Get("X-RateLimit-Limit")) } }) t.Run("setea X-RateLimit-Remaining con result.Remaining", func(t *testing.T) { result := RateLimitResult{Allowed: true, Remaining: 7, ResetAt: now} h := RateLimitHeaders(result, 10) if h.Get("X-RateLimit-Remaining") != "7" { t.Errorf("X-RateLimit-Remaining=%q, want 7", h.Get("X-RateLimit-Remaining")) } }) t.Run("setea X-RateLimit-Reset como timestamp unix", func(t *testing.T) { future := now.Add(30 * time.Second) result := RateLimitResult{Allowed: true, Remaining: 1, ResetAt: future} h := RateLimitHeaders(result, 10) got := h.Get("X-RateLimit-Reset") want := strconv.FormatInt(future.Unix(), 10) if got != want { t.Errorf("X-RateLimit-Reset=%q, want %q", got, want) } }) t.Run("incluye Retry-After cuando no esta permitido", func(t *testing.T) { result := RateLimitResult{Allowed: false, Remaining: 0, ResetAt: now, RetryAfter: 2.3} h := RateLimitHeaders(result, 10) if h.Get("Retry-After") == "" { t.Fatal("Retry-After deberia estar seteado") } // Debe redondear hacia arriba ra, _ := strconv.Atoi(h.Get("Retry-After")) if ra != 3 { t.Errorf("Retry-After=%d, want 3 (ceil de 2.3)", ra) } }) t.Run("Retry-After minimo es 1", func(t *testing.T) { result := RateLimitResult{Allowed: false, Remaining: 0, ResetAt: now, RetryAfter: 0.1} h := RateLimitHeaders(result, 10) if h.Get("Retry-After") != "1" { t.Errorf("Retry-After=%q, want 1 (minimo)", h.Get("Retry-After")) } }) t.Run("no incluye Retry-After cuando esta permitido", func(t *testing.T) { result := RateLimitResult{Allowed: true, Remaining: 5, ResetAt: now} h := RateLimitHeaders(result, 10) if h.Get("Retry-After") != "" { t.Errorf("Retry-After=%q, want vacio", h.Get("Retry-After")) } }) }