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.
 
 
 
 
 
 

196 lines
5.2 KiB

package user
import (
"context"
"testing"
"github.com/youruser/base/internal/types"
"github.com/youruser/base/model"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
// TestCreateUser_WithRole 测试创建用户时指定角色
func TestCreateUser_WithRole(t *testing.T) {
svcCtx, cleanup := setupUserTestDB(t)
defer cleanup()
ctx := context.Background()
logic := NewCreateUserLogic(ctx, svcCtx)
req := &types.CreateUserRequest{
Username: "admin_test",
Email: "admin_test@example.com",
Password: "password123",
Role: "admin",
Remark: "Test admin user",
}
resp, err := logic.CreateUser(req)
require.NoError(t, err)
require.NotNil(t, resp)
assert.Equal(t, "admin", resp.Role)
assert.Equal(t, "manual", resp.Source)
assert.Equal(t, "Test admin user", resp.Remark)
}
// TestCreateUser_DefaultRole 测试创建用户时不指定角色,应默认 user
func TestCreateUser_DefaultRole(t *testing.T) {
svcCtx, cleanup := setupUserTestDB(t)
defer cleanup()
ctx := context.Background()
logic := NewCreateUserLogic(ctx, svcCtx)
req := &types.CreateUserRequest{
Username: "default_role_test",
Email: "default_role@example.com",
Password: "password123",
}
resp, err := logic.CreateUser(req)
require.NoError(t, err)
require.NotNil(t, resp)
assert.Equal(t, "user", resp.Role)
assert.Equal(t, "manual", resp.Source)
assert.Equal(t, "", resp.Remark)
}
// TestGetUser_ReturnsRoleFields 测试获取用户时返回 role/source/remark
func TestGetUser_ReturnsRoleFields(t *testing.T) {
svcCtx, cleanup := setupUserTestDB(t)
defer cleanup()
ctx := context.Background()
// 先创建一个带角色的用户
createLogic := NewCreateUserLogic(ctx, svcCtx)
createResp, err := createLogic.CreateUser(&types.CreateUserRequest{
Username: "role_fields_test",
Email: "role_fields@example.com",
Password: "password123",
Role: "admin",
Remark: "role fields test",
})
require.NoError(t, err)
// 查询该用户
getLogic := NewGetUserLogic(ctx, svcCtx)
resp, err := getLogic.GetUser(&types.GetUserRequest{Id: createResp.Id})
require.NoError(t, err)
require.NotNil(t, resp)
assert.Equal(t, "admin", resp.Role)
assert.Equal(t, "manual", resp.Source)
assert.Equal(t, "role fields test", resp.Remark)
}
// TestGetUserList_ReturnsRoleFields 测试用户列表返回 role/source/remark
func TestGetUserList_ReturnsRoleFields(t *testing.T) {
svcCtx, cleanup := setupUserTestDB(t)
defer cleanup()
ctx := context.Background()
// 创建不同角色的用户
createLogic := NewCreateUserLogic(ctx, svcCtx)
_, err := createLogic.CreateUser(&types.CreateUserRequest{
Username: "list_admin",
Email: "list_admin@example.com",
Password: "password123",
Role: "admin",
})
require.NoError(t, err)
createLogic2 := NewCreateUserLogic(ctx, svcCtx)
_, err = createLogic2.CreateUser(&types.CreateUserRequest{
Username: "list_user",
Email: "list_user@example.com",
Password: "password123",
})
require.NoError(t, err)
// 查询列表
listLogic := NewGetUserListLogic(ctx, svcCtx)
resp, err := listLogic.GetUserList(&types.UserListRequest{
Page: 1,
PageSize: 10,
})
require.NoError(t, err)
require.NotNil(t, resp)
assert.GreaterOrEqual(t, len(resp.List), 2)
// 验证每个用户都有 role 字段
for _, u := range resp.List {
assert.NotEmpty(t, u.Role, "用户 %s 的 role 不应为空", u.Username)
assert.NotEmpty(t, u.Source, "用户 %s 的 source 不应为空", u.Username)
}
}
// TestUpdateUser_RoleAndRemark 测试更新用户角色和备注
func TestUpdateUser_RoleAndRemark(t *testing.T) {
svcCtx, cleanup := setupUserTestDB(t)
defer cleanup()
ctx := context.Background()
// 创建用户
createLogic := NewCreateUserLogic(ctx, svcCtx)
createResp, err := createLogic.CreateUser(&types.CreateUserRequest{
Username: "update_role_test",
Email: "update_role@example.com",
Password: "password123",
})
require.NoError(t, err)
assert.Equal(t, "user", createResp.Role)
// 更新角色
updateLogic := NewUpdateUserLogic(ctx, svcCtx)
resp, err := updateLogic.UpdateUser(&types.UpdateUserRequest{
Id: createResp.Id,
Role: "admin",
Remark: "promoted",
})
require.NoError(t, err)
require.NotNil(t, resp)
assert.Equal(t, "admin", resp.Role)
assert.Equal(t, "promoted", resp.Remark)
// Source 不应改变
assert.Equal(t, "manual", resp.Source)
}
// TestFindOneByRole 测试 FindOneByRole 方法
func TestFindOneByRole(t *testing.T) {
svcCtx, cleanup := setupUserTestDB(t)
defer cleanup()
ctx := context.Background()
// 创建 super_admin 用户
adminUser := &model.User{
Username: "find_role_admin",
Email: "find_role_admin@example.com",
Password: "hashed",
Role: model.RoleSuperAdmin,
Source: model.SourceSystem,
Status: 1,
}
_, err := model.Insert(ctx, svcCtx.DB, adminUser)
require.NoError(t, err)
// 查找 super_admin
found, err := model.FindOneByRole(ctx, svcCtx.DB, model.RoleSuperAdmin)
require.NoError(t, err)
require.NotNil(t, found)
assert.Equal(t, model.RoleSuperAdmin, found.Role)
assert.Equal(t, "find_role_admin", found.Username)
// 查找不存在的角色
_, err = model.FindOneByRole(ctx, svcCtx.DB, "nonexistent")
assert.ErrorIs(t, err, model.ErrNotFound)
}