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() } }