You've already forked agentic-coding-workflow
feat(http/mw): structured request logger middleware
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
package middleware
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"log/slog"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestLogger_LogsRequest(t *testing.T) {
|
||||
var buf bytes.Buffer
|
||||
log := slog.New(slog.NewJSONHandler(&buf, nil))
|
||||
|
||||
chain := RequestID(Logger(log)(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
|
||||
w.WriteHeader(http.StatusNoContent)
|
||||
})))
|
||||
|
||||
rec := httptest.NewRecorder()
|
||||
chain.ServeHTTP(rec, httptest.NewRequest("GET", "/x", nil))
|
||||
|
||||
var line map[string]any
|
||||
require.NoError(t, json.Unmarshal(buf.Bytes(), &line))
|
||||
require.Equal(t, "http", line["msg"])
|
||||
require.Equal(t, "/x", line["path"])
|
||||
require.Equal(t, "GET", line["method"])
|
||||
require.EqualValues(t, http.StatusNoContent, line["status"])
|
||||
require.NotEmpty(t, line["request_id"])
|
||||
}
|
||||
|
||||
func TestLogger_DefaultStatus200(t *testing.T) {
|
||||
var buf bytes.Buffer
|
||||
log := slog.New(slog.NewJSONHandler(&buf, nil))
|
||||
|
||||
h := Logger(log)(http.HandlerFunc(func(_ http.ResponseWriter, _ *http.Request) {
|
||||
// Handler writes nothing — status should default to 200.
|
||||
}))
|
||||
|
||||
rec := httptest.NewRecorder()
|
||||
h.ServeHTTP(rec, httptest.NewRequest("GET", "/y", nil))
|
||||
|
||||
var line map[string]any
|
||||
require.NoError(t, json.Unmarshal(buf.Bytes(), &line))
|
||||
require.EqualValues(t, http.StatusOK, line["status"])
|
||||
}
|
||||
Reference in New Issue
Block a user