102 lines
2.9 KiB
Go
102 lines
2.9 KiB
Go
package update
|
|
|
|
import (
|
|
"fmt"
|
|
"runtime"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestCompareVersions(t *testing.T) {
|
|
cases := []struct {
|
|
name string
|
|
current string
|
|
latest string
|
|
want bool
|
|
wantErr bool
|
|
}{
|
|
{"落后于最新版", "1.0.0", "1.0.1", true, false},
|
|
{"小幅落后大版本", "1.9.9", "2.0.0", true, false},
|
|
{"版本相同", "1.0.0", "1.0.0", false, false},
|
|
{"当前更新", "1.2.0", "1.1.0", false, false},
|
|
{"latest 带 v 前缀", "1.0.0", "v1.0.1", true, false},
|
|
{"dev 构建保守提示更新", "dev", "0.0.1", true, false},
|
|
{"当前版本无法解析按 dev 处理", "garbage", "0.0.1", true, false},
|
|
{"git describe 版本与基础版本等价", "0.2.0_39", "0.2.0", false, false},
|
|
{"git describe 版本落后于新版", "0.2.0_39", "0.2.1", true, false},
|
|
{"latest 无法解析报错", "1.0.0", "not-a-version", false, true},
|
|
}
|
|
|
|
for _, c := range cases {
|
|
t.Run(c.name, func(t *testing.T) {
|
|
got, err := compareVersions(c.current, c.latest)
|
|
if c.wantErr {
|
|
if err == nil {
|
|
t.Fatalf("latest=%q 无法解析时应返回错误", c.latest)
|
|
}
|
|
return
|
|
}
|
|
if err != nil {
|
|
t.Fatalf("比较失败: %v", err)
|
|
}
|
|
if got != c.want {
|
|
t.Errorf("compareVersions(%q, %q) = %v, want %v", c.current, c.latest, got, c.want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestHasUpdateButNoAsset(t *testing.T) {
|
|
cases := []struct {
|
|
name string
|
|
result *CheckResult
|
|
want bool
|
|
}{
|
|
{"nil 结果", nil, false},
|
|
{"有更新且有安装包", &CheckResult{HasUpdate: true, DownloadURL: "https://example.com/team-api-0.2.14-linux-amd64.tar.gz"}, false},
|
|
{"无更新且无安装包", &CheckResult{HasUpdate: false, DownloadURL: ""}, false},
|
|
{"有更新但缺安装包(发布窗口期脏数据)", &CheckResult{HasUpdate: true, DownloadURL: ""}, true},
|
|
}
|
|
|
|
for _, c := range cases {
|
|
t.Run(c.name, func(t *testing.T) {
|
|
if got := HasUpdateButNoAsset(c.result); got != c.want {
|
|
t.Errorf("HasUpdateButNoAsset(%+v) = %v, want %v", c.result, got, c.want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestNormalizeSemver(t *testing.T) {
|
|
cases := []struct{ in, want string }{
|
|
{"0.2.0_39", "0.2.0+39"}, // Makefile git describe 版本:下划线转构建元数据
|
|
{"v1.2.3", "1.2.3"}, // v 前缀剥离
|
|
{"1.2.3", "1.2.3"}, // 原样保留
|
|
{"dev", "dev"},
|
|
}
|
|
for _, c := range cases {
|
|
if got := normalizeSemver(c.in); got != c.want {
|
|
t.Errorf("normalizeSemver(%q) = %q, want %q", c.in, got, c.want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestGetPlatformAssetName(t *testing.T) {
|
|
ext := "tar.gz"
|
|
if runtime.GOOS == "windows" {
|
|
ext = "zip"
|
|
}
|
|
|
|
// v 前缀应被剥离
|
|
got := getPlatformAssetName("v1.2.3")
|
|
want := fmt.Sprintf("team-api-1.2.3-%s-%s.%s", runtime.GOOS, runtime.GOARCH, ext)
|
|
if got != want {
|
|
t.Errorf("getPlatformAssetName(v1.2.3) = %q, want %q", got, want)
|
|
}
|
|
|
|
// 无前缀原样使用
|
|
if got := getPlatformAssetName("2.0.0"); !strings.Contains(got, "team-api-2.0.0-") {
|
|
t.Errorf("getPlatformAssetName(2.0.0) = %q, 应包含 team-api-2.0.0-", got)
|
|
}
|
|
}
|