From e1c94e7b63bcea2934e263e282785f5d017628ef Mon Sep 17 00:00:00 2001 From: Ben Schumacher Date: Tue, 13 May 2025 08:52:13 +0200 Subject: [PATCH] Add deactivation status to mmctl user search output (#30379) --- server/cmd/mmctl/commands/user.go | 13 +++++++++++- server/cmd/mmctl/commands/user_e2e_test.go | 24 +++++++++++++++++++++- server/cmd/mmctl/commands/user_test.go | 24 +++++++++++++++++++--- 3 files changed, 56 insertions(+), 5 deletions(-) diff --git a/server/cmd/mmctl/commands/user.go b/server/cmd/mmctl/commands/user.go index ff081f9f22..48ee13ce8f 100644 --- a/server/cmd/mmctl/commands/user.go +++ b/server/cmd/mmctl/commands/user.go @@ -775,6 +775,12 @@ func deleteAllUsersCmdF(c client.Client, cmd *cobra.Command, args []string) erro return nil } +// userOut is the output format for users. +type userOut struct { + *model.User + Deactivated bool +} + func searchUserCmdF(c client.Client, cmd *cobra.Command, args []string) error { printer.SetSingle(true) @@ -789,7 +795,12 @@ func searchUserCmdF(c client.Client, cmd *cobra.Command, args []string) error { } for i, user := range users { + uout := userOut{ + User: user, + Deactivated: !(user.DeleteAt == 0), + } tpl := `id: {{.Id}} +deactivated: {{.Deactivated}} username: {{.Username}} nickname: {{.Nickname}} position: {{.Position}} @@ -801,7 +812,7 @@ auth_service: {{.AuthService}}` tpl = "------------------------------\n" + tpl } - printer.PrintT(tpl, user) + printer.PrintT(tpl, uout) } return nil diff --git a/server/cmd/mmctl/commands/user_e2e_test.go b/server/cmd/mmctl/commands/user_e2e_test.go index 32e5bc8cf1..bb95b7c2cc 100644 --- a/server/cmd/mmctl/commands/user_e2e_test.go +++ b/server/cmd/mmctl/commands/user_e2e_test.go @@ -125,8 +125,30 @@ func (s *MmctlE2ETestSuite) TestSearchUserCmd() { err := searchUserCmdF(c, &cobra.Command{}, []string{s.th.BasicUser.Email}) s.Require().Nil(err) s.Len(printer.GetLines(), 1) - user := printer.GetLines()[0].(*model.User) + user := printer.GetLines()[0].(userOut) s.Equal(s.th.BasicUser.Username, user.Username) + s.False(user.Deactivated) + s.Len(printer.GetErrorLines(), 0) + }) + + s.RunForAllClients("Search for a disabled user", func(c client.Client) { + printer.Clean() + + // Create a disabled user + disabledUser, appErr := s.th.App.CreateUser(s.th.Context, &model.User{ + Email: s.th.GenerateTestEmail(), + Username: model.NewUsername(), + Password: model.NewId(), + DeleteAt: model.GetMillis(), // Set DeleteAt to disable the user + }) + s.Require().Nil(appErr) + + err := searchUserCmdF(c, &cobra.Command{}, []string{disabledUser.Email}) + s.Require().Nil(err) + s.Len(printer.GetLines(), 1) + user := printer.GetLines()[0].(userOut) + s.Equal(disabledUser.Username, user.Username) + s.True(user.Deactivated) // Verify user shows as deactivated s.Len(printer.GetErrorLines(), 0) }) diff --git a/server/cmd/mmctl/commands/user_test.go b/server/cmd/mmctl/commands/user_test.go index 945714d799..7c3d5f4db9 100644 --- a/server/cmd/mmctl/commands/user_test.go +++ b/server/cmd/mmctl/commands/user_test.go @@ -596,17 +596,35 @@ func (s *MmctlUnitTestSuite) TestDeleteAllUsersCmd() { func (s *MmctlUnitTestSuite) TestSearchUserCmd() { s.Run("Search for an existing user", func() { emailArg := "example@example.com" - mockUser := model.User{Username: "ExampleUser", Email: emailArg} + mockUser := &model.User{Username: "ExampleUser", Email: emailArg} s.client. EXPECT(). GetUserByEmail(context.TODO(), emailArg, ""). - Return(&mockUser, &model.Response{}, nil). + Return(mockUser, &model.Response{}, nil). Times(1) err := searchUserCmdF(s.client, &cobra.Command{}, []string{emailArg}) s.Require().Nil(err) - s.Require().Equal(&mockUser, printer.GetLines()[0]) + s.Require().Equal(userOut{User: mockUser, Deactivated: false}, printer.GetLines()[0]) + s.Require().Len(printer.GetErrorLines(), 0) + }) + + s.Run("Search for a disabled user", func() { + printer.Clean() + emailArg := "example@example.com" + mockUser := &model.User{Username: "ExampleUser", Email: emailArg, DeleteAt: 1234} + + s.client. + EXPECT(). + GetUserByEmail(context.TODO(), emailArg, ""). + Return(mockUser, &model.Response{}, nil). + Times(1) + + err := searchUserCmdF(s.client, &cobra.Command{}, []string{emailArg}) + s.Require().Nil(err) + s.Require().Len(printer.GetLines(), 1) + s.Require().Equal(userOut{User: mockUser, Deactivated: true}, printer.GetLines()[0]) s.Require().Len(printer.GetErrorLines(), 0) })