package handler import ( "net/http" "net/http/httptest" "testing" "time" "github.com/Wei-Shaw/sub2api/internal/service" "github.com/gin-gonic/gin" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestOpsCaptureWriter_NilInnerWriter_NoPanic(t *testing.T) { w := &opsCaptureWriter{} w.ResponseWriter = nil assert.NotPanics(t, func() { assert.Equal(t, 0, w.Status()) }) assert.NotPanics(t, func() { assert.Equal(t, -1, w.Size()) }) assert.NotPanics(t, func() { assert.False(t, w.Written()) }) assert.NotPanics(t, func() { n, err := w.Write([]byte("test")) assert.Equal(t, 0, n) assert.NoError(t, err) }) assert.NotPanics(t, func() { n, err := w.WriteString("test") assert.Equal(t, 0, n) assert.NoError(t, err) }) assert.NotPanics(t, func() { h := w.Header() assert.NotNil(t, h) }) assert.NotPanics(t, func() { w.WriteHeader(200) }) assert.NotPanics(t, func() { w.WriteHeaderNow() }) assert.NotPanics(t, func() { w.Flush() }) assert.NotPanics(t, func() { conn, rw, err := w.Hijack() assert.Nil(t, conn) assert.Nil(t, rw) assert.Error(t, err) }) assert.NotPanics(t, func() { ch := w.CloseNotify() assert.NotNil(t, ch) }) assert.NotPanics(t, func() { p := w.Pusher() assert.Nil(t, p) }) } func TestOpsCaptureWriter_CompactKeepaliveRestoresOriginalWriter(t *testing.T) { gin.SetMode(gin.TestMode) router := gin.New() outerStatus := -1 router.Use(func(c *gin.Context) { c.Next() outerStatus = c.Writer.Status() }) router.Use(OpsErrorLoggerMiddleware(nil)) router.GET("/compact", func(c *gin.Context) { service.MarkOpenAICompactClientStream(c) stop := service.StartOpenAICompactSSEKeepalive(c, time.Hour) defer stop() c.Status(http.StatusOK) }) recorder := httptest.NewRecorder() request := httptest.NewRequest(http.MethodGet, "/compact", nil) require.NotPanics(t, func() { router.ServeHTTP(recorder, request) }) require.Equal(t, http.StatusOK, outerStatus) require.Equal(t, http.StatusOK, recorder.Code) }