feat:刷新时上游异常/卡密不存在自动标记已上报失效
This commit is contained in:
@@ -380,3 +380,174 @@ func TestRefreshTokenBinding_RejectsAvailableToken(t *testing.T) {
|
||||
t.Fatalf("available 状态应被拒绝,实际 err=%v", err)
|
||||
}
|
||||
}
|
||||
|
||||
// 上游 status=abnormal 时直接同步为已上报失效,优先级高于残留的绑定信息。
|
||||
func TestRefreshTokenBinding_UpstreamAbnormalMarksAbnormal(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{}{
|
||||
"token": map[string]interface{}{
|
||||
"status": "abnormal",
|
||||
"bound_account": "痛写心扉",
|
||||
"bound_account_id": "3132710334",
|
||||
},
|
||||
"binding": map[string]interface{}{"bound": true, "roleId": "3132710334"},
|
||||
})
|
||||
}))
|
||||
defer server.Close()
|
||||
|
||||
svc := NewRockService(db, NewRockClient(server.URL))
|
||||
setRockTestBearer(t, svc, "bearer-test")
|
||||
|
||||
token := model.RockToken{
|
||||
UpstreamTokenID: "9010",
|
||||
RedeemCode: "CODE-ABNORMAL",
|
||||
Status: model.RockStatusUsing,
|
||||
}
|
||||
if err := db.Create(&token).Error; err != nil {
|
||||
t.Fatalf("创建 Token 失败: %v", err)
|
||||
}
|
||||
|
||||
res, err := svc.RefreshTokenBinding(context.Background(), token.ID)
|
||||
if err != nil {
|
||||
t.Fatalf("刷新绑定状态失败: %v", err)
|
||||
}
|
||||
if res.Status != model.RockStatusAbnormal || !res.Changed {
|
||||
t.Fatalf("期望 abnormal 且 changed=true,实际 %+v", res)
|
||||
}
|
||||
if !strings.Contains(res.Message, "已上报失效") {
|
||||
t.Fatalf("提示应说明已标记失效,实际 %q", res.Message)
|
||||
}
|
||||
|
||||
var saved model.RockToken
|
||||
if err := db.First(&saved, token.ID).Error; err != nil {
|
||||
t.Fatalf("读取 Token 失败: %v", err)
|
||||
}
|
||||
if saved.Status != model.RockStatusAbnormal {
|
||||
t.Fatalf("状态应同步为 abnormal,实际 %s", saved.Status)
|
||||
}
|
||||
if saved.Remark != "上游状态异常(刷新自动同步)" {
|
||||
t.Fatalf("备注应写入系统原因,实际 %q", saved.Remark)
|
||||
}
|
||||
}
|
||||
|
||||
// 上游明确返回 Token 不存在(公开端与管理端都 404)时,绑定错误 Token 也同步为已上报失效。
|
||||
func TestRefreshTokenBinding_UpstreamDeletedMarksAbnormal(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")
|
||||
w.WriteHeader(http.StatusNotFound)
|
||||
_, _ = w.Write([]byte(`{"error":"Token 不存在"}`))
|
||||
}))
|
||||
defer server.Close()
|
||||
|
||||
svc := NewRockService(db, NewRockClient(server.URL))
|
||||
setRockTestBearer(t, svc, "bearer-test")
|
||||
|
||||
now := time.Now()
|
||||
token := model.RockToken{
|
||||
UpstreamTokenID: "9011",
|
||||
RedeemCode: "CODE-DELETED",
|
||||
Status: model.RockStatusMismatch,
|
||||
ExpectedUID: "1755431394",
|
||||
MismatchAt: &now,
|
||||
MismatchReason: "预期UID(1755431394) 与 扫码UID(Nfestx/1920708170) 不一致",
|
||||
}
|
||||
if err := db.Create(&token).Error; err != nil {
|
||||
t.Fatalf("创建 Token 失败: %v", err)
|
||||
}
|
||||
|
||||
res, err := svc.RefreshTokenBinding(context.Background(), token.ID)
|
||||
if err != nil {
|
||||
t.Fatalf("刷新绑定状态失败: %v", err)
|
||||
}
|
||||
if res.Status != model.RockStatusAbnormal {
|
||||
t.Fatalf("上游删除时应同步 abnormal,实际 %s", res.Status)
|
||||
}
|
||||
|
||||
var saved model.RockToken
|
||||
if err := db.First(&saved, token.ID).Error; err != nil {
|
||||
t.Fatalf("读取 Token 失败: %v", err)
|
||||
}
|
||||
if saved.Status != model.RockStatusAbnormal {
|
||||
t.Fatalf("状态应同步为 abnormal,实际 %s", saved.Status)
|
||||
}
|
||||
if saved.Remark != "上游卡密不存在(刷新自动同步)" {
|
||||
t.Fatalf("备注应写入系统原因,实际 %q", saved.Remark)
|
||||
}
|
||||
if saved.MismatchAt == nil {
|
||||
t.Fatalf("绑定错误历史应保留")
|
||||
}
|
||||
}
|
||||
|
||||
// 普通 404(网关/路由)不能被误判为卡密删除。
|
||||
func TestRefreshTokenBinding_Generic404KeepsState(t *testing.T) {
|
||||
db := newRockTestDB(t)
|
||||
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
w.WriteHeader(http.StatusNotFound)
|
||||
_, _ = w.Write([]byte(`{"error":"404 page not found"}`))
|
||||
}))
|
||||
defer server.Close()
|
||||
|
||||
svc := NewRockService(db, NewRockClient(server.URL))
|
||||
setRockTestBearer(t, svc, "bearer-test")
|
||||
|
||||
token := model.RockToken{
|
||||
UpstreamTokenID: "9012",
|
||||
RedeemCode: "CODE-GATEWAY-404",
|
||||
Status: model.RockStatusUsing,
|
||||
}
|
||||
if err := db.Create(&token).Error; err != nil {
|
||||
t.Fatalf("创建 Token 失败: %v", err)
|
||||
}
|
||||
|
||||
if _, err := svc.RefreshTokenBinding(context.Background(), token.ID); err == nil {
|
||||
t.Fatalf("普通 404 应返回错误,不能标记失效")
|
||||
}
|
||||
|
||||
var saved model.RockToken
|
||||
if err := db.First(&saved, token.ID).Error; err != nil {
|
||||
t.Fatalf("读取 Token 失败: %v", err)
|
||||
}
|
||||
if saved.Status != model.RockStatusUsing || saved.Remark != "" {
|
||||
t.Fatalf("普通 404 不应改动状态或备注,实际 %+v", saved)
|
||||
}
|
||||
}
|
||||
|
||||
// 已有备注时不被系统原因覆盖。
|
||||
func TestRefreshTokenBinding_AbnormalKeepsManualRemark(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{}{
|
||||
"token": map[string]interface{}{"status": "abnormal"},
|
||||
})
|
||||
}))
|
||||
defer server.Close()
|
||||
|
||||
svc := NewRockService(db, NewRockClient(server.URL))
|
||||
setRockTestBearer(t, svc, "bearer-test")
|
||||
|
||||
token := model.RockToken{
|
||||
UpstreamTokenID: "9013",
|
||||
RedeemCode: "CODE-ABNORMAL-REMARK",
|
||||
Status: model.RockStatusBound,
|
||||
Remark: "客服人工备注",
|
||||
}
|
||||
if err := db.Create(&token).Error; err != nil {
|
||||
t.Fatalf("创建 Token 失败: %v", err)
|
||||
}
|
||||
|
||||
if _, err := svc.RefreshTokenBinding(context.Background(), token.ID); err != nil {
|
||||
t.Fatalf("刷新绑定状态失败: %v", err)
|
||||
}
|
||||
|
||||
var saved model.RockToken
|
||||
if err := db.First(&saved, token.ID).Error; err != nil {
|
||||
t.Fatalf("读取 Token 失败: %v", err)
|
||||
}
|
||||
if saved.Status != model.RockStatusAbnormal || saved.Remark != "客服人工备注" {
|
||||
t.Fatalf("应保留人工备注并标记 abnormal,实际 %+v", saved)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user