Files
any-hub/internal/proxy/forwarder_test.go
2025-11-17 12:21:35 +08:00

94 lines
2.7 KiB
Go

package proxy
import (
"bytes"
"strings"
"testing"
"github.com/gofiber/fiber/v3"
"github.com/sirupsen/logrus"
"github.com/valyala/fasthttp"
"github.com/any-hub/any-hub/internal/config"
"github.com/any-hub/any-hub/internal/hubmodule/legacy"
"github.com/any-hub/any-hub/internal/server"
)
func TestForwarderMissingHandler(t *testing.T) {
app := fiber.New()
defer app.Shutdown()
ctx := app.AcquireCtx(new(fasthttp.RequestCtx))
defer app.ReleaseCtx(ctx)
logger := logrus.New()
logBuf := &bytes.Buffer{}
logger.SetOutput(logBuf)
forwarder := NewForwarder(nil, logger)
route := testRouteWithModule("missing-module")
if err := forwarder.Handle(ctx, route); err != nil {
t.Fatalf("forwarder.Handle returned unexpected error: %v", err)
}
if status := ctx.Response().StatusCode(); status != fiber.StatusInternalServerError {
t.Fatalf("expected 500 for missing handler, got %d", status)
}
if body := string(ctx.Response().Body()); !strings.Contains(body, "module_handler_missing") {
t.Fatalf("expected error body to mention module_handler_missing, got %s", body)
}
if !strings.Contains(logBuf.String(), "module_handler_missing") {
t.Fatalf("expected log to mention module_handler_missing, got %s", logBuf.String())
}
}
func TestForwarderHandlerPanic(t *testing.T) {
const moduleKey = "panic-module"
moduleHandlers.Delete(normalizeModuleKey(moduleKey))
defer moduleHandlers.Delete(normalizeModuleKey(moduleKey))
MustRegisterModule(ModuleRegistration{
Key: moduleKey,
Handler: server.ProxyHandlerFunc(func(fiber.Ctx, *server.HubRoute) error {
panic("boom")
}),
})
app := fiber.New()
defer app.Shutdown()
ctx := app.AcquireCtx(new(fasthttp.RequestCtx))
defer app.ReleaseCtx(ctx)
logger := logrus.New()
logBuf := &bytes.Buffer{}
logger.SetOutput(logBuf)
forwarder := NewForwarder(nil, logger)
route := testRouteWithModule(moduleKey)
if err := forwarder.Handle(ctx, route); err != nil {
t.Fatalf("forwarder.Handle returned unexpected error: %v", err)
}
if status := ctx.Response().StatusCode(); status != fiber.StatusInternalServerError {
t.Fatalf("expected 500 for handler panic, got %d", status)
}
if body := string(ctx.Response().Body()); !strings.Contains(body, "module_handler_panic") {
t.Fatalf("expected error body to mention module_handler_panic, got %s", body)
}
if !strings.Contains(logBuf.String(), "module_handler_panic") {
t.Fatalf("expected log to mention module_handler_panic, got %s", logBuf.String())
}
}
func testRouteWithModule(moduleKey string) *server.HubRoute {
return &server.HubRoute{
Config: config.HubConfig{
Name: "test",
Domain: "test.local",
Type: "custom",
},
ModuleKey: moduleKey,
RolloutFlag: legacy.RolloutModular,
}
}