mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-09-28 05:46:36 +08:00
cb339ab0dc
Handle 经 cleanPath 归一化会剥掉尾部斜杠,插件无法同时声明 /resource 与 /resource/ 两条路由;部署关闭 gin 的 RedirectTrailingSlash 时,缺失的那条 直接 404。下游 OpenFlare 有 20 个历史列表接口依赖该行为。 - HandleRaw:与组前缀拼接但保留尾部斜杠,分配独立路由 ID; - BasePath:返回组的绝对前缀(根注册表为空串); - 作用域包装器为 HandleRaw 同样登记 OnDispose 反注册。 验证:go build 通过;go test ./... exit 0(48 包 ok); check_cordis_architecture.sh 0 violations;gofmt 干净。
53 lines
1.8 KiB
Go
53 lines
1.8 KiB
Go
// Copyright 2026 Arctel.net
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package extpoints
|
|
|
|
import "testing"
|
|
|
|
// TestHandleRawPreservesTrailingSlash 验证 HandleRaw 能表达 /x 与 /x/ 两条不同路由,
|
|
// 而 Handle 会归一化掉尾部斜杠(server 插件的 list 端点历史行为依赖这一点)。
|
|
func TestHandleRawPreservesTrailingSlash(t *testing.T) {
|
|
r := &RouterRegistry{}
|
|
g := r.Group("/api/v1/nodes")
|
|
|
|
if got := g.BasePath(); got != "/api/v1/nodes" {
|
|
t.Fatalf("BasePath() = %q, want %q", got, "/api/v1/nodes")
|
|
}
|
|
slashless := g.Handle("GET", "")
|
|
slashed := g.HandleRaw("GET", "/")
|
|
|
|
if slashless.Path != "/api/v1/nodes" {
|
|
t.Errorf("Handle(\"\") path = %q, want %q", slashless.Path, "/api/v1/nodes")
|
|
}
|
|
if slashed.Path != "/api/v1/nodes/" {
|
|
t.Errorf("HandleRaw(\"/\") path = %q, want %q", slashed.Path, "/api/v1/nodes/")
|
|
}
|
|
if slashed.ID == slashless.ID {
|
|
t.Error("HandleRaw must allocate its own route ID so scoped teardown can unregister both")
|
|
}
|
|
if got := len(r.Routes()); got != 2 {
|
|
t.Errorf("registry routes = %d, want 2", got)
|
|
}
|
|
if !r.UnregisterByID(slashed.ID) {
|
|
t.Error("UnregisterByID(HandleRaw route) = false, want true")
|
|
}
|
|
if got := len(r.Routes()); got != 1 {
|
|
t.Errorf("routes after unregister = %d, want 1", got)
|
|
}
|
|
}
|
|
|
|
// TestRegistryHandleRawKeepsAbsolutePath 根注册表上 HandleRaw 只做绝对化处理。
|
|
func TestRegistryHandleRawKeepsAbsolutePath(t *testing.T) {
|
|
r := &RouterRegistry{}
|
|
if got := r.HandleRaw("GET", "/health/").Path; got != "/health/" {
|
|
t.Errorf("path = %q, want %q", got, "/health/")
|
|
}
|
|
if got := r.HandleRaw("POST", "submit").Path; got != "/submit" {
|
|
t.Errorf("path = %q, want %q", got, "/submit")
|
|
}
|
|
if got := r.BasePath(); got != "" {
|
|
t.Errorf("registry BasePath() = %q, want empty", got)
|
|
}
|
|
}
|