858 lines
23 KiB
Go
858 lines
23 KiB
Go
package repository
|
||
|
||
import (
|
||
"testing"
|
||
"time"
|
||
|
||
"github.com/topfans/backend/pkg/database"
|
||
"github.com/topfans/backend/pkg/models"
|
||
"gorm.io/gorm"
|
||
)
|
||
|
||
// setupTestDB 设置测试数据库
|
||
func setupTestDB(t *testing.T) *gorm.DB {
|
||
config := database.Config{
|
||
Host: "localhost",
|
||
Port: 5432,
|
||
User: "haihuizhu",
|
||
Password: "admin",
|
||
DBName: "top-fans",
|
||
SSLMode: "disable",
|
||
TimeZone: "Asia/Shanghai",
|
||
}
|
||
|
||
if err := database.Init(config); err != nil {
|
||
t.Skipf("Skipping test: failed to connect to test database: %v", err)
|
||
}
|
||
|
||
db := database.GetDB()
|
||
|
||
// 只迁移好友相关表(假设基础表已存在)
|
||
// 注意:如果表已存在,AutoMigrate会自动更新表结构
|
||
if err := db.AutoMigrate(&models.FriendRequest{}, &models.Friendship{}); err != nil {
|
||
t.Logf("Warning: Failed to migrate friend tables (may already exist): %v", err)
|
||
// 不要失败,继续测试
|
||
}
|
||
|
||
return db
|
||
}
|
||
|
||
// cleanupTestDB 清理测试数据
|
||
func cleanupTestDB(t *testing.T, db *gorm.DB) {
|
||
// 清理测试数据(注意外键约束顺序)
|
||
db.Exec("DELETE FROM friendships WHERE user_id IN (SELECT id FROM users WHERE mobile LIKE '188%')")
|
||
db.Exec("DELETE FROM friend_requests WHERE from_user_id IN (SELECT id FROM users WHERE mobile LIKE '188%')")
|
||
db.Exec("DELETE FROM fan_profiles WHERE user_id IN (SELECT id FROM users WHERE mobile LIKE '188%')")
|
||
db.Exec("DELETE FROM users WHERE mobile LIKE '188%'")
|
||
db.Exec("DELETE FROM stars WHERE identity_id LIKE 'test_social_%'")
|
||
}
|
||
|
||
// createTestStar 创建测试用明星
|
||
func createTestStar(t *testing.T, db *gorm.DB, identityID string) *models.Star {
|
||
star := &models.Star{
|
||
Name: "测试明星-" + identityID,
|
||
IdentityID: identityID,
|
||
IsActive: true,
|
||
}
|
||
if err := db.Create(star).Error; err != nil {
|
||
t.Fatalf("Failed to create test star: %v", err)
|
||
}
|
||
return star
|
||
}
|
||
|
||
// createTestUser 创建测试用户
|
||
func createTestUser(t *testing.T, db *gorm.DB, mobile string) *models.User {
|
||
user := &models.User{
|
||
Mobile: mobile,
|
||
PasswordHash: "test_hash",
|
||
IsActive: true,
|
||
}
|
||
if err := db.Create(user).Error; err != nil {
|
||
t.Fatalf("Failed to create test user: %v", err)
|
||
}
|
||
return user
|
||
}
|
||
|
||
// createTestFanProfile 创建测试粉丝档案
|
||
func createTestFanProfile(t *testing.T, db *gorm.DB, userID, starID int64, nickname string) *models.FanProfile {
|
||
profile := &models.FanProfile{
|
||
UserID: userID,
|
||
StarID: starID,
|
||
Nickname: nickname,
|
||
Level: 1,
|
||
Social: 0,
|
||
}
|
||
if err := db.Create(profile).Error; err != nil {
|
||
t.Fatalf("Failed to create test fan profile: %v", err)
|
||
}
|
||
return profile
|
||
}
|
||
|
||
// ==================== 好友请求相关测试 ====================
|
||
|
||
func TestSocialRepository_CreateRequest(t *testing.T) {
|
||
db := setupTestDB(t)
|
||
defer cleanupTestDB(t, db)
|
||
|
||
repo := NewSocialRepository()
|
||
|
||
// 创建测试数据
|
||
star := createTestStar(t, db, "test_social_001")
|
||
user1 := createTestUser(t, db, "18800000001")
|
||
user2 := createTestUser(t, db, "18800000002")
|
||
|
||
// 创建好友请求
|
||
expiresAt := time.Now().Add(30 * 24 * time.Hour).UnixMilli()
|
||
message := "你好,我想加你为好友"
|
||
request := &models.FriendRequest{
|
||
FromUserID: user1.ID,
|
||
ToUserID: user2.ID,
|
||
StarID: star.StarID,
|
||
Message: &message,
|
||
Status: models.FriendRequestStatusPending,
|
||
ExpiresAt: &expiresAt,
|
||
}
|
||
|
||
err := repo.CreateRequest(request)
|
||
if err != nil {
|
||
t.Fatalf("CreateRequest failed: %v", err)
|
||
}
|
||
|
||
// 验证
|
||
if request.ID == 0 {
|
||
t.Fatal("Request ID should not be zero after creation")
|
||
}
|
||
|
||
if request.CreatedAt == 0 {
|
||
t.Fatal("CreatedAt should be set")
|
||
}
|
||
|
||
// 测试nil请求
|
||
err = repo.CreateRequest(nil)
|
||
if err == nil {
|
||
t.Fatal("Expected error for nil request")
|
||
}
|
||
}
|
||
|
||
func TestSocialRepository_GetRequestByID(t *testing.T) {
|
||
db := setupTestDB(t)
|
||
defer cleanupTestDB(t, db)
|
||
|
||
repo := NewSocialRepository()
|
||
|
||
// 创建测试数据
|
||
star := createTestStar(t, db, "test_social_002")
|
||
user1 := createTestUser(t, db, "18800000003")
|
||
user2 := createTestUser(t, db, "18800000004")
|
||
|
||
expiresAt := time.Now().Add(30 * 24 * time.Hour).UnixMilli()
|
||
message := "测试消息"
|
||
request := &models.FriendRequest{
|
||
FromUserID: user1.ID,
|
||
ToUserID: user2.ID,
|
||
StarID: star.StarID,
|
||
Message: &message,
|
||
Status: models.FriendRequestStatusPending,
|
||
ExpiresAt: &expiresAt,
|
||
}
|
||
db.Create(request)
|
||
|
||
// 测试正常查询
|
||
retrieved, err := repo.GetRequestByID(request.ID)
|
||
if err != nil {
|
||
t.Fatalf("GetRequestByID failed: %v", err)
|
||
}
|
||
|
||
if retrieved == nil {
|
||
t.Fatal("Retrieved request should not be nil")
|
||
}
|
||
|
||
if retrieved.ID != request.ID {
|
||
t.Errorf("ID mismatch: expected %d, got %d", request.ID, retrieved.ID)
|
||
}
|
||
|
||
if retrieved.FromUserID != user1.ID {
|
||
t.Errorf("FromUserID mismatch: expected %d, got %d", user1.ID, retrieved.FromUserID)
|
||
}
|
||
|
||
// 测试不存在的请求
|
||
retrieved, err = repo.GetRequestByID(99999)
|
||
if err != nil {
|
||
t.Fatalf("GetRequestByID failed for non-existent request: %v", err)
|
||
}
|
||
|
||
if retrieved != nil {
|
||
t.Fatal("Expected nil for non-existent request")
|
||
}
|
||
}
|
||
|
||
func TestSocialRepository_GetRequestsByUser(t *testing.T) {
|
||
db := setupTestDB(t)
|
||
defer cleanupTestDB(t, db)
|
||
|
||
repo := NewSocialRepository()
|
||
|
||
// 创建测试数据
|
||
star := createTestStar(t, db, "test_social_003")
|
||
user1 := createTestUser(t, db, "18800000005")
|
||
user2 := createTestUser(t, db, "18800000006")
|
||
user3 := createTestUser(t, db, "18800000007")
|
||
|
||
// 创建多个请求
|
||
expiresAt := time.Now().Add(30 * 24 * time.Hour).UnixMilli()
|
||
message := "测试消息"
|
||
|
||
// user1 -> user2 (pending)
|
||
request1 := &models.FriendRequest{
|
||
FromUserID: user1.ID,
|
||
ToUserID: user2.ID,
|
||
StarID: star.StarID,
|
||
Message: &message,
|
||
Status: models.FriendRequestStatusPending,
|
||
ExpiresAt: &expiresAt,
|
||
}
|
||
db.Create(request1)
|
||
|
||
// user1 -> user3 (accepted)
|
||
request2 := &models.FriendRequest{
|
||
FromUserID: user1.ID,
|
||
ToUserID: user3.ID,
|
||
StarID: star.StarID,
|
||
Message: &message,
|
||
Status: models.FriendRequestStatusAccepted,
|
||
ExpiresAt: &expiresAt,
|
||
}
|
||
db.Create(request2)
|
||
|
||
// user3 -> user1 (pending)
|
||
request3 := &models.FriendRequest{
|
||
FromUserID: user3.ID,
|
||
ToUserID: user1.ID,
|
||
StarID: star.StarID,
|
||
Message: &message,
|
||
Status: models.FriendRequestStatusPending,
|
||
ExpiresAt: &expiresAt,
|
||
}
|
||
db.Create(request3)
|
||
|
||
// 测试获取发出的请求(sent)
|
||
sentRequests, total, err := repo.GetRequestsByUser(user1.ID, star.StarID, models.FriendRequestTypeSent, "", 1, 10)
|
||
if err != nil {
|
||
t.Fatalf("GetRequestsByUser (sent) failed: %v", err)
|
||
}
|
||
|
||
if total != 2 {
|
||
t.Errorf("Expected 2 sent requests, got %d", total)
|
||
}
|
||
|
||
if len(sentRequests) != 2 {
|
||
t.Errorf("Expected 2 sent requests in list, got %d", len(sentRequests))
|
||
}
|
||
|
||
// 测试获取收到的请求(received)
|
||
_, total, err = repo.GetRequestsByUser(user1.ID, star.StarID, models.FriendRequestTypeReceived, "", 1, 10)
|
||
if err != nil {
|
||
t.Fatalf("GetRequestsByUser (received) failed: %v", err)
|
||
}
|
||
|
||
if total != 1 {
|
||
t.Errorf("Expected 1 received request, got %d", total)
|
||
}
|
||
|
||
// 测试状态筛选
|
||
_, total, err = repo.GetRequestsByUser(user1.ID, star.StarID, models.FriendRequestTypeSent, models.FriendRequestStatusPending, 1, 10)
|
||
if err != nil {
|
||
t.Fatalf("GetRequestsByUser (pending) failed: %v", err)
|
||
}
|
||
|
||
if total != 1 {
|
||
t.Errorf("Expected 1 pending sent request, got %d", total)
|
||
}
|
||
|
||
// 测试分页
|
||
pagedRequests, total, err := repo.GetRequestsByUser(user1.ID, star.StarID, models.FriendRequestTypeSent, "", 1, 1)
|
||
if err != nil {
|
||
t.Fatalf("GetRequestsByUser (paged) failed: %v", err)
|
||
}
|
||
|
||
if total != 2 {
|
||
t.Errorf("Expected total 2, got %d", total)
|
||
}
|
||
|
||
if len(pagedRequests) != 1 {
|
||
t.Errorf("Expected 1 request in page, got %d", len(pagedRequests))
|
||
}
|
||
|
||
// 测试无效的请求类型
|
||
_, _, err = repo.GetRequestsByUser(user1.ID, star.StarID, "invalid", "", 1, 10)
|
||
if err == nil {
|
||
t.Fatal("Expected error for invalid request type")
|
||
}
|
||
}
|
||
|
||
func TestSocialRepository_GetLatestRequest(t *testing.T) {
|
||
db := setupTestDB(t)
|
||
defer cleanupTestDB(t, db)
|
||
|
||
repo := NewSocialRepository()
|
||
|
||
// 创建测试数据
|
||
star := createTestStar(t, db, "test_social_004")
|
||
user1 := createTestUser(t, db, "18800000008")
|
||
user2 := createTestUser(t, db, "18800000009")
|
||
|
||
// 创建多个历史请求
|
||
expiresAt := time.Now().Add(30 * 24 * time.Hour).UnixMilli()
|
||
message := "第一次请求"
|
||
|
||
// 第一次请求(rejected)
|
||
request1 := &models.FriendRequest{
|
||
FromUserID: user1.ID,
|
||
ToUserID: user2.ID,
|
||
StarID: star.StarID,
|
||
Message: &message,
|
||
Status: models.FriendRequestStatusRejected,
|
||
ExpiresAt: &expiresAt,
|
||
}
|
||
db.Create(request1)
|
||
|
||
time.Sleep(10 * time.Millisecond) // 确保时间不同
|
||
|
||
// 第二次请求(pending)
|
||
message2 := "第二次请求"
|
||
request2 := &models.FriendRequest{
|
||
FromUserID: user1.ID,
|
||
ToUserID: user2.ID,
|
||
StarID: star.StarID,
|
||
Message: &message2,
|
||
Status: models.FriendRequestStatusPending,
|
||
ExpiresAt: &expiresAt,
|
||
}
|
||
db.Create(request2)
|
||
|
||
// 获取最新请求
|
||
latest, err := repo.GetLatestRequest(user1.ID, user2.ID, star.StarID)
|
||
if err != nil {
|
||
t.Fatalf("GetLatestRequest failed: %v", err)
|
||
}
|
||
|
||
if latest == nil {
|
||
t.Fatal("Latest request should not be nil")
|
||
}
|
||
|
||
if latest.ID != request2.ID {
|
||
t.Errorf("Expected latest request ID %d, got %d", request2.ID, latest.ID)
|
||
}
|
||
|
||
if latest.Status != models.FriendRequestStatusPending {
|
||
t.Errorf("Expected status pending, got %s", latest.Status)
|
||
}
|
||
|
||
// 测试不存在的请求
|
||
latest, err = repo.GetLatestRequest(99999, 99999, star.StarID)
|
||
if err != nil {
|
||
t.Fatalf("GetLatestRequest failed for non-existent: %v", err)
|
||
}
|
||
|
||
if latest != nil {
|
||
t.Fatal("Expected nil for non-existent request")
|
||
}
|
||
}
|
||
|
||
func TestSocialRepository_UpdateRequestStatus(t *testing.T) {
|
||
db := setupTestDB(t)
|
||
defer cleanupTestDB(t, db)
|
||
|
||
repo := NewSocialRepository()
|
||
|
||
// 创建测试数据
|
||
star := createTestStar(t, db, "test_social_005")
|
||
user1 := createTestUser(t, db, "18800000010")
|
||
user2 := createTestUser(t, db, "18800000011")
|
||
|
||
expiresAt := time.Now().Add(30 * 24 * time.Hour).UnixMilli()
|
||
message := "测试消息"
|
||
request := &models.FriendRequest{
|
||
FromUserID: user1.ID,
|
||
ToUserID: user2.ID,
|
||
StarID: star.StarID,
|
||
Message: &message,
|
||
Status: models.FriendRequestStatusPending,
|
||
ExpiresAt: &expiresAt,
|
||
}
|
||
db.Create(request)
|
||
|
||
// 更新状态(不更新处理时间)
|
||
err := repo.UpdateRequestStatus(request.ID, models.FriendRequestStatusAccepted, nil)
|
||
if err != nil {
|
||
t.Fatalf("UpdateRequestStatus failed: %v", err)
|
||
}
|
||
|
||
// 验证更新
|
||
retrieved, _ := repo.GetRequestByID(request.ID)
|
||
if retrieved.Status != models.FriendRequestStatusAccepted {
|
||
t.Errorf("Expected status accepted, got %s", retrieved.Status)
|
||
}
|
||
|
||
if retrieved.ProcessedAt != nil {
|
||
t.Error("ProcessedAt should be nil when not provided")
|
||
}
|
||
|
||
// 更新状态(更新处理时间)
|
||
processedAt := time.Now().UnixMilli()
|
||
err = repo.UpdateRequestStatus(request.ID, models.FriendRequestStatusRejected, &processedAt)
|
||
if err != nil {
|
||
t.Fatalf("UpdateRequestStatus with processedAt failed: %v", err)
|
||
}
|
||
|
||
// 验证更新
|
||
retrieved, _ = repo.GetRequestByID(request.ID)
|
||
if retrieved.Status != models.FriendRequestStatusRejected {
|
||
t.Errorf("Expected status rejected, got %s", retrieved.Status)
|
||
}
|
||
|
||
if retrieved.ProcessedAt == nil {
|
||
t.Fatal("ProcessedAt should not be nil")
|
||
}
|
||
|
||
if *retrieved.ProcessedAt != processedAt {
|
||
t.Errorf("ProcessedAt mismatch: expected %d, got %d", processedAt, *retrieved.ProcessedAt)
|
||
}
|
||
|
||
// 测试不存在的请求
|
||
err = repo.UpdateRequestStatus(99999, models.FriendRequestStatusAccepted, nil)
|
||
if err == nil {
|
||
t.Fatal("Expected error for non-existent request")
|
||
}
|
||
}
|
||
|
||
// ==================== 好友关系相关测试 ====================
|
||
|
||
func TestSocialRepository_CreateFriendshipPair(t *testing.T) {
|
||
db := setupTestDB(t)
|
||
defer cleanupTestDB(t, db)
|
||
|
||
repo := NewSocialRepository()
|
||
|
||
// 创建测试数据
|
||
star := createTestStar(t, db, "test_social_006")
|
||
user1 := createTestUser(t, db, "18800000012")
|
||
user2 := createTestUser(t, db, "18800000013")
|
||
|
||
// 创建双向好友关系
|
||
err := repo.CreateFriendshipPair(user1.ID, user2.ID, star.StarID)
|
||
if err != nil {
|
||
t.Fatalf("CreateFriendshipPair failed: %v", err)
|
||
}
|
||
|
||
// 验证 A→B 关系
|
||
var friendship1 models.Friendship
|
||
err = db.Where("user_id = ? AND friend_id = ? AND star_id = ?", user1.ID, user2.ID, star.StarID).First(&friendship1).Error
|
||
if err != nil {
|
||
t.Fatalf("Failed to find friendship A→B: %v", err)
|
||
}
|
||
|
||
if friendship1.Status != models.FriendshipStatusAccepted {
|
||
t.Errorf("Expected status accepted, got %s", friendship1.Status)
|
||
}
|
||
|
||
// 验证 B→A 关系
|
||
var friendship2 models.Friendship
|
||
err = db.Where("user_id = ? AND friend_id = ? AND star_id = ?", user2.ID, user1.ID, star.StarID).First(&friendship2).Error
|
||
if err != nil {
|
||
t.Fatalf("Failed to find friendship B→A: %v", err)
|
||
}
|
||
|
||
if friendship2.Status != models.FriendshipStatusAccepted {
|
||
t.Errorf("Expected status accepted, got %s", friendship2.Status)
|
||
}
|
||
|
||
// 测试重复创建(应该失败,因为有唯一索引)
|
||
err = repo.CreateFriendshipPair(user1.ID, user2.ID, star.StarID)
|
||
if err == nil {
|
||
t.Fatal("Expected error for duplicate friendship")
|
||
}
|
||
}
|
||
|
||
func TestSocialRepository_CheckFriendship(t *testing.T) {
|
||
db := setupTestDB(t)
|
||
defer cleanupTestDB(t, db)
|
||
|
||
repo := NewSocialRepository()
|
||
|
||
// 创建测试数据
|
||
star := createTestStar(t, db, "test_social_007")
|
||
user1 := createTestUser(t, db, "18800000014")
|
||
user2 := createTestUser(t, db, "18800000015")
|
||
user3 := createTestUser(t, db, "18800000016")
|
||
|
||
// 创建好友关系
|
||
repo.CreateFriendshipPair(user1.ID, user2.ID, star.StarID)
|
||
|
||
// 测试已存在的好友关系
|
||
isFriend, err := repo.CheckFriendship(user1.ID, user2.ID, star.StarID)
|
||
if err != nil {
|
||
t.Fatalf("CheckFriendship failed: %v", err)
|
||
}
|
||
|
||
if !isFriend {
|
||
t.Error("Expected users to be friends")
|
||
}
|
||
|
||
// 测试反向关系
|
||
isFriend, err = repo.CheckFriendship(user2.ID, user1.ID, star.StarID)
|
||
if err != nil {
|
||
t.Fatalf("CheckFriendship (reverse) failed: %v", err)
|
||
}
|
||
|
||
if !isFriend {
|
||
t.Error("Expected reverse friendship to exist")
|
||
}
|
||
|
||
// 测试不存在的好友关系
|
||
isFriend, err = repo.CheckFriendship(user1.ID, user3.ID, star.StarID)
|
||
if err != nil {
|
||
t.Fatalf("CheckFriendship (non-friend) failed: %v", err)
|
||
}
|
||
|
||
if isFriend {
|
||
t.Error("Expected users to not be friends")
|
||
}
|
||
}
|
||
|
||
func TestSocialRepository_GetFriendsByUser(t *testing.T) {
|
||
db := setupTestDB(t)
|
||
defer cleanupTestDB(t, db)
|
||
|
||
repo := NewSocialRepository()
|
||
|
||
// 创建测试数据
|
||
star := createTestStar(t, db, "test_social_008")
|
||
user1 := createTestUser(t, db, "18800000017")
|
||
user2 := createTestUser(t, db, "18800000018")
|
||
user3 := createTestUser(t, db, "18800000019")
|
||
user4 := createTestUser(t, db, "18800000020")
|
||
|
||
// 创建粉丝档案(为关键词搜索准备)
|
||
createTestFanProfile(t, db, user2.ID, star.StarID, "张三")
|
||
createTestFanProfile(t, db, user3.ID, star.StarID, "李四")
|
||
createTestFanProfile(t, db, user4.ID, star.StarID, "王五")
|
||
|
||
// 创建好友关系
|
||
repo.CreateFriendshipPair(user1.ID, user2.ID, star.StarID)
|
||
repo.CreateFriendshipPair(user1.ID, user3.ID, star.StarID)
|
||
repo.CreateFriendshipPair(user1.ID, user4.ID, star.StarID)
|
||
|
||
// 设置备注
|
||
remark := "小张"
|
||
db.Model(&models.Friendship{}).Where("user_id = ? AND friend_id = ?", user1.ID, user2.ID).Update("remark", remark)
|
||
|
||
// 测试获取所有好友
|
||
friends, total, err := repo.GetFriendsByUser(user1.ID, star.StarID, "", 1, 10)
|
||
if err != nil {
|
||
t.Fatalf("GetFriendsByUser failed: %v", err)
|
||
}
|
||
|
||
if total != 3 {
|
||
t.Errorf("Expected 3 friends, got %d", total)
|
||
}
|
||
|
||
if len(friends) != 3 {
|
||
t.Errorf("Expected 3 friends in list, got %d", len(friends))
|
||
}
|
||
|
||
// 测试关键词搜索(搜索昵称)
|
||
friends, total, err = repo.GetFriendsByUser(user1.ID, star.StarID, "张", 1, 10)
|
||
if err != nil {
|
||
t.Fatalf("GetFriendsByUser with keyword failed: %v", err)
|
||
}
|
||
|
||
if total != 1 {
|
||
t.Errorf("Expected 1 friend matching '张', got %d", total)
|
||
}
|
||
|
||
// 测试关键词搜索(搜索备注)
|
||
friends, total, err = repo.GetFriendsByUser(user1.ID, star.StarID, "小张", 1, 10)
|
||
if err != nil {
|
||
t.Fatalf("GetFriendsByUser with remark keyword failed: %v", err)
|
||
}
|
||
|
||
if total != 1 {
|
||
t.Errorf("Expected 1 friend matching '小张', got %d", total)
|
||
}
|
||
|
||
// 测试分页
|
||
friends, total, err = repo.GetFriendsByUser(user1.ID, star.StarID, "", 1, 2)
|
||
if err != nil {
|
||
t.Fatalf("GetFriendsByUser with pagination failed: %v", err)
|
||
}
|
||
|
||
if total != 3 {
|
||
t.Errorf("Expected total 3, got %d", total)
|
||
}
|
||
|
||
if len(friends) != 2 {
|
||
t.Errorf("Expected 2 friends in first page, got %d", len(friends))
|
||
}
|
||
|
||
// 测试第二页
|
||
friends, total, err = repo.GetFriendsByUser(user1.ID, star.StarID, "", 2, 2)
|
||
if err != nil {
|
||
t.Fatalf("GetFriendsByUser second page failed: %v", err)
|
||
}
|
||
|
||
if len(friends) != 1 {
|
||
t.Errorf("Expected 1 friend in second page, got %d", len(friends))
|
||
}
|
||
}
|
||
|
||
func TestSocialRepository_DeleteFriendshipPair(t *testing.T) {
|
||
db := setupTestDB(t)
|
||
defer cleanupTestDB(t, db)
|
||
|
||
repo := NewSocialRepository()
|
||
|
||
// 创建测试数据
|
||
star := createTestStar(t, db, "test_social_009")
|
||
user1 := createTestUser(t, db, "18800000021")
|
||
user2 := createTestUser(t, db, "18800000022")
|
||
|
||
// 创建好友关系
|
||
repo.CreateFriendshipPair(user1.ID, user2.ID, star.StarID)
|
||
|
||
// 验证关系存在
|
||
isFriend, _ := repo.CheckFriendship(user1.ID, user2.ID, star.StarID)
|
||
if !isFriend {
|
||
t.Fatal("Friendship should exist before deletion")
|
||
}
|
||
|
||
// 删除好友关系
|
||
err := repo.DeleteFriendshipPair(user1.ID, user2.ID, star.StarID)
|
||
if err != nil {
|
||
t.Fatalf("DeleteFriendshipPair failed: %v", err)
|
||
}
|
||
|
||
// 验证 A→B 关系已删除
|
||
isFriend, _ = repo.CheckFriendship(user1.ID, user2.ID, star.StarID)
|
||
if isFriend {
|
||
t.Error("Friendship A→B should be deleted")
|
||
}
|
||
|
||
// 验证 B→A 关系已删除
|
||
isFriend, _ = repo.CheckFriendship(user2.ID, user1.ID, star.StarID)
|
||
if isFriend {
|
||
t.Error("Friendship B→A should be deleted")
|
||
}
|
||
|
||
// 测试删除不存在的关系
|
||
err = repo.DeleteFriendshipPair(user1.ID, user2.ID, star.StarID)
|
||
if err == nil {
|
||
t.Fatal("Expected error for non-existent friendship")
|
||
}
|
||
}
|
||
|
||
func TestSocialRepository_UpdateRemark(t *testing.T) {
|
||
db := setupTestDB(t)
|
||
defer cleanupTestDB(t, db)
|
||
|
||
repo := NewSocialRepository()
|
||
|
||
// 创建测试数据
|
||
star := createTestStar(t, db, "test_social_010")
|
||
user1 := createTestUser(t, db, "18800000023")
|
||
user2 := createTestUser(t, db, "18800000024")
|
||
|
||
// 创建好友关系
|
||
repo.CreateFriendshipPair(user1.ID, user2.ID, star.StarID)
|
||
|
||
// 更新备注
|
||
newRemark := "我的好朋友"
|
||
err := repo.UpdateRemark(user1.ID, user2.ID, star.StarID, newRemark)
|
||
if err != nil {
|
||
t.Fatalf("UpdateRemark failed: %v", err)
|
||
}
|
||
|
||
// 验证更新
|
||
var friendship models.Friendship
|
||
db.Where("user_id = ? AND friend_id = ? AND star_id = ?", user1.ID, user2.ID, star.StarID).First(&friendship)
|
||
|
||
if friendship.Remark == nil {
|
||
t.Fatal("Remark should not be nil")
|
||
}
|
||
|
||
if *friendship.Remark != newRemark {
|
||
t.Errorf("Remark mismatch: expected %s, got %s", newRemark, *friendship.Remark)
|
||
}
|
||
|
||
// 验证反向关系的备注未改变
|
||
var reverseFriendship models.Friendship
|
||
db.Where("user_id = ? AND friend_id = ? AND star_id = ?", user2.ID, user1.ID, star.StarID).First(&reverseFriendship)
|
||
|
||
if reverseFriendship.Remark != nil {
|
||
t.Error("Reverse friendship remark should not be updated")
|
||
}
|
||
|
||
// 测试更新不存在的关系
|
||
err = repo.UpdateRemark(99999, 99999, star.StarID, "test")
|
||
if err == nil {
|
||
t.Fatal("Expected error for non-existent friendship")
|
||
}
|
||
}
|
||
|
||
func TestSocialRepository_CountFriends(t *testing.T) {
|
||
db := setupTestDB(t)
|
||
defer cleanupTestDB(t, db)
|
||
|
||
repo := NewSocialRepository()
|
||
|
||
// 创建测试数据
|
||
star := createTestStar(t, db, "test_social_011")
|
||
user1 := createTestUser(t, db, "18800000025")
|
||
user2 := createTestUser(t, db, "18800000026")
|
||
user3 := createTestUser(t, db, "18800000027")
|
||
user4 := createTestUser(t, db, "18800000028")
|
||
|
||
// 创建好友关系
|
||
repo.CreateFriendshipPair(user1.ID, user2.ID, star.StarID)
|
||
repo.CreateFriendshipPair(user1.ID, user3.ID, star.StarID)
|
||
repo.CreateFriendshipPair(user1.ID, user4.ID, star.StarID)
|
||
|
||
// 统计好友数量
|
||
count, err := repo.CountFriends(user1.ID, star.StarID)
|
||
if err != nil {
|
||
t.Fatalf("CountFriends failed: %v", err)
|
||
}
|
||
|
||
if count != 3 {
|
||
t.Errorf("Expected 3 friends, got %d", count)
|
||
}
|
||
|
||
// 测试user2的好友数量
|
||
count, err = repo.CountFriends(user2.ID, star.StarID)
|
||
if err != nil {
|
||
t.Fatalf("CountFriends for user2 failed: %v", err)
|
||
}
|
||
|
||
if count != 1 {
|
||
t.Errorf("Expected 1 friend for user2, got %d", count)
|
||
}
|
||
|
||
// 测试没有好友的用户
|
||
user5 := createTestUser(t, db, "18800000029")
|
||
count, err = repo.CountFriends(user5.ID, star.StarID)
|
||
if err != nil {
|
||
t.Fatalf("CountFriends for user with no friends failed: %v", err)
|
||
}
|
||
|
||
if count != 0 {
|
||
t.Errorf("Expected 0 friends, got %d", count)
|
||
}
|
||
}
|
||
|
||
// ==================== 边界情况和集成测试 ====================
|
||
|
||
func TestSocialRepository_CompleteFlow(t *testing.T) {
|
||
db := setupTestDB(t)
|
||
defer cleanupTestDB(t, db)
|
||
|
||
repo := NewSocialRepository()
|
||
|
||
// 创建测试数据
|
||
star := createTestStar(t, db, "test_social_012")
|
||
userA := createTestUser(t, db, "18800000030")
|
||
userB := createTestUser(t, db, "18800000031")
|
||
|
||
// 1. A 发送好友请求给 B
|
||
expiresAt := time.Now().Add(30 * 24 * time.Hour).UnixMilli()
|
||
message := "你好,我想加你为好友"
|
||
request := &models.FriendRequest{
|
||
FromUserID: userA.ID,
|
||
ToUserID: userB.ID,
|
||
StarID: star.StarID,
|
||
Message: &message,
|
||
Status: models.FriendRequestStatusPending,
|
||
ExpiresAt: &expiresAt,
|
||
}
|
||
err := repo.CreateRequest(request)
|
||
if err != nil {
|
||
t.Fatalf("Failed to create request: %v", err)
|
||
}
|
||
|
||
// 2. B 查看收到的请求
|
||
_, total, err := repo.GetRequestsByUser(userB.ID, star.StarID, models.FriendRequestTypeReceived, models.FriendRequestStatusPending, 1, 10)
|
||
if err != nil {
|
||
t.Fatalf("Failed to get received requests: %v", err)
|
||
}
|
||
|
||
if total != 1 {
|
||
t.Errorf("Expected 1 received request, got %d", total)
|
||
}
|
||
|
||
// 3. B 接受请求
|
||
processedAt := time.Now().UnixMilli()
|
||
err = repo.UpdateRequestStatus(request.ID, models.FriendRequestStatusAccepted, &processedAt)
|
||
if err != nil {
|
||
t.Fatalf("Failed to update request status: %v", err)
|
||
}
|
||
|
||
// 4. 创建双向好友关系
|
||
err = repo.CreateFriendshipPair(userA.ID, userB.ID, star.StarID)
|
||
if err != nil {
|
||
t.Fatalf("Failed to create friendship: %v", err)
|
||
}
|
||
|
||
// 5. 验证好友关系
|
||
isFriend, err := repo.CheckFriendship(userA.ID, userB.ID, star.StarID)
|
||
if err != nil || !isFriend {
|
||
t.Fatal("Failed to verify friendship")
|
||
}
|
||
|
||
// 6. A 设置 B 的备注
|
||
err = repo.UpdateRemark(userA.ID, userB.ID, star.StarID, "B的昵称")
|
||
if err != nil {
|
||
t.Fatalf("Failed to update remark: %v", err)
|
||
}
|
||
|
||
// 7. 查询好友列表
|
||
friends, _, err := repo.GetFriendsByUser(userA.ID, star.StarID, "", 1, 10)
|
||
if err != nil {
|
||
t.Fatalf("Failed to get friends: %v", err)
|
||
}
|
||
|
||
if len(friends) != 1 {
|
||
t.Errorf("Expected 1 friend, got %d", len(friends))
|
||
}
|
||
|
||
// 8. 统计好友数量
|
||
count, err := repo.CountFriends(userA.ID, star.StarID)
|
||
if err != nil {
|
||
t.Fatalf("Failed to count friends: %v", err)
|
||
}
|
||
|
||
if count != 1 {
|
||
t.Errorf("Expected count 1, got %d", count)
|
||
}
|
||
|
||
// 9. A 删除好友
|
||
err = repo.DeleteFriendshipPair(userA.ID, userB.ID, star.StarID)
|
||
if err != nil {
|
||
t.Fatalf("Failed to delete friendship: %v", err)
|
||
}
|
||
|
||
// 10. 验证好友关系已删除
|
||
isFriend, err = repo.CheckFriendship(userA.ID, userB.ID, star.StarID)
|
||
if err != nil || isFriend {
|
||
t.Fatal("Friendship should be deleted")
|
||
}
|
||
|
||
// 11. 验证好友数量为0
|
||
count, err = repo.CountFriends(userA.ID, star.StarID)
|
||
if err != nil {
|
||
t.Fatalf("Failed to count friends after deletion: %v", err)
|
||
}
|
||
|
||
if count != 0 {
|
||
t.Errorf("Expected count 0, got %d", count)
|
||
}
|
||
}
|