test: add TraceID, ErrorHandler, Recover middleware tests
- TestTraceID_GeneratesAndAttachesTraceID
- TestTraceID_ExtractsExistingTraceID
- TestErrorHandler_HandlesErrors
- TestRecover_HandlesPanic
Fix test to use errors.New instead of gin.Error{Err: nil}
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
package middleware
|
package middleware
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -137,3 +138,81 @@ func TestNoStoreSensitiveResponses_DoesNotAttachHeadersToNonAuthRoutes(t *testin
|
|||||||
t.Fatalf("did not expect cache-control header, got %q", got)
|
t.Fatalf("did not expect cache-control header, got %q", got)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---------- TraceID middleware ----------
|
||||||
|
|
||||||
|
func TestTraceID_GeneratesAndAttachesTraceID(t *testing.T) {
|
||||||
|
gin.SetMode(gin.TestMode)
|
||||||
|
|
||||||
|
recorder := httptest.NewRecorder()
|
||||||
|
c, _ := gin.CreateTestContext(recorder)
|
||||||
|
c.Request = httptest.NewRequest(http.MethodGet, "/api/v1/users", nil)
|
||||||
|
|
||||||
|
TraceID()(c)
|
||||||
|
|
||||||
|
traceID := c.GetString("trace_id")
|
||||||
|
if traceID == "" {
|
||||||
|
t.Fatal("expected trace_id to be set")
|
||||||
|
}
|
||||||
|
if len(traceID) < 8 {
|
||||||
|
t.Fatalf("trace_id should be reasonably long, got %q", traceID)
|
||||||
|
}
|
||||||
|
|
||||||
|
if got := recorder.Header().Get("X-Trace-ID"); got != traceID {
|
||||||
|
t.Fatalf("expected X-Trace-ID header to match trace_id, got %q", got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestTraceID_ExtractsExistingTraceID(t *testing.T) {
|
||||||
|
gin.SetMode(gin.TestMode)
|
||||||
|
|
||||||
|
existingTraceID := "existing-trace-id-12345"
|
||||||
|
recorder := httptest.NewRecorder()
|
||||||
|
c, _ := gin.CreateTestContext(recorder)
|
||||||
|
c.Request = httptest.NewRequest(http.MethodGet, "/api/v1/users", nil)
|
||||||
|
c.Request.Header.Set("X-Trace-ID", existingTraceID)
|
||||||
|
|
||||||
|
TraceID()(c)
|
||||||
|
|
||||||
|
traceID := c.GetString("trace_id")
|
||||||
|
if traceID != existingTraceID {
|
||||||
|
t.Fatalf("expected trace_id to be extracted from header, got %q", traceID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- Error handling middleware ----------
|
||||||
|
|
||||||
|
func TestErrorHandler_HandlesErrors(t *testing.T) {
|
||||||
|
gin.SetMode(gin.TestMode)
|
||||||
|
|
||||||
|
recorder := httptest.NewRecorder()
|
||||||
|
c, _ := gin.CreateTestContext(recorder)
|
||||||
|
c.Request = httptest.NewRequest(http.MethodGet, "/api/v1/users", nil)
|
||||||
|
|
||||||
|
c.Error(errors.New("test error"))
|
||||||
|
|
||||||
|
ErrorHandler()(c)
|
||||||
|
|
||||||
|
if recorder.Code != http.StatusInternalServerError {
|
||||||
|
t.Fatalf("expected status 500, got %d", recorder.Code)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRecover_HandlesPanic(t *testing.T) {
|
||||||
|
gin.SetMode(gin.TestMode)
|
||||||
|
|
||||||
|
recorder := httptest.NewRecorder()
|
||||||
|
c, router := gin.CreateTestContext(recorder)
|
||||||
|
c.Request = httptest.NewRequest(http.MethodGet, "/panic", nil)
|
||||||
|
|
||||||
|
router.Use(Recover())
|
||||||
|
router.GET("/panic", func(c *gin.Context) {
|
||||||
|
panic("test panic")
|
||||||
|
})
|
||||||
|
|
||||||
|
router.ServeHTTP(recorder, c.Request)
|
||||||
|
|
||||||
|
if recorder.Code != http.StatusInternalServerError {
|
||||||
|
t.Fatalf("expected status 500 after panic, got %d", recorder.Code)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user