package middleware

import (
	"net/http"
	"net/http/httptest"
	"testing"

	"github.com/gin-gonic/gin"
)

func TestRateLimiterLimitsByClientIPAndBypassesHealth(t *testing.T) {
	gin.SetMode(gin.TestMode)
	limiter := NewRateLimiter(1, 1)
	router := gin.New()
	router.Use(limiter.Middleware())
	router.GET("/health", func(c *gin.Context) { c.Status(http.StatusNoContent) })
	router.GET("/api", func(c *gin.Context) { c.Status(http.StatusNoContent) })

	req1 := httptest.NewRequest(http.MethodGet, "/api", nil)
	req1.RemoteAddr = "198.51.100.10:1234"
	rec1 := httptest.NewRecorder()
	router.ServeHTTP(rec1, req1)
	if rec1.Code != http.StatusNoContent {
		t.Fatalf("first request status = %d, want %d", rec1.Code, http.StatusNoContent)
	}

	req2 := httptest.NewRequest(http.MethodGet, "/api", nil)
	req2.RemoteAddr = "198.51.100.10:1235"
	rec2 := httptest.NewRecorder()
	router.ServeHTTP(rec2, req2)
	if rec2.Code != http.StatusTooManyRequests {
		t.Fatalf("second request status = %d, want %d", rec2.Code, http.StatusTooManyRequests)
	}

	reqHealth := httptest.NewRequest(http.MethodGet, "/health", nil)
	reqHealth.RemoteAddr = "198.51.100.10:1236"
	recHealth := httptest.NewRecorder()
	router.ServeHTTP(recHealth, reqHealth)
	if recHealth.Code != http.StatusNoContent {
		t.Fatalf("health request status = %d, want %d", recHealth.Code, http.StatusNoContent)
	}
}
