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