package middleware import ( "bytes" "net/http" "net/http/httptest" "strings" "testing" "github.com/rs/zerolog" "github.com/rs/zerolog/log" ) // Der Test, der gefehlt hat. // // zerolog.Ctx liefert einen **abgeschalteten** Logger, wenn im Kontext keiner // steckt. 34 Aufrufe von log.Ctx(...) im Baum schrieben deshalb ins Nichts – // darunter Warnungen über verwaiste Blobs und beschädigte Dateien. Der Aufruf // sieht dabei völlig richtig aus; auffallen kann es nur, wenn man den Fehler // herbeiführt, den er melden soll. func TestLoggerHaengtLoggerInDenKontext(t *testing.T) { var aus bytes.Buffer alt := log.Logger log.Logger = zerolog.New(&aus) defer func() { log.Logger = alt }() h := Logger(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // Genau der Aufruf, der überall im Baum steht. log.Ctx(r.Context()).Error().Msg("kaputte-datei") })) h.ServeHTTP(httptest.NewRecorder(), httptest.NewRequest("GET", "/x", nil)) if !strings.Contains(aus.String(), "kaputte-datei") { t.Fatalf("log.Ctx im Handler schrieb nichts. Ausgabe: %q", aus.String()) } } // Jede Zeile aus einer Anfrage soll deren Kennung tragen – sonst weiß man bei // zwei gleichzeitigen Downloads nicht, welche Meldung zu welchem gehört. func TestZeilenTragenDieAnfrageKennung(t *testing.T) { var aus bytes.Buffer alt := log.Logger log.Logger = zerolog.New(&aus) defer func() { log.Logger = alt }() h := Logger(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log.Ctx(r.Context()).Error().Msg("x") })) h.ServeHTTP(httptest.NewRecorder(), httptest.NewRequest("GET", "/x", nil)) if !strings.Contains(aus.String(), "request_id") { t.Fatalf("keine request_id in der Zeile: %q", aus.String()) } }