mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-10-14 12:02:27 +08:00
这三个用例的字面量 2.1.251 写于内置基线为 2.1.220 的时期,本意是取一个 高于基线的补丁位验证"覆盖不得低于 pin"规则。基线升至 2.1.258 后,2.1.251 落在 pin 之下:IsSupportedCLIVersion 应判 false、resolveCLIVersion 应回落 基线,与用例原意相悖,CI 随之失败。 改为真正高于当前 pin 的最小补丁位 2.1.259,用例语义不变;实现未放宽, constants_cli_version_test.go 中独立的 Fable 5.1 闸门下限 2.1.251 保持不变。
74 lines
2.5 KiB
Go
74 lines
2.5 KiB
Go
package claude
|
|
|
|
import "testing"
|
|
|
|
func TestIsSupportedCLIVersion(t *testing.T) {
|
|
cases := []struct {
|
|
name string
|
|
version string
|
|
want bool
|
|
}{
|
|
{"内置基线本身", CLICurrentVersion, true},
|
|
{"高于基线的补丁位", "2.1.259", true},
|
|
{"高于基线的次版本", "2.2.0", true},
|
|
{"高于基线的主版本", "3.0.0", true},
|
|
{"低于基线", "2.1.219", false},
|
|
{"远低于基线", "1.0.0", false},
|
|
{"空值", "", false},
|
|
{"只有两段", "2.2", false},
|
|
{"带 v 前缀", "v2.2.0", false},
|
|
{"预发布后缀", "2.2.0-local", false},
|
|
{"构建元数据", "2.2.0+build1", false},
|
|
{"哨兵版本带后缀", "999.0.0-local", false},
|
|
{"纯数字哨兵仍然合法(形态没问题,运维自负)", "999.0.0", true},
|
|
{"非数字", "abc", false},
|
|
{"多余的段", "2.2.0.1", false},
|
|
}
|
|
for _, tc := range cases {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
if got := IsSupportedCLIVersion(tc.version); got != tc.want {
|
|
t.Fatalf("IsSupportedCLIVersion(%q) = %v, want %v", tc.version, got, tc.want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestResolveCLIVersion(t *testing.T) {
|
|
cases := []struct {
|
|
name string
|
|
raw string
|
|
want string
|
|
}{
|
|
{"未配置时用内置基线", "", CLICurrentVersion},
|
|
{"只有空白等同未配置", " ", CLICurrentVersion},
|
|
{"合法覆盖生效", "2.1.259", "2.1.259"},
|
|
{"两侧空白被裁掉", " 2.1.259 ", "2.1.259"},
|
|
{"非法值回落基线", "not-a-version", CLICurrentVersion},
|
|
{"向下覆盖被拒", "2.0.0", CLICurrentVersion},
|
|
{"预发布后缀被拒(会毒化账号指纹)", "2.2.0-local", CLICurrentVersion},
|
|
}
|
|
for _, tc := range cases {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
if got := resolveCLIVersion(tc.raw); got != tc.want {
|
|
t.Fatalf("resolveCLIVersion(%q) = %q, want %q", tc.raw, got, tc.want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
// 伪装身份的自洽性:User-Agent 头里的版本号必须与 CLIVersion() 一致。
|
|
// 两者由不同代码路径写入同一个请求,不一致会被上游判为非正版客户端。
|
|
func TestDefaultHeadersUserAgentMatchesCLIVersion(t *testing.T) {
|
|
want := "claude-cli/" + CLIVersion() + " (external, cli)"
|
|
if got := DefaultHeaders["User-Agent"]; got != want {
|
|
t.Fatalf("DefaultHeaders[User-Agent] = %q, want %q", got, want)
|
|
}
|
|
}
|
|
|
|
// 没有配置覆盖时,CLIVersion() 必须等于内置基线——保证本 PR 对既有部署零行为变化。
|
|
func TestCLIVersionDefaultsToBuiltinPin(t *testing.T) {
|
|
if got := CLIVersion(); got != CLICurrentVersion {
|
|
t.Fatalf("CLIVersion() = %q, want built-in pin %q (测试进程未设置 %s)", got, CLICurrentVersion, CLIVersionEnv)
|
|
}
|
|
}
|