Files
HomeAgent/internal
JianFeeeee b3ae99e32f refactor(webui): secret meta 判据迁到 test/ —— 走导出路由而非未导出 handler
## 迁移

    secret_meta_test.go → webui/test/

## 这一条迁移暴露的问题比前几次多

原测试用两种白盒写法:

    h := &Handler{settings: ...}          // 直接构造,设私有字段
    h.handleSettings(w, req)              // 直接调未导出 handler
    h.handleSettingsReveal(...)           // 同上

改成黑箱后依次撞到四件事,逐个解决:

### ① 路由是 `/api/v1/settings`,不是 `/api/settings`

原测试写的路径 `/api/settings` 从来没被路由表匹配过 —— 它直接调 handler,
所以路径是摆设。真实注册在 handler.go:551:

    mux.HandleFunc("/api/v1/settings", h.requireAPI(h.handleSettings))

⇒ 走真实路由后必须用对路径,否则 404。

### ② `Handler()` 会套三层中间件,依赖完整装配

`Handler()` = proxyDispatch + gzipMW + logged + mux。其中 `logged` 读
`h.settings` 的 webui 配置、`requestLog` 读 history store 等 ——
这些在最小装配下是 nil,直接 panic。

这不是"中间件写坏了",是本判据不该测它们。**用导出的 `RegisterRoutes`**:

    mux := http.NewServeMux()
    h.RegisterRoutes(mux)     // 只注册业务路由,不套中间件

`RegisterRoutes` 是导出接口,拿到的是真实路由表 —— 仍是黑箱,
只是不带外层。判据测的是 settings 的 meta 与 reveal,不该被请求日志和
反代的依赖拖下水。

### ③ `requireAPI` 需要 api_key,没配就 503

    {"error":"webui api_key not configured"}

补 `seedWebUIConfig`(与包内同名辅助一致),并在请求上带
`X-API-Key`。这是生产上非浏览器客户端的正常路径
(`validAPIKey` 优先于 cookie session)。

### ④ `SecretPlaceholder` 需导出访问

改成 `webui.SecretPlaceholder`。

## 判据有效性(变异验证)

secret 标记的传递链是
`ConfigDef.Secret → mapDefs → sdk.ConfigDef.Secret → HTTP meta`。
在 `internal/sdk/settings_impl.go` 的 mapDefs 里删掉 `Secret: d.Secret`:

    --- FAIL: TestSecretFlagReachesSettingsMeta
        Secret:true 未传递到 meta(前端会明文回显):
        map[default: display_name:标志式 key:by_flag type:string]

恢复后全绿。这条判据守的是真实缺陷形态:SDK 的 ConfigDef 一直有 Secret
字段,但内核侧三处转换都漏过它,导致敏感项被渲染成普通文本框明文回显。

## 进度

    webui/        178 条(迁走 2 条)
    webui/test/    24 条

`webui/` 剩 19 个测试文件。剩下的大头是 `proxy_test.go`(45 处未导出引用)
与 `handler_test.go`(90 处),它们直接调 `handleXxx` 并依赖
`newTestHandler`/`testSDK` 这套装配辅助 —— 迁移需要先把那套辅助搬到
test/ 共享,再逐个改调用点。

## 验证

    go build ./...                  PASS
    go vet ./...                    PASS
    gofmt -l                        干净
    go test ./... -count=1          67 包全过,0 FAIL
2026-11-04 21:34:17 +08:00
..