package metrics_test import ( "net/http" "net/http/httptest" "testing" "github.com/stretchr/testify/assert" "github.com/veylant/ia-gateway/internal/metrics" ) func TestMiddleware_RecordsSuccessfulRequest(t *testing.T) { next := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusOK) }) req := httptest.NewRequest(http.MethodPost, "/v1/chat/completions", nil) rec := httptest.NewRecorder() // The middleware should not panic and should call next. metrics.Middleware("openai")(next).ServeHTTP(rec, req) assert.Equal(t, http.StatusOK, rec.Code) } func TestMiddleware_RecordsErrorRequest(t *testing.T) { next := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusUnauthorized) }) req := httptest.NewRequest(http.MethodPost, "/v1/chat/completions", nil) rec := httptest.NewRecorder() metrics.Middleware("openai")(next).ServeHTTP(rec, req) assert.Equal(t, http.StatusUnauthorized, rec.Code) } func TestMiddleware_DefaultStatus200WhenWriteHeaderNotCalled(t *testing.T) { next := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { // Deliberately do NOT call WriteHeader — Go defaults to 200. _, _ = w.Write([]byte("ok")) }) req := httptest.NewRequest(http.MethodGet, "/healthz", nil) rec := httptest.NewRecorder() metrics.Middleware("openai")(next).ServeHTTP(rec, req) assert.Equal(t, http.StatusOK, rec.Code) } func TestMiddleware_RateLimitError(t *testing.T) { next := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusTooManyRequests) }) req := httptest.NewRequest(http.MethodPost, "/v1/chat/completions", nil) rec := httptest.NewRecorder() metrics.Middleware("openai")(next).ServeHTTP(rec, req) assert.Equal(t, http.StatusTooManyRequests, rec.Code) } func TestMiddleware_ServerError(t *testing.T) { next := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusInternalServerError) }) req := httptest.NewRequest(http.MethodPost, "/v1/chat/completions", nil) rec := httptest.NewRecorder() metrics.Middleware("openai")(next).ServeHTTP(rec, req) assert.Equal(t, http.StatusInternalServerError, rec.Code) }