56 lines
1.2 KiB
Go
56 lines
1.2 KiB
Go
package main
|
|
|
|
import (
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/FernandoVideira/LK_API_Temp/internal/ratelimiter"
|
|
)
|
|
|
|
func TestRateLimiterMiddleware(t *testing.T) {
|
|
cfg := config{
|
|
rateLimiter: ratelimiter.Config{
|
|
RequestsPerTimeFrame: 10,
|
|
TimeFrame: time.Second * 5,
|
|
Enabled: true,
|
|
},
|
|
addr: ":8080",
|
|
}
|
|
|
|
api := newTestApi(t, cfg)
|
|
ts := httptest.NewServer(api.mount())
|
|
|
|
defer ts.Close()
|
|
|
|
client := ts.Client()
|
|
mockIP := "192.168.1.1"
|
|
marginOfError := 2
|
|
|
|
for i := 0; i < cfg.rateLimiter.RequestsPerTimeFrame+marginOfError; i++ {
|
|
req, err := http.NewRequest("GET", ts.URL+"/v1/health", nil)
|
|
if err != nil {
|
|
t.Fatalf("failed to create request: %v", err)
|
|
}
|
|
|
|
req.Header.Set("X-Forwarded-For", mockIP)
|
|
|
|
resp, err := client.Do(req)
|
|
if err != nil {
|
|
t.Fatalf("failed to send request: %v", err)
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
if i < cfg.rateLimiter.RequestsPerTimeFrame {
|
|
if resp.StatusCode != http.StatusOK {
|
|
t.Fatalf("expected status code %d, got %d", http.StatusOK, resp.StatusCode)
|
|
}
|
|
} else {
|
|
if resp.StatusCode != http.StatusTooManyRequests {
|
|
t.Fatalf("expected status code %d, got %d", http.StatusTooManyRequests, resp.StatusCode)
|
|
}
|
|
}
|
|
}
|
|
}
|