package httplog import ( "bufio" "bytes" "log/slog" "net" "net/http" "net/http/httptest" "testing" ) type mockHijacker struct { *httptest.ResponseRecorder hijacked bool } func (m *mockHijacker) Hijack() (net.Conn, *bufio.ReadWriter, error) { m.hijacked = true // Return dummy values, not used in this test return nil, nil, nil } func TestResponseRecorder_Hijack(t *testing.T) { recorder := &responseRecorder{ ResponseWriter: &mockHijacker{ResponseRecorder: httptest.NewRecorder()}, } _, _, err := recorder.Hijack() if err != nil { t.Fatalf("Hijack failed: %v", err) } if recorder.ResponseWriter != nil { t.Error("ResponseWriter should be nil after Hijack") } } func TestLogger(t *testing.T) { var buf bytes.Buffer slog.SetDefault(slog.New(slog.NewTextHandler(&buf, nil))) handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { logger := Logger(r) logger.Info("test message") w.WriteHeader(http.StatusOK) }) t.Run("with middleware", func(t *testing.T) { buf.Reset() logMiddleware := Log{LogStart: true, LogFinish: true} wrappedHandler := logMiddleware.WrapHandler(handler) req := httptest.NewRequest("GET", "/test", nil) rr := httptest.NewRecorder() wrappedHandler.ServeHTTP(rr, req) if !bytes.Contains(buf.Bytes(), []byte("level=INFO msg=request")) { t.Error("expected start log message, but not found") } if !bytes.Contains(buf.Bytes(), []byte("level=INFO msg=\"test message\"")) { t.Error("expected handler log message, but not found") } if !bytes.Contains(buf.Bytes(), []byte("level=INFO msg=response")) { t.Error("expected finish log message, but not found") } }) t.Run("without middleware", func(t *testing.T) { buf.Reset() req := httptest.NewRequest("GET", "/test", nil) rr := httptest.NewRecorder() handler.ServeHTTP(rr, req) if !bytes.Contains(buf.Bytes(), []byte("level=INFO msg=\"test message\"")) { t.Error("expected handler log message, but not found") } if bytes.Contains(buf.Bytes(), []byte("level=INFO msg=request")) { t.Error("unexpected start log message found") } if bytes.Contains(buf.Bytes(), []byte("level=INFO msg=response")) { t.Error("unexpected finish log message found") } }) }