From 2e90c2cb5a8365baef74a65ae1a533f33d546000 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Wed, 4 Nov 2026 21:52:52 +0800 Subject: [PATCH] =?UTF-8?q?refactor(webui):=20openai=5Fcompat=20=E5=88=A4?= =?UTF-8?q?=E6=8D=AE=E8=BF=81=E5=88=B0=20test/=EF=BC=8C=E5=8C=85=E5=86=85?= =?UTF-8?q?=E9=87=8D=E5=BB=BA=E5=85=B1=E4=BA=AB=E8=BE=85=E5=8A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit openai_compat_test.go → webui/test/ (4 条判据) webui/ 178 → 174 条 webui/test/ 24 → 28 条 合计 202 条不变 ## 迁移碰到的连带问题 `openai_compat_test.go` 里除了自己的判据,还定义了三个**被包内其他文件 依赖**的共享件: newOpenAITestServer(t) auth_hardening_test.go 在用 testAuthAPIKey auth_hardening / gzip / legacy_proxy(×2) 在用 seedWebUIConfig 多处 文件一移走,包内立刻 build failed: vet: auth_hardening_test.go:373:15: undefined: newOpenAITestServer vet: auth_hardening_test.go:377:30: undefined: testAuthAPIKey 这说明「迁一个测试文件」从来不是孤立的 —— 它可能是包内共享辅助的**宿主**。 ## 处理方式:两边各留一份,不跨包共享 包内重定义 `testAuthAPIKey` 与 `newOpenAITestServer`(放 handler_test.go), test/ 侧保留自己那份(`seedWebUIConfig` 统一收进 helpers_test.go)。 **为什么不抽到共享包**:包内版本要用包内的 `testSDK`/`seedWebUIConfig`, test/ 版本要用那边的 helper。抽公共包等于让 test/ 反向依赖包内的未导出 辅助 —— 那正是这次迁移要摆脱的东西。两份各写 20 行,换来两侧互不牵连, 比一个"共享测试工具包"更符合这次的目的。 ## 顺带修掉一处重复定义 `seedWebUIConfig` 在 secret_meta_test.go 与 helpers_test.go 各出现过一次 (上一批我加的那份没和已有的对齐)。收拢到 helpers_test.go 一份, 字段与包内版本保持一致(api_key/username/password/session_ttl_hours)。 ## 验证 go build ./... PASS go vet ./... PASS gofmt -l 干净 go test ./... -count=1 67 包全过,0 FAIL webui/ + webui/test/ 174 + 28 = 202 条,与迁移前一致 --- internal/plugins/webui/handler_test.go | 31 +++++++++++++++++++ internal/plugins/webui/test/helpers_test.go | 19 ++++++++++++ .../webui/{ => test}/openai_compat_test.go | 9 +++--- .../plugins/webui/test/secret_meta_test.go | 17 ---------- 4 files changed, 55 insertions(+), 21 deletions(-) rename internal/plugins/webui/{ => test}/openai_compat_test.go (98%) diff --git a/internal/plugins/webui/handler_test.go b/internal/plugins/webui/handler_test.go index 9ff1a121..e5dc892d 100644 --- a/internal/plugins/webui/handler_test.go +++ b/internal/plugins/webui/handler_test.go @@ -1589,3 +1589,34 @@ func TestRuntimeEndpoint(t *testing.T) { t.Fatalf("无状态源应回 503,实际 %d", w2.Code) } } + +// testAuthAPIKey 是 seedWebUIConfig 写进配置的 api_key 值。 +// +// ★ 2026-11-04:原先只在 openai_compat_test.go 里定义,那个文件迁到 test/ +// 后本包 4 个测试文件(auth_hardening / gzip / legacy_proxy ×2)仍在用它。 +const testAuthAPIKey = "test-api-key" + +// newOpenAITestServer 起一个带完整路由的 /v1/* 测试服务器。 +// +// ★ 2026-11-04:原先定义在 openai_compat_test.go 里,那个文件迁到 test/ +// 之后本包仍有判据(auth_hardening_test.go)要用它,于是在这里重建一份包内版本。 +// 两份都保留是有意的:包内版本用包内的 seedWebUIConfig/testSDK, +// test/ 版本用那边的 helper —— 各自独立,避免跨包共享测试辅助。 +func newOpenAITestServer(t *testing.T) (*httptest.Server, *agentIO.IOManager, *events.Bus) { + t.Helper() + cfgReg := internalConfig.NewConfigRegistry("") + seedWebUIConfig(cfgReg) + + iom := agentIO.NewIOManager() + bus := events.NewBus() + h := NewHandler(testSDK(sdk.SDKConfig{ + Settings: sdk.NewSettings("webui", cfgReg), + IOManager: iom, + EventBus: bus, + })) + h.RegisterRoutes(http.NewServeMux()) + + srv := httptest.NewServer(h.Handler()) + t.Cleanup(func() { srv.Close() }) + return srv, iom, bus +} diff --git a/internal/plugins/webui/test/helpers_test.go b/internal/plugins/webui/test/helpers_test.go index 55e27761..589de957 100644 --- a/internal/plugins/webui/test/helpers_test.go +++ b/internal/plugins/webui/test/helpers_test.go @@ -9,6 +9,8 @@ import ( "github.com/JianFeeeee/HologramAgent/internal/plugins/webui" "strings" "testing" + + internalConfig "github.com/JianFeeeee/HologramAgent/internal/config" ) // stripJSComments 剥掉 // 行注释与 /* */ 块注释(粗粒度,但足够用于词频统计)。 @@ -96,3 +98,20 @@ func dashboardJS(t *testing.T) string { t.Helper() return dashboardJSSource(t) } + +// testAPIKey 与 seedWebUIConfig 写进配置的值一致。 +const testAPIKey = "test-api-key" + +// seedWebUIConfig 在 webui 插件配置里登记并设置 api_key / username / password。 +// +// 与包内 handler_test.go 的同名辅助保持一致 —— requireAPI 会读它, +// 没配就返回 503「webui api_key not configured」。 +func seedWebUIConfig(reg *internalConfig.ConfigRegistry) { + c := reg.PluginConfig("webui") + c.RegisterDef(internalConfig.ConfigDef{Key: "api_key", Default: ""}) + c.RegisterDef(internalConfig.ConfigDef{Key: "username", Default: ""}) + c.RegisterDef(internalConfig.ConfigDef{Key: "password", Default: ""}) + c.Set("api_key", testAPIKey) + c.Set("username", "admin") + c.Set("password", "pw-for-test") +} diff --git a/internal/plugins/webui/openai_compat_test.go b/internal/plugins/webui/test/openai_compat_test.go similarity index 98% rename from internal/plugins/webui/openai_compat_test.go rename to internal/plugins/webui/test/openai_compat_test.go index d5e20578..8f6209a1 100644 --- a/internal/plugins/webui/openai_compat_test.go +++ b/internal/plugins/webui/test/openai_compat_test.go @@ -1,4 +1,4 @@ -package webui +package test import ( "bufio" @@ -13,6 +13,7 @@ import ( agentIO "github.com/JianFeeeee/HologramAgent/internal/agent/io" internalConfig "github.com/JianFeeeee/HologramAgent/internal/config" "github.com/JianFeeeee/HologramAgent/internal/events" + "github.com/JianFeeeee/HologramAgent/internal/plugins/webui" "github.com/JianFeeeee/HologramAgent/internal/sdk" ) @@ -48,12 +49,12 @@ func newOpenAITestServer(t *testing.T) (*httptest.Server, *agentIO.IOManager, *e iom := agentIO.NewIOManager() bus := events.NewBus() - cfg := sdk.SDKConfig{ + cfg := sdk.New("webui", sdk.SDKConfig{ Settings: sdk.NewSettings("webui", cfgReg), IOManager: iom, EventBus: bus, - } - h := NewHandler(testSDK(cfg)) + }) + h := webui.NewHandler(cfg) h.RegisterRoutes(http.NewServeMux()) srv := httptest.NewServer(h.Handler()) diff --git a/internal/plugins/webui/test/secret_meta_test.go b/internal/plugins/webui/test/secret_meta_test.go index 16d69505..c96b98c1 100644 --- a/internal/plugins/webui/test/secret_meta_test.go +++ b/internal/plugins/webui/test/secret_meta_test.go @@ -147,20 +147,3 @@ func serveRoutes(t *testing.T, h *webui.Handler, w http.ResponseWriter, r *http. h.RegisterRoutes(mux) mux.ServeHTTP(w, r) } - -// testAPIKey 与 seedWebUIConfig 写进配置的值一致。 -const testAPIKey = "test-api-key" - -// seedWebUIConfig 在 webui 插件配置里登记并设置 api_key / username / password。 -// -// 与包内 handler_test.go 的同名辅助保持一致 —— requireAPI 会读它, -// 没配就返回 503「webui api_key not configured」。 -func seedWebUIConfig(reg *internalConfig.ConfigRegistry) { - c := reg.PluginConfig("webui") - c.RegisterDef(internalConfig.ConfigDef{Key: "api_key", Default: ""}) - c.RegisterDef(internalConfig.ConfigDef{Key: "username", Default: ""}) - c.RegisterDef(internalConfig.ConfigDef{Key: "password", Default: ""}) - c.Set("api_key", testAPIKey) - c.Set("username", "admin") - c.Set("password", "pw-for-test") -}