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>
2959 lines
80 KiB
Go
2959 lines
80 KiB
Go
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
package commands
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"github.com/hashicorp/go-multierror"
|
|
"github.com/mattermost/mattermost/server/public/model"
|
|
"github.com/mattermost/mattermost/server/v8/channels/web"
|
|
|
|
"github.com/mattermost/mattermost/server/v8/cmd/mmctl/printer"
|
|
|
|
"github.com/pkg/errors"
|
|
"github.com/spf13/cobra"
|
|
"github.com/spf13/viper"
|
|
)
|
|
|
|
const (
|
|
userID = "userID"
|
|
userEmail = "user@example.com"
|
|
teamID = "teamID"
|
|
teamName = "teamName"
|
|
teamDisplayName = "teamDisplayName"
|
|
channelID = "channelID"
|
|
channelName = "channelName"
|
|
channelDisplayName = "channelDisplayName"
|
|
)
|
|
|
|
func (s *MmctlUnitTestSuite) TestSearchChannelCmdF() {
|
|
s.Run("Search for an existing channel on an existing team", func() {
|
|
printer.Clean()
|
|
mockTeam := model.Team{Id: teamID}
|
|
mockChannel := model.Channel{Name: channelName}
|
|
|
|
cmd := &cobra.Command{}
|
|
cmd.Flags().String("team", teamID, "")
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamID, "").
|
|
Return(&mockTeam, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelByName(context.TODO(), channelName, teamID, "").
|
|
Return(&mockChannel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := searchChannelCmdF(s.client, cmd, []string{channelName})
|
|
s.Require().Nil(err)
|
|
s.Len(printer.GetLines(), 1)
|
|
s.Equal(&mockChannel, printer.GetLines()[0])
|
|
s.Len(printer.GetErrorLines(), 0)
|
|
})
|
|
|
|
s.Run("Search for an existing channel without specifying team", func() {
|
|
printer.Clean()
|
|
otherTeamID := "example-team-id-2"
|
|
mockTeams := []*model.Team{
|
|
{Id: otherTeamID},
|
|
{Id: teamID},
|
|
}
|
|
mockChannel := model.Channel{Name: channelName}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetAllTeams(context.TODO(), "", 0, DefaultPageSize).
|
|
Return(mockTeams, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetAllTeams(context.TODO(), "", 1, DefaultPageSize).
|
|
Return([]*model.Team{}, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
// first call is for the other team, that doesn't have the channel
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelByName(context.TODO(), channelName, otherTeamID, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
// second call is for the team that contains the channel
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelByName(context.TODO(), channelName, teamID, "").
|
|
Return(&mockChannel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := searchChannelCmdF(s.client, &cobra.Command{}, []string{channelName})
|
|
s.Require().Nil(err)
|
|
s.Len(printer.GetLines(), 1)
|
|
s.Equal(&mockChannel, printer.GetLines()[0])
|
|
s.Len(printer.GetErrorLines(), 0)
|
|
})
|
|
|
|
s.Run("Search for a nonexistent channel", func() {
|
|
printer.Clean()
|
|
mockTeam := model.Team{Id: teamID}
|
|
|
|
cmd := &cobra.Command{}
|
|
cmd.Flags().String("team", teamID, "")
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamID, "").
|
|
Return(&mockTeam, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelByName(context.TODO(), channelName, teamID, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := searchChannelCmdF(s.client, cmd, []string{channelName})
|
|
s.Require().NotNil(err)
|
|
s.Len(printer.GetLines(), 0)
|
|
s.Len(printer.GetErrorLines(), 0)
|
|
s.EqualError(err, "channel "+channelName+" was not found in team "+teamID)
|
|
})
|
|
|
|
s.Run("Search for a channel in a nonexistent team", func() {
|
|
printer.Clean()
|
|
|
|
cmd := &cobra.Command{}
|
|
cmd.Flags().String("team", teamID, "")
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamID, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeamByName(context.TODO(), teamID, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := searchChannelCmdF(s.client, cmd, []string{channelName})
|
|
s.Require().NotNil(err)
|
|
s.Len(printer.GetLines(), 0)
|
|
s.Len(printer.GetErrorLines(), 0)
|
|
s.EqualError(err, "team "+teamID+" was not found")
|
|
})
|
|
}
|
|
|
|
func (s *MmctlUnitTestSuite) TestModifyChannelCmdF() {
|
|
s.Run("Both public and private the same value (false)", func() {
|
|
printer.Clean()
|
|
|
|
cmd := &cobra.Command{}
|
|
cmd.Flags().String("username", "mockUser", "")
|
|
cmd.Flags().Bool("public", false, "")
|
|
cmd.Flags().Bool("private", false, "")
|
|
|
|
err := modifyChannelCmdF(s.client, cmd, []string{})
|
|
s.Require().EqualError(err, "you must specify only one of --public or --private")
|
|
s.Len(printer.GetLines(), 0)
|
|
s.Len(printer.GetErrorLines(), 0)
|
|
})
|
|
|
|
s.Run("Both public and private the same value (true)", func() {
|
|
printer.Clean()
|
|
|
|
cmd := &cobra.Command{}
|
|
cmd.Flags().String("username", "mockUser", "")
|
|
cmd.Flags().Bool("public", true, "")
|
|
cmd.Flags().Bool("private", true, "")
|
|
|
|
err := modifyChannelCmdF(s.client, cmd, []string{})
|
|
s.Require().EqualError(err, "you must specify only one of --public or --private")
|
|
s.Len(printer.GetLines(), 0)
|
|
s.Len(printer.GetErrorLines(), 0)
|
|
})
|
|
|
|
s.Run("Try to modify non-existing channel", func() {
|
|
printer.Clean()
|
|
args := []string{channelID}
|
|
|
|
cmd := &cobra.Command{}
|
|
cmd.Flags().String("username", "mockUser", "")
|
|
cmd.Flags().Bool("public", true, "")
|
|
cmd.Flags().Bool("private", false, "")
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannel(context.TODO(), args[0], "").
|
|
Return(nil, &model.Response{}, errors.New("")).
|
|
Times(1)
|
|
|
|
err := modifyChannelCmdF(s.client, cmd, args)
|
|
s.Require().EqualError(err, fmt.Sprintf("unable to find channel %q", args[0]))
|
|
s.Len(printer.GetLines(), 0)
|
|
s.Len(printer.GetErrorLines(), 0)
|
|
})
|
|
|
|
s.Run("Try to modify a channel from a non-existing team", func() {
|
|
printer.Clean()
|
|
team := "mockTeam"
|
|
channel := channelID
|
|
args := []string{team + ":" + channel}
|
|
|
|
cmd := &cobra.Command{}
|
|
cmd.Flags().String("username", "mockUser", "")
|
|
cmd.Flags().Bool("public", true, "")
|
|
cmd.Flags().Bool("private", false, "")
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), team, "").
|
|
Return(nil, &model.Response{}, errors.New("")).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeamByName(context.TODO(), team, "").
|
|
Return(nil, &model.Response{}, errors.New("")).
|
|
Times(1)
|
|
|
|
err := modifyChannelCmdF(s.client, cmd, args)
|
|
s.Require().EqualError(err, fmt.Sprintf("unable to find channel %q", args[0]))
|
|
s.Len(printer.GetLines(), 0)
|
|
s.Len(printer.GetErrorLines(), 0)
|
|
})
|
|
|
|
s.Run("Try to modify direct channel", func() {
|
|
printer.Clean()
|
|
channel := &model.Channel{
|
|
Id: channelID,
|
|
Type: model.ChannelTypeDirect,
|
|
}
|
|
args := []string{channel.Id}
|
|
|
|
cmd := &cobra.Command{}
|
|
cmd.Flags().String("username", "mockUser", "")
|
|
cmd.Flags().Bool("public", true, "")
|
|
cmd.Flags().Bool("private", false, "")
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannel(context.TODO(), args[0], "").
|
|
Return(channel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := modifyChannelCmdF(s.client, cmd, args)
|
|
s.Require().EqualError(err, "you can only change the type of public/private channels")
|
|
s.Len(printer.GetLines(), 0)
|
|
s.Len(printer.GetErrorLines(), 0)
|
|
})
|
|
|
|
s.Run("Try to modify group channel", func() {
|
|
printer.Clean()
|
|
channel := &model.Channel{
|
|
Id: channelID,
|
|
Type: model.ChannelTypeGroup,
|
|
}
|
|
args := []string{channel.Id}
|
|
|
|
cmd := &cobra.Command{}
|
|
cmd.Flags().String("username", "mockUser", "")
|
|
cmd.Flags().Bool("public", true, "")
|
|
cmd.Flags().Bool("private", false, "")
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannel(context.TODO(), args[0], "").
|
|
Return(channel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := modifyChannelCmdF(s.client, cmd, args)
|
|
s.Require().EqualError(err, "you can only change the type of public/private channels")
|
|
s.Len(printer.GetLines(), 0)
|
|
s.Len(printer.GetErrorLines(), 0)
|
|
})
|
|
|
|
s.Run("Try to modify channel privacy and get error", func() {
|
|
printer.Clean()
|
|
channel := &model.Channel{
|
|
Id: channelID,
|
|
Type: model.ChannelTypePrivate,
|
|
}
|
|
mockError := errors.New("mock error")
|
|
|
|
args := []string{channel.Id}
|
|
|
|
cmd := &cobra.Command{}
|
|
cmd.Flags().String("username", "mockUser", "")
|
|
cmd.Flags().Bool("public", true, "")
|
|
cmd.Flags().Bool("private", false, "")
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannel(context.TODO(), args[0], "").
|
|
Return(channel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
UpdateChannelPrivacy(context.TODO(), channel.Id, model.ChannelTypeOpen).
|
|
Return(nil, &model.Response{}, mockError).
|
|
Times(1)
|
|
|
|
err := modifyChannelCmdF(s.client, cmd, args)
|
|
s.Require().EqualError(err, fmt.Sprintf("failed to update channel (%q) privacy: %s", channel.Id, mockError.Error()))
|
|
s.Len(printer.GetLines(), 0)
|
|
s.Len(printer.GetErrorLines(), 0)
|
|
})
|
|
|
|
s.Run("Modify channel privacy to public", func() {
|
|
printer.Clean()
|
|
channel := &model.Channel{
|
|
Id: channelID,
|
|
Type: model.ChannelTypePrivate,
|
|
}
|
|
returnedChannel := &model.Channel{
|
|
Id: channel.Id,
|
|
Type: model.ChannelTypeOpen,
|
|
}
|
|
args := []string{channel.Id}
|
|
|
|
cmd := &cobra.Command{}
|
|
cmd.Flags().String("username", "mockUser", "")
|
|
cmd.Flags().Bool("public", true, "")
|
|
cmd.Flags().Bool("private", false, "")
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannel(context.TODO(), args[0], "").
|
|
Return(channel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
UpdateChannelPrivacy(context.TODO(), channel.Id, model.ChannelTypeOpen).
|
|
Return(returnedChannel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := modifyChannelCmdF(s.client, cmd, args)
|
|
s.Require().NoError(err)
|
|
s.Len(printer.GetLines(), 0)
|
|
s.Len(printer.GetErrorLines(), 0)
|
|
})
|
|
|
|
s.Run("Modify channel privacy to private", func() {
|
|
printer.Clean()
|
|
channel := &model.Channel{
|
|
Id: channelID,
|
|
Type: model.ChannelTypeOpen,
|
|
}
|
|
returnedChannel := &model.Channel{
|
|
Id: channel.Id,
|
|
Type: model.ChannelTypePrivate,
|
|
}
|
|
args := []string{channel.Id}
|
|
|
|
cmd := &cobra.Command{}
|
|
cmd.Flags().String("username", "mockUser", "")
|
|
cmd.Flags().Bool("public", false, "")
|
|
cmd.Flags().Bool("private", true, "")
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannel(context.TODO(), args[0], "").
|
|
Return(channel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
UpdateChannelPrivacy(context.TODO(), channel.Id, model.ChannelTypePrivate).
|
|
Return(returnedChannel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := modifyChannelCmdF(s.client, cmd, args)
|
|
s.Require().NoError(err)
|
|
s.Len(printer.GetLines(), 0)
|
|
s.Len(printer.GetErrorLines(), 0)
|
|
})
|
|
}
|
|
|
|
func (s *MmctlUnitTestSuite) TestArchiveChannelCmdF() {
|
|
s.Run("Archive channel without args returns an error", func() {
|
|
printer.Clean()
|
|
|
|
err := archiveChannelsCmdF(s.client, &cobra.Command{}, []string{})
|
|
mockErr := errors.New("enter at least one channel to archive")
|
|
|
|
expected := mockErr.Error()
|
|
actual := err.Error()
|
|
|
|
s.Require().Equal(expected, actual)
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
s.Require().Len(printer.GetErrorLines(), 0)
|
|
})
|
|
|
|
s.Run("Archive an existing channel on an existing team", func() {
|
|
printer.Clean()
|
|
|
|
mockTeam := model.Team{Id: teamID}
|
|
mockChannel := model.Channel{Id: channelID, Name: channelName}
|
|
|
|
cmd := &cobra.Command{}
|
|
args := teamID + ":" + channelName
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamID, "").
|
|
Return(&mockTeam, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelByNameIncludeDeleted(context.TODO(), channelName, teamID, "").
|
|
Return(&mockChannel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
DeleteChannel(context.TODO(), channelID).
|
|
Return(&model.Response{StatusCode: http.StatusOK}, nil).
|
|
Times(1)
|
|
|
|
err := archiveChannelsCmdF(s.client, cmd, []string{args})
|
|
s.Require().Nil(err)
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
s.Require().Len(printer.GetErrorLines(), 0)
|
|
})
|
|
|
|
s.Run("Archive an existing channel specified by channel id", func() {
|
|
printer.Clean()
|
|
|
|
mockChannel := model.Channel{Id: channelID, Name: channelName}
|
|
|
|
cmd := &cobra.Command{}
|
|
args := []string{channelName}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannel(context.TODO(), channelName, "").
|
|
Return(&mockChannel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
DeleteChannel(context.TODO(), channelID).
|
|
Return(&model.Response{StatusCode: http.StatusOK}, nil).
|
|
Times(1)
|
|
|
|
err := archiveChannelsCmdF(s.client, cmd, args)
|
|
s.Require().Nil(err)
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
s.Require().Len(printer.GetErrorLines(), 0)
|
|
})
|
|
|
|
s.Run("Archive several channels specified by channel id", func() {
|
|
printer.Clean()
|
|
|
|
channelArg1 := "some-channel"
|
|
channelID1 := "some-channel-id"
|
|
mockChannel1 := model.Channel{Id: channelID1, Name: channelArg1}
|
|
|
|
channelArg2 := "some-other-channel"
|
|
channelID2 := "some-other-channel-id"
|
|
mockChannel2 := model.Channel{Id: channelID2, Name: channelArg2}
|
|
|
|
cmd := &cobra.Command{}
|
|
args := []string{channelArg1, channelArg2}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannel(context.TODO(), channelArg1, "").
|
|
Return(&mockChannel1, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannel(context.TODO(), channelArg2, "").
|
|
Return(&mockChannel2, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
DeleteChannel(context.TODO(), channelID1).
|
|
Return(&model.Response{StatusCode: http.StatusOK}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
DeleteChannel(context.TODO(), channelID2).
|
|
Return(&model.Response{StatusCode: http.StatusOK}, nil).
|
|
Times(1)
|
|
|
|
err := archiveChannelsCmdF(s.client, cmd, args)
|
|
s.Require().Nil(err)
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
s.Require().Len(printer.GetErrorLines(), 0)
|
|
})
|
|
|
|
s.Run("Fail to archive a channel on a non-existent team", func() {
|
|
printer.Clean()
|
|
|
|
teamArg := "some-non-existent-team-id"
|
|
channelArg := "some-channel"
|
|
|
|
cmd := &cobra.Command{}
|
|
args := []string{teamArg + ":" + channelArg}
|
|
|
|
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 := archiveChannelsCmdF(s.client, cmd, args)
|
|
s.Require().Error(err)
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
s.Require().Len(printer.GetErrorLines(), 1)
|
|
|
|
expected := printer.GetErrorLines()[0]
|
|
actual := fmt.Sprintf("Unable to find channel '%s'", args[0])
|
|
s.Require().Equal(expected, actual)
|
|
})
|
|
|
|
s.Run("Fail to archive a non-existing channel on an existent team", func() {
|
|
printer.Clean()
|
|
|
|
teamArg := "some-non-existing-team-id"
|
|
mockTeam := model.Team{Id: teamArg}
|
|
channelArg := "some-non-existing-channel"
|
|
|
|
cmd := &cobra.Command{}
|
|
args := []string{teamArg + ":" + channelArg}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamArg, "").
|
|
Return(&mockTeam, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelByNameIncludeDeleted(context.TODO(), channelArg, teamArg, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannel(context.TODO(), channelArg, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := archiveChannelsCmdF(s.client, cmd, args)
|
|
s.Require().Error(err)
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
s.Require().Len(printer.GetErrorLines(), 1)
|
|
|
|
expected := printer.GetErrorLines()[0]
|
|
actual := fmt.Sprintf("Unable to find channel '%s'", args[0])
|
|
s.Require().Equal(expected, actual)
|
|
})
|
|
|
|
s.Run("Fail to archive a non-existing channel", func() {
|
|
printer.Clean()
|
|
|
|
channelArg := "some-non-existing-channel"
|
|
cmd := &cobra.Command{}
|
|
args := []string{channelArg}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannel(context.TODO(), channelArg, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := archiveChannelsCmdF(s.client, cmd, args)
|
|
s.Require().Error(err)
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
s.Require().Len(printer.GetErrorLines(), 1)
|
|
|
|
expected := printer.GetErrorLines()[0]
|
|
actual := fmt.Sprintf("Unable to find channel '%s'", args[0])
|
|
s.Require().Equal(expected, actual)
|
|
})
|
|
|
|
s.Run("Fail to archive an existing channel when client throws error", func() {
|
|
printer.Clean()
|
|
|
|
channelArg := "some-channel"
|
|
channelID := "some-channel-id"
|
|
mockChannel := model.Channel{Id: channelID, Name: channelArg}
|
|
|
|
cmd := &cobra.Command{}
|
|
args := []string{channelArg}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannel(context.TODO(), channelArg, "").
|
|
Return(&mockChannel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
mockErr := errors.New("mock error")
|
|
s.client.
|
|
EXPECT().
|
|
DeleteChannel(context.TODO(), channelID).
|
|
Return(&model.Response{StatusCode: http.StatusBadRequest}, mockErr).
|
|
Times(1)
|
|
|
|
err := archiveChannelsCmdF(s.client, cmd, args)
|
|
s.Require().Error(err)
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
s.Require().Len(printer.GetErrorLines(), 1)
|
|
|
|
expected := printer.GetErrorLines()[0]
|
|
actual := fmt.Sprintf("Unable to archive channel '%s' error: %s", channelArg, mockErr.Error())
|
|
s.Require().Equal(expected, actual)
|
|
})
|
|
|
|
s.Run("Fail to archive when team and channel not provided", func() {
|
|
printer.Clean()
|
|
cmd := &cobra.Command{}
|
|
args := []string{":"}
|
|
|
|
err := archiveChannelsCmdF(s.client, cmd, args)
|
|
s.Require().Error(err)
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
s.Require().Len(printer.GetErrorLines(), 1)
|
|
|
|
expected := printer.GetErrorLines()[0]
|
|
actual := fmt.Sprintf("Unable to find channel '%s'", args[0])
|
|
s.Require().Equal(expected, actual)
|
|
})
|
|
|
|
s.Run("Avoid path traversal with a valid team name", func() {
|
|
printer.Clean()
|
|
arg := "team:/../hello/channel-test"
|
|
|
|
err := archiveChannelsCmdF(s.client, &cobra.Command{}, []string{arg})
|
|
s.Require().Error(err)
|
|
s.Require().Equal("Unable to find channel 'team:/../hello/channel-test'", printer.GetErrorLines()[0])
|
|
})
|
|
}
|
|
|
|
func (s *MmctlUnitTestSuite) TestListChannelsCmd() {
|
|
emptyChannels := []*model.Channel{}
|
|
|
|
s.Run("Team is not found", func() {
|
|
printer.Clean()
|
|
args := []string{""}
|
|
args[0] = teamID
|
|
cmd := &cobra.Command{}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamID, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeamByName(context.TODO(), teamID, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := listChannelsCmdF(s.client, cmd, args)
|
|
|
|
s.Require().ErrorContains(err, "unable to find team \""+teamID+"\"")
|
|
s.Len(printer.GetLines(), 0)
|
|
s.Len(printer.GetErrorLines(), 1)
|
|
s.Require().Equal("unable to find team \""+teamID+"\"", printer.GetErrorLines()[0])
|
|
})
|
|
|
|
s.Run("Team has no channels", func() {
|
|
printer.Clean()
|
|
|
|
args := []string{teamID}
|
|
cmd := &cobra.Command{}
|
|
|
|
team := &model.Team{
|
|
Id: teamID,
|
|
}
|
|
|
|
// Empty channels of a team
|
|
publicChannels := []*model.Channel{}
|
|
archivedChannels := []*model.Channel{}
|
|
privateChannels := []*model.Channel{}
|
|
userChannels := []*model.Channel{}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamID, "").
|
|
Return(team, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPublicChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(publicChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetDeletedChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(archivedChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPrivateChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(privateChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelsForTeamForUser(context.TODO(), teamID, "me", false, "").
|
|
Return(userChannels, &model.Response{}, nil).
|
|
Times(0)
|
|
|
|
err := listChannelsCmdF(s.client, cmd, args)
|
|
|
|
s.Require().Nil(err)
|
|
s.Len(printer.GetLines(), 0)
|
|
s.Len(printer.GetErrorLines(), 0)
|
|
})
|
|
|
|
s.Run("Team with public channels", func() {
|
|
printer.Clean()
|
|
|
|
args := []string{teamID}
|
|
cmd := &cobra.Command{}
|
|
|
|
team := &model.Team{
|
|
Id: teamID,
|
|
}
|
|
|
|
publicChannelName1 := "ChannelName1"
|
|
publicChannel1 := &model.Channel{Name: publicChannelName1}
|
|
|
|
publicChannelName2 := "ChannelName2"
|
|
publicChannel2 := &model.Channel{Name: publicChannelName2}
|
|
|
|
publicChannels := []*model.Channel{publicChannel1, publicChannel2}
|
|
archivedChannels := []*model.Channel{} // Empty archived channels
|
|
privateChannels := []*model.Channel{} // Empty private channels
|
|
userChannels := []*model.Channel{} // Empty user channels
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamID, "").
|
|
Return(team, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPublicChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(publicChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPublicChannelsForTeam(context.TODO(), teamID, 1, web.PerPageMaximum, "").
|
|
Return(emptyChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetDeletedChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(archivedChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPrivateChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(privateChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelsForTeamForUser(context.TODO(), teamID, "me", false, "").
|
|
Return(userChannels, &model.Response{}, nil).
|
|
Times(0)
|
|
|
|
err := listChannelsCmdF(s.client, cmd, args)
|
|
|
|
s.Require().Nil(err)
|
|
s.Len(printer.GetErrorLines(), 0)
|
|
s.Len(printer.GetLines(), 2)
|
|
s.Require().Equal(printer.GetLines()[0], publicChannel1)
|
|
s.Require().Equal(printer.GetLines()[1], publicChannel2)
|
|
})
|
|
|
|
s.Run("Team with archived channels", func() {
|
|
printer.Clean()
|
|
|
|
args := []string{teamID}
|
|
cmd := &cobra.Command{}
|
|
|
|
team := &model.Team{
|
|
Id: teamID,
|
|
}
|
|
|
|
archivedChannelName1 := "ChannelName1"
|
|
archivedChannel1 := &model.Channel{Name: archivedChannelName1}
|
|
|
|
archivedChannelName2 := "ChannelName2"
|
|
archivedChannel2 := &model.Channel{Name: archivedChannelName2}
|
|
|
|
publicChannels := []*model.Channel{} // Empty public channels
|
|
archivedChannels := []*model.Channel{archivedChannel1, archivedChannel2}
|
|
privateChannels := []*model.Channel{} // Empty private channels
|
|
userChannels := []*model.Channel{} // Empty user channels
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamID, "").
|
|
Return(team, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPublicChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(publicChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetDeletedChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(archivedChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetDeletedChannelsForTeam(context.TODO(), teamID, 1, web.PerPageMaximum, "").
|
|
Return(emptyChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPrivateChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(privateChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelsForTeamForUser(context.TODO(), teamID, "me", false, "").
|
|
Return(userChannels, &model.Response{}, nil).
|
|
Times(0)
|
|
|
|
err := listChannelsCmdF(s.client, cmd, args)
|
|
|
|
s.Require().Nil(err)
|
|
s.Len(printer.GetErrorLines(), 0)
|
|
s.Len(printer.GetLines(), 2)
|
|
s.Require().Equal(printer.GetLines()[0], archivedChannel1)
|
|
s.Require().Equal(printer.GetLines()[1], archivedChannel2)
|
|
})
|
|
|
|
s.Run("Team with public, archived and private channels", func() {
|
|
printer.Clean()
|
|
|
|
args := []string{teamID}
|
|
cmd := &cobra.Command{}
|
|
|
|
team := &model.Team{
|
|
Id: teamID,
|
|
}
|
|
|
|
archivedChannel1 := &model.Channel{Name: "archivedChannelName1"}
|
|
archivedChannel2 := &model.Channel{Name: "archivedChannelName2"}
|
|
archivedChannels := []*model.Channel{archivedChannel1, archivedChannel2}
|
|
|
|
publicChannel1 := &model.Channel{Name: "publicChannelName1"}
|
|
publicChannel2 := &model.Channel{Name: "publicChannelName2"}
|
|
publicChannels := []*model.Channel{publicChannel1, publicChannel2}
|
|
|
|
privateChannel1 := &model.Channel{Name: "privateChannel1"}
|
|
privateChannel2 := &model.Channel{Name: "privateChannel2"}
|
|
privateChannels := []*model.Channel{privateChannel1, privateChannel2}
|
|
userChannels := []*model.Channel{}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamID, "").
|
|
Return(team, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPublicChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(publicChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPublicChannelsForTeam(context.TODO(), teamID, 1, web.PerPageMaximum, "").
|
|
Return(emptyChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetDeletedChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(archivedChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetDeletedChannelsForTeam(context.TODO(), teamID, 1, web.PerPageMaximum, "").
|
|
Return(emptyChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPrivateChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(privateChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPrivateChannelsForTeam(context.TODO(), teamID, 1, web.PerPageMaximum, "").
|
|
Return(emptyChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelsForTeamForUser(context.TODO(), teamID, "me", false, "").
|
|
Return(userChannels, &model.Response{}, nil).
|
|
Times(0)
|
|
|
|
err := listChannelsCmdF(s.client, cmd, args)
|
|
|
|
s.Require().Nil(err)
|
|
s.Len(printer.GetErrorLines(), 0)
|
|
s.Len(printer.GetLines(), 6)
|
|
s.Require().Equal(printer.GetLines()[0], publicChannel1)
|
|
s.Require().Equal(printer.GetLines()[1], publicChannel2)
|
|
s.Require().Equal(printer.GetLines()[2], archivedChannel1)
|
|
s.Require().Equal(printer.GetLines()[3], archivedChannel2)
|
|
s.Require().Equal(printer.GetLines()[4], privateChannel1)
|
|
s.Require().Equal(printer.GetLines()[5], privateChannel2)
|
|
})
|
|
|
|
s.Run("User does not have permissions to get all private channels in team", func() {
|
|
printer.Clean()
|
|
|
|
args := []string{teamID}
|
|
cmd := &cobra.Command{}
|
|
team := &model.Team{
|
|
Id: teamID,
|
|
}
|
|
cmd.PersistentFlags().Bool("local", false, "allows communicating with the server through a unix socket")
|
|
_ = viper.BindPFlag("local", cmd.PersistentFlags().Lookup("local"))
|
|
|
|
archivedChannel1 := &model.Channel{Name: "archivedChannelName1"}
|
|
publicChannel1 := &model.Channel{Name: "publicChannelName1"}
|
|
|
|
privateChannel1 := &model.Channel{Name: "privateChannel1", Type: model.ChannelTypePrivate}
|
|
privateChannel2 := &model.Channel{Name: "privateChannel2", Type: model.ChannelTypePrivate}
|
|
userChannels := []*model.Channel{archivedChannel1, publicChannel1, privateChannel1, privateChannel2}
|
|
|
|
mockError := errors.New("user does not have permissions to list all private channels in team")
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamID, "").
|
|
Return(team, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPublicChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(emptyChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetDeletedChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(emptyChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPrivateChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(nil, &model.Response{}, mockError).
|
|
Times(1)
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelsForTeamForUser(context.TODO(), teamID, "me", false, "").
|
|
Return(userChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := listChannelsCmdF(s.client, cmd, args)
|
|
|
|
s.Require().Nil(err)
|
|
s.Len(printer.GetErrorLines(), 0)
|
|
s.Len(printer.GetLines(), 2)
|
|
s.Require().Equal(printer.GetLines()[0], privateChannel1)
|
|
s.Require().Equal(printer.GetLines()[1], privateChannel2)
|
|
})
|
|
|
|
s.Run("API fails to get team's public channels", func() {
|
|
printer.Clean()
|
|
|
|
args := []string{teamID}
|
|
cmd := &cobra.Command{}
|
|
|
|
team := &model.Team{
|
|
Id: teamID,
|
|
}
|
|
|
|
mockError := errors.New("mock error")
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamID, "").
|
|
Return(team, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPublicChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(nil, &model.Response{}, mockError).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetDeletedChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(emptyChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPrivateChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(emptyChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelsForTeamForUser(context.TODO(), teamID, "me", false, "").
|
|
Return(emptyChannels, &model.Response{}, nil).
|
|
Times(0)
|
|
|
|
err := listChannelsCmdF(s.client, cmd, args)
|
|
|
|
s.Require().ErrorContains(err, mockError.Error())
|
|
s.Len(printer.GetLines(), 0)
|
|
s.Len(printer.GetErrorLines(), 1)
|
|
s.Require().Equal(printer.GetErrorLines()[0], fmt.Sprintf("unable to list public channels for %q: %s", args[0], mockError.Error()))
|
|
})
|
|
|
|
s.Run("API fails to get team's archived channels list", func() {
|
|
printer.Clean()
|
|
|
|
args := []string{teamID}
|
|
cmd := &cobra.Command{}
|
|
team := &model.Team{
|
|
Id: teamID,
|
|
}
|
|
|
|
mockError := errors.New("mock error")
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamID, "").
|
|
Return(team, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPublicChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(emptyChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetDeletedChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(nil, &model.Response{}, mockError).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPrivateChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(emptyChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelsForTeamForUser(context.TODO(), teamID, "me", false, "").
|
|
Return(emptyChannels, &model.Response{}, nil).
|
|
Times(0)
|
|
|
|
err := listChannelsCmdF(s.client, cmd, args)
|
|
|
|
s.Require().ErrorContains(err, mockError.Error())
|
|
s.Len(printer.GetLines(), 0)
|
|
s.Len(printer.GetErrorLines(), 1)
|
|
s.Require().Equal(printer.GetErrorLines()[0], fmt.Sprintf("unable to list archived channels for %q: %s", args[0], mockError.Error()))
|
|
})
|
|
|
|
s.Run("API fails to get team's private channels list", func() {
|
|
printer.Clean()
|
|
|
|
args := []string{teamID}
|
|
cmd := &cobra.Command{}
|
|
team := &model.Team{
|
|
Id: teamID,
|
|
}
|
|
|
|
mockError := errors.New("mock error")
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamID, "").
|
|
Return(team, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPublicChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(emptyChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetDeletedChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPrivateChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(emptyChannels, &model.Response{}, mockError).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelsForTeamForUser(context.TODO(), teamID, "me", false, "").
|
|
Return(emptyChannels, &model.Response{}, mockError).
|
|
Times(1) // falls through to GetChannelsForTeamForUser in non-local mode
|
|
|
|
err := listChannelsCmdF(s.client, cmd, args)
|
|
|
|
s.Require().ErrorContains(err, mockError.Error())
|
|
s.Len(printer.GetLines(), 0)
|
|
s.Len(printer.GetErrorLines(), 1)
|
|
s.Require().Equal(printer.GetErrorLines()[0], fmt.Sprintf("unable to list private channels for %q: %s", args[0], mockError.Error()))
|
|
})
|
|
|
|
s.Run("API fails to get team's private channels list in local mode", func() {
|
|
printer.Clean()
|
|
|
|
args := []string{teamID}
|
|
cmd := &cobra.Command{}
|
|
cmd.PersistentFlags().Bool("local", true, "allows communicating with the server through a unix socket")
|
|
_ = viper.BindPFlag("local", cmd.PersistentFlags().Lookup("local"))
|
|
team := &model.Team{
|
|
Id: teamID,
|
|
}
|
|
|
|
mockError := errors.New("mock error")
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamID, "").
|
|
Return(team, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPublicChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(emptyChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetDeletedChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPrivateChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(emptyChannels, &model.Response{}, mockError).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelsForTeamForUser(context.TODO(), teamID, "me", false, "").
|
|
Return(emptyChannels, &model.Response{}, mockError).
|
|
Times(0) // does not fall through to GetChannelsForTeamForUser in local mode
|
|
|
|
err := listChannelsCmdF(s.client, cmd, args)
|
|
|
|
s.Require().ErrorContains(err, mockError.Error())
|
|
s.Len(printer.GetLines(), 0)
|
|
s.Len(printer.GetErrorLines(), 1)
|
|
s.Require().Equal(printer.GetErrorLines()[0], fmt.Sprintf("unable to list private channels for %q: %s", args[0], mockError.Error()))
|
|
})
|
|
|
|
s.Run("API fails to get team's public, archived and private channels", func() {
|
|
printer.Clean()
|
|
|
|
args := []string{teamID}
|
|
cmd := &cobra.Command{}
|
|
cmd.PersistentFlags().Bool("local", false, "allows communicating with the server through a unix socket")
|
|
_ = viper.BindPFlag("local", cmd.PersistentFlags().Lookup("local"))
|
|
|
|
team := &model.Team{
|
|
Id: teamID,
|
|
}
|
|
|
|
mockError := errors.New("mock error")
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamID, "").
|
|
Return(team, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPublicChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(nil, &model.Response{}, mockError).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetDeletedChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(nil, &model.Response{}, mockError).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPrivateChannelsForTeam(context.TODO(), teamID, 0, web.PerPageMaximum, "").
|
|
Return(nil, &model.Response{}, mockError).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelsForTeamForUser(context.TODO(), teamID, "me", false, "").
|
|
Return(nil, &model.Response{}, mockError).
|
|
Times(1)
|
|
|
|
err := listChannelsCmdF(s.client, cmd, args)
|
|
|
|
s.Require().ErrorContains(err, mockError.Error())
|
|
s.Len(printer.GetLines(), 0)
|
|
s.Len(printer.GetErrorLines(), 3)
|
|
s.Require().Equal(printer.GetErrorLines()[0], fmt.Sprintf("unable to list public channels for %q: %s", args[0], mockError.Error()))
|
|
s.Require().Equal(printer.GetErrorLines()[1], fmt.Sprintf("unable to list archived channels for %q: %s", args[0], mockError.Error()))
|
|
s.Require().Equal(printer.GetErrorLines()[2], fmt.Sprintf("unable to list private channels for %q: %s", args[0], mockError.Error()))
|
|
})
|
|
|
|
s.Run("Two teams, one is found and other is not found", func() {
|
|
printer.Clean()
|
|
|
|
teamID1 := "teamID1"
|
|
teamID2 := "teamID2"
|
|
args := []string{teamID1, teamID2}
|
|
cmd := &cobra.Command{}
|
|
|
|
team1 := &model.Team{Id: teamID1}
|
|
|
|
publicChannel1 := &model.Channel{Name: "publicChannelName1"}
|
|
publicChannel2 := &model.Channel{Name: "publicChannelName2"}
|
|
publicChannels := []*model.Channel{publicChannel1, publicChannel2}
|
|
|
|
archivedChannel1 := &model.Channel{Name: "archivedChannelName1"}
|
|
archivedChannels := []*model.Channel{archivedChannel1}
|
|
|
|
privateChannel1 := &model.Channel{Name: "privateChannelName1"}
|
|
privateChannels := []*model.Channel{privateChannel1}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamID1, "").
|
|
Return(team1, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamID2, "").
|
|
Return(nil, &model.Response{}, nil). // Team 2 not found
|
|
Times(1)
|
|
s.client.
|
|
EXPECT().
|
|
GetTeamByName(context.TODO(), teamID2, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPublicChannelsForTeam(context.TODO(), teamID1, 0, web.PerPageMaximum, "").
|
|
Return(publicChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPublicChannelsForTeam(context.TODO(), teamID1, 1, web.PerPageMaximum, "").
|
|
Return(emptyChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetDeletedChannelsForTeam(context.TODO(), teamID1, 0, web.PerPageMaximum, "").
|
|
Return(archivedChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetDeletedChannelsForTeam(context.TODO(), teamID1, 1, web.PerPageMaximum, "").
|
|
Return(emptyChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPrivateChannelsForTeam(context.TODO(), teamID1, 0, web.PerPageMaximum, "").
|
|
Return(privateChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPrivateChannelsForTeam(context.TODO(), teamID1, 1, web.PerPageMaximum, "").
|
|
Return(emptyChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelsForTeamForUser(context.TODO(), teamID1, "me", false, "").
|
|
Return(privateChannels, &model.Response{}, nil).
|
|
Times(0)
|
|
|
|
err := listChannelsCmdF(s.client, cmd, args)
|
|
|
|
s.Require().ErrorContains(err, "unable to find team \""+teamID2+"\"")
|
|
s.Len(printer.GetErrorLines(), 1)
|
|
s.Require().Equal("unable to find team \""+teamID2+"\"", printer.GetErrorLines()[0])
|
|
s.Len(printer.GetLines(), 4)
|
|
s.Require().Equal(printer.GetLines()[0], publicChannel1)
|
|
s.Require().Equal(printer.GetLines()[1], publicChannel2)
|
|
s.Require().Equal(printer.GetLines()[2], archivedChannel1)
|
|
s.Require().Equal(printer.GetLines()[3], privateChannel1)
|
|
})
|
|
|
|
s.Run("Two teams, one is found and other has API errors", func() {
|
|
printer.Clean()
|
|
|
|
teamID1 := "teamID1"
|
|
teamID2 := "teamID2"
|
|
args := []string{teamID1, teamID2}
|
|
cmd := &cobra.Command{}
|
|
|
|
team1 := &model.Team{Id: teamID1}
|
|
team2 := &model.Team{Id: teamID2}
|
|
|
|
publicChannel1 := &model.Channel{Name: "publicChannelName1"}
|
|
publicChannel2 := &model.Channel{Name: "publicChannelName2"}
|
|
publicChannels := []*model.Channel{publicChannel1, publicChannel2}
|
|
|
|
archivedChannel1 := &model.Channel{Name: "archivedChannelName1"}
|
|
archivedChannels := []*model.Channel{archivedChannel1}
|
|
|
|
privateChannel1 := &model.Channel{Name: "privateChannelName1"}
|
|
privateChannels := []*model.Channel{privateChannel1}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamID1, "").
|
|
Return(team1, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPublicChannelsForTeam(context.TODO(), teamID1, 0, web.PerPageMaximum, "").
|
|
Return(publicChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPublicChannelsForTeam(context.TODO(), teamID1, 1, web.PerPageMaximum, "").
|
|
Return(emptyChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetDeletedChannelsForTeam(context.TODO(), teamID1, 0, web.PerPageMaximum, "").
|
|
Return(archivedChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetDeletedChannelsForTeam(context.TODO(), teamID1, 1, web.PerPageMaximum, "").
|
|
Return(emptyChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPrivateChannelsForTeam(context.TODO(), teamID1, 0, web.PerPageMaximum, "").
|
|
Return(privateChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPrivateChannelsForTeam(context.TODO(), teamID1, 1, web.PerPageMaximum, "").
|
|
Return(emptyChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelsForTeamForUser(context.TODO(), teamID1, "me", false, "").
|
|
Return(privateChannels, &model.Response{}, nil).
|
|
Times(0)
|
|
|
|
mockError := errors.New("mock error")
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamID2, "").
|
|
Return(team2, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPublicChannelsForTeam(context.TODO(), teamID2, 0, web.PerPageMaximum, "").
|
|
Return(nil, &model.Response{}, mockError).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetDeletedChannelsForTeam(context.TODO(), teamID2, 0, web.PerPageMaximum, "").
|
|
Return(nil, &model.Response{}, mockError).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPrivateChannelsForTeam(context.TODO(), teamID2, 0, web.PerPageMaximum, "").
|
|
Return(privateChannels, &model.Response{}, mockError).
|
|
Times(1)
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelsForTeamForUser(context.TODO(), teamID2, "me", false, "").
|
|
Return(privateChannels, &model.Response{}, mockError).
|
|
Times(1)
|
|
|
|
err := listChannelsCmdF(s.client, cmd, args)
|
|
|
|
s.Require().ErrorContains(err, mockError.Error())
|
|
s.Len(printer.GetErrorLines(), 3)
|
|
s.Len(printer.GetLines(), 4)
|
|
s.Require().Equal(printer.GetLines()[0], publicChannel1)
|
|
s.Require().Equal(printer.GetLines()[1], publicChannel2)
|
|
s.Require().Equal(printer.GetLines()[2], archivedChannel1)
|
|
s.Require().Equal(printer.GetLines()[3], privateChannel1)
|
|
})
|
|
|
|
s.Run("Two teams, both are not found", func() {
|
|
printer.Clean()
|
|
|
|
team1ID := "team1ID"
|
|
team2ID := "team2ID"
|
|
args := []string{team1ID, team2ID}
|
|
cmd := &cobra.Command{}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), team1ID, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), team2ID, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeamByName(context.TODO(), team1ID, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
s.client.
|
|
EXPECT().
|
|
GetTeamByName(context.TODO(), team2ID, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := listChannelsCmdF(s.client, cmd, args)
|
|
|
|
s.Require().ErrorContains(err, "unable to find team \""+team1ID+"\"")
|
|
s.Require().ErrorContains(err, "unable to find team \""+team2ID+"\"")
|
|
s.Len(printer.GetLines(), 0)
|
|
s.Len(printer.GetErrorLines(), 2)
|
|
s.Require().Equal("unable to find team \""+team1ID+"\"", printer.GetErrorLines()[0])
|
|
s.Require().Equal("unable to find team \""+team2ID+"\"", printer.GetErrorLines()[1])
|
|
})
|
|
|
|
s.Run("Two teams, both have channels", func() {
|
|
printer.Clean()
|
|
|
|
teamID1 := "teamID1"
|
|
teamID2 := "teamID2"
|
|
args := []string{teamID1, teamID2}
|
|
cmd := &cobra.Command{}
|
|
|
|
team1 := &model.Team{Id: teamID1}
|
|
team2 := &model.Team{Id: teamID2}
|
|
|
|
// Using same channel name for both teams since there can be common channels
|
|
publicChannel1 := &model.Channel{Name: "publicChannelName1"}
|
|
publicChannel2 := &model.Channel{Name: "publicChannelName2"}
|
|
publicChannels := []*model.Channel{publicChannel1, publicChannel2}
|
|
|
|
archivedChannel1 := &model.Channel{Name: "archivedChannelName1"}
|
|
archivedChannels := []*model.Channel{archivedChannel1}
|
|
|
|
privateChannel1 := &model.Channel{Name: "privateChannelName1"}
|
|
privateChannels := []*model.Channel{privateChannel1}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamID1, "").
|
|
Return(team1, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPublicChannelsForTeam(context.TODO(), teamID1, 0, web.PerPageMaximum, "").
|
|
Return(publicChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPublicChannelsForTeam(context.TODO(), teamID1, 1, web.PerPageMaximum, "").
|
|
Return(emptyChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetDeletedChannelsForTeam(context.TODO(), teamID1, 0, web.PerPageMaximum, "").
|
|
Return(archivedChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetDeletedChannelsForTeam(context.TODO(), teamID1, 1, web.PerPageMaximum, "").
|
|
Return(emptyChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPrivateChannelsForTeam(context.TODO(), teamID1, 0, web.PerPageMaximum, "").
|
|
Return(privateChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPrivateChannelsForTeam(context.TODO(), teamID1, 1, web.PerPageMaximum, "").
|
|
Return(emptyChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelsForTeamForUser(context.TODO(), teamID1, "me", false, "").
|
|
Return(privateChannels, &model.Response{}, nil).
|
|
Times(0)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamID2, "").
|
|
Return(team2, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPublicChannelsForTeam(context.TODO(), teamID2, 0, web.PerPageMaximum, "").
|
|
Return(publicChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPublicChannelsForTeam(context.TODO(), teamID2, 1, web.PerPageMaximum, "").
|
|
Return(emptyChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetDeletedChannelsForTeam(context.TODO(), teamID2, 0, web.PerPageMaximum, "").
|
|
Return(archivedChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetDeletedChannelsForTeam(context.TODO(), teamID2, 1, web.PerPageMaximum, "").
|
|
Return(emptyChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPrivateChannelsForTeam(context.TODO(), teamID2, 0, web.PerPageMaximum, "").
|
|
Return(privateChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetPrivateChannelsForTeam(context.TODO(), teamID2, 1, web.PerPageMaximum, "").
|
|
Return(emptyChannels, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelsForTeamForUser(context.TODO(), teamID2, "me", false, "").
|
|
Return(privateChannels, &model.Response{}, nil).
|
|
Times(0)
|
|
|
|
err := listChannelsCmdF(s.client, cmd, args)
|
|
|
|
s.Require().Nil(err)
|
|
s.Len(printer.GetErrorLines(), 0)
|
|
s.Len(printer.GetLines(), 8)
|
|
s.Require().Equal(printer.GetLines()[0], publicChannel1)
|
|
s.Require().Equal(printer.GetLines()[1], publicChannel2)
|
|
s.Require().Equal(printer.GetLines()[2], archivedChannel1)
|
|
s.Require().Equal(printer.GetLines()[3], privateChannel1)
|
|
s.Require().Equal(printer.GetLines()[4], publicChannel1)
|
|
s.Require().Equal(printer.GetLines()[5], publicChannel2)
|
|
s.Require().Equal(printer.GetLines()[6], archivedChannel1)
|
|
s.Require().Equal(printer.GetLines()[7], privateChannel1)
|
|
})
|
|
|
|
s.Run("Avoid path traversal", func() {
|
|
printer.Clean()
|
|
arg := "\"test/../hello?\"channel-test"
|
|
|
|
err := listChannelsCmdF(s.client, &cobra.Command{}, []string{arg})
|
|
s.Require().ErrorContains(err, "unable to find team \"\\\"test/../hello?\\\"channel-test\"")
|
|
s.Require().Equal("unable to find team \"\\\"test/../hello?\\\"channel-test\"", printer.GetErrorLines()[0])
|
|
})
|
|
}
|
|
|
|
func (s *MmctlUnitTestSuite) TestUnarchiveChannelCmdF() {
|
|
s.Run("Unarchive channel without args returns an error", func() {
|
|
printer.Clean()
|
|
|
|
err := unarchiveChannelsCmdF(s.client, &cobra.Command{}, []string{})
|
|
mockErr := errors.New("enter at least one channel")
|
|
|
|
expected := mockErr.Error()
|
|
actual := err.Error()
|
|
s.Require().Equal(expected, actual)
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
s.Require().Len(printer.GetErrorLines(), 0)
|
|
})
|
|
|
|
s.Run("Unarchive an existing channel on an existing team", func() {
|
|
printer.Clean()
|
|
|
|
mockTeam := model.Team{Id: teamID}
|
|
mockChannel := model.Channel{Id: channelID, Name: channelName}
|
|
|
|
cmd := &cobra.Command{}
|
|
args := teamID + ":" + channelName
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamID, "").
|
|
Return(&mockTeam, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelByNameIncludeDeleted(context.TODO(), channelName, teamID, "").
|
|
Return(&mockChannel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
RestoreChannel(context.TODO(), channelID).
|
|
Return(&mockChannel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := unarchiveChannelsCmdF(s.client, cmd, []string{args})
|
|
s.Require().Nil(err)
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
s.Require().Len(printer.GetErrorLines(), 0)
|
|
})
|
|
|
|
s.Run("Unarchive an existing channel specified by channel id", func() {
|
|
printer.Clean()
|
|
|
|
mockChannel := model.Channel{Id: channelID, Name: channelName}
|
|
|
|
cmd := &cobra.Command{}
|
|
args := []string{channelName}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannel(context.TODO(), channelName, "").
|
|
Return(&mockChannel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
RestoreChannel(context.TODO(), channelID).
|
|
Return(&mockChannel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := unarchiveChannelsCmdF(s.client, cmd, args)
|
|
s.Require().Nil(err)
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
s.Require().Len(printer.GetErrorLines(), 0)
|
|
})
|
|
|
|
s.Run("Unarchive several channels specified by channel id", func() {
|
|
printer.Clean()
|
|
|
|
channelArg1 := "some-channel"
|
|
channelID1 := "some-channel-id"
|
|
mockChannel1 := model.Channel{Id: channelID1, Name: channelArg1}
|
|
|
|
channelArg2 := "some-other-channel"
|
|
channelID2 := "some-other-channel-id"
|
|
mockChannel2 := model.Channel{Id: channelID2, Name: channelArg2}
|
|
|
|
cmd := &cobra.Command{}
|
|
args := []string{channelArg1, channelArg2}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannel(context.TODO(), channelArg1, "").
|
|
Return(&mockChannel1, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannel(context.TODO(), channelArg2, "").
|
|
Return(&mockChannel2, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
RestoreChannel(context.TODO(), channelID1).
|
|
Return(&mockChannel1, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
RestoreChannel(context.TODO(), channelID2).
|
|
Return(&mockChannel2, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := unarchiveChannelsCmdF(s.client, cmd, args)
|
|
s.Require().Nil(err)
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
s.Require().Len(printer.GetErrorLines(), 0)
|
|
})
|
|
|
|
s.Run("Fail to unarchive a channel on a non-existent team", func() {
|
|
printer.Clean()
|
|
|
|
teamArg := "some-non-existent-team-id"
|
|
|
|
cmd := &cobra.Command{}
|
|
args := []string{teamArg + ":" + channelName}
|
|
|
|
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 := unarchiveChannelsCmdF(s.client, cmd, args)
|
|
expectedError := fmt.Sprintf("Unable to find channel '%s'", args[0])
|
|
|
|
s.Require().ErrorContains(err, expectedError)
|
|
s.Require().Equal(expectedError, printer.GetErrorLines()[0])
|
|
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
s.Require().Len(printer.GetErrorLines(), 1)
|
|
})
|
|
|
|
s.Run("Fail to unarchive a non-existing channel on an existent team", func() {
|
|
printer.Clean()
|
|
|
|
teamArg := "some-non-existing-team-id"
|
|
mockTeam := model.Team{Id: teamArg}
|
|
channelArg := "some-non-existing-channel"
|
|
|
|
cmd := &cobra.Command{}
|
|
args := []string{teamArg + ":" + channelArg}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamArg, "").
|
|
Return(&mockTeam, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelByNameIncludeDeleted(context.TODO(), channelArg, teamArg, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannel(context.TODO(), channelArg, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := unarchiveChannelsCmdF(s.client, cmd, args)
|
|
expectedError := fmt.Sprintf("Unable to find channel '%s'", args[0])
|
|
|
|
s.Require().ErrorContains(err, expectedError)
|
|
s.Require().Equal(expectedError, printer.GetErrorLines()[0])
|
|
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
s.Require().Len(printer.GetErrorLines(), 1)
|
|
})
|
|
|
|
s.Run("Fail to unarchive a non-existing channel", func() {
|
|
printer.Clean()
|
|
|
|
channelArg := "some-non-existing-channel"
|
|
cmd := &cobra.Command{}
|
|
args := []string{channelArg}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannel(context.TODO(), channelArg, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := unarchiveChannelsCmdF(s.client, cmd, args)
|
|
expectedError := fmt.Sprintf("Unable to find channel '%s'", args[0])
|
|
|
|
s.Require().ErrorContains(err, expectedError)
|
|
s.Require().Equal(expectedError, printer.GetErrorLines()[0])
|
|
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
s.Require().Len(printer.GetErrorLines(), 1)
|
|
})
|
|
|
|
s.Run("Fail to unarchive an existing channel when client throws error", func() {
|
|
printer.Clean()
|
|
|
|
mockChannel := model.Channel{Id: channelID, Name: channelName}
|
|
|
|
cmd := &cobra.Command{}
|
|
args := []string{channelName}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannel(context.TODO(), channelName, "").
|
|
Return(&mockChannel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
mockErr := errors.New("mock error")
|
|
s.client.
|
|
EXPECT().
|
|
RestoreChannel(context.TODO(), channelID).
|
|
Return(nil, &model.Response{}, mockErr).
|
|
Times(1)
|
|
|
|
err := unarchiveChannelsCmdF(s.client, cmd, args)
|
|
expectedError := fmt.Sprintf("Unable to unarchive channel '%s'. Error: %s", channelName, mockErr.Error())
|
|
|
|
s.Require().ErrorContains(err, expectedError)
|
|
s.Require().Equal(expectedError, printer.GetErrorLines()[0])
|
|
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
s.Require().Len(printer.GetErrorLines(), 1)
|
|
})
|
|
|
|
s.Run("Fail to unarchive when team and channel not provided", func() {
|
|
printer.Clean()
|
|
|
|
cmd := &cobra.Command{}
|
|
args := []string{":"}
|
|
|
|
err := unarchiveChannelsCmdF(s.client, cmd, args)
|
|
expectedError := fmt.Sprintf("Unable to find channel '%s'", args[0])
|
|
|
|
s.Require().ErrorContains(err, expectedError)
|
|
s.Require().Equal(expectedError, printer.GetErrorLines()[0])
|
|
|
|
s.Require().Len(printer.GetLines(), 0)
|
|
s.Require().Len(printer.GetErrorLines(), 1)
|
|
})
|
|
}
|
|
|
|
func (s *MmctlUnitTestSuite) TestRenameChannelCmd() {
|
|
s.Run("It should fail when no name and display name is supplied", func() {
|
|
printer.Clean()
|
|
|
|
cmd := &cobra.Command{}
|
|
|
|
args := []string{""}
|
|
args[0] = "teamName:channelName"
|
|
|
|
cmd.Flags().String("name", "", "Channel Name")
|
|
cmd.Flags().String("display-name", "", channelDisplayName)
|
|
|
|
err := renameChannelCmdF(s.client, cmd, args)
|
|
s.Require().EqualError(err, "require at least one flag to rename channel, either 'name' or 'display-name'")
|
|
})
|
|
|
|
s.Run("It should fail when empty team and channel name are supplied", func() {
|
|
printer.Clean()
|
|
|
|
cmd := &cobra.Command{}
|
|
|
|
teamName := ""
|
|
channelName := ""
|
|
argsTeamChannel := teamName + ":" + channelName
|
|
args := []string{argsTeamChannel}
|
|
|
|
newChannelName := "newChannelName"
|
|
newChannelDisplayName := "New Channel Name"
|
|
cmd.Flags().String("name", newChannelName, "Channel Name")
|
|
cmd.Flags().String("display-name", newChannelDisplayName, channelDisplayName)
|
|
|
|
err := renameChannelCmdF(s.client, cmd, args)
|
|
s.Require().EqualError(err, fmt.Sprintf("unable to find channel from %q", argsTeamChannel))
|
|
})
|
|
|
|
s.Run("It should fail when empty channel is supplied", func() {
|
|
printer.Clean()
|
|
|
|
cmd := &cobra.Command{}
|
|
|
|
channelName := ""
|
|
argsTeamChannel := teamName + ":" + channelName
|
|
args := []string{argsTeamChannel}
|
|
|
|
newChannelName := "newChannelName"
|
|
newChannelDisplayName := "New Channel Name"
|
|
cmd.Flags().String("name", newChannelName, "Channel Name")
|
|
cmd.Flags().String("display-name", newChannelDisplayName, channelDisplayName)
|
|
|
|
foundTeam := &model.Team{
|
|
Id: teamID,
|
|
DisplayName: teamDisplayName,
|
|
Name: teamName,
|
|
}
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamName, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeamByName(context.TODO(), teamName, "").
|
|
Return(foundTeam, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelByNameIncludeDeleted(context.TODO(), channelName, foundTeam.Id, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannel(context.TODO(), channelName, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := renameChannelCmdF(s.client, cmd, args)
|
|
s.Require().EqualError(err, fmt.Sprintf("unable to find channel from %q", argsTeamChannel))
|
|
})
|
|
|
|
s.Run("It should fail with empty team and non existing channel", func() {
|
|
printer.Clean()
|
|
|
|
cmd := &cobra.Command{}
|
|
|
|
teamName := ""
|
|
channelName := "nonExistingChannelName"
|
|
argsTeamChannel := teamName + ":" + channelName
|
|
args := []string{argsTeamChannel}
|
|
|
|
newChannelName := "newChannelName"
|
|
newChannelDisplayName := "New Channel Name"
|
|
cmd.Flags().String("name", newChannelName, "Channel Name")
|
|
cmd.Flags().String("display-name", newChannelDisplayName, channelDisplayName)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannel(context.TODO(), channelName, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := renameChannelCmdF(s.client, cmd, args)
|
|
s.Require().EqualError(err, fmt.Sprintf("unable to find channel from %q", argsTeamChannel))
|
|
})
|
|
|
|
s.Run("It should fail when team is not found", func() {
|
|
printer.Clean()
|
|
|
|
cmd := &cobra.Command{}
|
|
|
|
teamName := "nonExistingteamName"
|
|
argsTeamChannel := teamName + ":" + channelName
|
|
args := []string{argsTeamChannel}
|
|
|
|
newChannelName := "newChannelName"
|
|
newChannelDisplayName := "New Channel Name"
|
|
cmd.Flags().String("name", newChannelName, "Channel Name")
|
|
cmd.Flags().String("display-name", newChannelDisplayName, channelDisplayName)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamName, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeamByName(context.TODO(), teamName, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := renameChannelCmdF(s.client, cmd, args)
|
|
s.Require().EqualError(err, fmt.Sprintf("unable to find channel from %q", argsTeamChannel))
|
|
})
|
|
|
|
s.Run("It should fail when channel is not found", func() {
|
|
printer.Clean()
|
|
|
|
cmd := &cobra.Command{}
|
|
|
|
channelName := "nonExistingChannelName"
|
|
argsTeamChannel := teamName + ":" + channelName
|
|
args := []string{argsTeamChannel}
|
|
|
|
newChannelName := "newChannelName"
|
|
newChannelDisplayName := "New Channel Name"
|
|
cmd.Flags().String("name", newChannelName, "Channel Name")
|
|
cmd.Flags().String("display-name", newChannelDisplayName, channelDisplayName)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamName, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
foundTeam := &model.Team{
|
|
Id: teamID,
|
|
DisplayName: teamDisplayName,
|
|
Name: teamName,
|
|
}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeamByName(context.TODO(), teamName, "").
|
|
Return(foundTeam, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelByNameIncludeDeleted(context.TODO(), channelName, foundTeam.Id, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannel(context.TODO(), channelName, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := renameChannelCmdF(s.client, cmd, args)
|
|
s.Require().EqualError(err, fmt.Sprintf("unable to find channel from %q", argsTeamChannel))
|
|
})
|
|
|
|
s.Run("It should fail when api fails to rename", func() {
|
|
printer.Clean()
|
|
|
|
cmd := &cobra.Command{}
|
|
|
|
argsTeamChannel := teamName + ":" + channelName
|
|
args := []string{argsTeamChannel}
|
|
|
|
newChannelName := "newChannelName"
|
|
newChannelDisplayName := "New Channel Name"
|
|
cmd.Flags().String("name", newChannelName, "Channel Name")
|
|
cmd.Flags().String("display-name", newChannelDisplayName, channelDisplayName)
|
|
|
|
foundTeam := &model.Team{
|
|
Id: teamID,
|
|
DisplayName: teamDisplayName,
|
|
Name: teamName,
|
|
}
|
|
|
|
foundChannel := &model.Channel{
|
|
Id: channelID,
|
|
Name: channelName,
|
|
DisplayName: channelDisplayName,
|
|
}
|
|
|
|
channelPatch := &model.ChannelPatch{
|
|
DisplayName: &newChannelDisplayName,
|
|
Name: &newChannelName,
|
|
}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamName, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeamByName(context.TODO(), teamName, "").
|
|
Return(foundTeam, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelByNameIncludeDeleted(context.TODO(), channelName, foundTeam.Id, "").
|
|
Return(foundChannel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
mockError := model.NewAppError("at-random-location.go", "mock error", nil, "mocking a random error", 0)
|
|
s.client.
|
|
EXPECT().
|
|
PatchChannel(context.TODO(), foundChannel.Id, channelPatch).
|
|
Return(nil, &model.Response{}, mockError).
|
|
Times(1)
|
|
|
|
err := renameChannelCmdF(s.client, cmd, args)
|
|
s.Require().EqualError(err, fmt.Sprintf("cannot rename channel %q, error: %s", foundChannel.Name, mockError.Error()))
|
|
})
|
|
|
|
s.Run("It should work as expected", func() {
|
|
printer.Clean()
|
|
|
|
cmd := &cobra.Command{}
|
|
|
|
argsTeamChannel := teamName + ":" + channelName
|
|
args := []string{argsTeamChannel}
|
|
|
|
newChannelName := "newChannelName"
|
|
newChannelDisplayName := "New Channel Name"
|
|
cmd.Flags().String("name", newChannelName, "Channel Name")
|
|
cmd.Flags().String("display-name", newChannelDisplayName, channelDisplayName)
|
|
|
|
foundTeam := &model.Team{
|
|
Id: teamID,
|
|
DisplayName: teamDisplayName,
|
|
Name: teamName,
|
|
}
|
|
|
|
foundChannel := &model.Channel{
|
|
Id: channelID,
|
|
Name: channelName,
|
|
DisplayName: channelDisplayName,
|
|
}
|
|
|
|
channelPatch := &model.ChannelPatch{
|
|
DisplayName: &newChannelDisplayName,
|
|
Name: &newChannelName,
|
|
}
|
|
|
|
updatedChannel := &model.Channel{
|
|
Id: channelID,
|
|
Name: newChannelName,
|
|
DisplayName: newChannelDisplayName,
|
|
}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamName, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeamByName(context.TODO(), teamName, "").
|
|
Return(foundTeam, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelByNameIncludeDeleted(context.TODO(), channelName, foundTeam.Id, "").
|
|
Return(foundChannel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
PatchChannel(context.TODO(), foundChannel.Id, channelPatch).
|
|
Return(updatedChannel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := renameChannelCmdF(s.client, cmd, args)
|
|
s.Require().Nil(err)
|
|
s.Require().Len(printer.GetErrorLines(), 0)
|
|
s.Require().Len(printer.GetLines(), 1)
|
|
s.Require().Equal(printer.GetLines()[0], updatedChannel)
|
|
})
|
|
|
|
s.Run("It should work with empty team and existing channel", func() {
|
|
printer.Clean()
|
|
|
|
cmd := &cobra.Command{}
|
|
|
|
teamName := ""
|
|
argsTeamChannel := teamName + ":" + channelName
|
|
args := []string{argsTeamChannel}
|
|
|
|
newChannelName := "newChannelName"
|
|
newChannelDisplayName := "New Channel Name"
|
|
cmd.Flags().String("name", newChannelName, "Channel Name")
|
|
cmd.Flags().String("display-name", newChannelDisplayName, channelDisplayName)
|
|
|
|
foundChannel := &model.Channel{
|
|
Id: channelID,
|
|
Name: channelName,
|
|
DisplayName: channelDisplayName,
|
|
}
|
|
|
|
channelPatch := &model.ChannelPatch{
|
|
DisplayName: &newChannelDisplayName,
|
|
Name: &newChannelName,
|
|
}
|
|
|
|
updatedChannel := &model.Channel{
|
|
Id: channelID,
|
|
Name: newChannelName,
|
|
DisplayName: newChannelDisplayName,
|
|
}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannel(context.TODO(), channelName, "").
|
|
Return(foundChannel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
PatchChannel(context.TODO(), foundChannel.Id, channelPatch).
|
|
Return(updatedChannel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := renameChannelCmdF(s.client, cmd, args)
|
|
s.Require().Nil(err)
|
|
s.Require().Len(printer.GetErrorLines(), 0)
|
|
s.Require().Len(printer.GetLines(), 1)
|
|
s.Require().Equal(printer.GetLines()[0], updatedChannel)
|
|
})
|
|
|
|
s.Run("It should work even if only name flag is passed", func() {
|
|
printer.Clean()
|
|
|
|
cmd := &cobra.Command{}
|
|
|
|
argsTeamChannel := teamName + ":" + channelName
|
|
args := []string{argsTeamChannel}
|
|
|
|
newChannelName := "newChannelName"
|
|
newChannelDisplayName := ""
|
|
cmd.Flags().String("name", newChannelName, "Channel Name")
|
|
cmd.Flags().String("display-name", newChannelDisplayName, channelDisplayName)
|
|
|
|
foundTeam := &model.Team{
|
|
Id: teamID,
|
|
DisplayName: teamDisplayName,
|
|
Name: teamName,
|
|
}
|
|
|
|
foundChannel := &model.Channel{
|
|
Id: channelID,
|
|
Name: channelName,
|
|
DisplayName: channelDisplayName,
|
|
}
|
|
|
|
channelPatch := &model.ChannelPatch{
|
|
Name: &newChannelName,
|
|
}
|
|
|
|
updatedChannel := &model.Channel{
|
|
Id: channelID,
|
|
Name: newChannelName,
|
|
DisplayName: newChannelDisplayName,
|
|
}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamName, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeamByName(context.TODO(), teamName, "").
|
|
Return(foundTeam, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelByNameIncludeDeleted(context.TODO(), channelName, foundTeam.Id, "").
|
|
Return(foundChannel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
PatchChannel(context.TODO(), foundChannel.Id, channelPatch).
|
|
Return(updatedChannel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := renameChannelCmdF(s.client, cmd, args)
|
|
s.Require().Nil(err)
|
|
s.Require().Len(printer.GetErrorLines(), 0)
|
|
s.Require().Len(printer.GetLines(), 1)
|
|
s.Require().Equal(printer.GetLines()[0], updatedChannel)
|
|
})
|
|
|
|
s.Run("It should work even if only display name flag is passed", func() {
|
|
printer.Clean()
|
|
|
|
cmd := &cobra.Command{}
|
|
|
|
argsTeamChannel := teamName + ":" + channelName
|
|
args := []string{argsTeamChannel}
|
|
|
|
newChannelName := ""
|
|
newChannelDisplayName := "New Channel Name"
|
|
cmd.Flags().String("name", newChannelName, "Channel Name")
|
|
cmd.Flags().String("display-name", newChannelDisplayName, channelDisplayName)
|
|
|
|
foundTeam := &model.Team{
|
|
Id: teamID,
|
|
DisplayName: teamDisplayName,
|
|
Name: teamName,
|
|
}
|
|
|
|
foundChannel := &model.Channel{
|
|
Id: channelID,
|
|
Name: channelName,
|
|
DisplayName: channelDisplayName,
|
|
}
|
|
|
|
channelPatch := &model.ChannelPatch{
|
|
DisplayName: &newChannelDisplayName,
|
|
}
|
|
|
|
updatedChannel := &model.Channel{
|
|
Id: channelID,
|
|
Name: newChannelName,
|
|
DisplayName: newChannelDisplayName,
|
|
}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamName, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeamByName(context.TODO(), teamName, "").
|
|
Return(foundTeam, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelByNameIncludeDeleted(context.TODO(), channelName, foundTeam.Id, "").
|
|
Return(foundChannel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
PatchChannel(context.TODO(), foundChannel.Id, channelPatch).
|
|
Return(updatedChannel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := renameChannelCmdF(s.client, cmd, args)
|
|
s.Require().Nil(err)
|
|
s.Require().Len(printer.GetErrorLines(), 0)
|
|
s.Require().Len(printer.GetLines(), 1)
|
|
s.Require().Equal(printer.GetLines()[0], updatedChannel)
|
|
})
|
|
}
|
|
|
|
func (s *MmctlUnitTestSuite) TestMoveChannelCmdF() {
|
|
s.Run("Move a channel to another team by using names", func() {
|
|
printer.Clean()
|
|
|
|
dstTeamName := "destination-team-name"
|
|
dstTeamID := "destination-team-id"
|
|
mockTeam1 := model.Team{
|
|
Name: dstTeamName,
|
|
Id: dstTeamID,
|
|
}
|
|
|
|
srcTeamName := "source-team-name"
|
|
srcTeamID := "source-team-id"
|
|
mockTeam2 := model.Team{
|
|
Name: srcTeamName,
|
|
Id: srcTeamID,
|
|
}
|
|
|
|
channelName := "channel-name"
|
|
channelID := "channel-id"
|
|
mockChannel := model.Channel{
|
|
Name: channelName,
|
|
TeamId: mockTeam2.Id,
|
|
Id: channelID,
|
|
}
|
|
|
|
cmd := &cobra.Command{}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), dstTeamName, "").
|
|
Return(nil, &model.Response{}, errors.New("")).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeamByName(context.TODO(), dstTeamName, "").
|
|
Return(&mockTeam1, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), srcTeamName, "").
|
|
Return(nil, &model.Response{}, errors.New("")).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeamByName(context.TODO(), srcTeamName, "").
|
|
Return(&mockTeam2, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelByNameIncludeDeleted(context.TODO(), channelName, mockTeam2.Id, "").
|
|
Return(&mockChannel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
MoveChannel(context.TODO(), mockChannel.Id, mockTeam1.Id, false).
|
|
Return(&mockChannel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := moveChannelCmdF(s.client, cmd, []string{dstTeamName, srcTeamName + ":" + channelName})
|
|
s.Require().Nil(err)
|
|
s.Len(printer.GetLines(), 1)
|
|
s.Equal(&mockChannel, printer.GetLines()[0])
|
|
s.Len(printer.GetErrorLines(), 0)
|
|
})
|
|
|
|
s.Run("Should fail for not being able to find the destination team", func() {
|
|
printer.Clean()
|
|
|
|
dstTeamName := "destination-team-name"
|
|
|
|
cmd := &cobra.Command{}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), dstTeamName, "").
|
|
Return(nil, &model.Response{}, errors.New("")).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeamByName(context.TODO(), dstTeamName, "").
|
|
Return(nil, &model.Response{}, errors.New("")).
|
|
Times(1)
|
|
|
|
err := moveChannelCmdF(s.client, cmd, []string{dstTeamName, "team:channel"})
|
|
|
|
s.Require().EqualError(err, fmt.Sprintf("unable to find destination team %q", dstTeamName))
|
|
})
|
|
|
|
s.Run("Should fail for not being able to find the channel", func() {
|
|
printer.Clean()
|
|
|
|
dstTeamName := "destination-team-name"
|
|
dstTeamID := "destination-team-id"
|
|
mockTeam1 := model.Team{
|
|
Name: dstTeamName,
|
|
Id: dstTeamID,
|
|
}
|
|
|
|
channelID := "channel-id"
|
|
|
|
cmd := &cobra.Command{}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), dstTeamID, "").
|
|
Return(&mockTeam1, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannel(context.TODO(), channelID, "").
|
|
Return(nil, &model.Response{}, errors.New("")).
|
|
Times(1)
|
|
|
|
err := moveChannelCmdF(s.client, cmd, []string{dstTeamID, channelID})
|
|
var expected error
|
|
expected = multierror.Append(expected, fmt.Errorf("unable to find channel %q", channelID))
|
|
|
|
s.Require().EqualError(err, expected.Error())
|
|
})
|
|
|
|
s.Run("Fail on client.MoveChannel to another team by using Ids", func() {
|
|
printer.Clean()
|
|
|
|
dstTeamID := "destination-team-id"
|
|
mockTeam1 := model.Team{
|
|
Id: dstTeamID,
|
|
}
|
|
|
|
channelID := "channel-id"
|
|
|
|
cmd := &cobra.Command{}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), dstTeamID, "").
|
|
Return(&mockTeam1, &model.Response{}, errors.New("")).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannel(context.TODO(), channelID, "").
|
|
Return(&model.Channel{Id: channelID, Name: "some-name"}, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
MoveChannel(context.TODO(), channelID, mockTeam1.Id, false).
|
|
Return(nil, &model.Response{}, errors.New("some-error")).
|
|
Times(1)
|
|
|
|
err := moveChannelCmdF(s.client, cmd, []string{dstTeamID, channelID})
|
|
var expected error
|
|
expected = multierror.Append(expected, fmt.Errorf("unable to move channel %q: some-error", "some-name"))
|
|
|
|
s.Require().EqualError(err, expected.Error())
|
|
})
|
|
}
|
|
|
|
func (s *MmctlUnitTestSuite) TestCreateChannelCmd() {
|
|
s.Run("should not create channel without display name", func() {
|
|
printer.Clean()
|
|
|
|
cmd := &cobra.Command{}
|
|
|
|
teamName := "teamName"
|
|
channelName := "channelName"
|
|
args := []string{teamName + ":" + channelName}
|
|
|
|
cmd.Flags().String("team", teamName, "Team Name")
|
|
cmd.Flags().String("name", channelName, "Channel Name")
|
|
|
|
err := createChannelCmdF(s.client, cmd, args)
|
|
s.Require().EqualError(err, "display-name is required")
|
|
})
|
|
|
|
s.Run("should not create channel without name", func() {
|
|
printer.Clean()
|
|
|
|
cmd := &cobra.Command{}
|
|
|
|
teamName := "teamName"
|
|
channelDisplayName := "channelDisplayName"
|
|
argsTeamChannel := teamName + ":" + channelDisplayName
|
|
args := []string{argsTeamChannel}
|
|
|
|
cmd.Flags().String("team", teamName, "Team Name")
|
|
cmd.Flags().String("display-name", channelDisplayName, "Channel Display Name")
|
|
|
|
err := createChannelCmdF(s.client, cmd, args)
|
|
s.Require().EqualError(err, "name is required")
|
|
})
|
|
|
|
s.Run("should not create channel without team", func() {
|
|
printer.Clean()
|
|
|
|
cmd := &cobra.Command{}
|
|
|
|
channelName := "channelName"
|
|
channelDisplayName := "channelDisplayName"
|
|
argsTeamChannel := channelName + ":" + channelDisplayName
|
|
args := []string{argsTeamChannel}
|
|
|
|
cmd.Flags().String("name", channelName, "Channel Name")
|
|
cmd.Flags().String("display-name", channelDisplayName, "Channel Display Name")
|
|
|
|
err := createChannelCmdF(s.client, cmd, args)
|
|
s.Require().EqualError(err, "team is required")
|
|
})
|
|
|
|
s.Run("should fail when team does not exist", func() {
|
|
printer.Clean()
|
|
|
|
cmd := &cobra.Command{}
|
|
|
|
teamName := "teamName"
|
|
channelName := "channelName"
|
|
channelDisplayName := "channelDisplayName"
|
|
argsTeamChannel := teamName + ":" + channelName + ":" + channelDisplayName
|
|
args := []string{argsTeamChannel}
|
|
|
|
cmd.Flags().String("team", teamName, "Team Name")
|
|
cmd.Flags().String("name", channelName, "Channel Name")
|
|
cmd.Flags().String("display-name", channelDisplayName, "Channel Display Name")
|
|
|
|
mockError := errors.New("mock error")
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamName, "").
|
|
Return(nil, &model.Response{}, mockError).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeamByName(context.TODO(), teamName, "").
|
|
Return(nil, &model.Response{}, mockError).
|
|
Times(1)
|
|
|
|
err := createChannelCmdF(s.client, cmd, args)
|
|
s.Require().EqualError(err, fmt.Sprintf("unable to find team: %s", teamName))
|
|
})
|
|
|
|
s.Run("should create public channel", func() {
|
|
printer.Clean()
|
|
|
|
cmd := &cobra.Command{}
|
|
|
|
teamName := "teamName"
|
|
channelName := "channelName"
|
|
channelDisplayName := "channelDisplayName"
|
|
argsTeamChannel := teamName + ":" + channelName + ":" + channelDisplayName
|
|
args := []string{argsTeamChannel}
|
|
|
|
cmd.Flags().String("team", teamName, "Team Name")
|
|
cmd.Flags().String("name", channelName, "Channel Name")
|
|
cmd.Flags().String("display-name", channelDisplayName, "Channel Display Name")
|
|
|
|
foundTeam := &model.Team{
|
|
Id: "teamId",
|
|
Name: teamName,
|
|
DisplayName: "teamDisplayName",
|
|
}
|
|
|
|
foundChannel := &model.Channel{
|
|
TeamId: "teamId",
|
|
Name: channelName,
|
|
DisplayName: channelDisplayName,
|
|
Type: model.ChannelTypeOpen,
|
|
}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamName, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeamByName(context.TODO(), teamName, "").
|
|
Return(foundTeam, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
CreateChannel(context.TODO(), foundChannel).
|
|
Return(foundChannel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := createChannelCmdF(s.client, cmd, args)
|
|
s.Require().Nil(err)
|
|
s.Require().Len(printer.GetLines(), 1)
|
|
s.Require().Equal(printer.GetLines()[0], foundChannel)
|
|
})
|
|
|
|
s.Run("should create private channel", func() {
|
|
printer.Clean()
|
|
|
|
cmd := &cobra.Command{}
|
|
|
|
teamName := "teamName"
|
|
channelName := "channelName"
|
|
channelDisplayName := "channelDisplayName"
|
|
argsTeamChannel := teamName + ":" + channelName + ":" + channelDisplayName
|
|
args := []string{argsTeamChannel}
|
|
|
|
cmd.Flags().String("team", teamName, "Team Name")
|
|
cmd.Flags().String("name", channelName, "Channel Name")
|
|
cmd.Flags().String("display-name", channelDisplayName, "Channel Display Name")
|
|
cmd.Flags().Bool("private", true, "Create a private channel")
|
|
|
|
foundTeam := &model.Team{
|
|
Id: "teamId",
|
|
Name: teamName,
|
|
DisplayName: "teamDisplayName",
|
|
}
|
|
|
|
foundChannel := &model.Channel{
|
|
TeamId: "teamId",
|
|
Name: channelName,
|
|
DisplayName: channelDisplayName,
|
|
Type: model.ChannelTypePrivate,
|
|
}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamName, "").
|
|
Return(foundTeam, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
CreateChannel(context.TODO(), foundChannel).
|
|
Return(foundChannel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := createChannelCmdF(s.client, cmd, args)
|
|
s.Require().Nil(err)
|
|
s.Require().Len(printer.GetLines(), 1)
|
|
s.Require().Equal(printer.GetLines()[0], foundChannel)
|
|
})
|
|
|
|
s.Run("should create channel with header and purpose", func() {
|
|
printer.Clean()
|
|
|
|
cmd := &cobra.Command{}
|
|
|
|
teamName := "teamName"
|
|
channelName := "channelName"
|
|
channelDisplayName := "channelDisplayName"
|
|
header := "someHeader"
|
|
purpose := "somePurpose"
|
|
argsTeamChannel := teamName + ":" + channelName + ":" + channelDisplayName
|
|
args := []string{argsTeamChannel}
|
|
|
|
cmd.Flags().String("team", teamName, "Team Name")
|
|
cmd.Flags().String("name", channelName, "Channel Name")
|
|
cmd.Flags().String("display-name", channelDisplayName, "Channel Display Name")
|
|
cmd.Flags().String("header", header, "Channel header")
|
|
cmd.Flags().String("purpose", purpose, "Channel purpose")
|
|
cmd.Flags().Bool("private", true, "Create a private channel")
|
|
|
|
foundTeam := &model.Team{
|
|
Id: "teamId",
|
|
Name: teamName,
|
|
DisplayName: "teamDisplayName",
|
|
}
|
|
|
|
foundChannel := &model.Channel{
|
|
TeamId: "teamId",
|
|
Name: channelName,
|
|
DisplayName: channelDisplayName,
|
|
Header: header,
|
|
Purpose: purpose,
|
|
Type: model.ChannelTypePrivate,
|
|
}
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamName, "").
|
|
Return(foundTeam, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
CreateChannel(context.TODO(), foundChannel).
|
|
Return(foundChannel, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
err := createChannelCmdF(s.client, cmd, args)
|
|
s.Require().Nil(err)
|
|
s.Require().Len(printer.GetLines(), 1)
|
|
s.Require().Equal(printer.GetLines()[0], foundChannel)
|
|
})
|
|
}
|
|
|
|
func (s *MmctlUnitTestSuite) TestDeleteChannelsCmd() {
|
|
teamName := "team1"
|
|
teamID := "teamId"
|
|
mockTeam := model.Team{
|
|
Name: teamName,
|
|
Id: teamID,
|
|
}
|
|
|
|
channelName := "channel1"
|
|
channelID := "channel1Id"
|
|
mockChannel := model.Channel{
|
|
Name: channelName,
|
|
Id: channelID,
|
|
}
|
|
|
|
s.Run("Delete channels without confirm flag returns an error", func() {
|
|
cmd := &cobra.Command{}
|
|
cmd.Flags().Bool("confirm", false, "")
|
|
err := deleteChannelsCmdF(s.client, cmd, []string{"some"})
|
|
s.Require().NotNil(err)
|
|
s.Require().Equal("could not proceed, either enable --confirm flag or use an interactive shell to complete operation: this is not an interactive shell", err.Error())
|
|
})
|
|
|
|
s.Run("Delete channel that does not exist in db returns an error", func() {
|
|
printer.Clean()
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamID, "").
|
|
Return(&mockTeam, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelByNameIncludeDeleted(context.TODO(), channelName, teamID, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannel(context.TODO(), channelName, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
cmd := &cobra.Command{}
|
|
cmd.Flags().Bool("confirm", true, "")
|
|
|
|
arg := teamID + ":" + channelName
|
|
err := deleteChannelsCmdF(s.client, cmd, []string{arg})
|
|
var expected error
|
|
expected = multierror.Append(expected, errors.New("unable to find channel '"+arg+"'"))
|
|
s.Require().EqualError(err, expected.Error())
|
|
})
|
|
|
|
s.Run("Delete channel from team that does not exist in db returns an error", func() {
|
|
printer.Clean()
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamName, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeamByName(context.TODO(), teamName, "").
|
|
Return(nil, &model.Response{}, nil).
|
|
Times(1)
|
|
|
|
cmd := &cobra.Command{}
|
|
cmd.Flags().Bool("confirm", true, "")
|
|
|
|
arg := teamName + ":" + channelName
|
|
err := deleteChannelsCmdF(s.client, cmd, []string{arg})
|
|
|
|
var expected error
|
|
expected = multierror.Append(expected, errors.New("unable to find channel '"+arg+"'"))
|
|
s.Require().EqualError(err, expected.Error())
|
|
})
|
|
|
|
s.Run("Delete channel should delete channel", func() {
|
|
printer.Clean()
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamID, "").
|
|
Return(&mockTeam, nil, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelByNameIncludeDeleted(context.TODO(), channelName, teamID, "").
|
|
Return(&mockChannel, nil, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
PermanentDeleteChannel(context.TODO(), channelID).
|
|
Return(&model.Response{StatusCode: http.StatusOK}, nil).
|
|
Times(1)
|
|
|
|
cmd := &cobra.Command{}
|
|
cmd.Flags().Bool("confirm", true, "")
|
|
|
|
arg := teamID + ":" + channelName
|
|
err := deleteChannelsCmdF(s.client, cmd, []string{arg})
|
|
s.Require().Nil(err)
|
|
s.Require().Equal(&mockChannel, printer.GetLines()[0])
|
|
})
|
|
|
|
s.Run("Delete two channels, first one does not exist", func() {
|
|
printer.Clean()
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetTeam(context.TODO(), teamID, "").
|
|
Return(&mockTeam, nil, nil).
|
|
Times(2)
|
|
|
|
channelNameDoesNotExist := "this channel does not exist"
|
|
mockError := errors.New("channel does not exist error")
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelByNameIncludeDeleted(context.TODO(), channelNameDoesNotExist, teamID, "").
|
|
Return(nil, &model.Response{}, mockError).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannel(context.TODO(), channelNameDoesNotExist, "").
|
|
Return(nil, &model.Response{}, mockError).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
GetChannelByNameIncludeDeleted(context.TODO(), channelName, teamID, "").
|
|
Return(&mockChannel, nil, nil).
|
|
Times(1)
|
|
|
|
s.client.
|
|
EXPECT().
|
|
PermanentDeleteChannel(context.TODO(), channelID).
|
|
Return(&model.Response{StatusCode: http.StatusOK}, nil).
|
|
Times(1)
|
|
|
|
cmd := &cobra.Command{}
|
|
cmd.Flags().Bool("confirm", true, "")
|
|
|
|
arg1 := teamID + ":" + channelNameDoesNotExist
|
|
arg2 := teamID + ":" + channelName
|
|
err := deleteChannelsCmdF(s.client, cmd, []string{arg1, arg2})
|
|
|
|
var expected error
|
|
expected = multierror.Append(expected, fmt.Errorf("unable to find channel '%s'", arg1))
|
|
s.Require().EqualError(err, expected.Error())
|
|
s.Require().Equal(&mockChannel, printer.GetLines()[0])
|
|
})
|
|
}
|