feat:跳转上游不限状态显示

This commit is contained in:
2026-10-31 14:26:12 +08:00
parent c50f471f64
commit 2d1ff1b520
3 changed files with 179 additions and 14 deletions
@@ -3,6 +3,8 @@ package service
import (
"context"
"encoding/json"
"net/http"
"net/http/httptest"
"strings"
"testing"
@@ -57,7 +59,7 @@ func TestTokenPackageLink_RejectsWithoutPackage(t *testing.T) {
}
}
func TestTokenPackageLink_RejectsMissingShareCode(t *testing.T) {
func TestTokenPackageLink_RejectsMissingShareCodeWithoutBearer(t *testing.T) {
db := newRockTestDB(t)
svc := NewRockService(db, NewRockClient("https://example.com"))
@@ -73,8 +75,93 @@ func TestTokenPackageLink_RejectsMissingShareCode(t *testing.T) {
t.Fatalf("创建 Token 失败: %v", err)
}
if _, err := svc.TokenPackageLink(context.Background(), token.ID); err == nil || !strings.Contains(err.Error(), "缺少上游包分享码") {
t.Fatalf("缺少分享码应被拒绝,实际 err=%v", err)
if _, err := svc.TokenPackageLink(context.Background(), token.ID); err == nil || !strings.Contains(err.Error(), "无法反查上游包") {
t.Fatalf("缺少 Bearer Token 时应拒绝反查,实际 err=%v", err)
}
}
func TestTokenPackageLink_ResolvesAndBackfillsShareCode(t *testing.T) {
db := newRockTestDB(t)
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
if r.URL.Path != "/api/user/packages" {
w.WriteHeader(http.StatusNotFound)
return
}
_ = json.NewEncoder(w).Encode(map[string]interface{}{
"packages": []map[string]interface{}{
{"id": 1509, "share_code": "share-other"},
{"id": 1508, "share_code": "share-resolved"},
},
"pagination": map[string]interface{}{"page": 1, "pageSize": 100, "total": 2, "totalPages": 1},
})
}))
defer server.Close()
svc := NewRockService(db, NewRockClient(server.URL))
setRockTestBearer(t, svc, "bearer-test")
packageID := int64(1508)
tokens := []model.RockToken{
{UpstreamTokenID: "9103", RedeemCode: "CODE-NOSHARE", Color: model.RockColorBlack, Status: model.RockStatusMismatch, PackageID: &packageID},
{UpstreamTokenID: "9104", RedeemCode: "CODE-NOSHARE-2", Color: model.RockColorBlack, Status: model.RockStatusAvailable, PackageID: &packageID},
}
for i := range tokens {
if err := db.Create(&tokens[i]).Error; err != nil {
t.Fatalf("创建 Token 失败: %v", err)
}
}
res, err := svc.TokenPackageLink(context.Background(), tokens[0].ID)
if err != nil {
t.Fatalf("反查分享码失败: %v", err)
}
if res.ShareCode != "share-resolved" || !strings.HasSuffix(res.URL, "/#/package/share-resolved") {
t.Fatalf("反查结果不符: %+v", res)
}
var saved []model.RockToken
if err := db.Where("package_id = ?", packageID).Find(&saved).Error; err != nil {
t.Fatalf("查询 Token 失败: %v", err)
}
if len(saved) != len(tokens) {
t.Fatalf("Token 数量不符: %d", len(saved))
}
for _, row := range saved {
if row.PackageShareCode != "share-resolved" {
t.Fatalf("同包 Token 未回填: id=%d code=%q", row.ID, row.PackageShareCode)
}
}
}
func TestTokenPackageLink_RejectsWhenUpstreamPackageMissing(t *testing.T) {
db := newRockTestDB(t)
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
_ = json.NewEncoder(w).Encode(map[string]interface{}{
"packages": []map[string]interface{}{},
"pagination": map[string]interface{}{"page": 1, "pageSize": 100, "total": 0, "totalPages": 1},
})
}))
defer server.Close()
svc := NewRockService(db, NewRockClient(server.URL))
setRockTestBearer(t, svc, "bearer-test")
packageID := int64(1599)
token := model.RockToken{
UpstreamTokenID: "9105",
RedeemCode: "CODE-GONE",
Color: model.RockColorBlack,
Status: model.RockStatusMismatch,
PackageID: &packageID,
}
if err := db.Create(&token).Error; err != nil {
t.Fatalf("创建 Token 失败: %v", err)
}
if _, err := svc.TokenPackageLink(context.Background(), token.ID); err == nil || !strings.Contains(err.Error(), "上游未找到") {
t.Fatalf("上游无该包时应返回明确错误,实际 err=%v", err)
}
}