mirror of
https://github.com/hanzoai/team.git
synced 2026-09-30 01:57:35 +00:00
* Move mmctl user deleteall to system nuke users Relocate the destructive PermanentDeleteAllUsers command out of the user namespace into a new system nuke subcommand to reduce the risk of accidental invocation. Regenerate mmctl docs and move associated unit and e2e tests accordingly. Co-authored-by: mattermost-code <[email protected]> * Address CodeRabbit feedback for system nuke users E2E tests Exercise SystemNukeUsersCmd with localOnlyPrecheck and --confirm in E2E tests, verify non-local mode is blocked via subprocess, and update confirmation text to mention users, posts, and related data. Co-authored-by: mattermost-code <[email protected]> * Fix viper local flag pollution in nuke users E2E tests Avoid setting viper local directly so unit tests that bind the local flag are not affected when mmctl unit and e2e suites run together. Co-authored-by: mattermost-code <[email protected]> * Simplify nuke users E2E test to reuse existing deleteall pattern Replace the subprocess-based localOnlyPrecheck verification with the straightforward client-based approach from the original TestDeleteAllUserCmd. The local-only enforcement is already covered by the local-only PermanentDeleteAllUsers API endpoint, so the regular and system-admin clients fail naturally without invoking the precheck. This also removes the viper local flag manipulation that previously polluted other E2E tests. --------- Co-authored-by: mattermost-code <[email protected]> Co-authored-by: Hanzo Dev <[email protected]>
251 lines
7.2 KiB
Go
251 lines
7.2 KiB
Go
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
package commands
|
|
|
|
import (
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/mattermost/mattermost/server/v8/cmd/mmctl/client"
|
|
"github.com/mattermost/mattermost/server/v8/cmd/mmctl/printer"
|
|
|
|
"github.com/mattermost/mattermost/server/public/model"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
func (s *MmctlE2ETestSuite) TestGetBusyCmd() {
|
|
s.SetupEnterpriseTestHelper().InitBasic(s.T())
|
|
|
|
s.th.App.Srv().Platform().Busy.Set(time.Minute)
|
|
defer s.th.App.Srv().Platform().Busy.Clear()
|
|
|
|
s.Run("MM-T3979 Should fail when regular user attempts to get server busy status", func() {
|
|
printer.Clean()
|
|
|
|
err := getBusyCmdF(s.th.Client, &cobra.Command{}, nil)
|
|
s.Require().Error(err)
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
s.Require().Len(printer.GetErrorLines(), 0)
|
|
})
|
|
|
|
s.RunForSystemAdminAndLocal("MM-T3956 Get server busy status", func(c client.Client) {
|
|
printer.Clean()
|
|
|
|
err := getBusyCmdF(c, &cobra.Command{}, nil)
|
|
s.Require().NoError(err)
|
|
s.Require().Len(printer.GetLines(), 1)
|
|
state, ok := printer.GetLines()[0].(*model.ServerBusyState)
|
|
s.Require().True(ok, true)
|
|
s.Require().True(state.Busy, true)
|
|
s.Require().Len(printer.GetErrorLines(), 0)
|
|
})
|
|
}
|
|
|
|
func (s *MmctlE2ETestSuite) TestNukeUsersCmd() {
|
|
s.SetupTestHelper().InitBasic(s.T())
|
|
|
|
s.Run("Delete all users as unprivileged user should not work", func() {
|
|
printer.Clean()
|
|
|
|
cmd := &cobra.Command{}
|
|
confirm := true
|
|
cmd.Flags().BoolVar(&confirm, "confirm", confirm, "confirm")
|
|
|
|
err := nukeUsersCmdF(s.th.Client, cmd, []string{})
|
|
s.Require().NotNil(err)
|
|
s.Len(printer.GetLines(), 0)
|
|
s.Len(printer.GetErrorLines(), 0)
|
|
|
|
// expect users not deleted
|
|
users, err := s.th.App.GetUsersPage(&model.UserGetOptions{
|
|
Page: 0,
|
|
PerPage: 10,
|
|
}, true)
|
|
s.Require().Nil(err)
|
|
s.Require().NotZero(len(users))
|
|
})
|
|
|
|
s.Run("Delete all users as system admin through the port API should not work", func() {
|
|
printer.Clean()
|
|
|
|
cmd := &cobra.Command{}
|
|
confirm := true
|
|
cmd.Flags().BoolVar(&confirm, "confirm", confirm, "confirm")
|
|
|
|
err := nukeUsersCmdF(s.th.SystemAdminClient, cmd, []string{})
|
|
s.Require().NotNil(err)
|
|
s.Len(printer.GetLines(), 0)
|
|
s.Len(printer.GetErrorLines(), 0)
|
|
|
|
// expect users not deleted
|
|
users, err := s.th.App.GetUsersPage(&model.UserGetOptions{
|
|
Page: 0,
|
|
PerPage: 10,
|
|
}, true)
|
|
s.Require().Nil(err)
|
|
s.Require().NotZero(len(users))
|
|
})
|
|
|
|
s.Run("Delete all users through local mode should work correctly", func() {
|
|
printer.Clean()
|
|
|
|
// populate with some user
|
|
for range 10 {
|
|
userData := model.User{
|
|
Username: "fakeuser" + model.NewRandomString(10),
|
|
Password: model.NewTestPassword(),
|
|
Email: s.th.GenerateTestEmail(),
|
|
}
|
|
_, err := s.th.App.CreateUser(s.th.Context, &userData)
|
|
s.Require().Nil(err)
|
|
}
|
|
|
|
cmd := &cobra.Command{}
|
|
confirm := true
|
|
cmd.Flags().BoolVar(&confirm, "confirm", confirm, "confirm")
|
|
|
|
// delete all users only works on local mode
|
|
err := nukeUsersCmdF(s.th.LocalClient, cmd, []string{})
|
|
s.Require().Nil(err)
|
|
s.Len(printer.GetLines(), 1)
|
|
s.Len(printer.GetErrorLines(), 0)
|
|
s.Require().Equal(printer.GetLines()[0], "All users successfully deleted")
|
|
|
|
// expect users deleted
|
|
users, err := s.th.App.GetUsersPage(&model.UserGetOptions{
|
|
Page: 0,
|
|
PerPage: 10,
|
|
}, true)
|
|
s.Require().Nil(err)
|
|
s.Require().Zero(len(users))
|
|
})
|
|
}
|
|
|
|
func (s *MmctlE2ETestSuite) TestSetBusyCmd() {
|
|
s.SetupEnterpriseTestHelper().InitBasic(s.T())
|
|
|
|
s.th.App.Srv().Platform().Busy.Clear()
|
|
cmd := &cobra.Command{}
|
|
cmd.Flags().Uint("seconds", 60, "")
|
|
|
|
s.Run("MM-T3980 Should fail when regular user attempts to set server busy status", func() {
|
|
printer.Clean()
|
|
|
|
err := setBusyCmdF(s.th.Client, cmd, nil)
|
|
s.Require().Error(err)
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
s.Require().Len(printer.GetErrorLines(), 0)
|
|
})
|
|
|
|
s.RunForSystemAdminAndLocal("MM-T3957 Set server status to busy", func(c client.Client) {
|
|
printer.Clean()
|
|
|
|
err := setBusyCmdF(c, cmd, nil)
|
|
s.Require().NoError(err)
|
|
defer func() {
|
|
s.th.App.Srv().Platform().Busy.Clear()
|
|
s.Require().False(s.th.App.Srv().Platform().Busy.IsBusy())
|
|
}()
|
|
s.Require().Len(printer.GetLines(), 1)
|
|
s.Require().Equal(printer.GetLines()[0], map[string]string{"status": "ok"})
|
|
s.Require().Len(printer.GetErrorLines(), 0)
|
|
s.Require().True(s.th.App.Srv().Platform().Busy.IsBusy())
|
|
})
|
|
}
|
|
|
|
func (s *MmctlE2ETestSuite) TestClearBusyCmd() {
|
|
s.SetupEnterpriseTestHelper().InitBasic(s.T())
|
|
|
|
s.th.App.Srv().Platform().Busy.Set(time.Minute)
|
|
defer s.th.App.Srv().Platform().Busy.Clear()
|
|
|
|
s.Run("MM-T3981 Should fail when regular user attempts to clear server busy status", func() {
|
|
printer.Clean()
|
|
|
|
err := clearBusyCmdF(s.th.Client, &cobra.Command{}, nil)
|
|
s.Require().Error(err)
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
s.Require().Len(printer.GetErrorLines(), 0)
|
|
})
|
|
|
|
s.RunForSystemAdminAndLocal("MM-T3958 Clear server status to busy", func(c client.Client) {
|
|
printer.Clean()
|
|
|
|
err := clearBusyCmdF(c, &cobra.Command{}, nil)
|
|
s.Require().NoError(err)
|
|
defer func() {
|
|
s.th.App.Srv().Platform().Busy.Set(time.Minute)
|
|
s.Require().True(s.th.App.Srv().Platform().Busy.IsBusy())
|
|
}()
|
|
s.Require().Len(printer.GetLines(), 1)
|
|
s.Require().Equal(printer.GetLines()[0], map[string]string{"status": "ok"})
|
|
s.Require().Len(printer.GetErrorLines(), 0)
|
|
s.Require().False(s.th.App.Srv().Platform().Busy.IsBusy())
|
|
})
|
|
}
|
|
|
|
func (s *MmctlE2ETestSuite) TestSupportPacketCmdF() {
|
|
s.SetupEnterpriseTestHelper().InitBasic(s.T())
|
|
|
|
printer.SetFormat(printer.FormatPlain)
|
|
s.T().Cleanup(func() { printer.SetFormat(printer.FormatJSON) })
|
|
|
|
s.Run("Download Support Packet with default filename", func() {
|
|
printer.Clean()
|
|
|
|
err := systemSupportPacketCmdF(s.th.SystemAdminClient, SystemSupportPacketCmd, []string{})
|
|
s.Require().NoError(err)
|
|
s.Require().Len(printer.GetLines(), 2)
|
|
s.Require().Equal(printer.GetLines()[0], "Downloading Support Packet")
|
|
s.Require().Contains(printer.GetLines()[1], "Downloaded Support Packet to ")
|
|
s.Require().Len(printer.GetErrorLines(), 0)
|
|
|
|
var found bool
|
|
|
|
entries, err := os.ReadDir(".")
|
|
s.Require().NoError(err)
|
|
for _, e := range entries {
|
|
if strings.HasPrefix(e.Name(), "mm_support_packet_") && strings.HasSuffix(e.Name(), ".zip") {
|
|
b, err := os.ReadFile(e.Name())
|
|
s.NoError(err)
|
|
|
|
s.NotEmpty(b, b)
|
|
|
|
s.T().Cleanup(func() {
|
|
err = os.Remove(e.Name())
|
|
s.Require().NoError(err)
|
|
})
|
|
|
|
found = true
|
|
}
|
|
}
|
|
s.True(found)
|
|
})
|
|
|
|
s.Run("Download Support Packet with custom filename", func() {
|
|
printer.Clean()
|
|
|
|
systemSupportPacketCmd := &cobra.Command{}
|
|
systemSupportPacketCmd.Flags().StringP("output-file", "o", "", "Define the output file name")
|
|
err := systemSupportPacketCmd.ParseFlags([]string{"-o", "foo.zip"})
|
|
s.Require().NoError(err)
|
|
|
|
defer func() {
|
|
s.Require().NoError(os.Remove("foo.zip"))
|
|
}()
|
|
|
|
err = systemSupportPacketCmdF(s.th.SystemAdminClient, systemSupportPacketCmd, []string{})
|
|
s.Require().NoError(err)
|
|
s.Require().Len(printer.GetErrorLines(), 0)
|
|
s.Require().Len(printer.GetLines(), 2)
|
|
s.Require().Equal(printer.GetLines()[0], "Downloading Support Packet")
|
|
s.Require().Equal(printer.GetLines()[1], "Downloaded Support Packet to foo.zip")
|
|
|
|
b, err := os.ReadFile("foo.zip")
|
|
s.Require().NoError(err)
|
|
s.NotNil(b, b)
|
|
})
|
|
}
|