veylant/internal/metrics/middleware_test.go
2026-02-23 13:35:04 +01:00

74 lines
2.2 KiB
Go

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)
}