package http_test
import (
stdhttp "net/http"
"net/http/httptest"
"strings"
"testing"
mw "mercemay.top/src/lambdalog/middleware/http"
)
func TestAccessLog_InfoOnSuccess(t *testing.T) {
l := &stubLogger{}
h := mw.AccessLog(l)(stdhttp.HandlerFunc(func(w stdhttp.ResponseWriter, r *stdhttp.Request) {
w.WriteHeader(204)
_, _ = w.Write([]byte("ok"))
}))
rec := httptest.NewRecorder()
req := httptest.NewRequest("GET", "/x", nil)
req.Header.Set("User-Agent", "probe")
h.ServeHTTP(rec, req)
if rec.Code != 204 {
t.Fatalf("code %d", rec.Code)
}
if len(l.msgs) != 1 || l.msgs[0] != "http.access" {
t.Fatalf("msgs: %v", l.msgs)
}
}
func TestAccessLog_ErrorOn5xx(t *testing.T) {
l := &stubLogger{}
h := mw.AccessLog(l)(stdhttp.HandlerFunc(func(w stdhttp.ResponseWriter, r *stdhttp.Request) {
w.WriteHeader(503)
}))
rec := httptest.NewRecorder()
h.ServeHTTP(rec, httptest.NewRequest("GET", "/", nil))
if len(l.msgs) != 1 || !strings.HasPrefix(l.msgs[0], "err:http.access") {
t.Fatalf("msgs: %v", l.msgs)
}
}
func TestAccessLog_DefaultStatus200(t *testing.T) {
l := &stubLogger{}
h := mw.AccessLog(l)(stdhttp.HandlerFunc(func(w stdhttp.ResponseWriter, r *stdhttp.Request) {
// No WriteHeader call.
_, _ = w.Write([]byte("ok"))
}))
rec := httptest.NewRecorder()
h.ServeHTTP(rec, httptest.NewRequest("GET", "/", nil))
if rec.Code != 200 {
t.Fatalf("code %d", rec.Code)
}
if l.msgs[0] != "http.access" {
t.Fatalf("msgs: %v", l.msgs)
}
}
func TestAccessLog_RecordsBytes(t *testing.T) {
l := &stubLogger{}
h := mw.AccessLog(l)(stdhttp.HandlerFunc(func(w stdhttp.ResponseWriter, r *stdhttp.Request) {
_, _ = w.Write([]byte("hello"))
}))
h.ServeHTTP(httptest.NewRecorder(), httptest.NewRequest("GET", "/", nil))
if l.msgs[0] != "http.access" {
t.Fatalf("msgs: %v", l.msgs)
}
}