Files
HomeAgent/internal/meta/test/meta_contract_test.go
JianFeeeee 8814ccdef6 test: 按模块导出接口重写黑盒判据(批次 6:promptsec / toolroute / pluginview / meta)
4 个文件全部在 `<module>/test/`,源码目录仍零 `_test.go`。
共 21 条判据,只调导出接口,输入 → 可观察输出。

## internal/promptsec —— NewRegistry/Declare/Render/Snapshot/Names

    TestDeclareThenRender                声明两段,按 Order 输出且含正文
    TestDeclareRejectsMismatchedOwner    段名前缀与 Owner 不符必须报错
    TestDeclareIsIdempotent              同段名覆盖,不产生两份
    TestEmptyContentRemovesSection       空正文 = 撤销声明
    TestRemoveOwnerOnlyDropsThatOwner    撤销一个 owner 不影响其他
    TestSnapshotReturnsAllSections       快照反映当前声明

## internal/toolroute —— Dispatch

    TestDispatchRoutesEachPrefix         15 种工具前缀 → 对应族处理器
    TestDispatchGetPluginToolsExtractsArg  plugin_name 参数透传
    TestDispatchUnknownIsNotSwallowed    未知工具 handled=false(插件工具不能消失)
    TestDispatchNilHandlers              nil handlers 不 panic

用 recordingHandlers 记录哪个族被调用,不断言内部 switch 结构。

## internal/pluginview —— 事件 → Snapshot

    TestFreshViewIsEmpty                 新视图为空
    TestCmdRunEventAppearsInSnapshot     cmd_run → 命令历史
    TestTerminalCreateThenOutput         terminal_create + 输出 → 终端状态
    TestUnknownToolIsIgnored             未知工具不造记录

**判据写错过一次**:`OnTerminalOutput` 的 payload 键是 `terminal_id`
不是 `id`,第一版按 `id` 写 ⇒ 输出没进 Snapshot。按真实输入契约修正。

## internal/meta —— 版本元信息

    TestFullVersionContainsKernelAndVersion
    TestSourceURLLooksLikeHTTPS
    TestLicenseMetadataNotEmpty
    TestSDKCompatibleVersionIsSemverLike

## 变异验证(改回旧实现必须红)

    promptsec  Declare 直接 return nil  → ★ Render 缺正文
    toolroute  未知工具 handled=true     → ★ 未知工具被吞掉
    pluginview cmd_run 不记录           → ★ cmd_run 未进命令历史
    meta       FullVersion 丢版本       → ★ 不含 "1.4.0"

第一版 promptsec 变异改的是条件中的一段 token、没改变行为(空变异),
重做后确认判据有效。

## 验证

    go build ./...                            PASS
    go vet ./...                              PASS
    gofmt -l                                  干净
    python3 .github/scripts/check-ci-gates.py PASS
    go test ./... -count=1                    24 个测试包 / 100 包无测试 / 0 FAIL
    4 个新包 -race                            全绿
    源码目录 _test.go                         0
2026-11-09 13:22:35 +08:00

39 lines
1.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package test
// internal/meta 的黑盒判据:FullVersion 的输出 + 版本常量的对外契约。
import (
"strings"
"testing"
"github.com/JianFeeeee/HologramAgent/internal/meta"
)
func TestFullVersionContainsKernelAndVersion(t *testing.T) {
got := meta.FullVersion()
for _, want := range []string{meta.KernelName, meta.Version, meta.Commit} {
if !strings.Contains(got, want) {
t.Fatalf("★ FullVersion()=%q 不含 %q", got, want)
}
}
}
func TestSourceURLLooksLikeHTTPS(t *testing.T) {
if !strings.HasPrefix(meta.SourceURL, "https://") {
t.Fatalf("★ SourceURL 不是 https:%q", meta.SourceURL)
}
}
func TestLicenseMetadataNotEmpty(t *testing.T) {
if meta.License == "" || !strings.HasPrefix(meta.LicenseURL, "https://") {
t.Fatalf("★ 许可元信息缺失:license=%q url=%q", meta.License, meta.LicenseURL)
}
}
func TestSDKCompatibleVersionIsSemverLike(t *testing.T) {
parts := strings.Split(meta.SDKCompatibleVersion, ".")
if len(parts) != 3 {
t.Fatalf("★ SDKCompatibleVersion=%q 不是三段版本号", meta.SDKCompatibleVersion)
}
}