96 lines
2.6 KiB
Go
96 lines
2.6 KiB
Go
package handler
|
|
|
|
import (
|
|
"net/http/httptest"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
func TestParseVersionFromName(t *testing.T) {
|
|
cases := []struct {
|
|
name, want string
|
|
}{
|
|
{"PixelArcade-Setup-1.0.1.exe", "1.0.1"},
|
|
{"PixelArcade-Setup-2.10.0.msi", "2.10.0"},
|
|
{"foo.zip", ""},
|
|
{"Setup.exe", ""},
|
|
}
|
|
for _, c := range cases {
|
|
if g := parseVersionFromName(c.name); g != c.want {
|
|
t.Fatalf("parseVersionFromName(%q)=%q, want %q", c.name, g, c.want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestCompareSemver(t *testing.T) {
|
|
if compareSemver("1.0.1", "1.0.0") <= 0 {
|
|
t.Fatal("1.0.1 should be newer than 1.0.0")
|
|
}
|
|
if compareSemver("1.0.0", "1.0.0") != 0 {
|
|
t.Fatal("equal versions")
|
|
}
|
|
if compareSemver("1.0.0", "1.2.0") >= 0 {
|
|
t.Fatal("1.0.0 should be older than 1.2.0")
|
|
}
|
|
}
|
|
|
|
func TestCanonicalDownloadPath(t *testing.T) {
|
|
cases := []struct{ in, want string }{
|
|
{"", ""},
|
|
{"/download/PixelArcade-Setup-1.0.1.exe", "/api/download/PixelArcade-Setup-1.0.1.exe"},
|
|
{"/api/download/foo.exe", "/api/download/foo.exe"},
|
|
{"https://game.nailaoyun.cn/download/foo.exe", "/api/download/foo.exe"},
|
|
{"http://127.0.0.1:8080/download/foo.exe", "/api/download/foo.exe"},
|
|
{"https://cdn.example.com/releases/foo.exe", "https://cdn.example.com/releases/foo.exe"},
|
|
}
|
|
for _, c := range cases {
|
|
if g := canonicalDownloadPath(c.in); g != c.want {
|
|
t.Fatalf("canonicalDownloadPath(%q)=%q, want %q", c.in, g, c.want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestVersionDownloadAttachment(t *testing.T) {
|
|
gin.SetMode(gin.TestMode)
|
|
dir := t.TempDir()
|
|
old, err := os.Getwd()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
t.Cleanup(func() { _ = os.Chdir(old) })
|
|
if err := os.Chdir(dir); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := os.MkdirAll(releaseDir, 0o755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
name := "PixelArcade-Setup-1.2.3.exe"
|
|
body := append([]byte("MZ"), []byte(strings.Repeat("x", 80))...)
|
|
if err := os.WriteFile(filepath.Join(releaseDir, name), body, 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
w := httptest.NewRecorder()
|
|
c, _ := gin.CreateTestContext(w)
|
|
c.Request = httptest.NewRequest("GET", "/api/download/"+name, nil)
|
|
c.Params = gin.Params{{Key: "filename", Value: name}}
|
|
VersionDownload(c)
|
|
if w.Code != 200 {
|
|
t.Fatalf("status %d", w.Code)
|
|
}
|
|
cd := w.Header().Get("Content-Disposition")
|
|
if !strings.Contains(cd, name) || !strings.Contains(cd, "attachment") {
|
|
t.Fatalf("Content-Disposition %q", cd)
|
|
}
|
|
if w.Header().Get("Content-Type") != "application/octet-stream" {
|
|
t.Fatalf("Content-Type %q", w.Header().Get("Content-Type"))
|
|
}
|
|
if !strings.HasPrefix(w.Body.String(), "MZ") {
|
|
t.Fatal("body should start with MZ")
|
|
}
|
|
}
|