topfans/backend/services/userService/service/auth_service_login_test.go
2026-06-15 14:15:24 +08:00

94 lines
2.7 KiB
Go

package service
import (
"context"
"errors"
"testing"
appErrors "github.com/topfans/backend/pkg/errors"
"github.com/topfans/backend/pkg/models"
pb "github.com/topfans/backend/pkg/proto/user"
"github.com/topfans/backend/services/userService/repository"
)
// §12.4 Test #1: 账号被封禁 → 业务码 403(不再是 500),typed error 可被 errors.Is 识别
func TestLogin_BannedAccount_Returns403(t *testing.T) {
skipIfNoTestEnv(t)
db := setupTestDB(t)
defer cleanupTestDB(t, db)
userRepo := repository.NewUserRepository()
fanProfileRepo := repository.NewFanProfileRepository()
starRepo := repository.NewStarRepository()
// 创建用户 + 封号状态
user := createTestUser(t, db, userRepo, "13800002001")
defer deleteTestUser(t, db, userRepo, user.ID)
reason := "违规发言"
if err := db.Create(&models.UserAccountStatus{
UserID: user.ID,
Status: "banned",
Reason: &reason,
}).Error; err != nil {
t.Fatalf("create banned status: %v", err)
}
svc := NewAuthService(userRepo, fanProfileRepo, starRepo, db)
_, err := svc.Login(&pb.LoginRequest{
Mobile: user.Mobile,
Password: "password123",
})
if !errors.Is(err, appErrors.ErrAccountBanned) {
t.Errorf("expected ErrAccountBanned, got %v", err)
}
// 验证 ToStatusCode 返回 403(而非 500)
if code := appErrors.ToStatusCode(err); code.String() != "STATUS_FORBIDDEN" {
t.Errorf("expected STATUS_FORBIDDEN, got %s", code.String())
}
}
// §12.4 Test #2: 账号被冻结 → 业务码 403,typed error 可识别
func TestLogin_FrozenAccount_Returns403(t *testing.T) {
skipIfNoTestEnv(t)
db := setupTestDB(t)
defer cleanupTestDB(t, db)
userRepo := repository.NewUserRepository()
fanProfileRepo := repository.NewFanProfileRepository()
starRepo := repository.NewStarRepository()
user := createTestUser(t, db, userRepo, "13800002002")
defer deleteTestUser(t, db, userRepo, user.ID)
reason := "异常登录"
// frozenUntil 设为未来时间,确保仍处于冻结状态
frozenUntil := int64(9999999999999)
if err := db.Create(&models.UserAccountStatus{
UserID: user.ID,
Status: "frozen",
Reason: &reason,
FrozenUntil: &frozenUntil,
}).Error; err != nil {
t.Fatalf("create frozen status: %v", err)
}
svc := NewAuthService(userRepo, fanProfileRepo, starRepo, db)
_, err := svc.Login(&pb.LoginRequest{
Mobile: user.Mobile,
Password: "password123",
})
if !errors.Is(err, appErrors.ErrAccountFrozen) {
t.Errorf("expected ErrAccountFrozen, got %v", err)
}
if code := appErrors.ToStatusCode(err); code.String() != "STATUS_FORBIDDEN" {
t.Errorf("expected STATUS_FORBIDDEN, got %s", code.String())
}
}
// 引用 context 包避免 unused import(测试可能 skip)
var _ = context.Background