lolly/internal/matcher/named_test.go
xfy c82e6dcdb7 test(matcher): 添加 location 匹配引擎完整测试覆盖
- conflict_test.go: 测试 location 冲突检测
- location_test.go: 测试 location 匹配逻辑
- named_test.go: 测试命名捕获组
- prefix_priority_test.go: 测试前缀匹配优先级
- prefix_test.go: 测试前缀匹配
- regex_test.go: 测试正则匹配

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-20 08:27:24 +08:00

135 lines
3.2 KiB
Go

package matcher
import (
"testing"
"github.com/valyala/fasthttp"
)
func TestNamedMatcher_New(t *testing.T) {
handler := func(ctx *fasthttp.RequestCtx) {}
m := NewNamedMatcher("error404", handler)
if m.name != "error404" {
t.Errorf("expected name 'error404', got %s", m.name)
}
}
func TestNamedMatcher_Match(t *testing.T) {
handler := func(ctx *fasthttp.RequestCtx) {}
m := NewNamedMatcher("error404", handler)
// Named matchers do not match by path
if m.Match("/anything") {
t.Error("named matcher should not match any path")
}
if m.Match("") {
t.Error("named matcher should not match empty path")
}
}
func TestNamedMatcher_Result(t *testing.T) {
handler := func(ctx *fasthttp.RequestCtx) {}
m := NewNamedMatcher("error404", handler)
result := m.Result()
if result == nil {
t.Fatal("result should not be nil")
}
if result.Path != "@error404" {
t.Errorf("expected path '@error404', got %s", result.Path)
}
if result.Priority != 0 {
t.Errorf("expected priority 0, got %d", result.Priority)
}
if result.LocationType != LocationTypeNamed {
t.Errorf("expected location type '%s', got %s", LocationTypeNamed, result.LocationType)
}
if result.Handler == nil {
t.Error("handler should not be nil")
}
}
func TestNamedMatcher_Name(t *testing.T) {
handler := func(ctx *fasthttp.RequestCtx) {}
tests := []struct {
name string
expected string
}{
{"error404", "error404"},
{"default", "default"},
{"", ""},
{"error_page", "error_page"},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
m := NewNamedMatcher(tt.name, handler)
if m.Name() != tt.expected {
t.Errorf("expected name %q, got %q", tt.expected, m.Name())
}
})
}
}
func TestNamedMatcher_UnicodeName(t *testing.T) {
handler := func(ctx *fasthttp.RequestCtx) {}
m := NewNamedMatcher("错误页面", handler)
if m.Name() != "错误页面" {
t.Errorf("expected unicode name preserved, got %s", m.Name())
}
result := m.Result()
if result.Path != "@错误页面" {
t.Errorf("expected '@错误页面', got %s", result.Path)
}
}
func TestNamedMatcher_SpecialCharName(t *testing.T) {
handler := func(ctx *fasthttp.RequestCtx) {}
m := NewNamedMatcher("error-404_not.found", handler)
if m.Name() != "error-404_not.found" {
t.Errorf("special char name should be preserved, got %s", m.Name())
}
}
func TestLocationEngine_AddNamed(t *testing.T) {
engine := NewLocationEngine()
handler := func(ctx *fasthttp.RequestCtx) {}
err := engine.AddNamed("error404", handler)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
matcher := engine.GetNamed("error404")
if matcher == nil {
t.Fatal("named matcher should be retrievable")
}
if matcher.Name() != "error404" {
t.Errorf("expected name 'error404', got %s", matcher.Name())
}
}
func TestLocationEngine_AddNamed_Duplicate(t *testing.T) {
engine := NewLocationEngine()
handler := func(ctx *fasthttp.RequestCtx) {}
engine.AddNamed("error404", handler)
err := engine.AddNamed("error404", handler)
if err == nil {
t.Fatal("expected duplicate error")
}
}
func TestLocationEngine_GetNamed_NonExistent(t *testing.T) {
engine := NewLocationEngine()
matcher := engine.GetNamed("nonexistent")
if matcher != nil {
t.Error("should return nil for non-existent named location")
}
}