package user 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" ) // Ensure imports are used var _ = svc.ServiceContext{} var _ = types.GetUserRequest{} // TestGetUser_Success 测试成功获取用户 func TestGetUser_Success(t *testing.T) { svcCtx, cleanup := setupUserTestDB(t) defer cleanup() // 创建测试用户 now := time.Now() user := &model.User{ Username: "testuser", Email: "test@example.com", Password: "encryptedpassword", Phone: "13800138000", Status: 1, CreatedAt: now, UpdatedAt: now, } err := svcCtx.DB.Create(user).Error require.NoError(t, err) // 创建上下文 ctx := context.Background() // 创建 Logic 实例 logic := NewGetUserLogic(ctx, svcCtx) // 准备获取用户请求数据 req := &types.GetUserRequest{ Id: user.Id, } // 执行测试 resp, err := logic.GetUser(req) // 验证结果 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, 1, resp.Status) } // TestGetUser_NotFound 测试用户不存在 func TestGetUser_NotFound(t *testing.T) { svcCtx, cleanup := setupUserTestDB(t) defer cleanup() // 创建上下文 ctx := context.Background() // 创建 Logic 实例 logic := NewGetUserLogic(ctx, svcCtx) // 使用不存在的用户ID req := &types.GetUserRequest{ Id: 99999, } // 执行测试 resp, err := logic.GetUser(req) // 验证结果 - 应该返回错误 require.Error(t, err) require.Nil(t, resp) assert.Contains(t, err.Error(), "用户不存在") } // TestGetUser_NegativeId 测试使用负数ID func TestGetUser_NegativeId(t *testing.T) { svcCtx, cleanup := setupUserTestDB(t) defer cleanup() // 创建上下文 ctx := context.Background() // 创建 Logic 实例 logic := NewGetUserLogic(ctx, svcCtx) // 使用负数ID req := &types.GetUserRequest{ Id: -1, } // 执行测试 resp, err := logic.GetUser(req) // 验证结果 - 应该返回错误 require.Error(t, err) require.Nil(t, resp) assert.Contains(t, err.Error(), "用户不存在") } // TestGetUser_ZeroId 测试使用零ID func TestGetUser_ZeroId(t *testing.T) { svcCtx, cleanup := setupUserTestDB(t) defer cleanup() // 创建上下文 ctx := context.Background() // 创建 Logic 实例 logic := NewGetUserLogic(ctx, svcCtx) // 使用零ID req := &types.GetUserRequest{ Id: 0, } // 执行测试 resp, err := logic.GetUser(req) // 验证结果 - 应该返回错误 require.Error(t, err) require.Nil(t, resp) assert.Contains(t, err.Error(), "用户不存在") } // TestGetUser_UserWithEmptyPhone 测试获取没有手机号的用户 func TestGetUser_UserWithEmptyPhone(t *testing.T) { svcCtx, cleanup := setupUserTestDB(t) defer cleanup() // 创建测试用户,手机号为空 now := time.Now() user := &model.User{ Username: "testuser", Email: "test@example.com", Password: "encryptedpassword", Phone: "", Status: 1, CreatedAt: now, UpdatedAt: now, } err := svcCtx.DB.Create(user).Error require.NoError(t, err) // 创建上下文 ctx := context.Background() // 创建 Logic 实例 logic := NewGetUserLogic(ctx, svcCtx) // 准备获取用户请求数据 req := &types.GetUserRequest{ Id: user.Id, } // 执行测试 resp, err := logic.GetUser(req) // 验证结果 require.NoError(t, err) require.NotNil(t, resp) assert.Equal(t, "", resp.Phone) } // TestGetUser_DisabledUser 测试获取禁用状态的用户 func TestGetUser_DisabledUser(t *testing.T) { svcCtx, cleanup := setupUserTestDB(t) defer cleanup() // 创建测试用户,状态为禁用 now := time.Now() user := &model.User{ Username: "disableduser", Email: "disabled@example.com", Password: "encryptedpassword", Phone: "13800138000", Status: 2, // 禁用状态 CreatedAt: now, UpdatedAt: now, } err := svcCtx.DB.Create(user).Error require.NoError(t, err) // 创建上下文 ctx := context.Background() // 创建 Logic 实例 logic := NewGetUserLogic(ctx, svcCtx) // 准备获取用户请求数据 req := &types.GetUserRequest{ Id: user.Id, } // 执行测试 resp, err := logic.GetUser(req) // 验证结果 require.NoError(t, err) require.NotNil(t, resp) assert.Equal(t, 2, resp.Status) } // BenchmarkGetUser 性能测试 func BenchmarkGetUser(b *testing.B) { svcCtx, _ := setupUserTestDB(&testing.T{}) defer func() { sqlDB, _ := svcCtx.DB.DB() if sqlDB != nil { sqlDB.Close() } }() // 创建测试用户 now := time.Now() user := &model.User{ Username: "testuser", Email: "test@example.com", Password: "encryptedpassword", Phone: "13800138000", Status: 1, CreatedAt: now, UpdatedAt: now, } err := svcCtx.DB.Create(user).Error if err != nil { b.Fatal(err) } ctx := context.Background() req := &types.GetUserRequest{ Id: user.Id, } b.ResetTimer() for i := 0; i < b.N; i++ { logic := NewGetUserLogic(ctx, svcCtx) _, _ = logic.GetUser(req) } }