Full Mattermost server source with integrated Community Enterprise features. Includes vendor directory for offline/air-gapped builds. Structure: - enterprise-impl/: Enterprise feature implementations - enterprise-community/: Init files that register implementations - enterprise/: Bridge imports (community_imports.go) - vendor/: All dependencies for offline builds Build (online): go build ./cmd/mattermost Build (offline/air-gapped): go build -mod=vendor ./cmd/mattermost 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
348 lines
9.1 KiB
Go
348 lines
9.1 KiB
Go
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
package commands
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"net/http"
|
|
|
|
"github.com/mattermost/mattermost/server/public/model"
|
|
"github.com/spf13/cobra"
|
|
|
|
"github.com/mattermost/mattermost/server/v8/cmd/mmctl/printer"
|
|
)
|
|
|
|
func (s *MmctlUnitTestSuite) TestTeamUsersArchiveCmd() {
|
|
teamArg := "example-team-id"
|
|
userArg := "example-user-id"
|
|
|
|
s.Run("Remove users from team with a non-existent team returns an error", func() {
|
|
printer.Clean()
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamArg, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeamByName(context.TODO(), teamArg, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := teamUsersRemoveCmdF(s.client, &cobra.Command{}, []string{teamArg, userArg})
|
|
s.Require().Equal(err.Error(), "Unable to find team '"+teamArg+"'")
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
})
|
|
|
|
s.Run("Remove users from team with a non-existent user returns an error", func() {
|
|
printer.Clean()
|
|
mockTeam := &model.Team{Id: teamArg}
|
|
mockUser := &model.User{Id: userArg}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamArg, "").
|
|
Return(mockTeam, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetUserByUsername(context.TODO(), mockUser.Id, "").
|
|
Return(nil, nil, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetUser(context.TODO(), mockUser.Id, "").
|
|
Return(nil, nil, nil).
|
|
Times(1)
|
|
|
|
err := teamUsersRemoveCmdF(s.client, &cobra.Command{}, []string{teamArg, mockUser.Id})
|
|
s.Require().Error(err)
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
s.Require().Len(printer.GetErrorLines(), 1)
|
|
s.Require().Equal(printer.GetErrorLines()[0], "can't find user '"+userArg+"'")
|
|
})
|
|
|
|
s.Run("Remove users from team by email and get team by name should not return an error", func() {
|
|
printer.Clean()
|
|
mockTeam := &model.Team{Id: teamArg}
|
|
mockUser := &model.User{Id: userArg}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamArg, "").
|
|
Return(nil, nil, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeamByName(context.TODO(), teamArg, "").
|
|
Return(mockTeam, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetUserByUsername(context.TODO(), mockUser.Id, "").
|
|
Return(mockUser, nil, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
RemoveTeamMember(context.TODO(), mockTeam.Id, mockUser.Id).
|
|
Return(&model.Response{StatusCode: http.StatusBadRequest}, nil).
|
|
Times(1)
|
|
|
|
err := teamUsersRemoveCmdF(s.client, &cobra.Command{}, []string{mockTeam.Id, mockUser.Id})
|
|
s.Require().Nil(err)
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
s.Require().Len(printer.GetErrorLines(), 0)
|
|
})
|
|
|
|
s.Run("Remove users from team by email and get team should not return an error", func() {
|
|
printer.Clean()
|
|
mockTeam := &model.Team{Id: teamArg}
|
|
mockUser := &model.User{Id: userArg}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamArg, "").
|
|
Return(mockTeam, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetUserByUsername(context.TODO(), mockUser.Id, "").
|
|
Return(mockUser, nil, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
RemoveTeamMember(context.TODO(), mockTeam.Id, mockUser.Id).
|
|
Return(&model.Response{StatusCode: http.StatusBadRequest}, nil).
|
|
Times(1)
|
|
|
|
err := teamUsersRemoveCmdF(s.client, &cobra.Command{}, []string{mockTeam.Id, mockUser.Id})
|
|
s.Require().Nil(err)
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
s.Require().Len(printer.GetErrorLines(), 0)
|
|
})
|
|
|
|
s.Run("Remove users from team by username and get team should not return an error", func() {
|
|
printer.Clean()
|
|
mockTeam := &model.Team{Id: teamArg}
|
|
mockUser := &model.User{Id: userArg}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamArg, "").
|
|
Return(mockTeam, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetUserByUsername(context.TODO(), mockUser.Id, "").
|
|
Return(mockUser, nil, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
RemoveTeamMember(context.TODO(), mockTeam.Id, mockUser.Id).
|
|
Return(&model.Response{StatusCode: http.StatusBadRequest}, nil).
|
|
Times(1)
|
|
|
|
err := teamUsersRemoveCmdF(s.client, &cobra.Command{}, []string{mockTeam.Id, mockUser.Id})
|
|
s.Require().Nil(err)
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
s.Require().Len(printer.GetErrorLines(), 0)
|
|
})
|
|
|
|
s.Run("Remove users from team by user and get team should not return an error", func() {
|
|
printer.Clean()
|
|
mockTeam := &model.Team{Id: teamArg}
|
|
mockUser := &model.User{Id: userArg}
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamArg, "").
|
|
Return(mockTeam, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetUserByUsername(context.TODO(), mockUser.Id, "").
|
|
Return(nil, nil, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetUser(context.TODO(), mockUser.Id, "").
|
|
Return(mockUser, nil, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
RemoveTeamMember(context.TODO(), mockTeam.Id, mockUser.Id).
|
|
Return(&model.Response{StatusCode: http.StatusBadRequest}, nil).
|
|
Times(1)
|
|
|
|
err := teamUsersRemoveCmdF(s.client, &cobra.Command{}, []string{mockTeam.Id, mockUser.Id})
|
|
s.Require().Nil(err)
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
s.Require().Len(printer.GetErrorLines(), 0)
|
|
})
|
|
|
|
s.Run("Remove users from team with an erroneous RemoveTeamMember should return an error", func() {
|
|
printer.Clean()
|
|
mockTeam := &model.Team{Id: teamArg, Name: "example-name"}
|
|
mockUser := &model.User{Id: userArg}
|
|
mockError := errors.New("mock error")
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamArg, "").
|
|
Return(mockTeam, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetUserByUsername(context.TODO(), mockUser.Id, "").
|
|
Return(mockUser, nil, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
RemoveTeamMember(context.TODO(), mockTeam.Id, mockUser.Id).
|
|
Return(&model.Response{StatusCode: http.StatusBadRequest}, mockError).
|
|
Times(1)
|
|
|
|
err := teamUsersRemoveCmdF(s.client, &cobra.Command{}, []string{mockTeam.Id, mockUser.Id})
|
|
s.Require().Error(err)
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
s.Require().Len(printer.GetErrorLines(), 1)
|
|
s.Require().Equal(printer.GetErrorLines()[0], "unable to remove '"+mockUser.Id+"' from "+mockTeam.Name+". Error: "+mockError.Error())
|
|
})
|
|
}
|
|
|
|
func (s *MmctlUnitTestSuite) TestAddUsersCmd() {
|
|
mockTeam := model.Team{
|
|
Id: "TeamId",
|
|
Name: "team1",
|
|
DisplayName: "DisplayName",
|
|
}
|
|
mockUser := model.User{
|
|
Id: "UserID",
|
|
Username: "ExampleUser",
|
|
Email: "example@example.com",
|
|
}
|
|
|
|
s.Run("Add users with a team that cannot be found returns error", func() {
|
|
cmd := &cobra.Command{}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), "team1", "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeamByName(context.TODO(), "team1", "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := teamUsersAddCmdF(s.client, cmd, []string{"team1", "user1"})
|
|
s.Require().Equal(err.Error(), "Unable to find team 'team1'")
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
})
|
|
|
|
s.Run("Add users with nonexistent user in arguments prints error", func() {
|
|
printer.Clean()
|
|
cmd := &cobra.Command{}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), "team1", "").
|
|
Return(&mockTeam, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetUserByUsername(context.TODO(), "user1", "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetUser(context.TODO(), "user1", "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := teamUsersAddCmdF(s.client, cmd, []string{"team1", "user1"})
|
|
s.Require().Error(err)
|
|
s.Require().Len(printer.GetErrorLines(), 1)
|
|
s.Require().ErrorContains(err, "can't find user 'user1'")
|
|
})
|
|
|
|
s.Run("Add users should print error when cannot add team member", func() {
|
|
printer.Clean()
|
|
cmd := &cobra.Command{}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), "team1", "").
|
|
Return(&mockTeam, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetUserByUsername(context.TODO(), "user1", "").
|
|
Return(&mockUser, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
mockError := errors.New("cannot add team member")
|
|
|
|
s.client.
|
|
EXPECT().
|
|
AddTeamMember(context.TODO(), "TeamId", "UserID").
|
|
Return(nil, &model.Response{}, mockError).
|
|
Times(1)
|
|
|
|
err := teamUsersAddCmdF(s.client, cmd, []string{"team1", "user1"})
|
|
s.Require().Nil(err)
|
|
s.Require().Len(printer.GetErrorLines(), 1)
|
|
s.Require().Equal(printer.GetErrorLines()[0],
|
|
"Unable to add 'user1' to team1. Error: cannot add team member")
|
|
})
|
|
|
|
s.Run("Add users should not print in console anything on success", func() {
|
|
printer.Clean()
|
|
|
|
cmd := &cobra.Command{}
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), "team1", "").
|
|
Return(&mockTeam, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetUserByUsername(context.TODO(), "user1", "").
|
|
Return(&mockUser, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
AddTeamMember(context.TODO(), "TeamId", "UserID").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := teamUsersAddCmdF(s.client, cmd, []string{"team1", "user1"})
|
|
s.Require().Nil(err)
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
s.Require().Len(printer.GetErrorLines(), 0)
|
|
})
|
|
}
|