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.
 
 
 
 
 
 

332 lines
7.2 KiB

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.DeleteUserRequest{}
// TestDeleteUser_Success 测试成功删除用户
func TestDeleteUser_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)
userId := user.Id
// 创建上下文
ctx := context.Background()
// 创建 Logic 实例
logic := NewDeleteUserLogic(ctx, svcCtx)
// 准备删除请求
req := &types.DeleteUserRequest{
Id: userId,
}
// 执行测试
resp, err := logic.DeleteUser(req)
// 验证结果
require.NoError(t, err)
require.NotNil(t, resp)
assert.Equal(t, 200, resp.Code)
assert.Equal(t, "删除成功", resp.Message)
assert.True(t, resp.Success)
// 验证用户已被删除
_, err = model.FindOne(context.Background(), svcCtx.DB, userId)
require.Error(t, err)
assert.Equal(t, model.ErrNotFound, err)
}
// TestDeleteUser_NotFound 测试删除不存在的用户
func TestDeleteUser_NotFound(t *testing.T) {
svcCtx, cleanup := setupUserTestDB(t)
defer cleanup()
// 创建上下文
ctx := context.Background()
// 创建 Logic 实例
logic := NewDeleteUserLogic(ctx, svcCtx)
// 使用不存在的用户ID
req := &types.DeleteUserRequest{
Id: 99999,
}
// 执行测试
resp, err := logic.DeleteUser(req)
// 验证结果 - 应该返回响应但用户不存在
require.NoError(t, err)
require.NotNil(t, resp)
assert.Equal(t, 404, resp.Code)
assert.Equal(t, "用户不存在", resp.Message)
assert.False(t, resp.Success)
}
// TestDeleteUser_NegativeId 测试使用负数ID删除
func TestDeleteUser_NegativeId(t *testing.T) {
svcCtx, cleanup := setupUserTestDB(t)
defer cleanup()
// 创建上下文
ctx := context.Background()
// 创建 Logic 实例
logic := NewDeleteUserLogic(ctx, svcCtx)
// 使用负数ID
req := &types.DeleteUserRequest{
Id: -1,
}
// 执行测试
resp, err := logic.DeleteUser(req)
// 验证结果 - 应该返回响应但用户不存在
require.NoError(t, err)
require.NotNil(t, resp)
assert.Equal(t, 404, resp.Code)
assert.Equal(t, "用户不存在", resp.Message)
}
// TestDeleteUser_ZeroId 测试使用零ID删除
func TestDeleteUser_ZeroId(t *testing.T) {
svcCtx, cleanup := setupUserTestDB(t)
defer cleanup()
// 创建上下文
ctx := context.Background()
// 创建 Logic 实例
logic := NewDeleteUserLogic(ctx, svcCtx)
// 使用零ID
req := &types.DeleteUserRequest{
Id: 0,
}
// 执行测试
resp, err := logic.DeleteUser(req)
// 验证结果 - 应该返回响应但用户不存在
require.NoError(t, err)
require.NotNil(t, resp)
assert.Equal(t, 404, resp.Code)
assert.Equal(t, "用户不存在", resp.Message)
}
// TestDeleteUser_ThenRecreate 测试删除后重建用户
func TestDeleteUser_ThenRecreate(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)
oldUserId := user.Id
// 创建上下文
ctx := context.Background()
// 删除用户
logic1 := NewDeleteUserLogic(ctx, svcCtx)
req1 := &types.DeleteUserRequest{
Id: oldUserId,
}
_, err = logic1.DeleteUser(req1)
require.NoError(t, err)
// 重建用户(使用相同的邮箱)
createLogic := NewCreateUserLogic(ctx, svcCtx)
createReq := &types.CreateUserRequest{
Username: "testuser2",
Email: "test@example.com",
Password: "newpassword",
}
newUser, err := createLogic.CreateUser(createReq)
// 验证结果 - 新用户ID应该不同
require.NoError(t, err)
require.NotNil(t, newUser)
assert.NotEqual(t, oldUserId, newUser.Id)
}
// TestDeleteUser_DeletedTwice 测试重复删除同一个用户
func TestDeleteUser_DeletedTwice(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)
userId := user.Id
// 创建上下文
ctx := context.Background()
// 第一次删除
logic1 := NewDeleteUserLogic(ctx, svcCtx)
req := &types.DeleteUserRequest{
Id: userId,
}
resp1, err := logic1.DeleteUser(req)
require.NoError(t, err)
assert.Equal(t, 200, resp1.Code)
// 第二次删除(应该返回404)
logic2 := NewDeleteUserLogic(ctx, svcCtx)
resp2, err := logic2.DeleteUser(req)
// 验证结果
require.NoError(t, err)
require.NotNil(t, resp2)
assert.Equal(t, 404, resp2.Code)
assert.Equal(t, "用户不存在", resp2.Message)
}
// TestDeleteUser_WithProfile 测试删除带个人资料的用户
func TestDeleteUser_WithProfile(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)
userId := user.Id
// 创建个人资料
profile := &model.Profile{
UserId: userId,
Avatar: "http://example.com/avatar.jpg",
Bio: "Test bio",
CreatedAt: now,
UpdatedAt: now,
}
err = svcCtx.DB.Create(profile).Error
require.NoError(t, err)
// 删除用户
ctx := context.Background()
logic := NewDeleteUserLogic(ctx, svcCtx)
req := &types.DeleteUserRequest{
Id: userId,
}
resp, err := logic.DeleteUser(req)
// 验证结果
require.NoError(t, err)
assert.Equal(t, 200, resp.Code)
// 验证用户和资料都已删除(或用户被删除后,profile变成孤数据)
_, err = model.FindOne(context.Background(), svcCtx.DB, userId)
assert.Error(t, err)
assert.Equal(t, model.ErrNotFound, err)
}
// BenchmarkDeleteUser 性能测试
func BenchmarkDeleteUser(b *testing.B) {
svcCtx, _ := setupUserTestDB(&testing.T{})
defer func() {
sqlDB, _ := svcCtx.DB.DB()
if sqlDB != nil {
sqlDB.Close()
}
}()
ctx := context.Background()
b.ResetTimer()
for i := 0; i < b.N; i++ {
// 为每次迭代创建用户
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)
}
logic := NewDeleteUserLogic(ctx, svcCtx)
req := &types.DeleteUserRequest{
Id: user.Id,
}
_, _ = logic.DeleteUser(req)
}
}