veza/veza-backend-api/internal/middleware/timeout_test.go

61 lines
1.6 KiB
Go
Raw Normal View History

2025-12-13 02:34:34 +00:00
package middleware_test
import (
"net/http"
"net/http/httptest"
"testing"
"time"
"github.com/gin-gonic/gin"
"github.com/stretchr/testify/assert"
"veza-backend-api/internal/middleware"
)
func TestTimeoutMiddleware_PassesGivenEnoughTime(t *testing.T) {
gin.SetMode(gin.TestMode)
router := gin.New()
router.Use(middleware.Timeout(100 * time.Millisecond))
router.GET("/slow", func(c *gin.Context) {
time.Sleep(10 * time.Millisecond)
c.JSON(http.StatusOK, gin.H{"status": "ok"})
})
w := httptest.NewRecorder()
req := httptest.NewRequest("GET", "/slow", nil)
router.ServeHTTP(w, req)
assert.Equal(t, http.StatusOK, w.Code)
}
func TestTimeoutMiddleware_ContextTimesOut(t *testing.T) {
gin.SetMode(gin.TestMode)
router := gin.New()
// Set a very short timeout
router.Use(middleware.Timeout(10 * time.Millisecond))
router.GET("/too-slow", func(c *gin.Context) {
// Simulate work that takes longer than timeout
// Check context deadline
ctx := c.Request.Context()
select {
case <-time.After(50 * time.Millisecond):
c.JSON(http.StatusOK, gin.H{"status": "should not reach here"})
case <-ctx.Done():
// Context should be cancelled
// We don't write anything, middleware might handle it or the client hangs up
}
})
w := httptest.NewRecorder()
req := httptest.NewRequest("GET", "/too-slow", nil)
router.ServeHTTP(w, req)
// Since our simple implementation just sets context but tries an opportunistic 504:
// If the handler respects context, it returns early.
// If standard flow, we expect 504 if middleware catches it, or just connection close.
// Let's check if we get 504.
assert.Equal(t, http.StatusGatewayTimeout, w.Code)
}