package user import ( "context" "database/sql" "errors" "testing" "time" "perms-system-server/internal/loaders" "perms-system-server/internal/middleware" userModel "perms-system-server/internal/model/user" "perms-system-server/internal/response" "perms-system-server/internal/svc" "perms-system-server/internal/testutil" "perms-system-server/internal/testutil/ctxhelper" "perms-system-server/internal/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func ctxWithUserId(userId int64) context.Context { return middleware.WithUserDetails(context.Background(), &loaders.UserDetails{UserId: userId}) } // TC-0141: 正常冻结 func TestUpdateUserStatus_Freeze(t *testing.T) { ctx := context.Background() svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) conn := testutil.GetTestSqlConn() username := testutil.UniqueId() userId := insertTestUser(t, ctx, username, testutil.HashPassword("pass")) t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_user`", userId) }) callerId := int64(999999998) logic := NewUpdateUserStatusLogic(ctxhelper.SuperAdminCtxWithUserId(callerId), svcCtx) err := logic.UpdateUserStatus(&types.UpdateUserStatusReq{ Id: userId, Status: 2, }) require.NoError(t, err) user, err := svcCtx.SysUserModel.FindOne(ctx, userId) require.NoError(t, err) assert.Equal(t, int64(2), user.Status) } // TC-0142: 正常解冻 func TestUpdateUserStatus_Unfreeze(t *testing.T) { ctx := context.Background() svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) conn := testutil.GetTestSqlConn() username := testutil.UniqueId() userId := insertTestUserFull(t, ctx, &userModel.SysUser{ Username: username, Password: testutil.HashPassword("pass"), Nickname: "frozen", Avatar: sql.NullString{}, IsSuperAdmin: 2, MustChangePassword: 2, Status: 2, }) t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_user`", userId) }) callerId := int64(999999998) logic := NewUpdateUserStatusLogic(ctxhelper.SuperAdminCtxWithUserId(callerId), svcCtx) err := logic.UpdateUserStatus(&types.UpdateUserStatusReq{ Id: userId, Status: 1, }) require.NoError(t, err) user, err := svcCtx.SysUserModel.FindOne(ctx, userId) require.NoError(t, err) assert.Equal(t, int64(1), user.Status) } // TC-0143: 非法status(0) func TestUpdateUserStatus_InvalidStatus(t *testing.T) { svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) logic := NewUpdateUserStatusLogic(ctxWithUserId(1), svcCtx) err := logic.UpdateUserStatus(&types.UpdateUserStatusReq{ Id: 1, Status: 0, }) require.Error(t, err) var codeErr *response.CodeError require.True(t, errors.As(err, &codeErr)) assert.Equal(t, 400, codeErr.Code()) assert.Contains(t, codeErr.Error(), "状态值无效") } // TC-0144: 冻结自己 func TestUpdateUserStatus_FreezeSelf(t *testing.T) { ctx := context.Background() svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) conn := testutil.GetTestSqlConn() username := testutil.UniqueId() userId := insertTestUser(t, ctx, username, testutil.HashPassword("pass")) t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_user`", userId) }) logic := NewUpdateUserStatusLogic(ctxWithUserId(userId), svcCtx) err := logic.UpdateUserStatus(&types.UpdateUserStatusReq{ Id: userId, Status: 2, }) require.Error(t, err) var codeErr *response.CodeError require.True(t, errors.As(err, &codeErr)) assert.Equal(t, 400, codeErr.Code()) assert.Equal(t, "不能修改自己的状态", codeErr.Error()) } // TC-0145: 冻结超管 func TestUpdateUserStatus_FreezeSuperAdmin(t *testing.T) { ctx := context.Background() svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) conn := testutil.GetTestSqlConn() username := testutil.UniqueId() now := time.Now().Unix() userId := insertTestUserFull(t, ctx, &userModel.SysUser{ Username: username, Password: testutil.HashPassword("pass"), Nickname: "superadmin", Avatar: sql.NullString{}, IsSuperAdmin: 1, MustChangePassword: 2, Status: 1, CreateTime: now, UpdateTime: now, }) t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_user`", userId) }) callerId := int64(999999998) logic := NewUpdateUserStatusLogic(ctxWithUserId(callerId), svcCtx) err := logic.UpdateUserStatus(&types.UpdateUserStatusReq{ Id: userId, Status: 2, }) require.Error(t, err) var codeErr *response.CodeError require.True(t, errors.As(err, &codeErr)) assert.Equal(t, 403, codeErr.Code()) assert.Equal(t, "不能修改超级管理员的状态", codeErr.Error()) } // TC-0145: 冻结超管 func TestUpdateUserStatus_NotFound(t *testing.T) { svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) callerId := int64(999999998) logic := NewUpdateUserStatusLogic(ctxWithUserId(callerId), svcCtx) err := logic.UpdateUserStatus(&types.UpdateUserStatusReq{ Id: 999999999, Status: 2, }) require.Error(t, err) var codeErr *response.CodeError require.True(t, errors.As(err, &codeErr)) assert.Equal(t, 404, codeErr.Code()) assert.Equal(t, "用户不存在", codeErr.Error()) }