321 lines
9.3 KiB
Go
321 lines
9.3 KiB
Go
package repository
|
||
|
||
import (
|
||
"testing"
|
||
|
||
"github.com/stretchr/testify/assert"
|
||
"github.com/topfans/backend/pkg/models"
|
||
|
||
)
|
||
|
||
// TestRankingRepository_GetHotRankingTotal 测试获取热度排行榜-全部
|
||
func TestRankingRepository_GetHotRankingTotal(t *testing.T) {
|
||
db := setupTestDB(t)
|
||
defer cleanupTestDB(t, db)
|
||
|
||
repo := NewRankingRepository(db)
|
||
|
||
// 创建测试数据
|
||
star := createTestStar(t, db, "test_ranking_total")
|
||
user1 := createTestUser(t, db, "19910000001")
|
||
user2 := createTestUser(t, db, "19910000002")
|
||
user3 := createTestUser(t, db, "19910000003")
|
||
|
||
// 创建粉丝档案
|
||
createTestFanProfile(t, db, user1.ID, star.StarID, "用户1")
|
||
createTestFanProfile(t, db, user2.ID, star.StarID, "用户2")
|
||
createTestFanProfile(t, db, user3.ID, star.StarID, "用户3")
|
||
|
||
// 创建资产(不同点赞数)
|
||
asset1 := &models.Asset{
|
||
OwnerUID: user1.ID,
|
||
StarID: star.StarID,
|
||
Name: "测试资产1",
|
||
CoverURL: "https://example.com/cover1.jpg",
|
||
LikeCount: 100,
|
||
Status: models.AssetStatusActive,
|
||
IsActive: true,
|
||
IsOriginal: false,
|
||
}
|
||
asset2 := &models.Asset{
|
||
OwnerUID: user2.ID,
|
||
StarID: star.StarID,
|
||
Name: "测试资产2",
|
||
CoverURL: "https://example.com/cover2.jpg",
|
||
LikeCount: 50,
|
||
Status: models.AssetStatusActive,
|
||
IsActive: true,
|
||
IsOriginal: false,
|
||
}
|
||
asset3 := &models.Asset{
|
||
OwnerUID: user3.ID,
|
||
StarID: star.StarID,
|
||
Name: "测试资产3",
|
||
CoverURL: "https://example.com/cover3.jpg",
|
||
LikeCount: 200,
|
||
Status: models.AssetStatusActive,
|
||
IsActive: true,
|
||
IsOriginal: false,
|
||
}
|
||
|
||
assert.NoError(t, db.Create(asset1).Error)
|
||
assert.NoError(t, db.Create(asset2).Error)
|
||
assert.NoError(t, db.Create(asset3).Error)
|
||
|
||
// 测试获取排行榜
|
||
items, total, err := repo.GetHotRankingTotal(star.StarID, 10, 0)
|
||
|
||
assert.NoError(t, err)
|
||
assert.Equal(t, int64(3), total)
|
||
assert.Len(t, items, 3)
|
||
|
||
// 验证按点赞数降序排列
|
||
assert.Equal(t, asset3.ID, items[0].AssetID) // 200 likes
|
||
assert.Equal(t, asset1.ID, items[1].AssetID) // 100 likes
|
||
assert.Equal(t, asset2.ID, items[2].AssetID) // 50 likes
|
||
}
|
||
|
||
// TestRankingRepository_GetHotRankingDisplaying 测试获取热度排行榜-展示中
|
||
func TestRankingRepository_GetHotRankingDisplaying(t *testing.T) {
|
||
db := setupTestDB(t)
|
||
defer cleanupTestDB(t, db)
|
||
|
||
repo := NewRankingRepository(db)
|
||
|
||
// 创建测试数据
|
||
star := createTestStar(t, db, "test_ranking_displaying")
|
||
user1 := createTestUser(t, db, "19910000004")
|
||
user2 := createTestUser(t, db, "19910000005")
|
||
|
||
profile1 := createTestFanProfile(t, db, user1.ID, star.StarID, "用户1")
|
||
// profile2 := createTestFanProfile(t, db, user2.ID, star.StarID, "用户2")
|
||
|
||
// 创建资产
|
||
asset1 := &models.Asset{
|
||
OwnerUID: user1.ID,
|
||
StarID: star.StarID,
|
||
Name: "展示中资产",
|
||
CoverURL: "https://example.com/cover1.jpg",
|
||
LikeCount: 100,
|
||
Status: models.AssetStatusActive,
|
||
IsActive: true,
|
||
IsOriginal: false,
|
||
}
|
||
asset2 := &models.Asset{
|
||
OwnerUID: user2.ID,
|
||
StarID: star.StarID,
|
||
Name: "未展示资产",
|
||
CoverURL: "https://example.com/cover2.jpg",
|
||
LikeCount: 200,
|
||
Status: models.AssetStatusActive,
|
||
IsActive: true,
|
||
IsOriginal: false,
|
||
}
|
||
|
||
assert.NoError(t, db.Create(asset1).Error)
|
||
assert.NoError(t, db.Create(asset2).Error)
|
||
|
||
// 创建展示记录(asset1 正在展示)
|
||
exhibition := &models.Exhibition{
|
||
HostProfileID: profile1.ID,
|
||
AssetID: asset1.ID,
|
||
SlotID: 1,
|
||
ExpireAt: 2531751708000, // 2050-01-01
|
||
}
|
||
assert.NoError(t, db.Create(exhibition).Error)
|
||
|
||
// 测试获取展示中排行榜
|
||
items, total, err := repo.GetHotRankingDisplaying(star.StarID, 10, 0)
|
||
|
||
assert.NoError(t, err)
|
||
assert.Equal(t, int64(1), total)
|
||
assert.Len(t, items, 1)
|
||
assert.Equal(t, asset1.ID, items[0].AssetID)
|
||
}
|
||
|
||
// TestRankingRepository_GetOriginalRankingTotal 测试获取自制排行榜-全部
|
||
func TestRankingRepository_GetOriginalRankingTotal(t *testing.T) {
|
||
db := setupTestDB(t)
|
||
defer cleanupTestDB(t, db)
|
||
|
||
repo := NewRankingRepository(db)
|
||
|
||
// 创建测试数据
|
||
star := createTestStar(t, db, "test_ranking_original")
|
||
user1 := createTestUser(t, db, "19910000006")
|
||
user2 := createTestUser(t, db, "19910000007")
|
||
user3 := createTestUser(t, db, "19910000008")
|
||
|
||
createTestFanProfile(t, db, user1.ID, star.StarID, "用户1")
|
||
createTestFanProfile(t, db, user2.ID, star.StarID, "用户2")
|
||
createTestFanProfile(t, db, user3.ID, star.StarID, "用户3")
|
||
|
||
// 创建自制资产和非自制资产
|
||
originalAsset := &models.Asset{
|
||
OwnerUID: user1.ID,
|
||
StarID: star.StarID,
|
||
Name: "自制资产",
|
||
CoverURL: "https://example.com/original.jpg",
|
||
LikeCount: 100,
|
||
Status: models.AssetStatusActive,
|
||
IsActive: true,
|
||
IsOriginal: true,
|
||
}
|
||
nonOriginalAsset := &models.Asset{
|
||
OwnerUID: user2.ID,
|
||
StarID: star.StarID,
|
||
Name: "非自制资产",
|
||
CoverURL: "https://example.com/non-original.jpg",
|
||
LikeCount: 200,
|
||
Status: models.AssetStatusActive,
|
||
IsActive: true,
|
||
IsOriginal: false,
|
||
}
|
||
anotherOriginalAsset := &models.Asset{
|
||
OwnerUID: user3.ID,
|
||
StarID: star.StarID,
|
||
Name: "另一个自制资产",
|
||
CoverURL: "https://example.com/original2.jpg",
|
||
LikeCount: 50,
|
||
Status: models.AssetStatusActive,
|
||
IsActive: true,
|
||
IsOriginal: true,
|
||
}
|
||
|
||
assert.NoError(t, db.Create(originalAsset).Error)
|
||
assert.NoError(t, db.Create(nonOriginalAsset).Error)
|
||
assert.NoError(t, db.Create(anotherOriginalAsset).Error)
|
||
|
||
// 测试获取自制排行榜
|
||
items, total, err := repo.GetOriginalRankingTotal(star.StarID, 10, 0)
|
||
|
||
assert.NoError(t, err)
|
||
assert.Equal(t, int64(2), total)
|
||
assert.Len(t, items, 2)
|
||
|
||
// 验证只返回自制资产,且按点赞数降序
|
||
assert.Equal(t, originalAsset.ID, items[0].AssetID)
|
||
assert.Equal(t, anotherOriginalAsset.ID, items[1].AssetID)
|
||
}
|
||
|
||
// TestRankingRepository_GetMyBestRanking 测试获取用户最佳排名
|
||
func TestRankingRepository_GetMyBestRanking(t *testing.T) {
|
||
db := setupTestDB(t)
|
||
defer cleanupTestDB(t, db)
|
||
|
||
repo := NewRankingRepository(db)
|
||
|
||
// 创建测试数据
|
||
star := createTestStar(t, db, "test_ranking_mybest")
|
||
user1 := createTestUser(t, db, "19910000009")
|
||
user2 := createTestUser(t, db, "19910000010")
|
||
|
||
createTestFanProfile(t, db, user1.ID, star.StarID, "测试用户1")
|
||
createTestFanProfile(t, db, user2.ID, star.StarID, "测试用户2")
|
||
|
||
// 为 user1 创建多个资产
|
||
asset1 := &models.Asset{
|
||
OwnerUID: user1.ID,
|
||
StarID: star.StarID,
|
||
Name: "用户1资产1",
|
||
CoverURL: "https://example.com/asset1.jpg",
|
||
LikeCount: 30,
|
||
Status: models.AssetStatusActive,
|
||
IsActive: true,
|
||
IsOriginal: false,
|
||
}
|
||
asset2 := &models.Asset{
|
||
OwnerUID: user1.ID,
|
||
StarID: star.StarID,
|
||
Name: "用户1资产2",
|
||
CoverURL: "https://example.com/asset2.jpg",
|
||
LikeCount: 80,
|
||
Status: models.AssetStatusActive,
|
||
IsActive: true,
|
||
IsOriginal: false,
|
||
}
|
||
|
||
// 为 user2 创建资产
|
||
asset3 := &models.Asset{
|
||
OwnerUID: user2.ID,
|
||
StarID: star.StarID,
|
||
Name: "用户2资产",
|
||
CoverURL: "https://example.com/asset3.jpg",
|
||
LikeCount: 50,
|
||
Status: models.AssetStatusActive,
|
||
IsActive: true,
|
||
IsOriginal: false,
|
||
}
|
||
|
||
assert.NoError(t, db.Create(asset1).Error)
|
||
assert.NoError(t, db.Create(asset2).Error)
|
||
assert.NoError(t, db.Create(asset3).Error)
|
||
|
||
// 测试 user1 的最佳排名(资产2有80点赞)
|
||
item, rank, err := repo.GetMyBestRanking(user1.ID, star.StarID, "total", false)
|
||
|
||
assert.NoError(t, err)
|
||
assert.NotNil(t, item)
|
||
assert.Equal(t, asset2.ID, item.AssetID) // 点赞最多的
|
||
assert.Equal(t, int32(1), rank) // 80点赞排第一
|
||
}
|
||
|
||
// TestRankingRepository_InvalidStarID 测试无效的 starID
|
||
func TestRankingRepository_InvalidStarID(t *testing.T) {
|
||
db := setupTestDB(t)
|
||
defer cleanupTestDB(t, db)
|
||
|
||
repo := NewRankingRepository(db)
|
||
|
||
// 测试 starID <= 0
|
||
_, _, err := repo.GetHotRankingTotal(0, 10, 0)
|
||
assert.Error(t, err)
|
||
assert.Contains(t, err.Error(), "star_id must be greater than 0")
|
||
|
||
_, _, err = repo.GetOriginalRankingTotal(-1, 10, 0)
|
||
assert.Error(t, err)
|
||
assert.Contains(t, err.Error(), "star_id must be greater than 0")
|
||
}
|
||
|
||
// TestRankingRepository_Pagination 测试分页
|
||
func TestRankingRepository_Pagination(t *testing.T) {
|
||
db := setupTestDB(t)
|
||
defer cleanupTestDB(t, db)
|
||
|
||
repo := NewRankingRepository(db)
|
||
|
||
// 创建测试数据
|
||
star := createTestStar(t, db, "test_ranking_page")
|
||
user := createTestUser(t, db, "19910000011")
|
||
createTestFanProfile(t, db, user.ID, star.StarID, "测试用户")
|
||
|
||
// 创建10个资产
|
||
for i := 0; i < 10; i++ {
|
||
asset := &models.Asset{
|
||
OwnerUID: user.ID,
|
||
StarID: star.StarID,
|
||
Name: "资产" + string(rune('0'+i)),
|
||
CoverURL: "https://example.com/cover" + string(rune('0'+i)) + ".jpg",
|
||
LikeCount: int32((i + 1) * 10),
|
||
Status: models.AssetStatusActive,
|
||
IsActive: true,
|
||
IsOriginal: false,
|
||
}
|
||
assert.NoError(t, db.Create(asset).Error)
|
||
}
|
||
|
||
// 测试第一页(每页3条)
|
||
items, total, err := repo.GetHotRankingTotal(star.StarID, 3, 0)
|
||
assert.NoError(t, err)
|
||
assert.Equal(t, int64(10), total)
|
||
assert.Len(t, items, 3)
|
||
assert.Equal(t, int32(100), items[0].LikeCount) // 第一页第一个是100赞
|
||
|
||
// 测试第二页
|
||
items, total, err = repo.GetHotRankingTotal(star.StarID, 3, 3)
|
||
assert.NoError(t, err)
|
||
assert.Equal(t, int64(10), total)
|
||
assert.Len(t, items, 3)
|
||
assert.Equal(t, int32(70), items[0].LikeCount) // 第二页第一个是70赞
|
||
}
|