119 lines
2.5 KiB
Go
119 lines
2.5 KiB
Go
//go:build linux || freebsd
|
|||
|
|
|
||
|
|
package main
|
||
|
|
|
||
|
|
import (
|
||
|
|
"io"
|
||
|
|
"log/slog"
|
||
|
|
"net/http"
|
||
|
|
"net/http/httptest"
|
||
|
|
"testing"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestItoa(t *testing.T) {
|
||
|
|
tests := []struct {
|
||
|
|
n int
|
||
|
|
want string
|
||
|
|
}{
|
||
|
|
{0, "0"},
|
||
|
|
{1, "1"},
|
||
|
|
{9, "9"},
|
||
|
|
{10, "10"},
|
||
|
|
{42, "42"},
|
||
|
|
{100, "100"},
|
||
|
|
{-1, "-1"},
|
||
|
|
{-42, "-42"},
|
||
|
|
{8080, "8080"},
|
||
|
|
}
|
||
|
|
|
||
|
|
for _, tt := range tests {
|
||
|
|
t.Run(tt.want, func(t *testing.T) {
|
||
|
|
if got := itoa(tt.n); got != tt.want {
|
||
|
|
t.Errorf("itoa(%d) = %q, want %q", tt.n, got, tt.want)
|
||
|
|
}
|
||
|
|
})
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestLast(t *testing.T) {
|
||
|
|
tests := []struct {
|
||
|
|
s string
|
||
|
|
c byte
|
||
|
|
want int
|
||
|
|
}{
|
||
|
|
{"hello", 'l', 3},
|
||
|
|
{"hello", 'o', 4},
|
||
|
|
{"hello", 'h', 0},
|
||
|
|
{"hello", 'x', -1},
|
||
|
|
{"", 'a', -1},
|
||
|
|
{"aaa", 'a', 2},
|
||
|
|
}
|
||
|
|
|
||
|
|
for _, tt := range tests {
|
||
|
|
if got := last(tt.s, tt.c); got != tt.want {
|
||
|
|
t.Errorf("last(%q, %q) = %d, want %d", tt.s, tt.c, got, tt.want)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestClientIP(t *testing.T) {
|
||
|
|
tests := []struct {
|
||
|
|
name string
|
||
|
|
remoteAddr string
|
||
|
|
want string
|
||
|
|
}{
|
||
|
|
{"ipv4 with port", "192.168.1.1:12345", "192.168.1.1"},
|
||
|
|
{"ipv6 with brackets", "[::1]:12345", "[::1]"},
|
||
|
|
{"ipv4 without port", "192.168.1.1", "192.168.1.1"},
|
||
|
|
{"empty", "", ""},
|
||
|
|
}
|
||
|
|
|
||
|
|
for _, tt := range tests {
|
||
|
|
t.Run(tt.name, func(t *testing.T) {
|
||
|
|
req := httptest.NewRequest(http.MethodGet, "/", nil)
|
||
|
|
req.RemoteAddr = tt.remoteAddr
|
||
|
|
if got := clientIP(req); got != tt.want {
|
||
|
|
t.Errorf("clientIP() = %q, want %q", got, tt.want)
|
||
|
|
}
|
||
|
|
})
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestStatusRecorder(t *testing.T) {
|
||
|
|
rec := httptest.NewRecorder()
|
||
|
|
sr := &statusRecorder{ResponseWriter: rec, status: http.StatusOK}
|
||
|
|
|
||
|
|
// Default status before WriteHeader.
|
||
|
|
if sr.status != http.StatusOK {
|
||
|
|
t.Errorf("initial status = %d, want %d", sr.status, http.StatusOK)
|
||
|
|
}
|
||
|
|
|
||
|
|
sr.WriteHeader(http.StatusNotFound)
|
||
|
|
if sr.status != http.StatusNotFound {
|
||
|
|
t.Errorf("status after WriteHeader = %d, want %d", sr.status, http.StatusNotFound)
|
||
|
|
}
|
||
|
|
|
||
|
|
// rec should also have the status set.
|
||
|
|
if rec.Code != http.StatusNotFound {
|
||
|
|
t.Errorf("rec.Code = %d, want %d", rec.Code, http.StatusNotFound)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestWithRequestLog(t *testing.T) {
|
||
|
|
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||
|
|
w.WriteHeader(http.StatusOK)
|
||
|
|
})
|
||
|
|
|
||
|
|
logger := slog.New(slog.NewTextHandler(io.Discard, nil))
|
||
|
|
wrapped := withRequestLog(handler, logger)
|
||
|
|
req := httptest.NewRequest(http.MethodGet, "/test", nil)
|
||
|
|
req.RemoteAddr = "192.168.1.1:12345"
|
||
|
|
rec := httptest.NewRecorder()
|
||
|
|
|
||
|
|
wrapped.ServeHTTP(rec, req)
|
||
|
|
|
||
|
|
if rec.Code != http.StatusOK {
|
||
|
|
t.Errorf("status = %d, want 200", rec.Code)
|
||
|
|
}
|
||
|
|
}
|