initial implementation

This commit is contained in:
juancwu 2026-04-25 20:26:07 +00:00
commit cb373e637b
16 changed files with 777 additions and 1 deletions

50
pkg/router/chain_test.go Normal file
View file

@ -0,0 +1,50 @@
package router
import (
"net/http"
"net/http/httptest"
"strings"
"testing"
"git.juancwu.dev/juancwu/lightmux/pkg/middleware"
)
func tagMW(log *[]string, tag string) middleware.Middleware {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
*log = append(*log, tag+":before")
next.ServeHTTP(w, r)
*log = append(*log, tag+":after")
})
}
}
func TestChainOrder(t *testing.T) {
var log []string
h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log = append(log, "handler")
})
wrapped := chain(h,
[]middleware.Middleware{tagMW(&log, "g1"), tagMW(&log, "g2")},
[]middleware.Middleware{tagMW(&log, "r1"), tagMW(&log, "r2")},
)
req := httptest.NewRequest(http.MethodGet, "/", nil)
wrapped.ServeHTTP(httptest.NewRecorder(), req)
want := "g1:before,g2:before,r1:before,r2:before,handler,r2:after,r1:after,g2:after,g1:after"
if got := strings.Join(log, ","); got != want {
t.Errorf("order:\n got %s\nwant %s", got, want)
}
}
func TestChainNoMiddlewares(t *testing.T) {
called := false
h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { called = true })
wrapped := chain(h, nil, nil)
wrapped.ServeHTTP(httptest.NewRecorder(), httptest.NewRequest(http.MethodGet, "/", nil))
if !called {
t.Fatal("handler not called")
}
}