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