Files
CLIProxyAPI/internal/pluginstore/github_test.go
2026-06-12 23:15:00 +08:00

94 lines
2.9 KiB
Go

package pluginstore
import (
"crypto/sha256"
"encoding/hex"
"strings"
"testing"
)
func TestSelectReleaseAssets(t *testing.T) {
t.Parallel()
release := Release{Assets: []ReleaseAsset{
{Name: "sample-provider_0.1.0_darwin_arm64.zip", BrowserDownloadURL: "https://example.com/sample-provider.zip"},
{Name: "checksums.txt", BrowserDownloadURL: "https://example.com/checksums.txt"},
}}
archiveAsset, checksumAsset, errSelect := SelectReleaseAssets(release, "sample-provider", "0.1.0", "darwin", "arm64")
if errSelect != nil {
t.Fatalf("SelectReleaseAssets() error = %v", errSelect)
}
if archiveAsset.BrowserDownloadURL != "https://example.com/sample-provider.zip" {
t.Fatalf("archive URL = %q", archiveAsset.BrowserDownloadURL)
}
if checksumAsset.BrowserDownloadURL != "https://example.com/checksums.txt" {
t.Fatalf("checksum URL = %q", checksumAsset.BrowserDownloadURL)
}
}
func TestSelectReleaseAssetsRejectsMissingAssets(t *testing.T) {
t.Parallel()
tests := []struct {
name string
release Release
wantErr string
}{
{
name: "missing zip",
release: Release{Assets: []ReleaseAsset{
{Name: "checksums.txt", BrowserDownloadURL: "https://example.com/checksums.txt"},
}},
wantErr: "sample-provider_0.1.0_darwin_arm64.zip",
},
{
name: "missing checksum",
release: Release{Assets: []ReleaseAsset{
{Name: "sample-provider_0.1.0_darwin_arm64.zip", BrowserDownloadURL: "https://example.com/sample-provider.zip"},
}},
wantErr: "checksums.txt",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
_, _, errSelect := SelectReleaseAssets(tt.release, "sample-provider", "0.1.0", "darwin", "arm64")
if errSelect == nil {
t.Fatal("SelectReleaseAssets() error = nil")
}
if !strings.Contains(errSelect.Error(), tt.wantErr) {
t.Fatalf("SelectReleaseAssets() error = %v, want substring %q", errSelect, tt.wantErr)
}
})
}
}
func TestParseChecksumsAndVerifyChecksum(t *testing.T) {
t.Parallel()
data := []byte("zip-data")
sum := sha256.Sum256(data)
checksumText := hex.EncodeToString(sum[:]) + " sample-provider_0.1.0_darwin_arm64.zip\n"
checksums, errParse := ParseChecksums([]byte(checksumText))
if errParse != nil {
t.Fatalf("ParseChecksums() error = %v", errParse)
}
if errVerify := VerifyChecksum("sample-provider_0.1.0_darwin_arm64.zip", data, checksums); errVerify != nil {
t.Fatalf("VerifyChecksum() error = %v", errVerify)
}
}
func TestVerifyChecksumRejectsMissingAndMismatch(t *testing.T) {
t.Parallel()
sum := sha256.Sum256([]byte("zip-data"))
checksums := map[string]string{"sample-provider.zip": hex.EncodeToString(sum[:])}
if errVerify := VerifyChecksum("missing.zip", []byte("zip-data"), checksums); errVerify == nil {
t.Fatal("VerifyChecksum() missing checksum error = nil")
}
if errVerify := VerifyChecksum("sample-provider.zip", []byte("other"), checksums); errVerify == nil {
t.Fatal("VerifyChecksum() mismatch error = nil")
}
}