You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
243 lines
5.8 KiB
243 lines
5.8 KiB
package profile
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/youruser/base/internal/svc"
|
|
"github.com/youruser/base/internal/types"
|
|
"github.com/youruser/base/model"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"gorm.io/driver/mysql"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// Ensure imports are used
|
|
var _ = svc.ServiceContext{}
|
|
var _ = types.GetProfileResponse{}
|
|
|
|
// setupTestDB 创建测试数据库并返回 ServiceContext(使用MySQL)
|
|
func setupTestDB(t *testing.T) (*svc.ServiceContext, func()) {
|
|
t.Helper()
|
|
|
|
// 使用 MySQL 进行测试
|
|
dsn := "root:dev123456@tcp(219.159.132.177:17173)/base?charset=utf8mb4&parseTime=true&loc=Local"
|
|
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
|
|
require.NoError(t, err)
|
|
|
|
// 自动迁移表
|
|
err = db.AutoMigrate(&model.User{}, &model.Profile{})
|
|
require.NoError(t, err)
|
|
|
|
// 清理所有测试数据(使用 TRUNCATE 快速清空表)
|
|
db.Exec("SET FOREIGN_KEY_CHECKS = 0")
|
|
db.Exec("TRUNCATE TABLE profile")
|
|
db.Exec("TRUNCATE TABLE user")
|
|
db.Exec("SET FOREIGN_KEY_CHECKS = 1")
|
|
|
|
// 创建测试 ServiceContext
|
|
svcCtx := &svc.ServiceContext{
|
|
DB: db,
|
|
}
|
|
|
|
// 清理函数
|
|
cleanup := func() {
|
|
sqlDB, _ := db.DB()
|
|
if sqlDB != nil {
|
|
sqlDB.Close()
|
|
}
|
|
}
|
|
|
|
return svcCtx, cleanup
|
|
}
|
|
|
|
// createTestUser 创建测试用户
|
|
func createTestUser(t *testing.T, db *gorm.DB) *model.User {
|
|
t.Helper()
|
|
|
|
now := time.Now()
|
|
user := &model.User{
|
|
Username: "testuser",
|
|
Email: "test@example.com",
|
|
Password: "5f4dcc3b5aa765d61d8327deb882cf99", // MD5 of "password"
|
|
Phone: "13800138000",
|
|
Status: 1,
|
|
CreatedAt: now,
|
|
UpdatedAt: now,
|
|
}
|
|
|
|
err := db.Create(user).Error
|
|
require.NoError(t, err)
|
|
|
|
return user
|
|
}
|
|
|
|
// createTestProfile 创建测试个人资料
|
|
func createTestProfile(t *testing.T, db *gorm.DB, userId int64) *model.Profile {
|
|
t.Helper()
|
|
|
|
now := time.Now()
|
|
profile := &model.Profile{
|
|
UserId: userId,
|
|
Avatar: "http://example.com/avatar.jpg",
|
|
Bio: "This is a test bio",
|
|
CreatedAt: now,
|
|
UpdatedAt: now,
|
|
}
|
|
|
|
err := db.Create(profile).Error
|
|
require.NoError(t, err)
|
|
|
|
return profile
|
|
}
|
|
|
|
// TestGetProfile_Success 测试成功获取个人信息
|
|
func TestGetProfile_Success(t *testing.T) {
|
|
svcCtx, cleanup := setupTestDB(t)
|
|
defer cleanup()
|
|
|
|
// 创建测试用户
|
|
user := createTestUser(t, svcCtx.DB)
|
|
createTestProfile(t, svcCtx.DB, user.Id)
|
|
|
|
// 设置上下文,包含用户ID
|
|
ctx := context.WithValue(context.Background(), "userId", user.Id)
|
|
|
|
// 创建 Logic 实例
|
|
logic := NewGetProfileLogic(ctx, svcCtx)
|
|
|
|
// 执行测试
|
|
resp, err := logic.GetProfile()
|
|
|
|
// 验证结果
|
|
require.NoError(t, err)
|
|
require.NotNil(t, resp)
|
|
|
|
assert.Equal(t, user.Id, resp.Id)
|
|
assert.Equal(t, "testuser", resp.Username)
|
|
assert.Equal(t, "test@example.com", resp.Email)
|
|
assert.Equal(t, "13800138000", resp.Phone)
|
|
assert.Equal(t, "http://example.com/avatar.jpg", resp.Avatar)
|
|
assert.Equal(t, "This is a test bio", resp.Bio)
|
|
assert.Equal(t, 1, resp.Status)
|
|
}
|
|
|
|
// TestGetProfile_NoProfile 测试用户没有个人资料的情况
|
|
func TestGetProfile_NoProfile(t *testing.T) {
|
|
svcCtx, cleanup := setupTestDB(t)
|
|
defer cleanup()
|
|
|
|
// 创建测试用户,不创建个人资料
|
|
user := createTestUser(t, svcCtx.DB)
|
|
|
|
// 设置上下文,包含用户ID
|
|
ctx := context.WithValue(context.Background(), "userId", user.Id)
|
|
|
|
// 创建 Logic 实例
|
|
logic := NewGetProfileLogic(ctx, svcCtx)
|
|
|
|
// 执行测试
|
|
resp, err := logic.GetProfile()
|
|
|
|
// 验证结果 - 应该返回用户信息,但 profile 字段为空
|
|
require.NoError(t, err)
|
|
require.NotNil(t, resp)
|
|
|
|
assert.Equal(t, user.Id, resp.Id)
|
|
assert.Equal(t, "testuser", resp.Username)
|
|
assert.Equal(t, "", resp.Avatar)
|
|
assert.Equal(t, "", resp.Bio)
|
|
}
|
|
|
|
// TestGetProfile_NoUserIdInContext 测试上下文中没有用户ID
|
|
func TestGetProfile_NoUserIdInContext(t *testing.T) {
|
|
svcCtx, cleanup := setupTestDB(t)
|
|
defer cleanup()
|
|
|
|
// 创建测试用户
|
|
createTestUser(t, svcCtx.DB)
|
|
|
|
// 设置上下文,不包含用户ID
|
|
ctx := context.Background()
|
|
|
|
// 创建 Logic 实例
|
|
logic := NewGetProfileLogic(ctx, svcCtx)
|
|
|
|
// 执行测试
|
|
resp, err := logic.GetProfile()
|
|
|
|
// 验证结果 - 应该返回错误
|
|
require.Error(t, err)
|
|
require.Nil(t, resp)
|
|
assert.Contains(t, err.Error(), "未获取到用户信息")
|
|
}
|
|
|
|
// TestGetProfile_InvalidUserIdType 测试用户ID类型错误
|
|
func TestGetProfile_InvalidUserIdType(t *testing.T) {
|
|
svcCtx, cleanup := setupTestDB(t)
|
|
defer cleanup()
|
|
|
|
// 创建测试用户
|
|
createTestUser(t, svcCtx.DB)
|
|
|
|
// 设置上下文,用户ID类型错误
|
|
ctx := context.WithValue(context.Background(), "userId", "invalid")
|
|
|
|
// 创建 Logic 实例
|
|
logic := NewGetProfileLogic(ctx, svcCtx)
|
|
|
|
// 执行测试
|
|
resp, err := logic.GetProfile()
|
|
|
|
// 验证结果 - 应该返回错误
|
|
require.Error(t, err)
|
|
require.Nil(t, resp)
|
|
assert.Contains(t, err.Error(), "用户ID格式错误")
|
|
}
|
|
|
|
// TestGetProfile_UserNotFound 测试用户不存在
|
|
func TestGetProfile_UserNotFound(t *testing.T) {
|
|
svcCtx, cleanup := setupTestDB(t)
|
|
defer cleanup()
|
|
|
|
// 设置上下文,使用不存在的用户ID
|
|
ctx := context.WithValue(context.Background(), "userId", int64(99999))
|
|
|
|
// 创建 Logic 实例
|
|
logic := NewGetProfileLogic(ctx, svcCtx)
|
|
|
|
// 执行测试
|
|
resp, err := logic.GetProfile()
|
|
|
|
// 验证结果 - 应该返回错误
|
|
require.Error(t, err)
|
|
require.Nil(t, resp)
|
|
assert.Contains(t, err.Error(), "用户不存在")
|
|
}
|
|
|
|
// BenchmarkGetProfile 性能测试
|
|
func BenchmarkGetProfile(b *testing.B) {
|
|
svcCtx, _ := setupTestDB(&testing.T{})
|
|
defer func() {
|
|
sqlDB, _ := svcCtx.DB.DB()
|
|
if sqlDB != nil {
|
|
sqlDB.Close()
|
|
}
|
|
}()
|
|
|
|
// 创建测试用户
|
|
user := createTestUser(&testing.T{}, svcCtx.DB)
|
|
createTestProfile(&testing.T{}, svcCtx.DB, user.Id)
|
|
|
|
// 设置上下文,包含用户ID
|
|
ctx := context.WithValue(context.Background(), "userId", user.Id)
|
|
|
|
b.ResetTimer()
|
|
for i := 0; i < b.N; i++ {
|
|
logic := NewGetProfileLogic(ctx, svcCtx)
|
|
_, _ = logic.GetProfile()
|
|
}
|
|
}
|
|
|