github.com/masterhung0112/hk_server/v5@v5.0.0-20220302090640-ec71aef15e1c/api4/channel_test.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package api4
     5  
     6  import (
     7  	"context"
     8  	"fmt"
     9  	"net/http"
    10  	"os"
    11  	"sort"
    12  	"strings"
    13  	"sync"
    14  	"testing"
    15  	"time"
    16  
    17  	"github.com/stretchr/testify/assert"
    18  	"github.com/stretchr/testify/require"
    19  
    20  	"github.com/masterhung0112/hk_server/v5/app"
    21  	"github.com/masterhung0112/hk_server/v5/model"
    22  	"github.com/masterhung0112/hk_server/v5/plugin/plugintest/mock"
    23  	"github.com/masterhung0112/hk_server/v5/store/storetest/mocks"
    24  	"github.com/masterhung0112/hk_server/v5/utils"
    25  )
    26  
    27  func TestCreateChannel(t *testing.T) {
    28  	th := Setup(t).InitBasic()
    29  	defer th.TearDown()
    30  	Client := th.Client
    31  	team := th.BasicTeam
    32  
    33  	channel := &model.Channel{DisplayName: "Test API Name", Name: GenerateTestChannelName(), Type: model.CHANNEL_OPEN, TeamId: team.Id}
    34  	private := &model.Channel{DisplayName: "Test API Name", Name: GenerateTestChannelName(), Type: model.CHANNEL_PRIVATE, TeamId: team.Id}
    35  
    36  	rchannel, resp := Client.CreateChannel(channel)
    37  	CheckNoError(t, resp)
    38  	CheckCreatedStatus(t, resp)
    39  
    40  	require.Equal(t, channel.Name, rchannel.Name, "names did not match")
    41  	require.Equal(t, channel.DisplayName, rchannel.DisplayName, "display names did not match")
    42  	require.Equal(t, channel.TeamId, rchannel.TeamId, "team ids did not match")
    43  
    44  	rprivate, resp := Client.CreateChannel(private)
    45  	CheckNoError(t, resp)
    46  
    47  	require.Equal(t, private.Name, rprivate.Name, "names did not match")
    48  	require.Equal(t, model.CHANNEL_PRIVATE, rprivate.Type, "wrong channel type")
    49  	require.Equal(t, th.BasicUser.Id, rprivate.CreatorId, "wrong creator id")
    50  
    51  	_, resp = Client.CreateChannel(channel)
    52  	CheckErrorMessage(t, resp, "store.sql_channel.save_channel.exists.app_error")
    53  	CheckBadRequestStatus(t, resp)
    54  
    55  	direct := &model.Channel{DisplayName: "Test API Name", Name: GenerateTestChannelName(), Type: model.CHANNEL_DIRECT, TeamId: team.Id}
    56  	_, resp = Client.CreateChannel(direct)
    57  	CheckErrorMessage(t, resp, "api.channel.create_channel.direct_channel.app_error")
    58  	CheckBadRequestStatus(t, resp)
    59  
    60  	Client.Logout()
    61  	_, resp = Client.CreateChannel(channel)
    62  	CheckUnauthorizedStatus(t, resp)
    63  
    64  	userNotOnTeam := th.CreateUser()
    65  	Client.Login(userNotOnTeam.Email, userNotOnTeam.Password)
    66  
    67  	_, resp = Client.CreateChannel(channel)
    68  	CheckForbiddenStatus(t, resp)
    69  
    70  	_, resp = Client.CreateChannel(private)
    71  	CheckForbiddenStatus(t, resp)
    72  
    73  	// Check the appropriate permissions are enforced.
    74  	defaultRolePermissions := th.SaveDefaultRolePermissions()
    75  	defer func() {
    76  		th.RestoreDefaultRolePermissions(defaultRolePermissions)
    77  	}()
    78  
    79  	th.AddPermissionToRole(model.PERMISSION_CREATE_PUBLIC_CHANNEL.Id, model.TEAM_USER_ROLE_ID)
    80  	th.AddPermissionToRole(model.PERMISSION_CREATE_PRIVATE_CHANNEL.Id, model.TEAM_USER_ROLE_ID)
    81  
    82  	th.LoginBasic()
    83  
    84  	channel.Name = GenerateTestChannelName()
    85  	_, resp = Client.CreateChannel(channel)
    86  	CheckNoError(t, resp)
    87  
    88  	private.Name = GenerateTestChannelName()
    89  	_, resp = Client.CreateChannel(private)
    90  	CheckNoError(t, resp)
    91  
    92  	th.AddPermissionToRole(model.PERMISSION_CREATE_PUBLIC_CHANNEL.Id, model.TEAM_ADMIN_ROLE_ID)
    93  	th.AddPermissionToRole(model.PERMISSION_CREATE_PRIVATE_CHANNEL.Id, model.TEAM_ADMIN_ROLE_ID)
    94  	th.RemovePermissionFromRole(model.PERMISSION_CREATE_PUBLIC_CHANNEL.Id, model.TEAM_USER_ROLE_ID)
    95  	th.RemovePermissionFromRole(model.PERMISSION_CREATE_PRIVATE_CHANNEL.Id, model.TEAM_USER_ROLE_ID)
    96  
    97  	_, resp = Client.CreateChannel(channel)
    98  	CheckForbiddenStatus(t, resp)
    99  
   100  	_, resp = Client.CreateChannel(private)
   101  	CheckForbiddenStatus(t, resp)
   102  
   103  	th.LoginTeamAdmin()
   104  
   105  	channel.Name = GenerateTestChannelName()
   106  	_, resp = Client.CreateChannel(channel)
   107  	CheckNoError(t, resp)
   108  
   109  	private.Name = GenerateTestChannelName()
   110  	_, resp = Client.CreateChannel(private)
   111  	CheckNoError(t, resp)
   112  
   113  	th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) {
   114  		channel.Name = GenerateTestChannelName()
   115  		_, resp = client.CreateChannel(channel)
   116  		CheckNoError(t, resp)
   117  
   118  		private.Name = GenerateTestChannelName()
   119  		_, resp = client.CreateChannel(private)
   120  		CheckNoError(t, resp)
   121  	})
   122  
   123  	// Test posting Garbage
   124  	r, err := Client.DoApiPost("/channels", "garbage")
   125  	require.NotNil(t, err, "expected error")
   126  	require.Equal(t, http.StatusBadRequest, r.StatusCode, "Expected 400 Bad Request")
   127  
   128  	// Test GroupConstrained flag
   129  	groupConstrainedChannel := &model.Channel{DisplayName: "Test API Name", Name: GenerateTestChannelName(), Type: model.CHANNEL_OPEN, TeamId: team.Id, GroupConstrained: model.NewBool(true)}
   130  	rchannel, resp = Client.CreateChannel(groupConstrainedChannel)
   131  	CheckNoError(t, resp)
   132  
   133  	require.Equal(t, *groupConstrainedChannel.GroupConstrained, *rchannel.GroupConstrained, "GroupConstrained flags do not match")
   134  }
   135  
   136  func TestUpdateChannel(t *testing.T) {
   137  	th := Setup(t).InitBasic()
   138  	defer th.TearDown()
   139  	Client := th.Client
   140  	team := th.BasicTeam
   141  
   142  	channel := &model.Channel{DisplayName: "Test API Name", Name: GenerateTestChannelName(), Type: model.CHANNEL_OPEN, TeamId: team.Id}
   143  	private := &model.Channel{DisplayName: "Test API Name", Name: GenerateTestChannelName(), Type: model.CHANNEL_PRIVATE, TeamId: team.Id}
   144  
   145  	channel, _ = Client.CreateChannel(channel)
   146  	private, _ = Client.CreateChannel(private)
   147  
   148  	//Update a open channel
   149  	channel.DisplayName = "My new display name"
   150  	channel.Header = "My fancy header"
   151  	channel.Purpose = "Mattermost ftw!"
   152  
   153  	newChannel, resp := Client.UpdateChannel(channel)
   154  	CheckNoError(t, resp)
   155  
   156  	require.Equal(t, channel.DisplayName, newChannel.DisplayName, "Update failed for DisplayName")
   157  	require.Equal(t, channel.Header, newChannel.Header, "Update failed for Header")
   158  	require.Equal(t, channel.Purpose, newChannel.Purpose, "Update failed for Purpose")
   159  
   160  	// Test GroupConstrained flag
   161  	channel.GroupConstrained = model.NewBool(true)
   162  	rchannel, resp := Client.UpdateChannel(channel)
   163  	CheckNoError(t, resp)
   164  	CheckOKStatus(t, resp)
   165  
   166  	require.Equal(t, *channel.GroupConstrained, *rchannel.GroupConstrained, "GroupConstrained flags do not match")
   167  
   168  	//Update a private channel
   169  	private.DisplayName = "My new display name for private channel"
   170  	private.Header = "My fancy private header"
   171  	private.Purpose = "Mattermost ftw! in private mode"
   172  
   173  	newPrivateChannel, resp := Client.UpdateChannel(private)
   174  	CheckNoError(t, resp)
   175  
   176  	require.Equal(t, private.DisplayName, newPrivateChannel.DisplayName, "Update failed for DisplayName in private channel")
   177  	require.Equal(t, private.Header, newPrivateChannel.Header, "Update failed for Header in private channel")
   178  	require.Equal(t, private.Purpose, newPrivateChannel.Purpose, "Update failed for Purpose in private channel")
   179  
   180  	// Test that changing the type fails and returns error
   181  
   182  	private.Type = model.CHANNEL_OPEN
   183  	newPrivateChannel, resp = Client.UpdateChannel(private)
   184  	CheckBadRequestStatus(t, resp)
   185  
   186  	// Test that keeping the same type succeeds
   187  
   188  	private.Type = model.CHANNEL_PRIVATE
   189  	newPrivateChannel, resp = Client.UpdateChannel(private)
   190  	CheckNoError(t, resp)
   191  
   192  	//Non existing channel
   193  	channel1 := &model.Channel{DisplayName: "Test API Name for apiv4", Name: GenerateTestChannelName(), Type: model.CHANNEL_OPEN, TeamId: team.Id}
   194  	_, resp = Client.UpdateChannel(channel1)
   195  	CheckNotFoundStatus(t, resp)
   196  
   197  	//Try to update with not logged user
   198  	Client.Logout()
   199  	_, resp = Client.UpdateChannel(channel)
   200  	CheckUnauthorizedStatus(t, resp)
   201  
   202  	//Try to update using another user
   203  	user := th.CreateUser()
   204  	Client.Login(user.Email, user.Password)
   205  
   206  	channel.DisplayName = "Should not update"
   207  	_, resp = Client.UpdateChannel(channel)
   208  	CheckForbiddenStatus(t, resp)
   209  
   210  	// Test updating the header of someone else's GM channel.
   211  	user1 := th.CreateUser()
   212  	user2 := th.CreateUser()
   213  	user3 := th.CreateUser()
   214  
   215  	groupChannel, resp := Client.CreateGroupChannel([]string{user1.Id, user2.Id})
   216  	CheckNoError(t, resp)
   217  
   218  	groupChannel.Header = "lolololol"
   219  	Client.Logout()
   220  	Client.Login(user3.Email, user3.Password)
   221  	_, resp = Client.UpdateChannel(groupChannel)
   222  	CheckForbiddenStatus(t, resp)
   223  
   224  	// Test updating the header of someone else's GM channel.
   225  	Client.Logout()
   226  	Client.Login(user.Email, user.Password)
   227  
   228  	directChannel, resp := Client.CreateDirectChannel(user.Id, user1.Id)
   229  	CheckNoError(t, resp)
   230  
   231  	directChannel.Header = "lolololol"
   232  	Client.Logout()
   233  	Client.Login(user3.Email, user3.Password)
   234  	_, resp = Client.UpdateChannel(directChannel)
   235  	CheckForbiddenStatus(t, resp)
   236  }
   237  
   238  func TestPatchChannel(t *testing.T) {
   239  	th := Setup(t).InitBasic()
   240  	defer th.TearDown()
   241  	Client := th.Client
   242  
   243  	patch := &model.ChannelPatch{
   244  		Name:        new(string),
   245  		DisplayName: new(string),
   246  		Header:      new(string),
   247  		Purpose:     new(string),
   248  	}
   249  	*patch.Name = model.NewId()
   250  	*patch.DisplayName = model.NewId()
   251  	*patch.Header = model.NewId()
   252  	*patch.Purpose = model.NewId()
   253  
   254  	channel, resp := Client.PatchChannel(th.BasicChannel.Id, patch)
   255  	CheckNoError(t, resp)
   256  
   257  	require.Equal(t, *patch.Name, channel.Name, "do not match")
   258  	require.Equal(t, *patch.DisplayName, channel.DisplayName, "do not match")
   259  	require.Equal(t, *patch.Header, channel.Header, "do not match")
   260  	require.Equal(t, *patch.Purpose, channel.Purpose, "do not match")
   261  
   262  	patch.Name = nil
   263  	oldName := channel.Name
   264  	channel, resp = Client.PatchChannel(th.BasicChannel.Id, patch)
   265  	CheckNoError(t, resp)
   266  
   267  	require.Equal(t, oldName, channel.Name, "should not have updated")
   268  
   269  	// Test GroupConstrained flag
   270  	patch.GroupConstrained = model.NewBool(true)
   271  	rchannel, resp := Client.PatchChannel(th.BasicChannel.Id, patch)
   272  	CheckNoError(t, resp)
   273  	CheckOKStatus(t, resp)
   274  
   275  	require.Equal(t, *rchannel.GroupConstrained, *patch.GroupConstrained, "GroupConstrained flags do not match")
   276  	patch.GroupConstrained = nil
   277  
   278  	_, resp = Client.PatchChannel("junk", patch)
   279  	CheckBadRequestStatus(t, resp)
   280  
   281  	_, resp = Client.PatchChannel(model.NewId(), patch)
   282  	CheckNotFoundStatus(t, resp)
   283  
   284  	user := th.CreateUser()
   285  	Client.Login(user.Email, user.Password)
   286  	_, resp = Client.PatchChannel(th.BasicChannel.Id, patch)
   287  	CheckForbiddenStatus(t, resp)
   288  
   289  	th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) {
   290  		_, resp = client.PatchChannel(th.BasicChannel.Id, patch)
   291  		CheckNoError(t, resp)
   292  
   293  		_, resp = client.PatchChannel(th.BasicPrivateChannel.Id, patch)
   294  		CheckNoError(t, resp)
   295  	})
   296  
   297  	// Test updating the header of someone else's GM channel.
   298  	user1 := th.CreateUser()
   299  	user2 := th.CreateUser()
   300  	user3 := th.CreateUser()
   301  
   302  	groupChannel, resp := Client.CreateGroupChannel([]string{user1.Id, user2.Id})
   303  	CheckNoError(t, resp)
   304  
   305  	Client.Logout()
   306  	Client.Login(user3.Email, user3.Password)
   307  
   308  	channelPatch := &model.ChannelPatch{}
   309  	channelPatch.Header = new(string)
   310  	*channelPatch.Header = "lolololol"
   311  
   312  	_, resp = Client.PatchChannel(groupChannel.Id, channelPatch)
   313  	CheckForbiddenStatus(t, resp)
   314  
   315  	// Test updating the header of someone else's GM channel.
   316  	Client.Logout()
   317  	Client.Login(user.Email, user.Password)
   318  
   319  	directChannel, resp := Client.CreateDirectChannel(user.Id, user1.Id)
   320  	CheckNoError(t, resp)
   321  
   322  	Client.Logout()
   323  	Client.Login(user3.Email, user3.Password)
   324  	_, resp = Client.PatchChannel(directChannel.Id, channelPatch)
   325  	CheckForbiddenStatus(t, resp)
   326  }
   327  
   328  func TestChannelUnicodeNames(t *testing.T) {
   329  	th := Setup(t).InitBasic()
   330  	defer th.TearDown()
   331  	Client := th.Client
   332  	team := th.BasicTeam
   333  
   334  	t.Run("create channel unicode", func(t *testing.T) {
   335  		channel := &model.Channel{
   336  			Name:        "\u206cenglish\u206dchannel",
   337  			DisplayName: "The \u206cEnglish\u206d Channel",
   338  			Type:        model.CHANNEL_OPEN,
   339  			TeamId:      team.Id}
   340  
   341  		rchannel, resp := Client.CreateChannel(channel)
   342  		CheckNoError(t, resp)
   343  		CheckCreatedStatus(t, resp)
   344  
   345  		require.Equal(t, "englishchannel", rchannel.Name, "bad unicode should be filtered from name")
   346  		require.Equal(t, "The English Channel", rchannel.DisplayName, "bad unicode should be filtered from display name")
   347  	})
   348  
   349  	t.Run("update channel unicode", func(t *testing.T) {
   350  		channel := &model.Channel{
   351  			DisplayName: "Test API Name",
   352  			Name:        GenerateTestChannelName(),
   353  			Type:        model.CHANNEL_OPEN,
   354  			TeamId:      team.Id,
   355  		}
   356  		channel, _ = Client.CreateChannel(channel)
   357  
   358  		channel.Name = "\u206ahistorychannel"
   359  		channel.DisplayName = "UFO's and \ufff9stuff\ufffb."
   360  
   361  		newChannel, resp := Client.UpdateChannel(channel)
   362  		CheckNoError(t, resp)
   363  
   364  		require.Equal(t, "historychannel", newChannel.Name, "bad unicode should be filtered from name")
   365  		require.Equal(t, "UFO's and stuff.", newChannel.DisplayName, "bad unicode should be filtered from display name")
   366  	})
   367  
   368  	t.Run("patch channel unicode", func(t *testing.T) {
   369  		patch := &model.ChannelPatch{
   370  			Name:        new(string),
   371  			DisplayName: new(string),
   372  			Header:      new(string),
   373  			Purpose:     new(string),
   374  		}
   375  		*patch.Name = "\u206ecommunitychannel\u206f"
   376  		*patch.DisplayName = "Natalie Tran's \ufffcAwesome Channel"
   377  
   378  		channel, resp := Client.PatchChannel(th.BasicChannel.Id, patch)
   379  		CheckNoError(t, resp)
   380  
   381  		require.Equal(t, "communitychannel", channel.Name, "bad unicode should be filtered from name")
   382  		require.Equal(t, "Natalie Tran's Awesome Channel", channel.DisplayName, "bad unicode should be filtered from display name")
   383  	})
   384  }
   385  
   386  func TestCreateDirectChannel(t *testing.T) {
   387  	th := Setup(t).InitBasic()
   388  	defer th.TearDown()
   389  	Client := th.Client
   390  	user1 := th.BasicUser
   391  	user2 := th.BasicUser2
   392  	user3 := th.CreateUser()
   393  
   394  	dm, resp := Client.CreateDirectChannel(user1.Id, user2.Id)
   395  	CheckNoError(t, resp)
   396  
   397  	channelName := ""
   398  	if user2.Id > user1.Id {
   399  		channelName = user1.Id + "__" + user2.Id
   400  	} else {
   401  		channelName = user2.Id + "__" + user1.Id
   402  	}
   403  
   404  	require.Equal(t, channelName, dm.Name, "dm name didn't match")
   405  
   406  	_, resp = Client.CreateDirectChannel("junk", user2.Id)
   407  	CheckBadRequestStatus(t, resp)
   408  
   409  	_, resp = Client.CreateDirectChannel(user1.Id, model.NewId())
   410  	CheckBadRequestStatus(t, resp)
   411  
   412  	_, resp = Client.CreateDirectChannel(model.NewId(), user1.Id)
   413  	CheckBadRequestStatus(t, resp)
   414  
   415  	_, resp = Client.CreateDirectChannel(model.NewId(), user2.Id)
   416  	CheckForbiddenStatus(t, resp)
   417  
   418  	r, err := Client.DoApiPost("/channels/direct", "garbage")
   419  	require.NotNil(t, err)
   420  	require.Equal(t, http.StatusBadRequest, r.StatusCode)
   421  
   422  	_, resp = th.SystemAdminClient.CreateDirectChannel(user3.Id, user2.Id)
   423  	CheckNoError(t, resp)
   424  
   425  	// Normal client should not be allowed to create a direct channel if users are
   426  	// restricted to messaging members of their own team
   427  	th.App.UpdateConfig(func(cfg *model.Config) {
   428  		*cfg.TeamSettings.RestrictDirectMessage = model.DIRECT_MESSAGE_TEAM
   429  	})
   430  	user4 := th.CreateUser()
   431  	_, resp = th.Client.CreateDirectChannel(user1.Id, user4.Id)
   432  	CheckForbiddenStatus(t, resp)
   433  	th.LinkUserToTeam(user4, th.BasicTeam)
   434  	_, resp = th.Client.CreateDirectChannel(user1.Id, user4.Id)
   435  	CheckNoError(t, resp)
   436  
   437  	Client.Logout()
   438  	_, resp = Client.CreateDirectChannel(model.NewId(), user2.Id)
   439  	CheckUnauthorizedStatus(t, resp)
   440  }
   441  
   442  func TestCreateDirectChannelAsGuest(t *testing.T) {
   443  	th := Setup(t).InitBasic()
   444  	defer th.TearDown()
   445  	Client := th.Client
   446  	user1 := th.BasicUser
   447  
   448  	enableGuestAccounts := *th.App.Config().GuestAccountsSettings.Enable
   449  	defer func() {
   450  		th.App.UpdateConfig(func(cfg *model.Config) { *cfg.GuestAccountsSettings.Enable = enableGuestAccounts })
   451  		th.App.Srv().RemoveLicense()
   452  	}()
   453  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.GuestAccountsSettings.Enable = true })
   454  	th.App.Srv().SetLicense(model.NewTestLicense())
   455  
   456  	id := model.NewId()
   457  	guest := &model.User{
   458  		Email:         "success+" + id + "@simulator.amazonses.com",
   459  		Username:      "un_" + id,
   460  		Nickname:      "nn_" + id,
   461  		Password:      "Password1",
   462  		EmailVerified: true,
   463  	}
   464  	guest, err := th.App.CreateGuest(th.Context, guest)
   465  	require.Nil(t, err)
   466  
   467  	_, resp := Client.Login(guest.Username, "Password1")
   468  	CheckNoError(t, resp)
   469  
   470  	t.Run("Try to created DM with not visible user", func(t *testing.T) {
   471  		_, resp := Client.CreateDirectChannel(guest.Id, user1.Id)
   472  		CheckForbiddenStatus(t, resp)
   473  
   474  		_, resp = Client.CreateDirectChannel(user1.Id, guest.Id)
   475  		CheckForbiddenStatus(t, resp)
   476  	})
   477  
   478  	t.Run("Creating DM with visible user", func(t *testing.T) {
   479  		th.LinkUserToTeam(guest, th.BasicTeam)
   480  		th.AddUserToChannel(guest, th.BasicChannel)
   481  
   482  		_, resp := Client.CreateDirectChannel(guest.Id, user1.Id)
   483  		CheckNoError(t, resp)
   484  	})
   485  }
   486  
   487  func TestDeleteDirectChannel(t *testing.T) {
   488  	th := Setup(t).InitBasic()
   489  	defer th.TearDown()
   490  	Client := th.Client
   491  	user := th.BasicUser
   492  	user2 := th.BasicUser2
   493  
   494  	rgc, resp := Client.CreateDirectChannel(user.Id, user2.Id)
   495  	CheckNoError(t, resp)
   496  	CheckCreatedStatus(t, resp)
   497  	require.NotNil(t, rgc, "should have created a direct channel")
   498  
   499  	deleted, resp := Client.DeleteChannel(rgc.Id)
   500  	CheckErrorMessage(t, resp, "api.channel.delete_channel.type.invalid")
   501  	require.False(t, deleted, "should not have been able to delete direct channel.")
   502  }
   503  
   504  func TestCreateGroupChannel(t *testing.T) {
   505  	th := Setup(t).InitBasic()
   506  	defer th.TearDown()
   507  	Client := th.Client
   508  	user := th.BasicUser
   509  	user2 := th.BasicUser2
   510  	user3 := th.CreateUser()
   511  
   512  	userIds := []string{user.Id, user2.Id, user3.Id}
   513  
   514  	rgc, resp := Client.CreateGroupChannel(userIds)
   515  	CheckNoError(t, resp)
   516  	CheckCreatedStatus(t, resp)
   517  
   518  	require.NotNil(t, rgc, "should have created a group channel")
   519  	require.Equal(t, model.CHANNEL_GROUP, rgc.Type, "should have created a channel of group type")
   520  
   521  	m, _ := th.App.GetChannelMembersPage(rgc.Id, 0, 10)
   522  	require.Len(t, *m, 3, "should have 3 channel members")
   523  
   524  	// saving duplicate group channel
   525  	rgc2, resp := Client.CreateGroupChannel([]string{user3.Id, user2.Id})
   526  	CheckNoError(t, resp)
   527  	require.Equal(t, rgc.Id, rgc2.Id, "should have returned existing channel")
   528  
   529  	m2, _ := th.App.GetChannelMembersPage(rgc2.Id, 0, 10)
   530  	require.Equal(t, m, m2)
   531  
   532  	_, resp = Client.CreateGroupChannel([]string{user2.Id})
   533  	CheckBadRequestStatus(t, resp)
   534  
   535  	user4 := th.CreateUser()
   536  	user5 := th.CreateUser()
   537  	user6 := th.CreateUser()
   538  	user7 := th.CreateUser()
   539  	user8 := th.CreateUser()
   540  	user9 := th.CreateUser()
   541  
   542  	rgc, resp = Client.CreateGroupChannel([]string{user.Id, user2.Id, user3.Id, user4.Id, user5.Id, user6.Id, user7.Id, user8.Id, user9.Id})
   543  	CheckBadRequestStatus(t, resp)
   544  	require.Nil(t, rgc)
   545  
   546  	_, resp = Client.CreateGroupChannel([]string{user.Id, user2.Id, user3.Id, GenerateTestId()})
   547  	CheckBadRequestStatus(t, resp)
   548  
   549  	_, resp = Client.CreateGroupChannel([]string{user.Id, user2.Id, user3.Id, "junk"})
   550  	CheckBadRequestStatus(t, resp)
   551  
   552  	Client.Logout()
   553  
   554  	_, resp = Client.CreateGroupChannel(userIds)
   555  	CheckUnauthorizedStatus(t, resp)
   556  
   557  	_, resp = th.SystemAdminClient.CreateGroupChannel(userIds)
   558  	CheckNoError(t, resp)
   559  }
   560  
   561  func TestCreateGroupChannelAsGuest(t *testing.T) {
   562  	th := Setup(t).InitBasic()
   563  	defer th.TearDown()
   564  	Client := th.Client
   565  	user1 := th.BasicUser
   566  	user2 := th.BasicUser2
   567  	user3 := th.CreateUser()
   568  	user4 := th.CreateUser()
   569  	user5 := th.CreateUser()
   570  	th.LinkUserToTeam(user2, th.BasicTeam)
   571  	th.AddUserToChannel(user2, th.BasicChannel)
   572  	th.LinkUserToTeam(user3, th.BasicTeam)
   573  	th.AddUserToChannel(user3, th.BasicChannel)
   574  
   575  	enableGuestAccounts := *th.App.Config().GuestAccountsSettings.Enable
   576  	defer func() {
   577  		th.App.UpdateConfig(func(cfg *model.Config) { *cfg.GuestAccountsSettings.Enable = enableGuestAccounts })
   578  		th.App.Srv().RemoveLicense()
   579  	}()
   580  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.GuestAccountsSettings.Enable = true })
   581  	th.App.Srv().SetLicense(model.NewTestLicense())
   582  
   583  	id := model.NewId()
   584  	guest := &model.User{
   585  		Email:         "success+" + id + "@simulator.amazonses.com",
   586  		Username:      "un_" + id,
   587  		Nickname:      "nn_" + id,
   588  		Password:      "Password1",
   589  		EmailVerified: true,
   590  	}
   591  	guest, err := th.App.CreateGuest(th.Context, guest)
   592  	require.Nil(t, err)
   593  
   594  	_, resp := Client.Login(guest.Username, "Password1")
   595  	CheckNoError(t, resp)
   596  
   597  	t.Run("Try to created GM with not visible users", func(t *testing.T) {
   598  		_, resp := Client.CreateGroupChannel([]string{guest.Id, user1.Id, user2.Id, user3.Id})
   599  		CheckForbiddenStatus(t, resp)
   600  
   601  		_, resp = Client.CreateGroupChannel([]string{user1.Id, user2.Id, guest.Id, user3.Id})
   602  		CheckForbiddenStatus(t, resp)
   603  	})
   604  
   605  	t.Run("Try to created GM with visible and not visible users", func(t *testing.T) {
   606  		th.LinkUserToTeam(guest, th.BasicTeam)
   607  		th.AddUserToChannel(guest, th.BasicChannel)
   608  
   609  		_, resp := Client.CreateGroupChannel([]string{guest.Id, user1.Id, user3.Id, user4.Id, user5.Id})
   610  		CheckForbiddenStatus(t, resp)
   611  
   612  		_, resp = Client.CreateGroupChannel([]string{user1.Id, user2.Id, guest.Id, user4.Id, user5.Id})
   613  		CheckForbiddenStatus(t, resp)
   614  	})
   615  
   616  	t.Run("Creating GM with visible users", func(t *testing.T) {
   617  		_, resp := Client.CreateGroupChannel([]string{guest.Id, user1.Id, user2.Id, user3.Id})
   618  		CheckNoError(t, resp)
   619  	})
   620  }
   621  
   622  func TestDeleteGroupChannel(t *testing.T) {
   623  	th := Setup(t).InitBasic()
   624  	defer th.TearDown()
   625  	user := th.BasicUser
   626  	user2 := th.BasicUser2
   627  	user3 := th.CreateUser()
   628  
   629  	userIds := []string{user.Id, user2.Id, user3.Id}
   630  
   631  	th.TestForAllClients(t, func(t *testing.T, client *model.Client4) {
   632  		rgc, resp := th.Client.CreateGroupChannel(userIds)
   633  		CheckNoError(t, resp)
   634  		CheckCreatedStatus(t, resp)
   635  		require.NotNil(t, rgc, "should have created a group channel")
   636  		deleted, resp := client.DeleteChannel(rgc.Id)
   637  		CheckErrorMessage(t, resp, "api.channel.delete_channel.type.invalid")
   638  		require.False(t, deleted, "should not have been able to delete group channel.")
   639  	})
   640  
   641  }
   642  
   643  func TestGetChannel(t *testing.T) {
   644  	th := Setup(t).InitBasic()
   645  	defer th.TearDown()
   646  	Client := th.Client
   647  
   648  	channel, resp := Client.GetChannel(th.BasicChannel.Id, "")
   649  	CheckNoError(t, resp)
   650  	require.Equal(t, th.BasicChannel.Id, channel.Id, "ids did not match")
   651  
   652  	Client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser.Id)
   653  	_, resp = Client.GetChannel(th.BasicChannel.Id, "")
   654  	CheckNoError(t, resp)
   655  
   656  	channel, resp = Client.GetChannel(th.BasicPrivateChannel.Id, "")
   657  	CheckNoError(t, resp)
   658  	require.Equal(t, th.BasicPrivateChannel.Id, channel.Id, "ids did not match")
   659  
   660  	Client.RemoveUserFromChannel(th.BasicPrivateChannel.Id, th.BasicUser.Id)
   661  	_, resp = Client.GetChannel(th.BasicPrivateChannel.Id, "")
   662  	CheckForbiddenStatus(t, resp)
   663  
   664  	_, resp = Client.GetChannel(model.NewId(), "")
   665  	CheckNotFoundStatus(t, resp)
   666  
   667  	Client.Logout()
   668  	_, resp = Client.GetChannel(th.BasicChannel.Id, "")
   669  	CheckUnauthorizedStatus(t, resp)
   670  
   671  	user := th.CreateUser()
   672  	Client.Login(user.Email, user.Password)
   673  	_, resp = Client.GetChannel(th.BasicChannel.Id, "")
   674  	CheckForbiddenStatus(t, resp)
   675  
   676  	th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) {
   677  		_, resp = client.GetChannel(th.BasicChannel.Id, "")
   678  		CheckNoError(t, resp)
   679  
   680  		_, resp = client.GetChannel(th.BasicPrivateChannel.Id, "")
   681  		CheckNoError(t, resp)
   682  
   683  		_, resp = client.GetChannel(th.BasicUser.Id, "")
   684  		CheckNotFoundStatus(t, resp)
   685  	})
   686  }
   687  
   688  func TestGetDeletedChannelsForTeam(t *testing.T) {
   689  	th := Setup(t).InitBasic()
   690  	defer th.TearDown()
   691  
   692  	Client := th.Client
   693  	team := th.BasicTeam
   694  
   695  	th.LoginTeamAdmin()
   696  
   697  	channels, resp := Client.GetDeletedChannelsForTeam(team.Id, 0, 100, "")
   698  	CheckNoError(t, resp)
   699  	numInitialChannelsForTeam := len(channels)
   700  
   701  	// create and delete public channel
   702  	publicChannel1 := th.CreatePublicChannel()
   703  	Client.DeleteChannel(publicChannel1.Id)
   704  
   705  	th.TestForAllClients(t, func(t *testing.T, client *model.Client4) {
   706  		channels, resp = client.GetDeletedChannelsForTeam(team.Id, 0, 100, "")
   707  		CheckNoError(t, resp)
   708  		require.Len(t, channels, numInitialChannelsForTeam+1, "should be 1 deleted channel")
   709  	})
   710  
   711  	publicChannel2 := th.CreatePublicChannel()
   712  	Client.DeleteChannel(publicChannel2.Id)
   713  
   714  	th.TestForAllClients(t, func(t *testing.T, client *model.Client4) {
   715  		channels, resp = client.GetDeletedChannelsForTeam(team.Id, 0, 100, "")
   716  		CheckNoError(t, resp)
   717  		require.Len(t, channels, numInitialChannelsForTeam+2, "should be 2 deleted channels")
   718  	})
   719  
   720  	th.LoginBasic()
   721  
   722  	privateChannel1 := th.CreatePrivateChannel()
   723  	Client.DeleteChannel(privateChannel1.Id)
   724  
   725  	channels, resp = Client.GetDeletedChannelsForTeam(team.Id, 0, 100, "")
   726  	CheckNoError(t, resp)
   727  	require.Len(t, channels, numInitialChannelsForTeam+3)
   728  
   729  	// Login as different user and create private channel
   730  	th.LoginBasic2()
   731  	privateChannel2 := th.CreatePrivateChannel()
   732  	Client.DeleteChannel(privateChannel2.Id)
   733  
   734  	// Log back in as first user
   735  	th.LoginBasic()
   736  
   737  	channels, resp = Client.GetDeletedChannelsForTeam(team.Id, 0, 100, "")
   738  	CheckNoError(t, resp)
   739  	require.Len(t, channels, numInitialChannelsForTeam+3)
   740  
   741  	th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) {
   742  		channels, resp = client.GetDeletedChannelsForTeam(team.Id, 0, 100, "")
   743  		CheckNoError(t, resp)
   744  		require.Len(t, channels, numInitialChannelsForTeam+2)
   745  	})
   746  
   747  	channels, resp = Client.GetDeletedChannelsForTeam(team.Id, 0, 1, "")
   748  	CheckNoError(t, resp)
   749  	require.Len(t, channels, 1, "should be one channel per page")
   750  
   751  	channels, resp = Client.GetDeletedChannelsForTeam(team.Id, 1, 1, "")
   752  	CheckNoError(t, resp)
   753  	require.Len(t, channels, 1, "should be one channel per page")
   754  }
   755  
   756  func TestGetPrivateChannelsForTeam(t *testing.T) {
   757  	th := Setup(t).InitBasic()
   758  	defer th.TearDown()
   759  	team := th.BasicTeam
   760  
   761  	// normal user
   762  	_, resp := th.Client.GetPrivateChannelsForTeam(team.Id, 0, 100, "")
   763  	CheckForbiddenStatus(t, resp)
   764  
   765  	th.TestForSystemAdminAndLocal(t, func(t *testing.T, c *model.Client4) {
   766  		channels, resp := c.GetPrivateChannelsForTeam(team.Id, 0, 100, "")
   767  		CheckNoError(t, resp)
   768  		// th.BasicPrivateChannel and th.BasicPrivateChannel2
   769  		require.Len(t, channels, 2, "wrong number of private channels")
   770  		for _, c := range channels {
   771  			// check all channels included are private
   772  			require.Equal(t, model.CHANNEL_PRIVATE, c.Type, "should include private channels only")
   773  		}
   774  
   775  		channels, resp = c.GetPrivateChannelsForTeam(team.Id, 0, 1, "")
   776  		CheckNoError(t, resp)
   777  		require.Len(t, channels, 1, "should be one channel per page")
   778  
   779  		channels, resp = c.GetPrivateChannelsForTeam(team.Id, 1, 1, "")
   780  		CheckNoError(t, resp)
   781  		require.Len(t, channels, 1, "should be one channel per page")
   782  
   783  		channels, resp = c.GetPrivateChannelsForTeam(team.Id, 10000, 100, "")
   784  		CheckNoError(t, resp)
   785  		require.Empty(t, channels, "should be no channel")
   786  
   787  		_, resp = c.GetPrivateChannelsForTeam("junk", 0, 100, "")
   788  		CheckBadRequestStatus(t, resp)
   789  	})
   790  }
   791  
   792  func TestGetPublicChannelsForTeam(t *testing.T) {
   793  	th := Setup(t).InitBasic()
   794  	defer th.TearDown()
   795  	Client := th.Client
   796  	team := th.BasicTeam
   797  	publicChannel1 := th.BasicChannel
   798  	publicChannel2 := th.BasicChannel2
   799  
   800  	channels, resp := Client.GetPublicChannelsForTeam(team.Id, 0, 100, "")
   801  	CheckNoError(t, resp)
   802  	require.Len(t, channels, 4, "wrong path")
   803  
   804  	for i, c := range channels {
   805  		// check all channels included are open
   806  		require.Equal(t, model.CHANNEL_OPEN, c.Type, "should include open channel only")
   807  
   808  		// only check the created 2 public channels
   809  		require.False(t, i < 2 && !(c.DisplayName == publicChannel1.DisplayName || c.DisplayName == publicChannel2.DisplayName), "should match public channel display name")
   810  	}
   811  
   812  	privateChannel := th.CreatePrivateChannel()
   813  	channels, resp = Client.GetPublicChannelsForTeam(team.Id, 0, 100, "")
   814  	CheckNoError(t, resp)
   815  	require.Len(t, channels, 4, "incorrect length of team public channels")
   816  
   817  	for _, c := range channels {
   818  		require.Equal(t, model.CHANNEL_OPEN, c.Type, "should not include private channel")
   819  		require.NotEqual(t, privateChannel.DisplayName, c.DisplayName, "should not match private channel display name")
   820  	}
   821  
   822  	channels, resp = Client.GetPublicChannelsForTeam(team.Id, 0, 1, "")
   823  	CheckNoError(t, resp)
   824  	require.Len(t, channels, 1, "should be one channel per page")
   825  
   826  	channels, resp = Client.GetPublicChannelsForTeam(team.Id, 1, 1, "")
   827  	CheckNoError(t, resp)
   828  	require.Len(t, channels, 1, "should be one channel per page")
   829  
   830  	channels, resp = Client.GetPublicChannelsForTeam(team.Id, 10000, 100, "")
   831  	CheckNoError(t, resp)
   832  	require.Empty(t, channels, "should be no channel")
   833  
   834  	_, resp = Client.GetPublicChannelsForTeam("junk", 0, 100, "")
   835  	CheckBadRequestStatus(t, resp)
   836  
   837  	_, resp = Client.GetPublicChannelsForTeam(model.NewId(), 0, 100, "")
   838  	CheckForbiddenStatus(t, resp)
   839  
   840  	Client.Logout()
   841  	_, resp = Client.GetPublicChannelsForTeam(team.Id, 0, 100, "")
   842  	CheckUnauthorizedStatus(t, resp)
   843  
   844  	user := th.CreateUser()
   845  	Client.Login(user.Email, user.Password)
   846  	_, resp = Client.GetPublicChannelsForTeam(team.Id, 0, 100, "")
   847  	CheckForbiddenStatus(t, resp)
   848  
   849  	th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) {
   850  		_, resp = client.GetPublicChannelsForTeam(team.Id, 0, 100, "")
   851  		CheckNoError(t, resp)
   852  	})
   853  }
   854  
   855  func TestGetPublicChannelsByIdsForTeam(t *testing.T) {
   856  	th := Setup(t).InitBasic()
   857  	defer th.TearDown()
   858  	Client := th.Client
   859  	teamId := th.BasicTeam.Id
   860  	input := []string{th.BasicChannel.Id}
   861  	output := []string{th.BasicChannel.DisplayName}
   862  
   863  	channels, resp := Client.GetPublicChannelsByIdsForTeam(teamId, input)
   864  	CheckNoError(t, resp)
   865  	require.Len(t, channels, 1, "should return 1 channel")
   866  	require.Equal(t, output[0], channels[0].DisplayName, "missing channel")
   867  
   868  	input = append(input, GenerateTestId())
   869  	input = append(input, th.BasicChannel2.Id)
   870  	input = append(input, th.BasicPrivateChannel.Id)
   871  	output = append(output, th.BasicChannel2.DisplayName)
   872  	sort.Strings(output)
   873  
   874  	channels, resp = Client.GetPublicChannelsByIdsForTeam(teamId, input)
   875  	CheckNoError(t, resp)
   876  	require.Len(t, channels, 2, "should return 2 channels")
   877  
   878  	for i, c := range channels {
   879  		require.Equal(t, output[i], c.DisplayName, "missing channel")
   880  	}
   881  
   882  	_, resp = Client.GetPublicChannelsByIdsForTeam(GenerateTestId(), input)
   883  	CheckForbiddenStatus(t, resp)
   884  
   885  	_, resp = Client.GetPublicChannelsByIdsForTeam(teamId, []string{})
   886  	CheckBadRequestStatus(t, resp)
   887  
   888  	_, resp = Client.GetPublicChannelsByIdsForTeam(teamId, []string{"junk"})
   889  	CheckBadRequestStatus(t, resp)
   890  
   891  	_, resp = Client.GetPublicChannelsByIdsForTeam(teamId, []string{GenerateTestId()})
   892  	CheckNotFoundStatus(t, resp)
   893  
   894  	_, resp = Client.GetPublicChannelsByIdsForTeam(teamId, []string{th.BasicPrivateChannel.Id})
   895  	CheckNotFoundStatus(t, resp)
   896  
   897  	Client.Logout()
   898  
   899  	_, resp = Client.GetPublicChannelsByIdsForTeam(teamId, input)
   900  	CheckUnauthorizedStatus(t, resp)
   901  
   902  	_, resp = th.SystemAdminClient.GetPublicChannelsByIdsForTeam(teamId, input)
   903  	CheckNoError(t, resp)
   904  }
   905  
   906  func TestGetChannelsForTeamForUser(t *testing.T) {
   907  	th := Setup(t).InitBasic()
   908  	defer th.TearDown()
   909  	Client := th.Client
   910  
   911  	t.Run("get channels for the team for user", func(t *testing.T) {
   912  		channels, resp := Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, "")
   913  		CheckNoError(t, resp)
   914  
   915  		found := make([]bool, 3)
   916  		for _, c := range channels {
   917  			if c.Id == th.BasicChannel.Id {
   918  				found[0] = true
   919  			} else if c.Id == th.BasicChannel2.Id {
   920  				found[1] = true
   921  			} else if c.Id == th.BasicPrivateChannel.Id {
   922  				found[2] = true
   923  			}
   924  
   925  			require.True(t, c.TeamId == "" || c.TeamId == th.BasicTeam.Id)
   926  		}
   927  
   928  		for _, f := range found {
   929  			require.True(t, f, "missing a channel")
   930  		}
   931  
   932  		channels, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, resp.Etag)
   933  		CheckEtag(t, channels, resp)
   934  
   935  		_, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, "junk", false, "")
   936  		CheckBadRequestStatus(t, resp)
   937  
   938  		_, resp = Client.GetChannelsForTeamForUser("junk", th.BasicUser.Id, false, "")
   939  		CheckBadRequestStatus(t, resp)
   940  
   941  		_, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser2.Id, false, "")
   942  		CheckForbiddenStatus(t, resp)
   943  
   944  		_, resp = Client.GetChannelsForTeamForUser(model.NewId(), th.BasicUser.Id, false, "")
   945  		CheckForbiddenStatus(t, resp)
   946  
   947  		_, resp = th.SystemAdminClient.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, "")
   948  		CheckNoError(t, resp)
   949  	})
   950  
   951  	t.Run("deleted channel could be retrieved using the proper flag", func(t *testing.T) {
   952  		testChannel := &model.Channel{
   953  			DisplayName: "dn_" + model.NewId(),
   954  			Name:        GenerateTestChannelName(),
   955  			Type:        model.CHANNEL_OPEN,
   956  			TeamId:      th.BasicTeam.Id,
   957  			CreatorId:   th.BasicUser.Id,
   958  		}
   959  		th.App.CreateChannel(th.Context, testChannel, true)
   960  		defer th.App.PermanentDeleteChannel(testChannel)
   961  		channels, resp := Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, "")
   962  		CheckNoError(t, resp)
   963  		assert.Equal(t, 6, len(channels))
   964  		th.App.DeleteChannel(th.Context, testChannel, th.BasicUser.Id)
   965  		channels, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, "")
   966  		CheckNoError(t, resp)
   967  		assert.Equal(t, 5, len(channels))
   968  
   969  		// Should return all channels including basicDeleted.
   970  		channels, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, true, "")
   971  		CheckNoError(t, resp)
   972  		assert.Equal(t, 7, len(channels))
   973  
   974  		// Should stil return all channels including basicDeleted.
   975  		now := time.Now().Add(-time.Minute).Unix() * 1000
   976  		Client.GetChannelsForTeamAndUserWithLastDeleteAt(th.BasicTeam.Id, th.BasicUser.Id,
   977  			true, int(now), "")
   978  		CheckNoError(t, resp)
   979  		assert.Equal(t, 7, len(channels))
   980  	})
   981  }
   982  
   983  func TestGetAllChannels(t *testing.T) {
   984  	th := Setup(t).InitBasic()
   985  	defer th.TearDown()
   986  	Client := th.Client
   987  
   988  	th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) {
   989  		channels, resp := client.GetAllChannels(0, 20, "")
   990  		CheckNoError(t, resp)
   991  
   992  		// At least, all the not-deleted channels created during the InitBasic
   993  		require.True(t, len(*channels) >= 3)
   994  		for _, c := range *channels {
   995  			require.NotEqual(t, c.TeamId, "")
   996  		}
   997  
   998  		channels, resp = client.GetAllChannels(0, 10, "")
   999  		CheckNoError(t, resp)
  1000  		require.True(t, len(*channels) >= 3)
  1001  
  1002  		channels, resp = client.GetAllChannels(1, 1, "")
  1003  		CheckNoError(t, resp)
  1004  		require.Len(t, *channels, 1)
  1005  
  1006  		channels, resp = client.GetAllChannels(10000, 10000, "")
  1007  		CheckNoError(t, resp)
  1008  		require.Empty(t, *channels)
  1009  
  1010  		channels, resp = client.GetAllChannels(0, 10000, "")
  1011  		require.Nil(t, resp.Error)
  1012  		beforeCount := len(*channels)
  1013  
  1014  		firstChannel := (*channels)[0].Channel
  1015  
  1016  		ok, resp := client.DeleteChannel(firstChannel.Id)
  1017  		require.Nil(t, resp.Error)
  1018  		require.True(t, ok)
  1019  
  1020  		channels, resp = client.GetAllChannels(0, 10000, "")
  1021  		var ids []string
  1022  		for _, item := range *channels {
  1023  			ids = append(ids, item.Channel.Id)
  1024  		}
  1025  		require.Nil(t, resp.Error)
  1026  		require.Len(t, *channels, beforeCount-1)
  1027  		require.NotContains(t, ids, firstChannel.Id)
  1028  
  1029  		channels, resp = client.GetAllChannelsIncludeDeleted(0, 10000, "")
  1030  		ids = []string{}
  1031  		for _, item := range *channels {
  1032  			ids = append(ids, item.Channel.Id)
  1033  		}
  1034  		require.Nil(t, resp.Error)
  1035  		require.True(t, len(*channels) > beforeCount)
  1036  		require.Contains(t, ids, firstChannel.Id)
  1037  	})
  1038  
  1039  	_, resp := Client.GetAllChannels(0, 20, "")
  1040  	CheckForbiddenStatus(t, resp)
  1041  
  1042  	sysManagerChannels, resp := th.SystemManagerClient.GetAllChannels(0, 10000, "")
  1043  	CheckOKStatus(t, resp)
  1044  	policyChannel := (*sysManagerChannels)[0]
  1045  	policy, savePolicyErr := th.App.Srv().Store.RetentionPolicy().Save(&model.RetentionPolicyWithTeamAndChannelIDs{
  1046  		RetentionPolicy: model.RetentionPolicy{
  1047  			DisplayName:  "Policy 1",
  1048  			PostDuration: model.NewInt64(30),
  1049  		},
  1050  		ChannelIDs: []string{policyChannel.Id},
  1051  	})
  1052  	require.NoError(t, savePolicyErr)
  1053  
  1054  	t.Run("exclude policy constrained", func(t *testing.T) {
  1055  		_, resp := th.SystemManagerClient.GetAllChannelsExcludePolicyConstrained(0, 10000, "")
  1056  		CheckForbiddenStatus(t, resp)
  1057  
  1058  		channels, resp := th.SystemAdminClient.GetAllChannelsExcludePolicyConstrained(0, 10000, "")
  1059  		CheckOKStatus(t, resp)
  1060  		found := false
  1061  		for _, channel := range *channels {
  1062  			if channel.Id == policyChannel.Id {
  1063  				found = true
  1064  				break
  1065  			}
  1066  		}
  1067  		require.False(t, found)
  1068  	})
  1069  
  1070  	t.Run("does not return policy ID", func(t *testing.T) {
  1071  		channels, resp := th.SystemManagerClient.GetAllChannels(0, 10000, "")
  1072  		CheckOKStatus(t, resp)
  1073  		found := false
  1074  		for _, channel := range *channels {
  1075  			if channel.Id == policyChannel.Id {
  1076  				found = true
  1077  				require.Nil(t, channel.PolicyID)
  1078  				break
  1079  			}
  1080  		}
  1081  		require.True(t, found)
  1082  	})
  1083  
  1084  	t.Run("returns policy ID", func(t *testing.T) {
  1085  		channels, resp := th.SystemAdminClient.GetAllChannels(0, 10000, "")
  1086  		CheckOKStatus(t, resp)
  1087  		found := false
  1088  		for _, channel := range *channels {
  1089  			if channel.Id == policyChannel.Id {
  1090  				found = true
  1091  				require.Equal(t, *channel.PolicyID, policy.ID)
  1092  				break
  1093  			}
  1094  		}
  1095  		require.True(t, found)
  1096  	})
  1097  }
  1098  
  1099  func TestGetAllChannelsWithCount(t *testing.T) {
  1100  	th := Setup(t).InitBasic()
  1101  	defer th.TearDown()
  1102  	Client := th.Client
  1103  
  1104  	channels, total, resp := th.SystemAdminClient.GetAllChannelsWithCount(0, 20, "")
  1105  	CheckNoError(t, resp)
  1106  
  1107  	// At least, all the not-deleted channels created during the InitBasic
  1108  	require.True(t, len(*channels) >= 3)
  1109  	for _, c := range *channels {
  1110  		require.NotEqual(t, c.TeamId, "")
  1111  	}
  1112  	require.Equal(t, int64(6), total)
  1113  
  1114  	channels, _, resp = th.SystemAdminClient.GetAllChannelsWithCount(0, 10, "")
  1115  	CheckNoError(t, resp)
  1116  	require.True(t, len(*channels) >= 3)
  1117  
  1118  	channels, _, resp = th.SystemAdminClient.GetAllChannelsWithCount(1, 1, "")
  1119  	CheckNoError(t, resp)
  1120  	require.Len(t, *channels, 1)
  1121  
  1122  	channels, _, resp = th.SystemAdminClient.GetAllChannelsWithCount(10000, 10000, "")
  1123  	CheckNoError(t, resp)
  1124  	require.Empty(t, *channels)
  1125  
  1126  	_, _, resp = Client.GetAllChannelsWithCount(0, 20, "")
  1127  	CheckForbiddenStatus(t, resp)
  1128  }
  1129  
  1130  func TestSearchChannels(t *testing.T) {
  1131  	th := Setup(t).InitBasic()
  1132  	defer th.TearDown()
  1133  	Client := th.Client
  1134  
  1135  	search := &model.ChannelSearch{Term: th.BasicChannel.Name}
  1136  
  1137  	channels, resp := Client.SearchChannels(th.BasicTeam.Id, search)
  1138  	CheckNoError(t, resp)
  1139  
  1140  	found := false
  1141  	for _, c := range channels {
  1142  		require.Equal(t, model.CHANNEL_OPEN, c.Type, "should only return public channels")
  1143  
  1144  		if c.Id == th.BasicChannel.Id {
  1145  			found = true
  1146  		}
  1147  	}
  1148  	require.True(t, found, "didn't find channel")
  1149  
  1150  	search.Term = th.BasicPrivateChannel.Name
  1151  	channels, resp = Client.SearchChannels(th.BasicTeam.Id, search)
  1152  	CheckNoError(t, resp)
  1153  
  1154  	found = false
  1155  	for _, c := range channels {
  1156  		if c.Id == th.BasicPrivateChannel.Id {
  1157  			found = true
  1158  		}
  1159  	}
  1160  	require.False(t, found, "shouldn't find private channel")
  1161  
  1162  	search.Term = ""
  1163  	_, resp = Client.SearchChannels(th.BasicTeam.Id, search)
  1164  	CheckNoError(t, resp)
  1165  
  1166  	search.Term = th.BasicChannel.Name
  1167  	_, resp = Client.SearchChannels(model.NewId(), search)
  1168  	CheckNotFoundStatus(t, resp)
  1169  
  1170  	_, resp = Client.SearchChannels("junk", search)
  1171  	CheckBadRequestStatus(t, resp)
  1172  
  1173  	_, resp = th.SystemAdminClient.SearchChannels(th.BasicTeam.Id, search)
  1174  	CheckNoError(t, resp)
  1175  
  1176  	// Check the appropriate permissions are enforced.
  1177  	defaultRolePermissions := th.SaveDefaultRolePermissions()
  1178  	defer func() {
  1179  		th.RestoreDefaultRolePermissions(defaultRolePermissions)
  1180  	}()
  1181  
  1182  	// Remove list channels permission from the user
  1183  	th.RemovePermissionFromRole(model.PERMISSION_LIST_TEAM_CHANNELS.Id, model.TEAM_USER_ROLE_ID)
  1184  
  1185  	t.Run("Search for a BasicChannel, which the user is a member of", func(t *testing.T) {
  1186  		search.Term = th.BasicChannel.Name
  1187  		channelList, resp := Client.SearchChannels(th.BasicTeam.Id, search)
  1188  		CheckNoError(t, resp)
  1189  
  1190  		channelNames := []string{}
  1191  		for _, c := range channelList {
  1192  			channelNames = append(channelNames, c.Name)
  1193  		}
  1194  		require.Contains(t, channelNames, th.BasicChannel.Name)
  1195  	})
  1196  
  1197  	t.Run("Remove the user from BasicChannel and search again, should not be returned", func(t *testing.T) {
  1198  		th.App.RemoveUserFromChannel(th.Context, th.BasicUser.Id, th.BasicUser.Id, th.BasicChannel)
  1199  
  1200  		search.Term = th.BasicChannel.Name
  1201  		channelList, resp := Client.SearchChannels(th.BasicTeam.Id, search)
  1202  		CheckNoError(t, resp)
  1203  
  1204  		channelNames := []string{}
  1205  		for _, c := range channelList {
  1206  			channelNames = append(channelNames, c.Name)
  1207  		}
  1208  		require.NotContains(t, channelNames, th.BasicChannel.Name)
  1209  	})
  1210  }
  1211  
  1212  func TestSearchArchivedChannels(t *testing.T) {
  1213  	th := Setup(t).InitBasic()
  1214  	defer th.TearDown()
  1215  	Client := th.Client
  1216  
  1217  	search := &model.ChannelSearch{Term: th.BasicChannel.Name}
  1218  
  1219  	Client.DeleteChannel(th.BasicChannel.Id)
  1220  
  1221  	channels, resp := Client.SearchArchivedChannels(th.BasicTeam.Id, search)
  1222  	CheckNoError(t, resp)
  1223  
  1224  	found := false
  1225  	for _, c := range channels {
  1226  		require.Equal(t, model.CHANNEL_OPEN, c.Type)
  1227  
  1228  		if c.Id == th.BasicChannel.Id {
  1229  			found = true
  1230  		}
  1231  	}
  1232  
  1233  	require.True(t, found)
  1234  
  1235  	search.Term = th.BasicPrivateChannel.Name
  1236  	Client.DeleteChannel(th.BasicPrivateChannel.Id)
  1237  
  1238  	channels, resp = Client.SearchArchivedChannels(th.BasicTeam.Id, search)
  1239  	CheckNoError(t, resp)
  1240  
  1241  	found = false
  1242  	for _, c := range channels {
  1243  		if c.Id == th.BasicPrivateChannel.Id {
  1244  			found = true
  1245  		}
  1246  	}
  1247  
  1248  	require.True(t, found)
  1249  
  1250  	search.Term = ""
  1251  	_, resp = Client.SearchArchivedChannels(th.BasicTeam.Id, search)
  1252  	CheckNoError(t, resp)
  1253  
  1254  	search.Term = th.BasicDeletedChannel.Name
  1255  	_, resp = Client.SearchArchivedChannels(model.NewId(), search)
  1256  	CheckNotFoundStatus(t, resp)
  1257  
  1258  	_, resp = Client.SearchArchivedChannels("junk", search)
  1259  	CheckBadRequestStatus(t, resp)
  1260  
  1261  	_, resp = th.SystemAdminClient.SearchArchivedChannels(th.BasicTeam.Id, search)
  1262  	CheckNoError(t, resp)
  1263  
  1264  	// Check the appropriate permissions are enforced.
  1265  	defaultRolePermissions := th.SaveDefaultRolePermissions()
  1266  	defer func() {
  1267  		th.RestoreDefaultRolePermissions(defaultRolePermissions)
  1268  	}()
  1269  
  1270  	// Remove list channels permission from the user
  1271  	th.RemovePermissionFromRole(model.PERMISSION_LIST_TEAM_CHANNELS.Id, model.TEAM_USER_ROLE_ID)
  1272  
  1273  	t.Run("Search for a BasicDeletedChannel, which the user is a member of", func(t *testing.T) {
  1274  		search.Term = th.BasicDeletedChannel.Name
  1275  		channelList, resp := Client.SearchArchivedChannels(th.BasicTeam.Id, search)
  1276  		CheckNoError(t, resp)
  1277  
  1278  		channelNames := []string{}
  1279  		for _, c := range channelList {
  1280  			channelNames = append(channelNames, c.Name)
  1281  		}
  1282  		require.Contains(t, channelNames, th.BasicDeletedChannel.Name)
  1283  	})
  1284  
  1285  	t.Run("Remove the user from BasicDeletedChannel and search again, should still return", func(t *testing.T) {
  1286  		th.App.RemoveUserFromChannel(th.Context, th.BasicUser.Id, th.BasicUser.Id, th.BasicDeletedChannel)
  1287  
  1288  		search.Term = th.BasicDeletedChannel.Name
  1289  		channelList, resp := Client.SearchArchivedChannels(th.BasicTeam.Id, search)
  1290  		CheckNoError(t, resp)
  1291  
  1292  		channelNames := []string{}
  1293  		for _, c := range channelList {
  1294  			channelNames = append(channelNames, c.Name)
  1295  		}
  1296  		require.Contains(t, channelNames, th.BasicDeletedChannel.Name)
  1297  	})
  1298  }
  1299  
  1300  func TestSearchAllChannels(t *testing.T) {
  1301  	th := Setup(t).InitBasic()
  1302  	defer th.TearDown()
  1303  	Client := th.Client
  1304  
  1305  	openChannel, chanErr := th.SystemAdminClient.CreateChannel(&model.Channel{
  1306  		DisplayName: "SearchAllChannels-FOOBARDISPLAYNAME",
  1307  		Name:        "whatever",
  1308  		Type:        model.CHANNEL_OPEN,
  1309  		TeamId:      th.BasicTeam.Id,
  1310  	})
  1311  	CheckNoError(t, chanErr)
  1312  
  1313  	privateChannel, privErr := th.SystemAdminClient.CreateChannel(&model.Channel{
  1314  		DisplayName: "SearchAllChannels-private1",
  1315  		Name:        "private1",
  1316  		Type:        model.CHANNEL_PRIVATE,
  1317  		TeamId:      th.BasicTeam.Id,
  1318  	})
  1319  	CheckNoError(t, privErr)
  1320  
  1321  	team := th.CreateTeam()
  1322  	groupConstrainedChannel, groupErr := th.SystemAdminClient.CreateChannel(&model.Channel{
  1323  		DisplayName:      "SearchAllChannels-groupConstrained-1",
  1324  		Name:             "groupconstrained1",
  1325  		Type:             model.CHANNEL_PRIVATE,
  1326  		GroupConstrained: model.NewBool(true),
  1327  		TeamId:           team.Id,
  1328  	})
  1329  	CheckNoError(t, groupErr)
  1330  
  1331  	testCases := []struct {
  1332  		Description        string
  1333  		Search             *model.ChannelSearch
  1334  		ExpectedChannelIds []string
  1335  	}{
  1336  		{
  1337  			"Middle of word search",
  1338  			&model.ChannelSearch{Term: "bardisplay"},
  1339  			[]string{openChannel.Id},
  1340  		},
  1341  		{
  1342  			"Prefix search",
  1343  			&model.ChannelSearch{Term: "SearchAllChannels-foobar"},
  1344  			[]string{openChannel.Id},
  1345  		},
  1346  		{
  1347  			"Suffix search",
  1348  			&model.ChannelSearch{Term: "displayname"},
  1349  			[]string{openChannel.Id},
  1350  		},
  1351  		{
  1352  			"Name search",
  1353  			&model.ChannelSearch{Term: "what"},
  1354  			[]string{openChannel.Id},
  1355  		},
  1356  		{
  1357  			"Name suffix search",
  1358  			&model.ChannelSearch{Term: "ever"},
  1359  			[]string{openChannel.Id},
  1360  		},
  1361  		{
  1362  			"Basic channel name middle of word search",
  1363  			&model.ChannelSearch{Term: th.BasicChannel.Name[2:14]},
  1364  			[]string{th.BasicChannel.Id},
  1365  		},
  1366  		{
  1367  			"Upper case search",
  1368  			&model.ChannelSearch{Term: strings.ToUpper(th.BasicChannel.Name)},
  1369  			[]string{th.BasicChannel.Id},
  1370  		},
  1371  		{
  1372  			"Mixed case search",
  1373  			&model.ChannelSearch{Term: th.BasicChannel.Name[0:2] + strings.ToUpper(th.BasicChannel.Name[2:5]) + th.BasicChannel.Name[5:]},
  1374  			[]string{th.BasicChannel.Id},
  1375  		},
  1376  		{
  1377  			"Non mixed case search",
  1378  			&model.ChannelSearch{Term: th.BasicChannel.Name},
  1379  			[]string{th.BasicChannel.Id},
  1380  		},
  1381  		{
  1382  			"Search private channel name",
  1383  			&model.ChannelSearch{Term: th.BasicPrivateChannel.Name},
  1384  			[]string{th.BasicPrivateChannel.Id},
  1385  		},
  1386  		{
  1387  			"Search with private channel filter",
  1388  			&model.ChannelSearch{Private: true},
  1389  			[]string{th.BasicPrivateChannel.Id, th.BasicPrivateChannel2.Id, privateChannel.Id, groupConstrainedChannel.Id},
  1390  		},
  1391  		{
  1392  			"Search with public channel filter",
  1393  			&model.ChannelSearch{Term: "SearchAllChannels", Public: true},
  1394  			[]string{openChannel.Id},
  1395  		},
  1396  		{
  1397  			"Search with private channel filter",
  1398  			&model.ChannelSearch{Term: "SearchAllChannels", Private: true},
  1399  			[]string{privateChannel.Id, groupConstrainedChannel.Id},
  1400  		},
  1401  		{
  1402  			"Search with teamIds channel filter",
  1403  			&model.ChannelSearch{Term: "SearchAllChannels", TeamIds: []string{th.BasicTeam.Id}},
  1404  			[]string{openChannel.Id, privateChannel.Id},
  1405  		},
  1406  		{
  1407  			"Search with deleted without IncludeDeleted filter",
  1408  			&model.ChannelSearch{Term: th.BasicDeletedChannel.Name},
  1409  			[]string{},
  1410  		},
  1411  		{
  1412  			"Search with deleted IncludeDeleted filter",
  1413  			&model.ChannelSearch{Term: th.BasicDeletedChannel.Name, IncludeDeleted: true},
  1414  			[]string{th.BasicDeletedChannel.Id},
  1415  		},
  1416  		{
  1417  			"Search with deleted IncludeDeleted filter",
  1418  			&model.ChannelSearch{Term: th.BasicDeletedChannel.Name, IncludeDeleted: true},
  1419  			[]string{th.BasicDeletedChannel.Id},
  1420  		},
  1421  		{
  1422  			"Search with deleted Deleted filter and empty term",
  1423  			&model.ChannelSearch{Term: "", Deleted: true},
  1424  			[]string{th.BasicDeletedChannel.Id},
  1425  		},
  1426  		{
  1427  			"Search for group constrained",
  1428  			&model.ChannelSearch{Term: "SearchAllChannels", GroupConstrained: true},
  1429  			[]string{groupConstrainedChannel.Id},
  1430  		},
  1431  		{
  1432  			"Search for group constrained and public",
  1433  			&model.ChannelSearch{Term: "SearchAllChannels", GroupConstrained: true, Public: true},
  1434  			[]string{},
  1435  		},
  1436  		{
  1437  			"Search for exclude group constrained",
  1438  			&model.ChannelSearch{Term: "SearchAllChannels", ExcludeGroupConstrained: true},
  1439  			[]string{openChannel.Id, privateChannel.Id},
  1440  		},
  1441  	}
  1442  	for _, testCase := range testCases {
  1443  		t.Run(testCase.Description, func(t *testing.T) {
  1444  			channels, resp := th.SystemAdminClient.SearchAllChannels(testCase.Search)
  1445  			CheckNoError(t, resp)
  1446  			assert.Equal(t, len(testCase.ExpectedChannelIds), len(*channels))
  1447  			actualChannelIds := []string{}
  1448  			for _, channelWithTeamData := range *channels {
  1449  				actualChannelIds = append(actualChannelIds, channelWithTeamData.Channel.Id)
  1450  			}
  1451  			assert.ElementsMatch(t, testCase.ExpectedChannelIds, actualChannelIds)
  1452  		})
  1453  	}
  1454  
  1455  	// Searching with no terms returns all default channels
  1456  	allChannels, resp := th.SystemAdminClient.SearchAllChannels(&model.ChannelSearch{Term: ""})
  1457  	CheckNoError(t, resp)
  1458  	assert.True(t, len(*allChannels) >= 3)
  1459  
  1460  	_, resp = Client.SearchAllChannels(&model.ChannelSearch{Term: ""})
  1461  	CheckForbiddenStatus(t, resp)
  1462  
  1463  	// Choose a policy which the system manager can read
  1464  	sysManagerChannels, resp := th.SystemManagerClient.GetAllChannels(0, 10000, "")
  1465  	CheckOKStatus(t, resp)
  1466  	policyChannel := (*sysManagerChannels)[0]
  1467  	policy, savePolicyErr := th.App.Srv().Store.RetentionPolicy().Save(&model.RetentionPolicyWithTeamAndChannelIDs{
  1468  		RetentionPolicy: model.RetentionPolicy{
  1469  			DisplayName:  "Policy 1",
  1470  			PostDuration: model.NewInt64(30),
  1471  		},
  1472  		ChannelIDs: []string{policyChannel.Id},
  1473  	})
  1474  	require.NoError(t, savePolicyErr)
  1475  
  1476  	t.Run("does not return policy ID", func(t *testing.T) {
  1477  		channels, resp := th.SystemManagerClient.SearchAllChannels(&model.ChannelSearch{Term: policyChannel.Name})
  1478  		CheckOKStatus(t, resp)
  1479  		found := false
  1480  		for _, channel := range *channels {
  1481  			if channel.Id == policyChannel.Id {
  1482  				found = true
  1483  				require.Nil(t, channel.PolicyID)
  1484  				break
  1485  			}
  1486  		}
  1487  		require.True(t, found)
  1488  	})
  1489  	t.Run("returns policy ID", func(t *testing.T) {
  1490  		channels, resp := th.SystemAdminClient.SearchAllChannels(&model.ChannelSearch{Term: policyChannel.Name})
  1491  		CheckOKStatus(t, resp)
  1492  		found := false
  1493  		for _, channel := range *channels {
  1494  			if channel.Id == policyChannel.Id {
  1495  				found = true
  1496  				require.Equal(t, *channel.PolicyID, policy.ID)
  1497  				break
  1498  			}
  1499  		}
  1500  		require.True(t, found)
  1501  	})
  1502  }
  1503  
  1504  func TestSearchAllChannelsPaged(t *testing.T) {
  1505  	th := Setup(t).InitBasic()
  1506  	defer th.TearDown()
  1507  	Client := th.Client
  1508  
  1509  	search := &model.ChannelSearch{Term: th.BasicChannel.Name}
  1510  	search.Term = ""
  1511  	search.Page = model.NewInt(0)
  1512  	search.PerPage = model.NewInt(2)
  1513  	channelsWithCount, resp := th.SystemAdminClient.SearchAllChannelsPaged(search)
  1514  	CheckNoError(t, resp)
  1515  	require.Len(t, *channelsWithCount.Channels, 2)
  1516  
  1517  	search.Term = th.BasicChannel.Name
  1518  	_, resp = Client.SearchAllChannels(search)
  1519  	CheckForbiddenStatus(t, resp)
  1520  }
  1521  
  1522  func TestSearchGroupChannels(t *testing.T) {
  1523  	th := Setup(t).InitBasic()
  1524  	defer th.TearDown()
  1525  	Client := th.Client
  1526  
  1527  	u1 := th.CreateUserWithClient(th.SystemAdminClient)
  1528  
  1529  	// Create a group channel in which base user belongs but not sysadmin
  1530  	gc1, resp := th.Client.CreateGroupChannel([]string{th.BasicUser.Id, th.BasicUser2.Id, u1.Id})
  1531  	CheckNoError(t, resp)
  1532  	defer th.Client.DeleteChannel(gc1.Id)
  1533  
  1534  	gc2, resp := th.Client.CreateGroupChannel([]string{th.BasicUser.Id, th.BasicUser2.Id, th.SystemAdminUser.Id})
  1535  	CheckNoError(t, resp)
  1536  	defer th.Client.DeleteChannel(gc2.Id)
  1537  
  1538  	search := &model.ChannelSearch{Term: th.BasicUser2.Username}
  1539  
  1540  	// sysadmin should only find gc2 as he doesn't belong to gc1
  1541  	channels, resp := th.SystemAdminClient.SearchGroupChannels(search)
  1542  	CheckNoError(t, resp)
  1543  
  1544  	assert.Len(t, channels, 1)
  1545  	assert.Equal(t, channels[0].Id, gc2.Id)
  1546  
  1547  	// basic user should find both
  1548  	Client.Login(th.BasicUser.Username, th.BasicUser.Password)
  1549  	channels, resp = Client.SearchGroupChannels(search)
  1550  	CheckNoError(t, resp)
  1551  
  1552  	assert.Len(t, channels, 2)
  1553  	channelIds := []string{}
  1554  	for _, c := range channels {
  1555  		channelIds = append(channelIds, c.Id)
  1556  	}
  1557  	assert.ElementsMatch(t, channelIds, []string{gc1.Id, gc2.Id})
  1558  
  1559  	// searching for sysadmin, it should only find gc1
  1560  	search = &model.ChannelSearch{Term: th.SystemAdminUser.Username}
  1561  	channels, resp = Client.SearchGroupChannels(search)
  1562  	CheckNoError(t, resp)
  1563  
  1564  	assert.Len(t, channels, 1)
  1565  	assert.Equal(t, channels[0].Id, gc2.Id)
  1566  
  1567  	// with an empty search, response should be empty
  1568  	search = &model.ChannelSearch{Term: ""}
  1569  	channels, resp = Client.SearchGroupChannels(search)
  1570  	CheckNoError(t, resp)
  1571  
  1572  	assert.Empty(t, channels)
  1573  
  1574  	// search unprivileged, forbidden
  1575  	th.Client.Logout()
  1576  	_, resp = Client.SearchAllChannels(search)
  1577  	CheckUnauthorizedStatus(t, resp)
  1578  }
  1579  
  1580  func TestDeleteChannel(t *testing.T) {
  1581  	th := Setup(t).InitBasic()
  1582  	defer th.TearDown()
  1583  	c := th.Client
  1584  	team := th.BasicTeam
  1585  	user := th.BasicUser
  1586  	user2 := th.BasicUser2
  1587  
  1588  	// successful delete of public channel
  1589  	th.TestForAllClients(t, func(t *testing.T, client *model.Client4) {
  1590  		publicChannel1 := th.CreatePublicChannel()
  1591  		pass, resp := client.DeleteChannel(publicChannel1.Id)
  1592  		CheckNoError(t, resp)
  1593  
  1594  		require.True(t, pass, "should have passed")
  1595  
  1596  		ch, err := th.App.GetChannel(publicChannel1.Id)
  1597  		require.True(t, err != nil || ch.DeleteAt != 0, "should have failed to get deleted channel, or returned one with a populated DeleteAt.")
  1598  
  1599  		post1 := &model.Post{ChannelId: publicChannel1.Id, Message: "a" + GenerateTestId() + "a"}
  1600  		_, resp = client.CreatePost(post1)
  1601  		require.NotNil(t, resp, "expected response to not be nil")
  1602  
  1603  		// successful delete of private channel
  1604  		privateChannel2 := th.CreatePrivateChannel()
  1605  		_, resp = client.DeleteChannel(privateChannel2.Id)
  1606  		CheckNoError(t, resp)
  1607  
  1608  		// successful delete of channel with multiple members
  1609  		publicChannel3 := th.CreatePublicChannel()
  1610  		th.App.AddUserToChannel(user, publicChannel3, false)
  1611  		th.App.AddUserToChannel(user2, publicChannel3, false)
  1612  		_, resp = client.DeleteChannel(publicChannel3.Id)
  1613  		CheckNoError(t, resp)
  1614  
  1615  		// default channel cannot be deleted.
  1616  		defaultChannel, _ := th.App.GetChannelByName(model.DEFAULT_CHANNEL, team.Id, false)
  1617  		pass, resp = client.DeleteChannel(defaultChannel.Id)
  1618  		CheckBadRequestStatus(t, resp)
  1619  		require.False(t, pass, "should have failed")
  1620  
  1621  		// check system admin can delete a channel without any appropriate team or channel membership.
  1622  		sdTeam := th.CreateTeamWithClient(c)
  1623  		sdPublicChannel := &model.Channel{
  1624  			DisplayName: "dn_" + model.NewId(),
  1625  			Name:        GenerateTestChannelName(),
  1626  			Type:        model.CHANNEL_OPEN,
  1627  			TeamId:      sdTeam.Id,
  1628  		}
  1629  		sdPublicChannel, resp = c.CreateChannel(sdPublicChannel)
  1630  		CheckNoError(t, resp)
  1631  		_, resp = client.DeleteChannel(sdPublicChannel.Id)
  1632  		CheckNoError(t, resp)
  1633  
  1634  		sdPrivateChannel := &model.Channel{
  1635  			DisplayName: "dn_" + model.NewId(),
  1636  			Name:        GenerateTestChannelName(),
  1637  			Type:        model.CHANNEL_PRIVATE,
  1638  			TeamId:      sdTeam.Id,
  1639  		}
  1640  		sdPrivateChannel, resp = c.CreateChannel(sdPrivateChannel)
  1641  		CheckNoError(t, resp)
  1642  		_, resp = client.DeleteChannel(sdPrivateChannel.Id)
  1643  		CheckNoError(t, resp)
  1644  	})
  1645  	th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) {
  1646  
  1647  		th.LoginBasic()
  1648  		publicChannel5 := th.CreatePublicChannel()
  1649  		c.Logout()
  1650  
  1651  		c.Login(user.Id, user.Password)
  1652  		_, resp := c.DeleteChannel(publicChannel5.Id)
  1653  		CheckUnauthorizedStatus(t, resp)
  1654  
  1655  		_, resp = c.DeleteChannel("junk")
  1656  		CheckUnauthorizedStatus(t, resp)
  1657  
  1658  		c.Logout()
  1659  		_, resp = c.DeleteChannel(GenerateTestId())
  1660  		CheckUnauthorizedStatus(t, resp)
  1661  
  1662  		_, resp = client.DeleteChannel(publicChannel5.Id)
  1663  		CheckNoError(t, resp)
  1664  
  1665  	})
  1666  
  1667  }
  1668  
  1669  func TestDeleteChannel2(t *testing.T) {
  1670  	th := Setup(t).InitBasic()
  1671  	defer th.TearDown()
  1672  	Client := th.Client
  1673  	user := th.BasicUser
  1674  
  1675  	// Check the appropriate permissions are enforced.
  1676  	defaultRolePermissions := th.SaveDefaultRolePermissions()
  1677  	defer func() {
  1678  		th.RestoreDefaultRolePermissions(defaultRolePermissions)
  1679  	}()
  1680  
  1681  	th.AddPermissionToRole(model.PERMISSION_DELETE_PUBLIC_CHANNEL.Id, model.CHANNEL_USER_ROLE_ID)
  1682  	th.AddPermissionToRole(model.PERMISSION_DELETE_PRIVATE_CHANNEL.Id, model.CHANNEL_USER_ROLE_ID)
  1683  
  1684  	// channels created by SystemAdmin
  1685  	publicChannel6 := th.CreateChannelWithClient(th.SystemAdminClient, model.CHANNEL_OPEN)
  1686  	privateChannel7 := th.CreateChannelWithClient(th.SystemAdminClient, model.CHANNEL_PRIVATE)
  1687  	th.App.AddUserToChannel(user, publicChannel6, false)
  1688  	th.App.AddUserToChannel(user, privateChannel7, false)
  1689  	th.App.AddUserToChannel(user, privateChannel7, false)
  1690  
  1691  	// successful delete by user
  1692  	_, resp := Client.DeleteChannel(publicChannel6.Id)
  1693  	CheckNoError(t, resp)
  1694  
  1695  	_, resp = Client.DeleteChannel(privateChannel7.Id)
  1696  	CheckNoError(t, resp)
  1697  
  1698  	// Restrict permissions to Channel Admins
  1699  	th.RemovePermissionFromRole(model.PERMISSION_DELETE_PUBLIC_CHANNEL.Id, model.CHANNEL_USER_ROLE_ID)
  1700  	th.RemovePermissionFromRole(model.PERMISSION_DELETE_PRIVATE_CHANNEL.Id, model.CHANNEL_USER_ROLE_ID)
  1701  	th.AddPermissionToRole(model.PERMISSION_DELETE_PUBLIC_CHANNEL.Id, model.CHANNEL_ADMIN_ROLE_ID)
  1702  	th.AddPermissionToRole(model.PERMISSION_DELETE_PRIVATE_CHANNEL.Id, model.CHANNEL_ADMIN_ROLE_ID)
  1703  
  1704  	// channels created by SystemAdmin
  1705  	publicChannel6 = th.CreateChannelWithClient(th.SystemAdminClient, model.CHANNEL_OPEN)
  1706  	privateChannel7 = th.CreateChannelWithClient(th.SystemAdminClient, model.CHANNEL_PRIVATE)
  1707  	th.App.AddUserToChannel(user, publicChannel6, false)
  1708  	th.App.AddUserToChannel(user, privateChannel7, false)
  1709  	th.App.AddUserToChannel(user, privateChannel7, false)
  1710  
  1711  	// cannot delete by user
  1712  	_, resp = Client.DeleteChannel(publicChannel6.Id)
  1713  	CheckForbiddenStatus(t, resp)
  1714  
  1715  	_, resp = Client.DeleteChannel(privateChannel7.Id)
  1716  	CheckForbiddenStatus(t, resp)
  1717  
  1718  	// successful delete by channel admin
  1719  	th.MakeUserChannelAdmin(user, publicChannel6)
  1720  	th.MakeUserChannelAdmin(user, privateChannel7)
  1721  	th.App.Srv().Store.Channel().ClearCaches()
  1722  
  1723  	_, resp = Client.DeleteChannel(publicChannel6.Id)
  1724  	CheckNoError(t, resp)
  1725  
  1726  	_, resp = Client.DeleteChannel(privateChannel7.Id)
  1727  	CheckNoError(t, resp)
  1728  
  1729  	// Make sure team admins don't have permission to delete channels.
  1730  	th.RemovePermissionFromRole(model.PERMISSION_DELETE_PUBLIC_CHANNEL.Id, model.CHANNEL_ADMIN_ROLE_ID)
  1731  	th.RemovePermissionFromRole(model.PERMISSION_DELETE_PRIVATE_CHANNEL.Id, model.CHANNEL_ADMIN_ROLE_ID)
  1732  
  1733  	// last member of a public channel should have required permission to delete
  1734  	publicChannel6 = th.CreateChannelWithClient(th.Client, model.CHANNEL_OPEN)
  1735  	_, resp = Client.DeleteChannel(publicChannel6.Id)
  1736  	CheckForbiddenStatus(t, resp)
  1737  
  1738  	// last member of a private channel should not be able to delete it if they don't have required permissions
  1739  	privateChannel7 = th.CreateChannelWithClient(th.Client, model.CHANNEL_PRIVATE)
  1740  	_, resp = Client.DeleteChannel(privateChannel7.Id)
  1741  	CheckForbiddenStatus(t, resp)
  1742  }
  1743  
  1744  func TestPermanentDeleteChannel(t *testing.T) {
  1745  	th := Setup(t).InitBasic()
  1746  	defer th.TearDown()
  1747  
  1748  	enableAPIChannelDeletion := *th.App.Config().ServiceSettings.EnableAPIChannelDeletion
  1749  	defer func() {
  1750  		th.App.UpdateConfig(func(cfg *model.Config) { cfg.ServiceSettings.EnableAPIChannelDeletion = &enableAPIChannelDeletion })
  1751  	}()
  1752  
  1753  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableAPIChannelDeletion = false })
  1754  
  1755  	publicChannel1 := th.CreatePublicChannel()
  1756  	t.Run("Permanent deletion not available through API if EnableAPIChannelDeletion is not set", func(t *testing.T) {
  1757  		_, resp := th.SystemAdminClient.PermanentDeleteChannel(publicChannel1.Id)
  1758  		CheckUnauthorizedStatus(t, resp)
  1759  	})
  1760  
  1761  	t.Run("Permanent deletion available through local mode even if EnableAPIChannelDeletion is not set", func(t *testing.T) {
  1762  		ok, resp := th.LocalClient.PermanentDeleteChannel(publicChannel1.Id)
  1763  		CheckNoError(t, resp)
  1764  		assert.True(t, ok)
  1765  	})
  1766  
  1767  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableAPIChannelDeletion = true })
  1768  	th.TestForSystemAdminAndLocal(t, func(t *testing.T, c *model.Client4) {
  1769  		publicChannel := th.CreatePublicChannel()
  1770  		ok, resp := c.PermanentDeleteChannel(publicChannel.Id)
  1771  		CheckNoError(t, resp)
  1772  		assert.True(t, ok)
  1773  
  1774  		_, err := th.App.GetChannel(publicChannel.Id)
  1775  		assert.NotNil(t, err)
  1776  
  1777  		ok, resp = c.PermanentDeleteChannel("junk")
  1778  		CheckBadRequestStatus(t, resp)
  1779  		require.False(t, ok, "should have returned false")
  1780  	}, "Permanent deletion with EnableAPIChannelDeletion set")
  1781  }
  1782  
  1783  func TestConvertChannelToPrivate(t *testing.T) {
  1784  	th := Setup(t).InitBasic()
  1785  	defer th.TearDown()
  1786  	Client := th.Client
  1787  
  1788  	defaultChannel, _ := th.App.GetChannelByName(model.DEFAULT_CHANNEL, th.BasicTeam.Id, false)
  1789  	_, resp := Client.ConvertChannelToPrivate(defaultChannel.Id)
  1790  	CheckForbiddenStatus(t, resp)
  1791  
  1792  	privateChannel := th.CreatePrivateChannel()
  1793  	_, resp = Client.ConvertChannelToPrivate(privateChannel.Id)
  1794  	CheckForbiddenStatus(t, resp)
  1795  
  1796  	publicChannel := th.CreatePublicChannel()
  1797  	_, resp = Client.ConvertChannelToPrivate(publicChannel.Id)
  1798  	CheckForbiddenStatus(t, resp)
  1799  
  1800  	th.LoginTeamAdmin()
  1801  	th.RemovePermissionFromRole(model.PERMISSION_CONVERT_PUBLIC_CHANNEL_TO_PRIVATE.Id, model.TEAM_ADMIN_ROLE_ID)
  1802  
  1803  	_, resp = Client.ConvertChannelToPrivate(publicChannel.Id)
  1804  	CheckForbiddenStatus(t, resp)
  1805  
  1806  	th.AddPermissionToRole(model.PERMISSION_CONVERT_PUBLIC_CHANNEL_TO_PRIVATE.Id, model.TEAM_ADMIN_ROLE_ID)
  1807  
  1808  	rchannel, resp := Client.ConvertChannelToPrivate(publicChannel.Id)
  1809  	CheckOKStatus(t, resp)
  1810  	require.Equal(t, model.CHANNEL_PRIVATE, rchannel.Type, "channel should be converted from public to private")
  1811  
  1812  	rchannel, resp = th.SystemAdminClient.ConvertChannelToPrivate(privateChannel.Id)
  1813  	CheckBadRequestStatus(t, resp)
  1814  	require.Nil(t, rchannel, "should not return a channel")
  1815  
  1816  	rchannel, resp = th.SystemAdminClient.ConvertChannelToPrivate(defaultChannel.Id)
  1817  	CheckBadRequestStatus(t, resp)
  1818  	require.Nil(t, rchannel, "should not return a channel")
  1819  
  1820  	WebSocketClient, err := th.CreateWebSocketClient()
  1821  	require.Nil(t, err)
  1822  	WebSocketClient.Listen()
  1823  
  1824  	publicChannel2 := th.CreatePublicChannel()
  1825  	rchannel, resp = th.SystemAdminClient.ConvertChannelToPrivate(publicChannel2.Id)
  1826  	CheckOKStatus(t, resp)
  1827  	require.Equal(t, model.CHANNEL_PRIVATE, rchannel.Type, "channel should be converted from public to private")
  1828  
  1829  	timeout := time.After(10 * time.Second)
  1830  
  1831  	for {
  1832  		select {
  1833  		case resp := <-WebSocketClient.EventChannel:
  1834  			if resp.EventType() == model.WEBSOCKET_EVENT_CHANNEL_CONVERTED && resp.GetData()["channel_id"].(string) == publicChannel2.Id {
  1835  				return
  1836  			}
  1837  		case <-timeout:
  1838  			require.Fail(t, "timed out waiting for channel_converted event")
  1839  			return
  1840  		}
  1841  	}
  1842  }
  1843  
  1844  func TestUpdateChannelPrivacy(t *testing.T) {
  1845  	th := Setup(t).InitBasic()
  1846  	defer th.TearDown()
  1847  
  1848  	defaultChannel, _ := th.App.GetChannelByName(model.DEFAULT_CHANNEL, th.BasicTeam.Id, false)
  1849  
  1850  	type testTable []struct {
  1851  		name            string
  1852  		channel         *model.Channel
  1853  		expectedPrivacy string
  1854  	}
  1855  
  1856  	t.Run("Should get a forbidden response if not logged in", func(t *testing.T) {
  1857  		privateChannel := th.CreatePrivateChannel()
  1858  		publicChannel := th.CreatePublicChannel()
  1859  
  1860  		tt := testTable{
  1861  			{"Updating default channel should fail with forbidden status if not logged in", defaultChannel, model.CHANNEL_OPEN},
  1862  			{"Updating private channel should fail with forbidden status if not logged in", privateChannel, model.CHANNEL_PRIVATE},
  1863  			{"Updating public channel should fail with forbidden status if not logged in", publicChannel, model.CHANNEL_OPEN},
  1864  		}
  1865  
  1866  		for _, tc := range tt {
  1867  			t.Run(tc.name, func(t *testing.T) {
  1868  				_, resp := th.Client.UpdateChannelPrivacy(tc.channel.Id, tc.expectedPrivacy)
  1869  				CheckForbiddenStatus(t, resp)
  1870  			})
  1871  		}
  1872  	})
  1873  
  1874  	th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) {
  1875  		privateChannel := th.CreatePrivateChannel()
  1876  		publicChannel := th.CreatePublicChannel()
  1877  
  1878  		tt := testTable{
  1879  			{"Converting default channel to private should fail", defaultChannel, model.CHANNEL_PRIVATE},
  1880  			{"Updating privacy to an invalid setting should fail", publicChannel, "invalid"},
  1881  		}
  1882  
  1883  		for _, tc := range tt {
  1884  			t.Run(tc.name, func(t *testing.T) {
  1885  				_, resp := client.UpdateChannelPrivacy(tc.channel.Id, tc.expectedPrivacy)
  1886  				CheckBadRequestStatus(t, resp)
  1887  			})
  1888  		}
  1889  
  1890  		tt = testTable{
  1891  			{"Default channel should stay public", defaultChannel, model.CHANNEL_OPEN},
  1892  			{"Public channel should stay public", publicChannel, model.CHANNEL_OPEN},
  1893  			{"Private channel should stay private", privateChannel, model.CHANNEL_PRIVATE},
  1894  			{"Public channel should convert to private", publicChannel, model.CHANNEL_PRIVATE},
  1895  			{"Private channel should convert to public", privateChannel, model.CHANNEL_OPEN},
  1896  		}
  1897  
  1898  		for _, tc := range tt {
  1899  			t.Run(tc.name, func(t *testing.T) {
  1900  				updatedChannel, resp := client.UpdateChannelPrivacy(tc.channel.Id, tc.expectedPrivacy)
  1901  				CheckNoError(t, resp)
  1902  				assert.Equal(t, tc.expectedPrivacy, updatedChannel.Type)
  1903  				updatedChannel, err := th.App.GetChannel(tc.channel.Id)
  1904  				require.Nil(t, err)
  1905  				assert.Equal(t, tc.expectedPrivacy, updatedChannel.Type)
  1906  			})
  1907  		}
  1908  	})
  1909  
  1910  	t.Run("Enforces convert channel permissions", func(t *testing.T) {
  1911  		privateChannel := th.CreatePrivateChannel()
  1912  		publicChannel := th.CreatePublicChannel()
  1913  
  1914  		th.LoginTeamAdmin()
  1915  
  1916  		th.RemovePermissionFromRole(model.PERMISSION_CONVERT_PUBLIC_CHANNEL_TO_PRIVATE.Id, model.TEAM_ADMIN_ROLE_ID)
  1917  		th.RemovePermissionFromRole(model.PERMISSION_CONVERT_PRIVATE_CHANNEL_TO_PUBLIC.Id, model.TEAM_ADMIN_ROLE_ID)
  1918  
  1919  		_, resp := th.Client.UpdateChannelPrivacy(publicChannel.Id, model.CHANNEL_PRIVATE)
  1920  		CheckForbiddenStatus(t, resp)
  1921  		_, resp = th.Client.UpdateChannelPrivacy(privateChannel.Id, model.CHANNEL_OPEN)
  1922  		CheckForbiddenStatus(t, resp)
  1923  
  1924  		th.AddPermissionToRole(model.PERMISSION_CONVERT_PUBLIC_CHANNEL_TO_PRIVATE.Id, model.TEAM_ADMIN_ROLE_ID)
  1925  		th.AddPermissionToRole(model.PERMISSION_CONVERT_PRIVATE_CHANNEL_TO_PUBLIC.Id, model.TEAM_ADMIN_ROLE_ID)
  1926  
  1927  		_, resp = th.Client.UpdateChannelPrivacy(privateChannel.Id, model.CHANNEL_OPEN)
  1928  		CheckNoError(t, resp)
  1929  		_, resp = th.Client.UpdateChannelPrivacy(publicChannel.Id, model.CHANNEL_PRIVATE)
  1930  		CheckNoError(t, resp)
  1931  	})
  1932  }
  1933  
  1934  func TestRestoreChannel(t *testing.T) {
  1935  	th := Setup(t).InitBasic()
  1936  	defer th.TearDown()
  1937  
  1938  	publicChannel1 := th.CreatePublicChannel()
  1939  	th.Client.DeleteChannel(publicChannel1.Id)
  1940  
  1941  	privateChannel1 := th.CreatePrivateChannel()
  1942  	th.Client.DeleteChannel(privateChannel1.Id)
  1943  
  1944  	_, resp := th.Client.RestoreChannel(publicChannel1.Id)
  1945  	CheckForbiddenStatus(t, resp)
  1946  
  1947  	_, resp = th.Client.RestoreChannel(privateChannel1.Id)
  1948  	CheckForbiddenStatus(t, resp)
  1949  
  1950  	th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) {
  1951  		defer func() {
  1952  			client.DeleteChannel(publicChannel1.Id)
  1953  			client.DeleteChannel(privateChannel1.Id)
  1954  		}()
  1955  
  1956  		_, resp = client.RestoreChannel(publicChannel1.Id)
  1957  		CheckOKStatus(t, resp)
  1958  
  1959  		_, resp = client.RestoreChannel(privateChannel1.Id)
  1960  		CheckOKStatus(t, resp)
  1961  	})
  1962  }
  1963  
  1964  func TestGetChannelByName(t *testing.T) {
  1965  	th := Setup(t).InitBasic()
  1966  	defer th.TearDown()
  1967  	Client := th.Client
  1968  
  1969  	channel, resp := Client.GetChannelByName(th.BasicChannel.Name, th.BasicTeam.Id, "")
  1970  	CheckNoError(t, resp)
  1971  	require.Equal(t, th.BasicChannel.Name, channel.Name, "names did not match")
  1972  
  1973  	channel, resp = Client.GetChannelByName(th.BasicPrivateChannel.Name, th.BasicTeam.Id, "")
  1974  	CheckNoError(t, resp)
  1975  	require.Equal(t, th.BasicPrivateChannel.Name, channel.Name, "names did not match")
  1976  
  1977  	_, resp = Client.GetChannelByName(strings.ToUpper(th.BasicPrivateChannel.Name), th.BasicTeam.Id, "")
  1978  	CheckNoError(t, resp)
  1979  
  1980  	_, resp = Client.GetChannelByName(th.BasicDeletedChannel.Name, th.BasicTeam.Id, "")
  1981  	CheckNotFoundStatus(t, resp)
  1982  
  1983  	channel, resp = Client.GetChannelByNameIncludeDeleted(th.BasicDeletedChannel.Name, th.BasicTeam.Id, "")
  1984  	CheckNoError(t, resp)
  1985  	require.Equal(t, th.BasicDeletedChannel.Name, channel.Name, "names did not match")
  1986  
  1987  	Client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser.Id)
  1988  	_, resp = Client.GetChannelByName(th.BasicChannel.Name, th.BasicTeam.Id, "")
  1989  	CheckNoError(t, resp)
  1990  
  1991  	Client.RemoveUserFromChannel(th.BasicPrivateChannel.Id, th.BasicUser.Id)
  1992  	_, resp = Client.GetChannelByName(th.BasicPrivateChannel.Name, th.BasicTeam.Id, "")
  1993  	CheckNotFoundStatus(t, resp)
  1994  
  1995  	_, resp = Client.GetChannelByName(GenerateTestChannelName(), th.BasicTeam.Id, "")
  1996  	CheckNotFoundStatus(t, resp)
  1997  
  1998  	_, resp = Client.GetChannelByName(GenerateTestChannelName(), "junk", "")
  1999  	CheckBadRequestStatus(t, resp)
  2000  
  2001  	Client.Logout()
  2002  	_, resp = Client.GetChannelByName(th.BasicChannel.Name, th.BasicTeam.Id, "")
  2003  	CheckUnauthorizedStatus(t, resp)
  2004  
  2005  	user := th.CreateUser()
  2006  	Client.Login(user.Email, user.Password)
  2007  	_, resp = Client.GetChannelByName(th.BasicChannel.Name, th.BasicTeam.Id, "")
  2008  	CheckForbiddenStatus(t, resp)
  2009  
  2010  	th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) {
  2011  		_, resp = client.GetChannelByName(th.BasicChannel.Name, th.BasicTeam.Id, "")
  2012  		CheckNoError(t, resp)
  2013  	})
  2014  }
  2015  
  2016  func TestGetChannelByNameForTeamName(t *testing.T) {
  2017  	th := Setup(t).InitBasic()
  2018  	defer th.TearDown()
  2019  	Client := th.Client
  2020  
  2021  	channel, resp := th.SystemAdminClient.GetChannelByNameForTeamName(th.BasicChannel.Name, th.BasicTeam.Name, "")
  2022  	CheckNoError(t, resp)
  2023  	require.Equal(t, th.BasicChannel.Name, channel.Name, "names did not match")
  2024  
  2025  	_, resp = Client.GetChannelByNameForTeamName(th.BasicChannel.Name, th.BasicTeam.Name, "")
  2026  	CheckNoError(t, resp)
  2027  	require.Equal(t, th.BasicChannel.Name, channel.Name, "names did not match")
  2028  
  2029  	channel, resp = Client.GetChannelByNameForTeamName(th.BasicPrivateChannel.Name, th.BasicTeam.Name, "")
  2030  	CheckNoError(t, resp)
  2031  	require.Equal(t, th.BasicPrivateChannel.Name, channel.Name, "names did not match")
  2032  
  2033  	_, resp = Client.GetChannelByNameForTeamName(th.BasicDeletedChannel.Name, th.BasicTeam.Name, "")
  2034  	CheckNotFoundStatus(t, resp)
  2035  
  2036  	channel, resp = Client.GetChannelByNameForTeamNameIncludeDeleted(th.BasicDeletedChannel.Name, th.BasicTeam.Name, "")
  2037  	CheckNoError(t, resp)
  2038  	require.Equal(t, th.BasicDeletedChannel.Name, channel.Name, "names did not match")
  2039  
  2040  	Client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser.Id)
  2041  	_, resp = Client.GetChannelByNameForTeamName(th.BasicChannel.Name, th.BasicTeam.Name, "")
  2042  	CheckNoError(t, resp)
  2043  
  2044  	Client.RemoveUserFromChannel(th.BasicPrivateChannel.Id, th.BasicUser.Id)
  2045  	_, resp = Client.GetChannelByNameForTeamName(th.BasicPrivateChannel.Name, th.BasicTeam.Name, "")
  2046  	CheckNotFoundStatus(t, resp)
  2047  
  2048  	_, resp = Client.GetChannelByNameForTeamName(th.BasicChannel.Name, model.NewRandomString(15), "")
  2049  	CheckNotFoundStatus(t, resp)
  2050  
  2051  	_, resp = Client.GetChannelByNameForTeamName(GenerateTestChannelName(), th.BasicTeam.Name, "")
  2052  	CheckNotFoundStatus(t, resp)
  2053  
  2054  	Client.Logout()
  2055  	_, resp = Client.GetChannelByNameForTeamName(th.BasicChannel.Name, th.BasicTeam.Name, "")
  2056  	CheckUnauthorizedStatus(t, resp)
  2057  
  2058  	user := th.CreateUser()
  2059  	Client.Login(user.Email, user.Password)
  2060  	_, resp = Client.GetChannelByNameForTeamName(th.BasicChannel.Name, th.BasicTeam.Name, "")
  2061  	CheckForbiddenStatus(t, resp)
  2062  }
  2063  
  2064  func TestGetChannelMembers(t *testing.T) {
  2065  	th := Setup(t).InitBasic()
  2066  	defer th.TearDown()
  2067  	th.TestForAllClients(t, func(t *testing.T, client *model.Client4) {
  2068  		members, resp := client.GetChannelMembers(th.BasicChannel.Id, 0, 60, "")
  2069  		CheckNoError(t, resp)
  2070  		require.Len(t, *members, 3, "should only be 3 users in channel")
  2071  
  2072  		members, resp = client.GetChannelMembers(th.BasicChannel.Id, 0, 2, "")
  2073  		CheckNoError(t, resp)
  2074  		require.Len(t, *members, 2, "should only be 2 users")
  2075  
  2076  		members, resp = client.GetChannelMembers(th.BasicChannel.Id, 1, 1, "")
  2077  		CheckNoError(t, resp)
  2078  		require.Len(t, *members, 1, "should only be 1 user")
  2079  
  2080  		members, resp = client.GetChannelMembers(th.BasicChannel.Id, 1000, 100000, "")
  2081  		CheckNoError(t, resp)
  2082  		require.Empty(t, *members, "should be 0 users")
  2083  
  2084  		_, resp = client.GetChannelMembers("junk", 0, 60, "")
  2085  		CheckBadRequestStatus(t, resp)
  2086  
  2087  		_, resp = client.GetChannelMembers("", 0, 60, "")
  2088  		CheckBadRequestStatus(t, resp)
  2089  
  2090  		_, resp = client.GetChannelMembers(th.BasicChannel.Id, 0, 60, "")
  2091  		CheckNoError(t, resp)
  2092  	})
  2093  
  2094  	_, resp := th.Client.GetChannelMembers(model.NewId(), 0, 60, "")
  2095  	CheckForbiddenStatus(t, resp)
  2096  
  2097  	th.Client.Logout()
  2098  	_, resp = th.Client.GetChannelMembers(th.BasicChannel.Id, 0, 60, "")
  2099  	CheckUnauthorizedStatus(t, resp)
  2100  
  2101  	user := th.CreateUser()
  2102  	th.Client.Login(user.Email, user.Password)
  2103  	_, resp = th.Client.GetChannelMembers(th.BasicChannel.Id, 0, 60, "")
  2104  	CheckForbiddenStatus(t, resp)
  2105  }
  2106  
  2107  func TestGetChannelMembersByIds(t *testing.T) {
  2108  	th := Setup(t).InitBasic()
  2109  	defer th.TearDown()
  2110  	Client := th.Client
  2111  
  2112  	cm, resp := Client.GetChannelMembersByIds(th.BasicChannel.Id, []string{th.BasicUser.Id})
  2113  	CheckNoError(t, resp)
  2114  	require.Equal(t, th.BasicUser.Id, (*cm)[0].UserId, "returned wrong user")
  2115  
  2116  	_, resp = Client.GetChannelMembersByIds(th.BasicChannel.Id, []string{})
  2117  	CheckBadRequestStatus(t, resp)
  2118  
  2119  	cm1, resp := Client.GetChannelMembersByIds(th.BasicChannel.Id, []string{"junk"})
  2120  	CheckNoError(t, resp)
  2121  	require.Empty(t, *cm1, "no users should be returned")
  2122  
  2123  	cm1, resp = Client.GetChannelMembersByIds(th.BasicChannel.Id, []string{"junk", th.BasicUser.Id})
  2124  	CheckNoError(t, resp)
  2125  	require.Len(t, *cm1, 1, "1 member should be returned")
  2126  
  2127  	cm1, resp = Client.GetChannelMembersByIds(th.BasicChannel.Id, []string{th.BasicUser2.Id, th.BasicUser.Id})
  2128  	CheckNoError(t, resp)
  2129  	require.Len(t, *cm1, 2, "2 members should be returned")
  2130  
  2131  	_, resp = Client.GetChannelMembersByIds("junk", []string{th.BasicUser.Id})
  2132  	CheckBadRequestStatus(t, resp)
  2133  
  2134  	_, resp = Client.GetChannelMembersByIds(model.NewId(), []string{th.BasicUser.Id})
  2135  	CheckForbiddenStatus(t, resp)
  2136  
  2137  	Client.Logout()
  2138  	_, resp = Client.GetChannelMembersByIds(th.BasicChannel.Id, []string{th.BasicUser.Id})
  2139  	CheckUnauthorizedStatus(t, resp)
  2140  
  2141  	_, resp = th.SystemAdminClient.GetChannelMembersByIds(th.BasicChannel.Id, []string{th.BasicUser2.Id, th.BasicUser.Id})
  2142  	CheckNoError(t, resp)
  2143  }
  2144  
  2145  func TestGetChannelMember(t *testing.T) {
  2146  	th := Setup(t).InitBasic()
  2147  	defer th.TearDown()
  2148  	c := th.Client
  2149  	th.TestForAllClients(t, func(t *testing.T, client *model.Client4) {
  2150  		member, resp := client.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "")
  2151  		CheckNoError(t, resp)
  2152  		require.Equal(t, th.BasicChannel.Id, member.ChannelId, "wrong channel id")
  2153  		require.Equal(t, th.BasicUser.Id, member.UserId, "wrong user id")
  2154  
  2155  		_, resp = client.GetChannelMember("", th.BasicUser.Id, "")
  2156  		CheckNotFoundStatus(t, resp)
  2157  
  2158  		_, resp = client.GetChannelMember("junk", th.BasicUser.Id, "")
  2159  		CheckBadRequestStatus(t, resp)
  2160  		_, resp = client.GetChannelMember(th.BasicChannel.Id, "", "")
  2161  		CheckNotFoundStatus(t, resp)
  2162  
  2163  		_, resp = client.GetChannelMember(th.BasicChannel.Id, "junk", "")
  2164  		CheckBadRequestStatus(t, resp)
  2165  
  2166  		_, resp = client.GetChannelMember(th.BasicChannel.Id, model.NewId(), "")
  2167  		CheckNotFoundStatus(t, resp)
  2168  
  2169  		_, resp = client.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "")
  2170  		CheckNoError(t, resp)
  2171  	})
  2172  
  2173  	_, resp := c.GetChannelMember(model.NewId(), th.BasicUser.Id, "")
  2174  	CheckForbiddenStatus(t, resp)
  2175  
  2176  	c.Logout()
  2177  	_, resp = c.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "")
  2178  	CheckUnauthorizedStatus(t, resp)
  2179  
  2180  	user := th.CreateUser()
  2181  	c.Login(user.Email, user.Password)
  2182  	_, resp = c.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "")
  2183  	CheckForbiddenStatus(t, resp)
  2184  }
  2185  
  2186  func TestGetChannelMembersForUser(t *testing.T) {
  2187  	th := Setup(t).InitBasic()
  2188  	defer th.TearDown()
  2189  	Client := th.Client
  2190  
  2191  	members, resp := Client.GetChannelMembersForUser(th.BasicUser.Id, th.BasicTeam.Id, "")
  2192  	CheckNoError(t, resp)
  2193  	require.Len(t, *members, 6, "should have 6 members on team")
  2194  
  2195  	_, resp = Client.GetChannelMembersForUser("", th.BasicTeam.Id, "")
  2196  	CheckNotFoundStatus(t, resp)
  2197  
  2198  	_, resp = Client.GetChannelMembersForUser("junk", th.BasicTeam.Id, "")
  2199  	CheckBadRequestStatus(t, resp)
  2200  
  2201  	_, resp = Client.GetChannelMembersForUser(model.NewId(), th.BasicTeam.Id, "")
  2202  	CheckForbiddenStatus(t, resp)
  2203  
  2204  	_, resp = Client.GetChannelMembersForUser(th.BasicUser.Id, "", "")
  2205  	CheckNotFoundStatus(t, resp)
  2206  
  2207  	_, resp = Client.GetChannelMembersForUser(th.BasicUser.Id, "junk", "")
  2208  	CheckBadRequestStatus(t, resp)
  2209  
  2210  	_, resp = Client.GetChannelMembersForUser(th.BasicUser.Id, model.NewId(), "")
  2211  	CheckForbiddenStatus(t, resp)
  2212  
  2213  	Client.Logout()
  2214  	_, resp = Client.GetChannelMembersForUser(th.BasicUser.Id, th.BasicTeam.Id, "")
  2215  	CheckUnauthorizedStatus(t, resp)
  2216  
  2217  	user := th.CreateUser()
  2218  	Client.Login(user.Email, user.Password)
  2219  	_, resp = Client.GetChannelMembersForUser(th.BasicUser.Id, th.BasicTeam.Id, "")
  2220  	CheckForbiddenStatus(t, resp)
  2221  
  2222  	_, resp = th.SystemAdminClient.GetChannelMembersForUser(th.BasicUser.Id, th.BasicTeam.Id, "")
  2223  	CheckNoError(t, resp)
  2224  }
  2225  
  2226  func TestViewChannel(t *testing.T) {
  2227  	th := Setup(t).InitBasic()
  2228  	defer th.TearDown()
  2229  	Client := th.Client
  2230  
  2231  	view := &model.ChannelView{
  2232  		ChannelId: th.BasicChannel.Id,
  2233  	}
  2234  
  2235  	viewResp, resp := Client.ViewChannel(th.BasicUser.Id, view)
  2236  	CheckNoError(t, resp)
  2237  	require.Equal(t, "OK", viewResp.Status, "should have passed")
  2238  
  2239  	channel, _ := th.App.GetChannel(th.BasicChannel.Id)
  2240  
  2241  	require.Equal(t, channel.LastPostAt, viewResp.LastViewedAtTimes[channel.Id], "LastPostAt does not match returned LastViewedAt time")
  2242  
  2243  	view.PrevChannelId = th.BasicChannel.Id
  2244  	_, resp = Client.ViewChannel(th.BasicUser.Id, view)
  2245  	CheckNoError(t, resp)
  2246  
  2247  	view.PrevChannelId = ""
  2248  	_, resp = Client.ViewChannel(th.BasicUser.Id, view)
  2249  	CheckNoError(t, resp)
  2250  
  2251  	view.PrevChannelId = "junk"
  2252  	_, resp = Client.ViewChannel(th.BasicUser.Id, view)
  2253  	CheckBadRequestStatus(t, resp)
  2254  
  2255  	// All blank is OK we use it for clicking off of the browser.
  2256  	view.PrevChannelId = ""
  2257  	view.ChannelId = ""
  2258  	_, resp = Client.ViewChannel(th.BasicUser.Id, view)
  2259  	CheckNoError(t, resp)
  2260  
  2261  	view.PrevChannelId = ""
  2262  	view.ChannelId = "junk"
  2263  	_, resp = Client.ViewChannel(th.BasicUser.Id, view)
  2264  	CheckBadRequestStatus(t, resp)
  2265  
  2266  	view.ChannelId = "correctlysizedjunkdddfdfdf"
  2267  	_, resp = Client.ViewChannel(th.BasicUser.Id, view)
  2268  	CheckBadRequestStatus(t, resp)
  2269  	view.ChannelId = th.BasicChannel.Id
  2270  
  2271  	member, resp := Client.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "")
  2272  	CheckNoError(t, resp)
  2273  	channel, resp = Client.GetChannel(th.BasicChannel.Id, "")
  2274  	CheckNoError(t, resp)
  2275  	require.Equal(t, channel.TotalMsgCount, member.MsgCount, "should match message counts")
  2276  	require.Equal(t, int64(0), member.MentionCount, "should have no mentions")
  2277  	require.Equal(t, int64(0), member.MentionCountRoot, "should have no mentions")
  2278  
  2279  	_, resp = Client.ViewChannel("junk", view)
  2280  	CheckBadRequestStatus(t, resp)
  2281  
  2282  	_, resp = Client.ViewChannel(th.BasicUser2.Id, view)
  2283  	CheckForbiddenStatus(t, resp)
  2284  
  2285  	r, err := Client.DoApiPost(fmt.Sprintf("/channels/members/%v/view", th.BasicUser.Id), "garbage")
  2286  	require.NotNil(t, err)
  2287  	require.Equal(t, http.StatusBadRequest, r.StatusCode)
  2288  
  2289  	Client.Logout()
  2290  	_, resp = Client.ViewChannel(th.BasicUser.Id, view)
  2291  	CheckUnauthorizedStatus(t, resp)
  2292  
  2293  	_, resp = th.SystemAdminClient.ViewChannel(th.BasicUser.Id, view)
  2294  	CheckNoError(t, resp)
  2295  }
  2296  
  2297  func TestGetChannelUnread(t *testing.T) {
  2298  	th := Setup(t).InitBasic()
  2299  	defer th.TearDown()
  2300  	Client := th.Client
  2301  	user := th.BasicUser
  2302  	channel := th.BasicChannel
  2303  
  2304  	channelUnread, resp := Client.GetChannelUnread(channel.Id, user.Id)
  2305  	CheckNoError(t, resp)
  2306  	require.Equal(t, th.BasicTeam.Id, channelUnread.TeamId, "wrong team id returned for a regular user call")
  2307  	require.Equal(t, channel.Id, channelUnread.ChannelId, "wrong team id returned for a regular user call")
  2308  
  2309  	_, resp = Client.GetChannelUnread("junk", user.Id)
  2310  	CheckBadRequestStatus(t, resp)
  2311  
  2312  	_, resp = Client.GetChannelUnread(channel.Id, "junk")
  2313  	CheckBadRequestStatus(t, resp)
  2314  
  2315  	_, resp = Client.GetChannelUnread(channel.Id, model.NewId())
  2316  	CheckForbiddenStatus(t, resp)
  2317  
  2318  	_, resp = Client.GetChannelUnread(model.NewId(), user.Id)
  2319  	CheckForbiddenStatus(t, resp)
  2320  
  2321  	newUser := th.CreateUser()
  2322  	Client.Login(newUser.Email, newUser.Password)
  2323  	_, resp = Client.GetChannelUnread(th.BasicChannel.Id, user.Id)
  2324  	CheckForbiddenStatus(t, resp)
  2325  
  2326  	Client.Logout()
  2327  
  2328  	_, resp = th.SystemAdminClient.GetChannelUnread(channel.Id, user.Id)
  2329  	CheckNoError(t, resp)
  2330  
  2331  	_, resp = th.SystemAdminClient.GetChannelUnread(model.NewId(), user.Id)
  2332  	CheckForbiddenStatus(t, resp)
  2333  
  2334  	_, resp = th.SystemAdminClient.GetChannelUnread(channel.Id, model.NewId())
  2335  	CheckNotFoundStatus(t, resp)
  2336  }
  2337  
  2338  func TestGetChannelStats(t *testing.T) {
  2339  	th := Setup(t).InitBasic()
  2340  	defer th.TearDown()
  2341  	Client := th.Client
  2342  	channel := th.CreatePrivateChannel()
  2343  
  2344  	stats, resp := Client.GetChannelStats(channel.Id, "")
  2345  	CheckNoError(t, resp)
  2346  
  2347  	require.Equal(t, channel.Id, stats.ChannelId, "couldnt't get extra info")
  2348  	require.Equal(t, int64(1), stats.MemberCount, "got incorrect member count")
  2349  	require.Equal(t, int64(0), stats.PinnedPostCount, "got incorrect pinned post count")
  2350  
  2351  	th.CreatePinnedPostWithClient(th.Client, channel)
  2352  	stats, resp = Client.GetChannelStats(channel.Id, "")
  2353  	CheckNoError(t, resp)
  2354  	require.Equal(t, int64(1), stats.PinnedPostCount, "should have returned 1 pinned post count")
  2355  
  2356  	_, resp = Client.GetChannelStats("junk", "")
  2357  	CheckBadRequestStatus(t, resp)
  2358  
  2359  	_, resp = Client.GetChannelStats(model.NewId(), "")
  2360  	CheckForbiddenStatus(t, resp)
  2361  
  2362  	Client.Logout()
  2363  	_, resp = Client.GetChannelStats(channel.Id, "")
  2364  	CheckUnauthorizedStatus(t, resp)
  2365  
  2366  	th.LoginBasic2()
  2367  
  2368  	_, resp = Client.GetChannelStats(channel.Id, "")
  2369  	CheckForbiddenStatus(t, resp)
  2370  
  2371  	_, resp = th.SystemAdminClient.GetChannelStats(channel.Id, "")
  2372  	CheckNoError(t, resp)
  2373  }
  2374  
  2375  func TestGetPinnedPosts(t *testing.T) {
  2376  	th := Setup(t).InitBasic()
  2377  	defer th.TearDown()
  2378  	Client := th.Client
  2379  	channel := th.BasicChannel
  2380  
  2381  	posts, resp := Client.GetPinnedPosts(channel.Id, "")
  2382  	CheckNoError(t, resp)
  2383  	require.Empty(t, posts.Posts, "should not have gotten a pinned post")
  2384  
  2385  	pinnedPost := th.CreatePinnedPost()
  2386  	posts, resp = Client.GetPinnedPosts(channel.Id, "")
  2387  	CheckNoError(t, resp)
  2388  	require.Len(t, posts.Posts, 1, "should have returned 1 pinned post")
  2389  	require.Contains(t, posts.Posts, pinnedPost.Id, "missing pinned post")
  2390  
  2391  	posts, resp = Client.GetPinnedPosts(channel.Id, resp.Etag)
  2392  	CheckEtag(t, posts, resp)
  2393  
  2394  	_, resp = Client.GetPinnedPosts(GenerateTestId(), "")
  2395  	CheckForbiddenStatus(t, resp)
  2396  
  2397  	_, resp = Client.GetPinnedPosts("junk", "")
  2398  	CheckBadRequestStatus(t, resp)
  2399  
  2400  	Client.Logout()
  2401  	_, resp = Client.GetPinnedPosts(channel.Id, "")
  2402  	CheckUnauthorizedStatus(t, resp)
  2403  
  2404  	_, resp = th.SystemAdminClient.GetPinnedPosts(channel.Id, "")
  2405  	CheckNoError(t, resp)
  2406  }
  2407  
  2408  func TestUpdateChannelRoles(t *testing.T) {
  2409  	th := Setup(t).InitBasic()
  2410  	defer th.TearDown()
  2411  	Client := th.Client
  2412  
  2413  	const ChannelAdmin = "channel_user channel_admin"
  2414  	const ChannelMember = "channel_user"
  2415  
  2416  	// User 1 creates a channel, making them channel admin by default.
  2417  	channel := th.CreatePublicChannel()
  2418  
  2419  	// Adds User 2 to the channel, making them a channel member by default.
  2420  	th.App.AddUserToChannel(th.BasicUser2, channel, false)
  2421  
  2422  	// User 1 promotes User 2
  2423  	pass, resp := Client.UpdateChannelRoles(channel.Id, th.BasicUser2.Id, ChannelAdmin)
  2424  	CheckNoError(t, resp)
  2425  	require.True(t, pass, "should have passed")
  2426  
  2427  	member, resp := Client.GetChannelMember(channel.Id, th.BasicUser2.Id, "")
  2428  	CheckNoError(t, resp)
  2429  	require.Equal(t, ChannelAdmin, member.Roles, "roles don't match")
  2430  
  2431  	// User 1 demotes User 2
  2432  	_, resp = Client.UpdateChannelRoles(channel.Id, th.BasicUser2.Id, ChannelMember)
  2433  	CheckNoError(t, resp)
  2434  
  2435  	th.LoginBasic2()
  2436  
  2437  	// User 2 cannot demote User 1
  2438  	_, resp = Client.UpdateChannelRoles(channel.Id, th.BasicUser.Id, ChannelMember)
  2439  	CheckForbiddenStatus(t, resp)
  2440  
  2441  	// User 2 cannot promote self
  2442  	_, resp = Client.UpdateChannelRoles(channel.Id, th.BasicUser2.Id, ChannelAdmin)
  2443  	CheckForbiddenStatus(t, resp)
  2444  
  2445  	th.LoginBasic()
  2446  
  2447  	// User 1 demotes self
  2448  	_, resp = Client.UpdateChannelRoles(channel.Id, th.BasicUser.Id, ChannelMember)
  2449  	CheckNoError(t, resp)
  2450  
  2451  	// System Admin promotes User 1
  2452  	_, resp = th.SystemAdminClient.UpdateChannelRoles(channel.Id, th.BasicUser.Id, ChannelAdmin)
  2453  	CheckNoError(t, resp)
  2454  
  2455  	// System Admin demotes User 1
  2456  	_, resp = th.SystemAdminClient.UpdateChannelRoles(channel.Id, th.BasicUser.Id, ChannelMember)
  2457  	CheckNoError(t, resp)
  2458  
  2459  	// System Admin promotes User 1
  2460  	_, resp = th.SystemAdminClient.UpdateChannelRoles(channel.Id, th.BasicUser.Id, ChannelAdmin)
  2461  	CheckNoError(t, resp)
  2462  
  2463  	th.LoginBasic()
  2464  
  2465  	_, resp = Client.UpdateChannelRoles(channel.Id, th.BasicUser.Id, "junk")
  2466  	CheckBadRequestStatus(t, resp)
  2467  
  2468  	_, resp = Client.UpdateChannelRoles(channel.Id, "junk", ChannelMember)
  2469  	CheckBadRequestStatus(t, resp)
  2470  
  2471  	_, resp = Client.UpdateChannelRoles("junk", th.BasicUser.Id, ChannelMember)
  2472  	CheckBadRequestStatus(t, resp)
  2473  
  2474  	_, resp = Client.UpdateChannelRoles(channel.Id, model.NewId(), ChannelMember)
  2475  	CheckNotFoundStatus(t, resp)
  2476  
  2477  	_, resp = Client.UpdateChannelRoles(model.NewId(), th.BasicUser.Id, ChannelMember)
  2478  	CheckForbiddenStatus(t, resp)
  2479  }
  2480  
  2481  func TestUpdateChannelMemberSchemeRoles(t *testing.T) {
  2482  	th := Setup(t).InitBasic()
  2483  	defer th.TearDown()
  2484  	SystemAdminClient := th.SystemAdminClient
  2485  	WebSocketClient, err := th.CreateWebSocketClient()
  2486  	WebSocketClient.Listen()
  2487  	require.Nil(t, err)
  2488  
  2489  	th.LoginBasic()
  2490  
  2491  	s1 := &model.SchemeRoles{
  2492  		SchemeAdmin: false,
  2493  		SchemeUser:  false,
  2494  		SchemeGuest: false,
  2495  	}
  2496  	_, r1 := SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s1)
  2497  	CheckNoError(t, r1)
  2498  
  2499  	timeout := time.After(600 * time.Millisecond)
  2500  	waiting := true
  2501  	for waiting {
  2502  		select {
  2503  		case event := <-WebSocketClient.EventChannel:
  2504  			if event.Event == model.WEBSOCKET_EVENT_CHANNEL_MEMBER_UPDATED {
  2505  				require.Equal(t, model.WEBSOCKET_EVENT_CHANNEL_MEMBER_UPDATED, event.Event)
  2506  				waiting = false
  2507  			}
  2508  		case <-timeout:
  2509  			require.Fail(t, "Should have received event channel member websocket event and not timedout")
  2510  			waiting = false
  2511  		}
  2512  	}
  2513  
  2514  	tm1, rtm1 := SystemAdminClient.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "")
  2515  	CheckNoError(t, rtm1)
  2516  	assert.Equal(t, false, tm1.SchemeGuest)
  2517  	assert.Equal(t, false, tm1.SchemeUser)
  2518  	assert.Equal(t, false, tm1.SchemeAdmin)
  2519  
  2520  	s2 := &model.SchemeRoles{
  2521  		SchemeAdmin: false,
  2522  		SchemeUser:  true,
  2523  		SchemeGuest: false,
  2524  	}
  2525  	_, r2 := SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s2)
  2526  	CheckNoError(t, r2)
  2527  
  2528  	tm2, rtm2 := SystemAdminClient.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "")
  2529  	CheckNoError(t, rtm2)
  2530  	assert.Equal(t, false, tm2.SchemeGuest)
  2531  	assert.Equal(t, true, tm2.SchemeUser)
  2532  	assert.Equal(t, false, tm2.SchemeAdmin)
  2533  
  2534  	s3 := &model.SchemeRoles{
  2535  		SchemeAdmin: true,
  2536  		SchemeUser:  false,
  2537  		SchemeGuest: false,
  2538  	}
  2539  	_, r3 := SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s3)
  2540  	CheckNoError(t, r3)
  2541  
  2542  	tm3, rtm3 := SystemAdminClient.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "")
  2543  	CheckNoError(t, rtm3)
  2544  	assert.Equal(t, false, tm3.SchemeGuest)
  2545  	assert.Equal(t, false, tm3.SchemeUser)
  2546  	assert.Equal(t, true, tm3.SchemeAdmin)
  2547  
  2548  	s4 := &model.SchemeRoles{
  2549  		SchemeAdmin: true,
  2550  		SchemeUser:  true,
  2551  		SchemeGuest: false,
  2552  	}
  2553  	_, r4 := SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s4)
  2554  	CheckNoError(t, r4)
  2555  
  2556  	tm4, rtm4 := SystemAdminClient.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "")
  2557  	CheckNoError(t, rtm4)
  2558  	assert.Equal(t, false, tm4.SchemeGuest)
  2559  	assert.Equal(t, true, tm4.SchemeUser)
  2560  	assert.Equal(t, true, tm4.SchemeAdmin)
  2561  
  2562  	s5 := &model.SchemeRoles{
  2563  		SchemeAdmin: false,
  2564  		SchemeUser:  false,
  2565  		SchemeGuest: true,
  2566  	}
  2567  	_, r5 := SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s5)
  2568  	CheckNoError(t, r5)
  2569  
  2570  	tm5, rtm5 := SystemAdminClient.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "")
  2571  	CheckNoError(t, rtm5)
  2572  	assert.Equal(t, true, tm5.SchemeGuest)
  2573  	assert.Equal(t, false, tm5.SchemeUser)
  2574  	assert.Equal(t, false, tm5.SchemeAdmin)
  2575  
  2576  	s6 := &model.SchemeRoles{
  2577  		SchemeAdmin: false,
  2578  		SchemeUser:  true,
  2579  		SchemeGuest: true,
  2580  	}
  2581  	_, resp := SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s6)
  2582  	CheckBadRequestStatus(t, resp)
  2583  
  2584  	_, resp = SystemAdminClient.UpdateChannelMemberSchemeRoles(model.NewId(), th.BasicUser.Id, s4)
  2585  	CheckForbiddenStatus(t, resp)
  2586  
  2587  	_, resp = SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, model.NewId(), s4)
  2588  	CheckNotFoundStatus(t, resp)
  2589  
  2590  	_, resp = SystemAdminClient.UpdateChannelMemberSchemeRoles("ASDF", th.BasicUser.Id, s4)
  2591  	CheckBadRequestStatus(t, resp)
  2592  
  2593  	_, resp = SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, "ASDF", s4)
  2594  	CheckBadRequestStatus(t, resp)
  2595  
  2596  	th.LoginBasic2()
  2597  	_, resp = th.Client.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s4)
  2598  	CheckForbiddenStatus(t, resp)
  2599  
  2600  	SystemAdminClient.Logout()
  2601  	_, resp = SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.SystemAdminUser.Id, s4)
  2602  	CheckUnauthorizedStatus(t, resp)
  2603  }
  2604  
  2605  func TestUpdateChannelNotifyProps(t *testing.T) {
  2606  	th := Setup(t).InitBasic()
  2607  	defer th.TearDown()
  2608  	Client := th.Client
  2609  
  2610  	props := map[string]string{}
  2611  	props[model.DESKTOP_NOTIFY_PROP] = model.CHANNEL_NOTIFY_MENTION
  2612  	props[model.MARK_UNREAD_NOTIFY_PROP] = model.CHANNEL_MARK_UNREAD_MENTION
  2613  
  2614  	pass, resp := Client.UpdateChannelNotifyProps(th.BasicChannel.Id, th.BasicUser.Id, props)
  2615  	CheckNoError(t, resp)
  2616  	require.True(t, pass, "should have passed")
  2617  
  2618  	member, err := th.App.GetChannelMember(context.Background(), th.BasicChannel.Id, th.BasicUser.Id)
  2619  	require.Nil(t, err)
  2620  	require.Equal(t, model.CHANNEL_NOTIFY_MENTION, member.NotifyProps[model.DESKTOP_NOTIFY_PROP], "bad update")
  2621  	require.Equal(t, model.CHANNEL_MARK_UNREAD_MENTION, member.NotifyProps[model.MARK_UNREAD_NOTIFY_PROP], "bad update")
  2622  
  2623  	_, resp = Client.UpdateChannelNotifyProps("junk", th.BasicUser.Id, props)
  2624  	CheckBadRequestStatus(t, resp)
  2625  
  2626  	_, resp = Client.UpdateChannelNotifyProps(th.BasicChannel.Id, "junk", props)
  2627  	CheckBadRequestStatus(t, resp)
  2628  
  2629  	_, resp = Client.UpdateChannelNotifyProps(model.NewId(), th.BasicUser.Id, props)
  2630  	CheckNotFoundStatus(t, resp)
  2631  
  2632  	_, resp = Client.UpdateChannelNotifyProps(th.BasicChannel.Id, model.NewId(), props)
  2633  	CheckForbiddenStatus(t, resp)
  2634  
  2635  	_, resp = Client.UpdateChannelNotifyProps(th.BasicChannel.Id, th.BasicUser.Id, map[string]string{})
  2636  	CheckNoError(t, resp)
  2637  
  2638  	Client.Logout()
  2639  	_, resp = Client.UpdateChannelNotifyProps(th.BasicChannel.Id, th.BasicUser.Id, props)
  2640  	CheckUnauthorizedStatus(t, resp)
  2641  
  2642  	_, resp = th.SystemAdminClient.UpdateChannelNotifyProps(th.BasicChannel.Id, th.BasicUser.Id, props)
  2643  	CheckNoError(t, resp)
  2644  }
  2645  
  2646  func TestAddChannelMember(t *testing.T) {
  2647  	th := Setup(t).InitBasic()
  2648  	defer th.TearDown()
  2649  	Client := th.Client
  2650  	user := th.BasicUser
  2651  	user2 := th.BasicUser2
  2652  	team := th.BasicTeam
  2653  	publicChannel := th.CreatePublicChannel()
  2654  	privateChannel := th.CreatePrivateChannel()
  2655  
  2656  	user3 := th.CreateUserWithClient(th.SystemAdminClient)
  2657  	_, resp := th.SystemAdminClient.AddTeamMember(team.Id, user3.Id)
  2658  	CheckNoError(t, resp)
  2659  
  2660  	cm, resp := Client.AddChannelMember(publicChannel.Id, user2.Id)
  2661  	CheckNoError(t, resp)
  2662  	CheckCreatedStatus(t, resp)
  2663  	require.Equal(t, publicChannel.Id, cm.ChannelId, "should have returned exact channel")
  2664  	require.Equal(t, user2.Id, cm.UserId, "should have returned exact user added to public channel")
  2665  
  2666  	cm, resp = Client.AddChannelMember(privateChannel.Id, user2.Id)
  2667  	CheckNoError(t, resp)
  2668  	require.Equal(t, privateChannel.Id, cm.ChannelId, "should have returned exact channel")
  2669  	require.Equal(t, user2.Id, cm.UserId, "should have returned exact user added to private channel")
  2670  
  2671  	post := &model.Post{ChannelId: publicChannel.Id, Message: "a" + GenerateTestId() + "a"}
  2672  	rpost, err := Client.CreatePost(post)
  2673  	require.NotNil(t, err)
  2674  
  2675  	Client.RemoveUserFromChannel(publicChannel.Id, user.Id)
  2676  	_, resp = Client.AddChannelMemberWithRootId(publicChannel.Id, user.Id, rpost.Id)
  2677  	CheckNoError(t, resp)
  2678  	CheckCreatedStatus(t, resp)
  2679  
  2680  	Client.RemoveUserFromChannel(publicChannel.Id, user.Id)
  2681  	_, resp = Client.AddChannelMemberWithRootId(publicChannel.Id, user.Id, "junk")
  2682  	CheckBadRequestStatus(t, resp)
  2683  
  2684  	_, resp = Client.AddChannelMemberWithRootId(publicChannel.Id, user.Id, GenerateTestId())
  2685  	CheckNotFoundStatus(t, resp)
  2686  
  2687  	Client.RemoveUserFromChannel(publicChannel.Id, user.Id)
  2688  	_, resp = Client.AddChannelMember(publicChannel.Id, user.Id)
  2689  	CheckNoError(t, resp)
  2690  
  2691  	cm, resp = Client.AddChannelMember(publicChannel.Id, "junk")
  2692  	CheckBadRequestStatus(t, resp)
  2693  	require.Nil(t, cm, "should return nothing")
  2694  
  2695  	_, resp = Client.AddChannelMember(publicChannel.Id, GenerateTestId())
  2696  	CheckNotFoundStatus(t, resp)
  2697  
  2698  	_, resp = Client.AddChannelMember("junk", user2.Id)
  2699  	CheckBadRequestStatus(t, resp)
  2700  
  2701  	_, resp = Client.AddChannelMember(GenerateTestId(), user2.Id)
  2702  	CheckNotFoundStatus(t, resp)
  2703  
  2704  	otherUser := th.CreateUser()
  2705  	otherChannel := th.CreatePublicChannel()
  2706  	Client.Logout()
  2707  	Client.Login(user2.Id, user2.Password)
  2708  
  2709  	_, resp = Client.AddChannelMember(publicChannel.Id, otherUser.Id)
  2710  	CheckUnauthorizedStatus(t, resp)
  2711  
  2712  	_, resp = Client.AddChannelMember(privateChannel.Id, otherUser.Id)
  2713  	CheckUnauthorizedStatus(t, resp)
  2714  
  2715  	_, resp = Client.AddChannelMember(otherChannel.Id, otherUser.Id)
  2716  	CheckUnauthorizedStatus(t, resp)
  2717  
  2718  	Client.Logout()
  2719  	Client.Login(user.Id, user.Password)
  2720  
  2721  	// should fail adding user who is not a member of the team
  2722  	_, resp = Client.AddChannelMember(otherChannel.Id, otherUser.Id)
  2723  	CheckUnauthorizedStatus(t, resp)
  2724  
  2725  	Client.DeleteChannel(otherChannel.Id)
  2726  
  2727  	// should fail adding user to a deleted channel
  2728  	_, resp = Client.AddChannelMember(otherChannel.Id, user2.Id)
  2729  	CheckUnauthorizedStatus(t, resp)
  2730  
  2731  	Client.Logout()
  2732  	_, resp = Client.AddChannelMember(publicChannel.Id, user2.Id)
  2733  	CheckUnauthorizedStatus(t, resp)
  2734  
  2735  	_, resp = Client.AddChannelMember(privateChannel.Id, user2.Id)
  2736  	CheckUnauthorizedStatus(t, resp)
  2737  
  2738  	th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) {
  2739  		_, resp = client.AddChannelMember(publicChannel.Id, user2.Id)
  2740  		CheckNoError(t, resp)
  2741  
  2742  		_, resp = client.AddChannelMember(privateChannel.Id, user2.Id)
  2743  		CheckNoError(t, resp)
  2744  	})
  2745  
  2746  	// Check the appropriate permissions are enforced.
  2747  	defaultRolePermissions := th.SaveDefaultRolePermissions()
  2748  	defer func() {
  2749  		th.RestoreDefaultRolePermissions(defaultRolePermissions)
  2750  	}()
  2751  
  2752  	th.AddPermissionToRole(model.PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS.Id, model.CHANNEL_USER_ROLE_ID)
  2753  
  2754  	// Check that a regular channel user can add other users.
  2755  	Client.Login(user2.Username, user2.Password)
  2756  	privateChannel = th.CreatePrivateChannel()
  2757  	_, resp = Client.AddChannelMember(privateChannel.Id, user.Id)
  2758  	CheckNoError(t, resp)
  2759  	Client.Logout()
  2760  
  2761  	Client.Login(user.Username, user.Password)
  2762  	_, resp = Client.AddChannelMember(privateChannel.Id, user3.Id)
  2763  	CheckNoError(t, resp)
  2764  	Client.Logout()
  2765  
  2766  	// Restrict the permission for adding users to Channel Admins
  2767  	th.AddPermissionToRole(model.PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS.Id, model.CHANNEL_ADMIN_ROLE_ID)
  2768  	th.RemovePermissionFromRole(model.PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS.Id, model.CHANNEL_USER_ROLE_ID)
  2769  
  2770  	Client.Login(user2.Username, user2.Password)
  2771  	privateChannel = th.CreatePrivateChannel()
  2772  	_, resp = Client.AddChannelMember(privateChannel.Id, user.Id)
  2773  	CheckNoError(t, resp)
  2774  	Client.Logout()
  2775  
  2776  	Client.Login(user.Username, user.Password)
  2777  	_, resp = Client.AddChannelMember(privateChannel.Id, user3.Id)
  2778  	CheckForbiddenStatus(t, resp)
  2779  	Client.Logout()
  2780  
  2781  	th.MakeUserChannelAdmin(user, privateChannel)
  2782  	th.App.Srv().InvalidateAllCaches()
  2783  
  2784  	Client.Login(user.Username, user.Password)
  2785  	_, resp = Client.AddChannelMember(privateChannel.Id, user3.Id)
  2786  	CheckNoError(t, resp)
  2787  	Client.Logout()
  2788  
  2789  	// Set a channel to group-constrained
  2790  	privateChannel.GroupConstrained = model.NewBool(true)
  2791  	_, appErr := th.App.UpdateChannel(privateChannel)
  2792  	require.Nil(t, appErr)
  2793  
  2794  	th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) {
  2795  		// User is not in associated groups so shouldn't be allowed
  2796  		_, resp = client.AddChannelMember(privateChannel.Id, user.Id)
  2797  		CheckErrorMessage(t, resp, "api.channel.add_members.user_denied")
  2798  	})
  2799  
  2800  	// Associate group to team
  2801  	_, appErr = th.App.UpsertGroupSyncable(&model.GroupSyncable{
  2802  		GroupId:    th.Group.Id,
  2803  		SyncableId: privateChannel.Id,
  2804  		Type:       model.GroupSyncableTypeChannel,
  2805  	})
  2806  	require.Nil(t, appErr)
  2807  
  2808  	// Add user to group
  2809  	_, appErr = th.App.UpsertGroupMember(th.Group.Id, user.Id)
  2810  	require.Nil(t, appErr)
  2811  
  2812  	th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) {
  2813  		_, resp = client.AddChannelMember(privateChannel.Id, user.Id)
  2814  		CheckNoError(t, resp)
  2815  	})
  2816  }
  2817  
  2818  func TestAddChannelMemberAddMyself(t *testing.T) {
  2819  	th := Setup(t).InitBasic()
  2820  	defer th.TearDown()
  2821  	Client := th.Client
  2822  	user := th.CreateUser()
  2823  	th.LinkUserToTeam(user, th.BasicTeam)
  2824  	notMemberPublicChannel1 := th.CreatePublicChannel()
  2825  	notMemberPublicChannel2 := th.CreatePublicChannel()
  2826  	notMemberPrivateChannel := th.CreatePrivateChannel()
  2827  
  2828  	memberPublicChannel := th.CreatePublicChannel()
  2829  	memberPrivateChannel := th.CreatePrivateChannel()
  2830  	th.AddUserToChannel(user, memberPublicChannel)
  2831  	th.AddUserToChannel(user, memberPrivateChannel)
  2832  
  2833  	testCases := []struct {
  2834  		Name                     string
  2835  		Channel                  *model.Channel
  2836  		WithJoinPublicPermission bool
  2837  		ExpectedError            string
  2838  	}{
  2839  		{
  2840  			"Add myself to a public channel with JOIN_PUBLIC_CHANNEL permission",
  2841  			notMemberPublicChannel1,
  2842  			true,
  2843  			"",
  2844  		},
  2845  		{
  2846  			"Try to add myself to a private channel with the JOIN_PUBLIC_CHANNEL permission",
  2847  			notMemberPrivateChannel,
  2848  			true,
  2849  			"api.context.permissions.app_error",
  2850  		},
  2851  		{
  2852  			"Try to add myself to a public channel without the JOIN_PUBLIC_CHANNEL permission",
  2853  			notMemberPublicChannel2,
  2854  			false,
  2855  			"api.context.permissions.app_error",
  2856  		},
  2857  		{
  2858  			"Add myself a public channel where I'm already a member, not having JOIN_PUBLIC_CHANNEL or MANAGE MEMBERS permission",
  2859  			memberPublicChannel,
  2860  			false,
  2861  			"",
  2862  		},
  2863  		{
  2864  			"Add myself a private channel where I'm already a member, not having JOIN_PUBLIC_CHANNEL or MANAGE MEMBERS permission",
  2865  			memberPrivateChannel,
  2866  			false,
  2867  			"",
  2868  		},
  2869  	}
  2870  	Client.Login(user.Email, user.Password)
  2871  	for _, tc := range testCases {
  2872  		t.Run(tc.Name, func(t *testing.T) {
  2873  
  2874  			// Check the appropriate permissions are enforced.
  2875  			defaultRolePermissions := th.SaveDefaultRolePermissions()
  2876  			defer func() {
  2877  				th.RestoreDefaultRolePermissions(defaultRolePermissions)
  2878  			}()
  2879  
  2880  			if !tc.WithJoinPublicPermission {
  2881  				th.RemovePermissionFromRole(model.PERMISSION_JOIN_PUBLIC_CHANNELS.Id, model.TEAM_USER_ROLE_ID)
  2882  			}
  2883  
  2884  			_, resp := Client.AddChannelMember(tc.Channel.Id, user.Id)
  2885  			if tc.ExpectedError == "" {
  2886  				CheckNoError(t, resp)
  2887  			} else {
  2888  				CheckErrorMessage(t, resp, tc.ExpectedError)
  2889  			}
  2890  		})
  2891  	}
  2892  }
  2893  
  2894  func TestRemoveChannelMember(t *testing.T) {
  2895  	th := Setup(t).InitBasic()
  2896  	user1 := th.BasicUser
  2897  	user2 := th.BasicUser2
  2898  	team := th.BasicTeam
  2899  	defer th.TearDown()
  2900  	Client := th.Client
  2901  
  2902  	th.App.UpdateConfig(func(cfg *model.Config) {
  2903  		*cfg.ServiceSettings.EnableBotAccountCreation = true
  2904  	})
  2905  	bot := th.CreateBotWithSystemAdminClient()
  2906  	th.App.AddUserToTeam(th.Context, team.Id, bot.UserId, "")
  2907  
  2908  	pass, resp := Client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser2.Id)
  2909  	CheckNoError(t, resp)
  2910  	require.True(t, pass, "should have passed")
  2911  
  2912  	_, resp = Client.RemoveUserFromChannel(th.BasicChannel.Id, "junk")
  2913  	CheckBadRequestStatus(t, resp)
  2914  
  2915  	_, resp = Client.RemoveUserFromChannel(th.BasicChannel.Id, model.NewId())
  2916  	CheckNotFoundStatus(t, resp)
  2917  
  2918  	_, resp = Client.RemoveUserFromChannel(model.NewId(), th.BasicUser2.Id)
  2919  	CheckNotFoundStatus(t, resp)
  2920  
  2921  	th.LoginBasic2()
  2922  	_, resp = Client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser.Id)
  2923  	CheckForbiddenStatus(t, resp)
  2924  
  2925  	t.Run("success", func(t *testing.T) {
  2926  		// Setup the system administrator to listen for websocket events from the channels.
  2927  		th.LinkUserToTeam(th.SystemAdminUser, th.BasicTeam)
  2928  		_, err := th.App.AddUserToChannel(th.SystemAdminUser, th.BasicChannel, false)
  2929  		require.Nil(t, err)
  2930  		_, err = th.App.AddUserToChannel(th.SystemAdminUser, th.BasicChannel2, false)
  2931  		require.Nil(t, err)
  2932  		props := map[string]string{}
  2933  		props[model.DESKTOP_NOTIFY_PROP] = model.CHANNEL_NOTIFY_ALL
  2934  		_, resp = th.SystemAdminClient.UpdateChannelNotifyProps(th.BasicChannel.Id, th.SystemAdminUser.Id, props)
  2935  		_, resp = th.SystemAdminClient.UpdateChannelNotifyProps(th.BasicChannel2.Id, th.SystemAdminUser.Id, props)
  2936  		CheckNoError(t, resp)
  2937  
  2938  		wsClient, err := th.CreateWebSocketSystemAdminClient()
  2939  		require.Nil(t, err)
  2940  		wsClient.Listen()
  2941  		var closeWsClient sync.Once
  2942  		defer closeWsClient.Do(func() {
  2943  			wsClient.Close()
  2944  		})
  2945  
  2946  		wsr := <-wsClient.EventChannel
  2947  		require.Equal(t, model.WEBSOCKET_EVENT_HELLO, wsr.EventType())
  2948  
  2949  		// requirePost listens for websocket events and tries to find the post matching
  2950  		// the expected post's channel and message.
  2951  		requirePost := func(expectedPost *model.Post) {
  2952  			t.Helper()
  2953  			for {
  2954  				select {
  2955  				case event := <-wsClient.EventChannel:
  2956  					postData, ok := event.GetData()["post"]
  2957  					if !ok {
  2958  						continue
  2959  					}
  2960  
  2961  					post := model.PostFromJson(strings.NewReader(postData.(string)))
  2962  					if post.ChannelId == expectedPost.ChannelId && post.Message == expectedPost.Message {
  2963  						return
  2964  					}
  2965  				case <-time.After(5 * time.Second):
  2966  					require.FailNow(t, "failed to find expected post after 5 seconds")
  2967  					return
  2968  				}
  2969  			}
  2970  		}
  2971  
  2972  		th.App.AddUserToChannel(th.BasicUser2, th.BasicChannel, false)
  2973  		_, resp = Client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser2.Id)
  2974  		CheckNoError(t, resp)
  2975  
  2976  		requirePost(&model.Post{
  2977  			Message:   fmt.Sprintf("@%s left the channel.", th.BasicUser2.Username),
  2978  			ChannelId: th.BasicChannel.Id,
  2979  		})
  2980  
  2981  		_, resp = Client.RemoveUserFromChannel(th.BasicChannel2.Id, th.BasicUser.Id)
  2982  		CheckNoError(t, resp)
  2983  		requirePost(&model.Post{
  2984  			Message:   fmt.Sprintf("@%s removed from the channel.", th.BasicUser.Username),
  2985  			ChannelId: th.BasicChannel2.Id,
  2986  		})
  2987  
  2988  		_, resp = th.SystemAdminClient.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser.Id)
  2989  		CheckNoError(t, resp)
  2990  		requirePost(&model.Post{
  2991  			Message:   fmt.Sprintf("@%s removed from the channel.", th.BasicUser.Username),
  2992  			ChannelId: th.BasicChannel.Id,
  2993  		})
  2994  
  2995  		closeWsClient.Do(func() {
  2996  			wsClient.Close()
  2997  		})
  2998  	})
  2999  
  3000  	// Leave deleted channel
  3001  	th.LoginBasic()
  3002  	deletedChannel := th.CreatePublicChannel()
  3003  	th.App.AddUserToChannel(th.BasicUser, deletedChannel, false)
  3004  	th.App.AddUserToChannel(th.BasicUser2, deletedChannel, false)
  3005  
  3006  	deletedChannel.DeleteAt = 1
  3007  	th.App.UpdateChannel(deletedChannel)
  3008  
  3009  	_, resp = Client.RemoveUserFromChannel(deletedChannel.Id, th.BasicUser.Id)
  3010  	CheckNoError(t, resp)
  3011  
  3012  	th.LoginBasic()
  3013  	private := th.CreatePrivateChannel()
  3014  	th.App.AddUserToChannel(th.BasicUser2, private, false)
  3015  
  3016  	_, resp = Client.RemoveUserFromChannel(private.Id, th.BasicUser2.Id)
  3017  	CheckNoError(t, resp)
  3018  
  3019  	th.LoginBasic2()
  3020  	_, resp = Client.RemoveUserFromChannel(private.Id, th.BasicUser.Id)
  3021  	CheckForbiddenStatus(t, resp)
  3022  
  3023  	th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) {
  3024  		th.App.AddUserToChannel(th.BasicUser, private, false)
  3025  		_, resp = client.RemoveUserFromChannel(private.Id, th.BasicUser.Id)
  3026  		CheckNoError(t, resp)
  3027  	})
  3028  
  3029  	th.LoginBasic()
  3030  	th.UpdateUserToNonTeamAdmin(user1, team)
  3031  	th.App.Srv().InvalidateAllCaches()
  3032  
  3033  	// Check the appropriate permissions are enforced.
  3034  	defaultRolePermissions := th.SaveDefaultRolePermissions()
  3035  	defer func() {
  3036  		th.RestoreDefaultRolePermissions(defaultRolePermissions)
  3037  	}()
  3038  
  3039  	th.AddPermissionToRole(model.PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS.Id, model.CHANNEL_USER_ROLE_ID)
  3040  
  3041  	th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) {
  3042  		// Check that a regular channel user can remove other users.
  3043  		privateChannel := th.CreateChannelWithClient(client, model.CHANNEL_PRIVATE)
  3044  		_, resp = client.AddChannelMember(privateChannel.Id, user1.Id)
  3045  		CheckNoError(t, resp)
  3046  		_, resp = client.AddChannelMember(privateChannel.Id, user2.Id)
  3047  		CheckNoError(t, resp)
  3048  
  3049  		_, resp = Client.RemoveUserFromChannel(privateChannel.Id, user2.Id)
  3050  		CheckNoError(t, resp)
  3051  	})
  3052  
  3053  	// Restrict the permission for adding users to Channel Admins
  3054  	th.AddPermissionToRole(model.PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS.Id, model.CHANNEL_ADMIN_ROLE_ID)
  3055  	th.RemovePermissionFromRole(model.PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS.Id, model.CHANNEL_USER_ROLE_ID)
  3056  
  3057  	privateChannel := th.CreateChannelWithClient(th.SystemAdminClient, model.CHANNEL_PRIVATE)
  3058  	_, resp = th.SystemAdminClient.AddChannelMember(privateChannel.Id, user1.Id)
  3059  	CheckNoError(t, resp)
  3060  	_, resp = th.SystemAdminClient.AddChannelMember(privateChannel.Id, user2.Id)
  3061  	CheckNoError(t, resp)
  3062  	_, resp = th.SystemAdminClient.AddChannelMember(privateChannel.Id, bot.UserId)
  3063  	CheckNoError(t, resp)
  3064  
  3065  	_, resp = Client.RemoveUserFromChannel(privateChannel.Id, user2.Id)
  3066  	CheckForbiddenStatus(t, resp)
  3067  
  3068  	th.MakeUserChannelAdmin(user1, privateChannel)
  3069  	th.App.Srv().InvalidateAllCaches()
  3070  
  3071  	_, resp = Client.RemoveUserFromChannel(privateChannel.Id, user2.Id)
  3072  	CheckNoError(t, resp)
  3073  
  3074  	_, resp = th.SystemAdminClient.AddChannelMember(privateChannel.Id, th.SystemAdminUser.Id)
  3075  	CheckNoError(t, resp)
  3076  
  3077  	// If the channel is group-constrained the user cannot be removed
  3078  	privateChannel.GroupConstrained = model.NewBool(true)
  3079  	_, err := th.App.UpdateChannel(privateChannel)
  3080  	require.Nil(t, err)
  3081  	_, resp = Client.RemoveUserFromChannel(privateChannel.Id, user2.Id)
  3082  	require.Equal(t, "api.channel.remove_member.group_constrained.app_error", resp.Error.Id)
  3083  
  3084  	// If the channel is group-constrained user can remove self
  3085  	_, resp = th.SystemAdminClient.RemoveUserFromChannel(privateChannel.Id, th.SystemAdminUser.Id)
  3086  	CheckNoError(t, resp)
  3087  
  3088  	// Test on preventing removal of user from a direct channel
  3089  	directChannel, resp := Client.CreateDirectChannel(user1.Id, user2.Id)
  3090  	CheckNoError(t, resp)
  3091  
  3092  	// If the channel is group-constrained a user can remove a bot
  3093  	_, resp = Client.RemoveUserFromChannel(privateChannel.Id, bot.UserId)
  3094  	CheckNoError(t, resp)
  3095  
  3096  	_, resp = Client.RemoveUserFromChannel(directChannel.Id, user1.Id)
  3097  	CheckBadRequestStatus(t, resp)
  3098  
  3099  	_, resp = Client.RemoveUserFromChannel(directChannel.Id, user2.Id)
  3100  	CheckBadRequestStatus(t, resp)
  3101  
  3102  	_, resp = th.SystemAdminClient.RemoveUserFromChannel(directChannel.Id, user1.Id)
  3103  	CheckBadRequestStatus(t, resp)
  3104  
  3105  	// Test on preventing removal of user from a group channel
  3106  	user3 := th.CreateUser()
  3107  	groupChannel, resp := Client.CreateGroupChannel([]string{user1.Id, user2.Id, user3.Id})
  3108  	CheckNoError(t, resp)
  3109  
  3110  	th.TestForAllClients(t, func(t *testing.T, client *model.Client4) {
  3111  		_, resp = client.RemoveUserFromChannel(groupChannel.Id, user1.Id)
  3112  		CheckBadRequestStatus(t, resp)
  3113  	})
  3114  }
  3115  
  3116  func TestAutocompleteChannels(t *testing.T) {
  3117  	th := Setup(t).InitBasic()
  3118  	defer th.TearDown()
  3119  
  3120  	// A private channel to make sure private channels are not used
  3121  	utils.DisableDebugLogForTest()
  3122  	ptown, _ := th.Client.CreateChannel(&model.Channel{
  3123  		DisplayName: "Town",
  3124  		Name:        "town",
  3125  		Type:        model.CHANNEL_PRIVATE,
  3126  		TeamId:      th.BasicTeam.Id,
  3127  	})
  3128  	tower, _ := th.Client.CreateChannel(&model.Channel{
  3129  		DisplayName: "Tower",
  3130  		Name:        "tower",
  3131  		Type:        model.CHANNEL_OPEN,
  3132  		TeamId:      th.BasicTeam.Id,
  3133  	})
  3134  	utils.EnableDebugLogForTest()
  3135  	defer func() {
  3136  		th.Client.DeleteChannel(ptown.Id)
  3137  		th.Client.DeleteChannel(tower.Id)
  3138  	}()
  3139  
  3140  	for _, tc := range []struct {
  3141  		description      string
  3142  		teamId           string
  3143  		fragment         string
  3144  		expectedIncludes []string
  3145  		expectedExcludes []string
  3146  	}{
  3147  		{
  3148  			"Basic town-square",
  3149  			th.BasicTeam.Id,
  3150  			"town",
  3151  			[]string{"town-square"},
  3152  			[]string{"off-topic", "town", "tower"},
  3153  		},
  3154  		{
  3155  			"Basic off-topic",
  3156  			th.BasicTeam.Id,
  3157  			"off-to",
  3158  			[]string{"off-topic"},
  3159  			[]string{"town-square", "town", "tower"},
  3160  		},
  3161  		{
  3162  			"Basic town square and off topic",
  3163  			th.BasicTeam.Id,
  3164  			"tow",
  3165  			[]string{"town-square", "tower"},
  3166  			[]string{"off-topic", "town"},
  3167  		},
  3168  	} {
  3169  		t.Run(tc.description, func(t *testing.T) {
  3170  			channels, resp := th.Client.AutocompleteChannelsForTeam(tc.teamId, tc.fragment)
  3171  			require.Nil(t, resp.Error)
  3172  			names := make([]string, len(*channels))
  3173  			for i, c := range *channels {
  3174  				names[i] = c.Name
  3175  			}
  3176  			for _, name := range tc.expectedIncludes {
  3177  				require.Contains(t, names, name, "channel not included")
  3178  			}
  3179  			for _, name := range tc.expectedExcludes {
  3180  				require.NotContains(t, names, name, "channel not excluded")
  3181  			}
  3182  		})
  3183  	}
  3184  }
  3185  
  3186  func TestAutocompleteChannelsForSearch(t *testing.T) {
  3187  	th := Setup(t).InitBasic()
  3188  	defer th.TearDown()
  3189  
  3190  	th.LoginSystemAdminWithClient(th.SystemAdminClient)
  3191  	th.LoginBasicWithClient(th.Client)
  3192  
  3193  	u1 := th.CreateUserWithClient(th.SystemAdminClient)
  3194  	defer th.App.PermanentDeleteUser(th.Context, u1)
  3195  	u2 := th.CreateUserWithClient(th.SystemAdminClient)
  3196  	defer th.App.PermanentDeleteUser(th.Context, u2)
  3197  	u3 := th.CreateUserWithClient(th.SystemAdminClient)
  3198  	defer th.App.PermanentDeleteUser(th.Context, u3)
  3199  	u4 := th.CreateUserWithClient(th.SystemAdminClient)
  3200  	defer th.App.PermanentDeleteUser(th.Context, u4)
  3201  
  3202  	// A private channel to make sure private channels are not used
  3203  	utils.DisableDebugLogForTest()
  3204  	ptown, _ := th.SystemAdminClient.CreateChannel(&model.Channel{
  3205  		DisplayName: "Town",
  3206  		Name:        "town",
  3207  		Type:        model.CHANNEL_PRIVATE,
  3208  		TeamId:      th.BasicTeam.Id,
  3209  	})
  3210  	defer func() {
  3211  		th.Client.DeleteChannel(ptown.Id)
  3212  	}()
  3213  	mypriv, _ := th.Client.CreateChannel(&model.Channel{
  3214  		DisplayName: "My private town",
  3215  		Name:        "townpriv",
  3216  		Type:        model.CHANNEL_PRIVATE,
  3217  		TeamId:      th.BasicTeam.Id,
  3218  	})
  3219  	defer func() {
  3220  		th.Client.DeleteChannel(mypriv.Id)
  3221  	}()
  3222  	utils.EnableDebugLogForTest()
  3223  
  3224  	dc1, resp := th.Client.CreateDirectChannel(th.BasicUser.Id, u1.Id)
  3225  	CheckNoError(t, resp)
  3226  	defer func() {
  3227  		th.Client.DeleteChannel(dc1.Id)
  3228  	}()
  3229  
  3230  	dc2, resp := th.SystemAdminClient.CreateDirectChannel(u2.Id, u3.Id)
  3231  	CheckNoError(t, resp)
  3232  	defer func() {
  3233  		th.SystemAdminClient.DeleteChannel(dc2.Id)
  3234  	}()
  3235  
  3236  	gc1, resp := th.Client.CreateGroupChannel([]string{th.BasicUser.Id, u2.Id, u3.Id})
  3237  	CheckNoError(t, resp)
  3238  	defer func() {
  3239  		th.Client.DeleteChannel(gc1.Id)
  3240  	}()
  3241  
  3242  	gc2, resp := th.SystemAdminClient.CreateGroupChannel([]string{u2.Id, u3.Id, u4.Id})
  3243  	CheckNoError(t, resp)
  3244  	defer func() {
  3245  		th.SystemAdminClient.DeleteChannel(gc2.Id)
  3246  	}()
  3247  
  3248  	for _, tc := range []struct {
  3249  		description      string
  3250  		teamID           string
  3251  		fragment         string
  3252  		expectedIncludes []string
  3253  		expectedExcludes []string
  3254  	}{
  3255  		{
  3256  			"Basic town-square",
  3257  			th.BasicTeam.Id,
  3258  			"town",
  3259  			[]string{"town-square", "townpriv"},
  3260  			[]string{"off-topic", "town"},
  3261  		},
  3262  		{
  3263  			"Basic off-topic",
  3264  			th.BasicTeam.Id,
  3265  			"off-to",
  3266  			[]string{"off-topic"},
  3267  			[]string{"town-square", "town", "townpriv"},
  3268  		},
  3269  		{
  3270  			"Basic town square and townpriv",
  3271  			th.BasicTeam.Id,
  3272  			"tow",
  3273  			[]string{"town-square", "townpriv"},
  3274  			[]string{"off-topic", "town"},
  3275  		},
  3276  		{
  3277  			"Direct and group messages",
  3278  			th.BasicTeam.Id,
  3279  			"fakeuser",
  3280  			[]string{dc1.Name, gc1.Name},
  3281  			[]string{dc2.Name, gc2.Name},
  3282  		},
  3283  	} {
  3284  		t.Run(tc.description, func(t *testing.T) {
  3285  			channels, resp := th.Client.AutocompleteChannelsForTeamForSearch(tc.teamID, tc.fragment)
  3286  			require.Nil(t, resp.Error)
  3287  			names := make([]string, len(*channels))
  3288  			for i, c := range *channels {
  3289  				names[i] = c.Name
  3290  			}
  3291  			for _, name := range tc.expectedIncludes {
  3292  				require.Contains(t, names, name, "channel not included")
  3293  			}
  3294  			for _, name := range tc.expectedExcludes {
  3295  				require.NotContains(t, names, name, "channel not excluded")
  3296  			}
  3297  		})
  3298  	}
  3299  }
  3300  
  3301  func TestAutocompleteChannelsForSearchGuestUsers(t *testing.T) {
  3302  	th := Setup(t).InitBasic()
  3303  	defer th.TearDown()
  3304  
  3305  	u1 := th.CreateUserWithClient(th.SystemAdminClient)
  3306  	defer th.App.PermanentDeleteUser(th.Context, u1)
  3307  
  3308  	enableGuestAccounts := *th.App.Config().GuestAccountsSettings.Enable
  3309  	defer func() {
  3310  		th.App.UpdateConfig(func(cfg *model.Config) { *cfg.GuestAccountsSettings.Enable = enableGuestAccounts })
  3311  		th.App.Srv().RemoveLicense()
  3312  	}()
  3313  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.GuestAccountsSettings.Enable = true })
  3314  	th.App.Srv().SetLicense(model.NewTestLicense())
  3315  
  3316  	id := model.NewId()
  3317  	guest := &model.User{
  3318  		Email:         "success+" + id + "@simulator.amazonses.com",
  3319  		Username:      "un_" + id,
  3320  		Nickname:      "nn_" + id,
  3321  		Password:      "Password1",
  3322  		EmailVerified: true,
  3323  	}
  3324  	guest, err := th.App.CreateGuest(th.Context, guest)
  3325  	require.Nil(t, err)
  3326  
  3327  	th.LoginSystemAdminWithClient(th.SystemAdminClient)
  3328  
  3329  	_, resp := th.SystemAdminClient.AddTeamMember(th.BasicTeam.Id, guest.Id)
  3330  	CheckNoError(t, resp)
  3331  
  3332  	// A private channel to make sure private channels are not used
  3333  	utils.DisableDebugLogForTest()
  3334  	town, _ := th.SystemAdminClient.CreateChannel(&model.Channel{
  3335  		DisplayName: "Town",
  3336  		Name:        "town",
  3337  		Type:        model.CHANNEL_OPEN,
  3338  		TeamId:      th.BasicTeam.Id,
  3339  	})
  3340  	defer func() {
  3341  		th.SystemAdminClient.DeleteChannel(town.Id)
  3342  	}()
  3343  	_, resp = th.SystemAdminClient.AddChannelMember(town.Id, guest.Id)
  3344  	CheckNoError(t, resp)
  3345  
  3346  	mypriv, _ := th.SystemAdminClient.CreateChannel(&model.Channel{
  3347  		DisplayName: "My private town",
  3348  		Name:        "townpriv",
  3349  		Type:        model.CHANNEL_PRIVATE,
  3350  		TeamId:      th.BasicTeam.Id,
  3351  	})
  3352  	defer func() {
  3353  		th.SystemAdminClient.DeleteChannel(mypriv.Id)
  3354  	}()
  3355  	_, resp = th.SystemAdminClient.AddChannelMember(mypriv.Id, guest.Id)
  3356  	CheckNoError(t, resp)
  3357  
  3358  	utils.EnableDebugLogForTest()
  3359  
  3360  	dc1, resp := th.SystemAdminClient.CreateDirectChannel(th.BasicUser.Id, guest.Id)
  3361  	CheckNoError(t, resp)
  3362  	defer func() {
  3363  		th.SystemAdminClient.DeleteChannel(dc1.Id)
  3364  	}()
  3365  
  3366  	dc2, resp := th.SystemAdminClient.CreateDirectChannel(th.BasicUser.Id, th.BasicUser2.Id)
  3367  	CheckNoError(t, resp)
  3368  	defer func() {
  3369  		th.SystemAdminClient.DeleteChannel(dc2.Id)
  3370  	}()
  3371  
  3372  	gc1, resp := th.SystemAdminClient.CreateGroupChannel([]string{th.BasicUser.Id, th.BasicUser2.Id, guest.Id})
  3373  	CheckNoError(t, resp)
  3374  	defer func() {
  3375  		th.SystemAdminClient.DeleteChannel(gc1.Id)
  3376  	}()
  3377  
  3378  	gc2, resp := th.SystemAdminClient.CreateGroupChannel([]string{th.BasicUser.Id, th.BasicUser2.Id, u1.Id})
  3379  	CheckNoError(t, resp)
  3380  	defer func() {
  3381  		th.SystemAdminClient.DeleteChannel(gc2.Id)
  3382  	}()
  3383  
  3384  	_, resp = th.Client.Login(guest.Username, "Password1")
  3385  	CheckNoError(t, resp)
  3386  
  3387  	for _, tc := range []struct {
  3388  		description      string
  3389  		teamID           string
  3390  		fragment         string
  3391  		expectedIncludes []string
  3392  		expectedExcludes []string
  3393  	}{
  3394  		{
  3395  			"Should return those channel where is member",
  3396  			th.BasicTeam.Id,
  3397  			"town",
  3398  			[]string{"town", "townpriv"},
  3399  			[]string{"town-square", "off-topic"},
  3400  		},
  3401  		{
  3402  			"Should return empty if not member of the searched channels",
  3403  			th.BasicTeam.Id,
  3404  			"off-to",
  3405  			[]string{},
  3406  			[]string{"off-topic", "town-square", "town", "townpriv"},
  3407  		},
  3408  		{
  3409  			"Should return direct and group messages",
  3410  			th.BasicTeam.Id,
  3411  			"fakeuser",
  3412  			[]string{dc1.Name, gc1.Name},
  3413  			[]string{dc2.Name, gc2.Name},
  3414  		},
  3415  	} {
  3416  		t.Run(tc.description, func(t *testing.T) {
  3417  			channels, resp := th.Client.AutocompleteChannelsForTeamForSearch(tc.teamID, tc.fragment)
  3418  			require.Nil(t, resp.Error)
  3419  			names := make([]string, len(*channels))
  3420  			for i, c := range *channels {
  3421  				names[i] = c.Name
  3422  			}
  3423  			for _, name := range tc.expectedIncludes {
  3424  				require.Contains(t, names, name, "channel not included")
  3425  			}
  3426  			for _, name := range tc.expectedExcludes {
  3427  				require.NotContains(t, names, name, "channel not excluded")
  3428  			}
  3429  		})
  3430  	}
  3431  }
  3432  
  3433  func TestUpdateChannelScheme(t *testing.T) {
  3434  	th := Setup(t)
  3435  	defer th.TearDown()
  3436  
  3437  	th.App.Srv().SetLicense(model.NewTestLicense(""))
  3438  
  3439  	th.App.SetPhase2PermissionsMigrationStatus(true)
  3440  
  3441  	team, resp := th.SystemAdminClient.CreateTeam(&model.Team{
  3442  		DisplayName:     "Name",
  3443  		Description:     "Some description",
  3444  		CompanyName:     "Some company name",
  3445  		AllowOpenInvite: false,
  3446  		InviteId:        "inviteid0",
  3447  		Name:            "z-z-" + model.NewId() + "a",
  3448  		Email:           "success+" + model.NewId() + "@simulator.amazonses.com",
  3449  		Type:            model.TEAM_OPEN,
  3450  	})
  3451  	CheckNoError(t, resp)
  3452  
  3453  	channel, resp := th.SystemAdminClient.CreateChannel(&model.Channel{
  3454  		DisplayName: "Name",
  3455  		Name:        "z-z-" + model.NewId() + "a",
  3456  		Type:        model.CHANNEL_OPEN,
  3457  		TeamId:      team.Id,
  3458  	})
  3459  	CheckNoError(t, resp)
  3460  
  3461  	channelScheme, resp := th.SystemAdminClient.CreateScheme(&model.Scheme{
  3462  		DisplayName: "DisplayName",
  3463  		Name:        model.NewId(),
  3464  		Description: "Some description",
  3465  		Scope:       model.SCHEME_SCOPE_CHANNEL,
  3466  	})
  3467  	CheckNoError(t, resp)
  3468  
  3469  	teamScheme, resp := th.SystemAdminClient.CreateScheme(&model.Scheme{
  3470  		DisplayName: "DisplayName",
  3471  		Name:        model.NewId(),
  3472  		Description: "Some description",
  3473  		Scope:       model.SCHEME_SCOPE_TEAM,
  3474  	})
  3475  	CheckNoError(t, resp)
  3476  
  3477  	// Test the setup/base case.
  3478  	_, resp = th.SystemAdminClient.UpdateChannelScheme(channel.Id, channelScheme.Id)
  3479  	CheckNoError(t, resp)
  3480  
  3481  	// Test various invalid channel and scheme id combinations.
  3482  	_, resp = th.SystemAdminClient.UpdateChannelScheme(channel.Id, "x")
  3483  	CheckBadRequestStatus(t, resp)
  3484  	_, resp = th.SystemAdminClient.UpdateChannelScheme("x", channelScheme.Id)
  3485  	CheckBadRequestStatus(t, resp)
  3486  	_, resp = th.SystemAdminClient.UpdateChannelScheme("x", "x")
  3487  	CheckBadRequestStatus(t, resp)
  3488  
  3489  	// Test that permissions are required.
  3490  	_, resp = th.Client.UpdateChannelScheme(channel.Id, channelScheme.Id)
  3491  	CheckForbiddenStatus(t, resp)
  3492  
  3493  	// Test that a license is required.
  3494  	th.App.Srv().SetLicense(nil)
  3495  	_, resp = th.SystemAdminClient.UpdateChannelScheme(channel.Id, channelScheme.Id)
  3496  	CheckNotImplementedStatus(t, resp)
  3497  	th.App.Srv().SetLicense(model.NewTestLicense(""))
  3498  
  3499  	// Test an invalid scheme scope.
  3500  	_, resp = th.SystemAdminClient.UpdateChannelScheme(channel.Id, teamScheme.Id)
  3501  	CheckBadRequestStatus(t, resp)
  3502  
  3503  	// Test that an unauthenticated user gets rejected.
  3504  	th.SystemAdminClient.Logout()
  3505  	_, resp = th.SystemAdminClient.UpdateChannelScheme(channel.Id, channelScheme.Id)
  3506  	CheckUnauthorizedStatus(t, resp)
  3507  }
  3508  
  3509  func TestGetChannelMembersTimezones(t *testing.T) {
  3510  	th := Setup(t).InitBasic()
  3511  	defer th.TearDown()
  3512  	Client := th.Client
  3513  
  3514  	user := th.BasicUser
  3515  	user.Timezone["useAutomaticTimezone"] = "false"
  3516  	user.Timezone["manualTimezone"] = "XOXO/BLABLA"
  3517  	_, resp := Client.UpdateUser(user)
  3518  	CheckNoError(t, resp)
  3519  
  3520  	user2 := th.BasicUser2
  3521  	user2.Timezone["automaticTimezone"] = "NoWhere/Island"
  3522  	_, resp = th.SystemAdminClient.UpdateUser(user2)
  3523  	CheckNoError(t, resp)
  3524  
  3525  	timezone, resp := Client.GetChannelMembersTimezones(th.BasicChannel.Id)
  3526  	CheckNoError(t, resp)
  3527  	require.Len(t, timezone, 2, "should return 2 timezones")
  3528  
  3529  	//both users have same timezone
  3530  	user2.Timezone["automaticTimezone"] = "XOXO/BLABLA"
  3531  	_, resp = th.SystemAdminClient.UpdateUser(user2)
  3532  	CheckNoError(t, resp)
  3533  
  3534  	timezone, resp = Client.GetChannelMembersTimezones(th.BasicChannel.Id)
  3535  	CheckNoError(t, resp)
  3536  	require.Len(t, timezone, 1, "should return 1 timezone")
  3537  
  3538  	//no timezone set should return empty
  3539  	user2.Timezone["automaticTimezone"] = ""
  3540  	_, resp = th.SystemAdminClient.UpdateUser(user2)
  3541  	CheckNoError(t, resp)
  3542  
  3543  	user.Timezone["manualTimezone"] = ""
  3544  	_, resp = Client.UpdateUser(user)
  3545  	CheckNoError(t, resp)
  3546  
  3547  	timezone, resp = Client.GetChannelMembersTimezones(th.BasicChannel.Id)
  3548  	CheckNoError(t, resp)
  3549  	require.Empty(t, timezone, "should return 0 timezone")
  3550  }
  3551  
  3552  func TestChannelMembersMinusGroupMembers(t *testing.T) {
  3553  	th := Setup(t).InitBasic()
  3554  	defer th.TearDown()
  3555  
  3556  	user1 := th.BasicUser
  3557  	user2 := th.BasicUser2
  3558  
  3559  	channel := th.CreatePrivateChannel()
  3560  
  3561  	_, err := th.App.AddChannelMember(th.Context, user1.Id, channel, app.ChannelMemberOpts{})
  3562  	require.Nil(t, err)
  3563  	_, err = th.App.AddChannelMember(th.Context, user2.Id, channel, app.ChannelMemberOpts{})
  3564  	require.Nil(t, err)
  3565  
  3566  	channel.GroupConstrained = model.NewBool(true)
  3567  	channel, err = th.App.UpdateChannel(channel)
  3568  	require.Nil(t, err)
  3569  
  3570  	group1 := th.CreateGroup()
  3571  	group2 := th.CreateGroup()
  3572  
  3573  	_, err = th.App.UpsertGroupMember(group1.Id, user1.Id)
  3574  	require.Nil(t, err)
  3575  	_, err = th.App.UpsertGroupMember(group2.Id, user2.Id)
  3576  	require.Nil(t, err)
  3577  
  3578  	// No permissions
  3579  	_, _, res := th.Client.ChannelMembersMinusGroupMembers(channel.Id, []string{group1.Id, group2.Id}, 0, 100, "")
  3580  	require.Equal(t, "api.context.permissions.app_error", res.Error.Id)
  3581  
  3582  	testCases := map[string]struct {
  3583  		groupIDs        []string
  3584  		page            int
  3585  		perPage         int
  3586  		length          int
  3587  		count           int
  3588  		otherAssertions func([]*model.UserWithGroups)
  3589  	}{
  3590  		"All groups, expect no users removed": {
  3591  			groupIDs: []string{group1.Id, group2.Id},
  3592  			page:     0,
  3593  			perPage:  100,
  3594  			length:   0,
  3595  			count:    0,
  3596  		},
  3597  		"Some nonexistent group, page 0": {
  3598  			groupIDs: []string{model.NewId()},
  3599  			page:     0,
  3600  			perPage:  1,
  3601  			length:   1,
  3602  			count:    2,
  3603  		},
  3604  		"Some nonexistent group, page 1": {
  3605  			groupIDs: []string{model.NewId()},
  3606  			page:     1,
  3607  			perPage:  1,
  3608  			length:   1,
  3609  			count:    2,
  3610  		},
  3611  		"One group, expect one user removed": {
  3612  			groupIDs: []string{group1.Id},
  3613  			page:     0,
  3614  			perPage:  100,
  3615  			length:   1,
  3616  			count:    1,
  3617  			otherAssertions: func(uwg []*model.UserWithGroups) {
  3618  				require.Equal(t, uwg[0].Id, user2.Id)
  3619  			},
  3620  		},
  3621  		"Other group, expect other user removed": {
  3622  			groupIDs: []string{group2.Id},
  3623  			page:     0,
  3624  			perPage:  100,
  3625  			length:   1,
  3626  			count:    1,
  3627  			otherAssertions: func(uwg []*model.UserWithGroups) {
  3628  				require.Equal(t, uwg[0].Id, user1.Id)
  3629  			},
  3630  		},
  3631  	}
  3632  
  3633  	for name, tc := range testCases {
  3634  		t.Run(name, func(t *testing.T) {
  3635  			uwg, count, res := th.SystemAdminClient.ChannelMembersMinusGroupMembers(channel.Id, tc.groupIDs, tc.page, tc.perPage, "")
  3636  			require.Nil(t, res.Error)
  3637  			require.Len(t, uwg, tc.length)
  3638  			require.Equal(t, tc.count, int(count))
  3639  			if tc.otherAssertions != nil {
  3640  				tc.otherAssertions(uwg)
  3641  			}
  3642  		})
  3643  	}
  3644  }
  3645  
  3646  func TestGetChannelModerations(t *testing.T) {
  3647  	th := Setup(t).InitBasic()
  3648  	defer th.TearDown()
  3649  
  3650  	channel := th.BasicChannel
  3651  	team := th.BasicTeam
  3652  
  3653  	th.App.SetPhase2PermissionsMigrationStatus(true)
  3654  
  3655  	t.Run("Errors without a license", func(t *testing.T) {
  3656  		_, res := th.SystemAdminClient.GetChannelModerations(channel.Id, "")
  3657  		require.Equal(t, "api.channel.get_channel_moderations.license.error", res.Error.Id)
  3658  	})
  3659  
  3660  	th.App.Srv().SetLicense(model.NewTestLicense())
  3661  
  3662  	t.Run("Errors as a non sysadmin", func(t *testing.T) {
  3663  		_, res := th.Client.GetChannelModerations(channel.Id, "")
  3664  		require.Equal(t, "api.context.permissions.app_error", res.Error.Id)
  3665  	})
  3666  
  3667  	th.App.Srv().SetLicense(model.NewTestLicense())
  3668  
  3669  	t.Run("Returns default moderations with default roles", func(t *testing.T) {
  3670  		moderations, res := th.SystemAdminClient.GetChannelModerations(channel.Id, "")
  3671  		require.Nil(t, res.Error)
  3672  		require.Equal(t, len(moderations), 4)
  3673  		for _, moderation := range moderations {
  3674  			if moderation.Name == "manage_members" {
  3675  				require.Empty(t, moderation.Roles.Guests)
  3676  			} else {
  3677  				require.Equal(t, moderation.Roles.Guests.Value, true)
  3678  				require.Equal(t, moderation.Roles.Guests.Enabled, true)
  3679  			}
  3680  
  3681  			require.Equal(t, moderation.Roles.Members.Value, true)
  3682  			require.Equal(t, moderation.Roles.Members.Enabled, true)
  3683  		}
  3684  	})
  3685  
  3686  	t.Run("Returns value false and enabled false for permissions that are not present in higher scoped scheme when no channel scheme present", func(t *testing.T) {
  3687  		scheme := th.SetupTeamScheme()
  3688  		team.SchemeId = &scheme.Id
  3689  		_, err := th.App.UpdateTeamScheme(team)
  3690  		require.Nil(t, err)
  3691  
  3692  		th.RemovePermissionFromRole(model.PERMISSION_CREATE_POST.Id, scheme.DefaultChannelGuestRole)
  3693  		defer th.AddPermissionToRole(model.PERMISSION_CREATE_POST.Id, scheme.DefaultChannelGuestRole)
  3694  
  3695  		moderations, res := th.SystemAdminClient.GetChannelModerations(channel.Id, "")
  3696  		require.Nil(t, res.Error)
  3697  		for _, moderation := range moderations {
  3698  			if moderation.Name == model.PERMISSION_CREATE_POST.Id {
  3699  				require.Equal(t, moderation.Roles.Members.Value, true)
  3700  				require.Equal(t, moderation.Roles.Members.Enabled, true)
  3701  				require.Equal(t, moderation.Roles.Guests.Value, false)
  3702  				require.Equal(t, moderation.Roles.Guests.Enabled, false)
  3703  			}
  3704  		}
  3705  	})
  3706  
  3707  	t.Run("Returns value false and enabled true for permissions that are not present in channel scheme but present in team scheme", func(t *testing.T) {
  3708  		scheme := th.SetupChannelScheme()
  3709  		channel.SchemeId = &scheme.Id
  3710  		_, err := th.App.UpdateChannelScheme(channel)
  3711  		require.Nil(t, err)
  3712  
  3713  		th.RemovePermissionFromRole(model.PERMISSION_CREATE_POST.Id, scheme.DefaultChannelGuestRole)
  3714  		defer th.AddPermissionToRole(model.PERMISSION_CREATE_POST.Id, scheme.DefaultChannelGuestRole)
  3715  
  3716  		moderations, res := th.SystemAdminClient.GetChannelModerations(channel.Id, "")
  3717  		require.Nil(t, res.Error)
  3718  		for _, moderation := range moderations {
  3719  			if moderation.Name == model.PERMISSION_CREATE_POST.Id {
  3720  				require.Equal(t, moderation.Roles.Members.Value, true)
  3721  				require.Equal(t, moderation.Roles.Members.Enabled, true)
  3722  				require.Equal(t, moderation.Roles.Guests.Value, false)
  3723  				require.Equal(t, moderation.Roles.Guests.Enabled, true)
  3724  			}
  3725  		}
  3726  	})
  3727  
  3728  	t.Run("Returns value false and enabled false for permissions that are not present in channel & team scheme", func(t *testing.T) {
  3729  		teamScheme := th.SetupTeamScheme()
  3730  		team.SchemeId = &teamScheme.Id
  3731  		th.App.UpdateTeamScheme(team)
  3732  
  3733  		scheme := th.SetupChannelScheme()
  3734  		channel.SchemeId = &scheme.Id
  3735  		th.App.UpdateChannelScheme(channel)
  3736  
  3737  		th.RemovePermissionFromRole(model.PERMISSION_CREATE_POST.Id, scheme.DefaultChannelGuestRole)
  3738  		th.RemovePermissionFromRole(model.PERMISSION_CREATE_POST.Id, teamScheme.DefaultChannelGuestRole)
  3739  
  3740  		defer th.AddPermissionToRole(model.PERMISSION_CREATE_POST.Id, scheme.DefaultChannelGuestRole)
  3741  		defer th.AddPermissionToRole(model.PERMISSION_CREATE_POST.Id, teamScheme.DefaultChannelGuestRole)
  3742  
  3743  		moderations, res := th.SystemAdminClient.GetChannelModerations(channel.Id, "")
  3744  		require.Nil(t, res.Error)
  3745  		for _, moderation := range moderations {
  3746  			if moderation.Name == model.PERMISSION_CREATE_POST.Id {
  3747  				require.Equal(t, moderation.Roles.Members.Value, true)
  3748  				require.Equal(t, moderation.Roles.Members.Enabled, true)
  3749  				require.Equal(t, moderation.Roles.Guests.Value, false)
  3750  				require.Equal(t, moderation.Roles.Guests.Enabled, false)
  3751  			}
  3752  		}
  3753  	})
  3754  
  3755  	t.Run("Returns the correct value for manage_members depending on whether the channel is public or private", func(t *testing.T) {
  3756  		scheme := th.SetupTeamScheme()
  3757  		team.SchemeId = &scheme.Id
  3758  		_, err := th.App.UpdateTeamScheme(team)
  3759  		require.Nil(t, err)
  3760  
  3761  		th.RemovePermissionFromRole(model.PERMISSION_MANAGE_PUBLIC_CHANNEL_MEMBERS.Id, scheme.DefaultChannelUserRole)
  3762  		defer th.AddPermissionToRole(model.PERMISSION_CREATE_POST.Id, scheme.DefaultChannelUserRole)
  3763  
  3764  		// public channel does not have the permission
  3765  		moderations, res := th.SystemAdminClient.GetChannelModerations(channel.Id, "")
  3766  		require.Nil(t, res.Error)
  3767  		for _, moderation := range moderations {
  3768  			if moderation.Name == "manage_members" {
  3769  				require.Equal(t, moderation.Roles.Members.Value, false)
  3770  			}
  3771  		}
  3772  
  3773  		// private channel does have the permission
  3774  		moderations, res = th.SystemAdminClient.GetChannelModerations(th.BasicPrivateChannel.Id, "")
  3775  		require.Nil(t, res.Error)
  3776  		for _, moderation := range moderations {
  3777  			if moderation.Name == "manage_members" {
  3778  				require.Equal(t, moderation.Roles.Members.Value, true)
  3779  			}
  3780  		}
  3781  	})
  3782  
  3783  	t.Run("Does not return an error if the team scheme has a blank DefaultChannelGuestRole field", func(t *testing.T) {
  3784  		scheme := th.SetupTeamScheme()
  3785  		scheme.DefaultChannelGuestRole = ""
  3786  
  3787  		mockStore := mocks.Store{}
  3788  		mockSchemeStore := mocks.SchemeStore{}
  3789  		mockSchemeStore.On("Get", mock.Anything).Return(scheme, nil)
  3790  		mockStore.On("Scheme").Return(&mockSchemeStore)
  3791  		mockStore.On("Team").Return(th.App.Srv().Store.Team())
  3792  		mockStore.On("Channel").Return(th.App.Srv().Store.Channel())
  3793  		mockStore.On("User").Return(th.App.Srv().Store.User())
  3794  		mockStore.On("Post").Return(th.App.Srv().Store.Post())
  3795  		mockStore.On("FileInfo").Return(th.App.Srv().Store.FileInfo())
  3796  		mockStore.On("Webhook").Return(th.App.Srv().Store.Webhook())
  3797  		mockStore.On("System").Return(th.App.Srv().Store.System())
  3798  		mockStore.On("License").Return(th.App.Srv().Store.License())
  3799  		mockStore.On("Role").Return(th.App.Srv().Store.Role())
  3800  		mockStore.On("Close").Return(nil)
  3801  		th.App.Srv().Store = &mockStore
  3802  
  3803  		team.SchemeId = &scheme.Id
  3804  		_, err := th.App.UpdateTeamScheme(team)
  3805  		require.Nil(t, err)
  3806  
  3807  		_, res := th.SystemAdminClient.GetChannelModerations(channel.Id, "")
  3808  		require.Nil(t, res.Error)
  3809  	})
  3810  }
  3811  
  3812  func TestPatchChannelModerations(t *testing.T) {
  3813  	th := Setup(t).InitBasic()
  3814  	defer th.TearDown()
  3815  
  3816  	channel := th.BasicChannel
  3817  
  3818  	emptyPatch := []*model.ChannelModerationPatch{}
  3819  
  3820  	createPosts := model.ChannelModeratedPermissions[0]
  3821  
  3822  	th.App.SetPhase2PermissionsMigrationStatus(true)
  3823  
  3824  	t.Run("Errors without a license", func(t *testing.T) {
  3825  		_, res := th.SystemAdminClient.PatchChannelModerations(channel.Id, emptyPatch)
  3826  		require.Equal(t, "api.channel.patch_channel_moderations.license.error", res.Error.Id)
  3827  	})
  3828  
  3829  	th.App.Srv().SetLicense(model.NewTestLicense())
  3830  
  3831  	t.Run("Errors as a non sysadmin", func(t *testing.T) {
  3832  		_, res := th.Client.PatchChannelModerations(channel.Id, emptyPatch)
  3833  		require.Equal(t, "api.context.permissions.app_error", res.Error.Id)
  3834  	})
  3835  
  3836  	th.App.Srv().SetLicense(model.NewTestLicense())
  3837  
  3838  	t.Run("Returns default moderations with empty patch", func(t *testing.T) {
  3839  		moderations, res := th.SystemAdminClient.PatchChannelModerations(channel.Id, emptyPatch)
  3840  		require.Nil(t, res.Error)
  3841  		require.Equal(t, len(moderations), 4)
  3842  		for _, moderation := range moderations {
  3843  			if moderation.Name == "manage_members" {
  3844  				require.Empty(t, moderation.Roles.Guests)
  3845  			} else {
  3846  				require.Equal(t, moderation.Roles.Guests.Value, true)
  3847  				require.Equal(t, moderation.Roles.Guests.Enabled, true)
  3848  			}
  3849  
  3850  			require.Equal(t, moderation.Roles.Members.Value, true)
  3851  			require.Equal(t, moderation.Roles.Members.Enabled, true)
  3852  		}
  3853  
  3854  		require.Nil(t, channel.SchemeId)
  3855  	})
  3856  
  3857  	t.Run("Creates a scheme and returns the updated channel moderations when patching an existing permission", func(t *testing.T) {
  3858  		patch := []*model.ChannelModerationPatch{
  3859  			{
  3860  				Name:  &createPosts,
  3861  				Roles: &model.ChannelModeratedRolesPatch{Members: model.NewBool(false)},
  3862  			},
  3863  		}
  3864  
  3865  		moderations, res := th.SystemAdminClient.PatchChannelModerations(channel.Id, patch)
  3866  		require.Nil(t, res.Error)
  3867  		require.Equal(t, len(moderations), 4)
  3868  		for _, moderation := range moderations {
  3869  			if moderation.Name == "manage_members" {
  3870  				require.Empty(t, moderation.Roles.Guests)
  3871  			} else {
  3872  				require.Equal(t, moderation.Roles.Guests.Value, true)
  3873  				require.Equal(t, moderation.Roles.Guests.Enabled, true)
  3874  			}
  3875  
  3876  			if moderation.Name == createPosts {
  3877  				require.Equal(t, moderation.Roles.Members.Value, false)
  3878  				require.Equal(t, moderation.Roles.Members.Enabled, true)
  3879  			} else {
  3880  				require.Equal(t, moderation.Roles.Members.Value, true)
  3881  				require.Equal(t, moderation.Roles.Members.Enabled, true)
  3882  			}
  3883  		}
  3884  		channel, _ = th.App.GetChannel(channel.Id)
  3885  		require.NotNil(t, channel.SchemeId)
  3886  	})
  3887  
  3888  	t.Run("Removes the existing scheme when moderated permissions are set back to higher scoped values", func(t *testing.T) {
  3889  		channel, _ = th.App.GetChannel(channel.Id)
  3890  		schemeId := channel.SchemeId
  3891  
  3892  		scheme, _ := th.App.GetScheme(*schemeId)
  3893  		require.Equal(t, scheme.DeleteAt, int64(0))
  3894  
  3895  		patch := []*model.ChannelModerationPatch{
  3896  			{
  3897  				Name:  &createPosts,
  3898  				Roles: &model.ChannelModeratedRolesPatch{Members: model.NewBool(true)},
  3899  			},
  3900  		}
  3901  
  3902  		moderations, res := th.SystemAdminClient.PatchChannelModerations(channel.Id, patch)
  3903  		require.Nil(t, res.Error)
  3904  		require.Equal(t, len(moderations), 4)
  3905  		for _, moderation := range moderations {
  3906  			if moderation.Name == "manage_members" {
  3907  				require.Empty(t, moderation.Roles.Guests)
  3908  			} else {
  3909  				require.Equal(t, moderation.Roles.Guests.Value, true)
  3910  				require.Equal(t, moderation.Roles.Guests.Enabled, true)
  3911  			}
  3912  
  3913  			require.Equal(t, moderation.Roles.Members.Value, true)
  3914  			require.Equal(t, moderation.Roles.Members.Enabled, true)
  3915  		}
  3916  
  3917  		channel, _ = th.App.GetChannel(channel.Id)
  3918  		require.Nil(t, channel.SchemeId)
  3919  
  3920  		scheme, _ = th.App.GetScheme(*schemeId)
  3921  		require.NotEqual(t, scheme.DeleteAt, int64(0))
  3922  	})
  3923  
  3924  	t.Run("Does not return an error if the team scheme has a blank DefaultChannelGuestRole field", func(t *testing.T) {
  3925  		team := th.BasicTeam
  3926  		scheme := th.SetupTeamScheme()
  3927  		scheme.DefaultChannelGuestRole = ""
  3928  
  3929  		mockStore := mocks.Store{}
  3930  		mockSchemeStore := mocks.SchemeStore{}
  3931  		mockSchemeStore.On("Get", mock.Anything).Return(scheme, nil)
  3932  		mockSchemeStore.On("Save", mock.Anything).Return(scheme, nil)
  3933  		mockSchemeStore.On("Delete", mock.Anything).Return(scheme, nil)
  3934  		mockStore.On("Scheme").Return(&mockSchemeStore)
  3935  		mockStore.On("Team").Return(th.App.Srv().Store.Team())
  3936  		mockStore.On("Channel").Return(th.App.Srv().Store.Channel())
  3937  		mockStore.On("User").Return(th.App.Srv().Store.User())
  3938  		mockStore.On("Post").Return(th.App.Srv().Store.Post())
  3939  		mockStore.On("FileInfo").Return(th.App.Srv().Store.FileInfo())
  3940  		mockStore.On("Webhook").Return(th.App.Srv().Store.Webhook())
  3941  		mockStore.On("System").Return(th.App.Srv().Store.System())
  3942  		mockStore.On("License").Return(th.App.Srv().Store.License())
  3943  		mockStore.On("Role").Return(th.App.Srv().Store.Role())
  3944  		mockStore.On("Close").Return(nil)
  3945  		th.App.Srv().Store = &mockStore
  3946  
  3947  		team.SchemeId = &scheme.Id
  3948  		_, err := th.App.UpdateTeamScheme(team)
  3949  		require.Nil(t, err)
  3950  
  3951  		moderations, res := th.SystemAdminClient.PatchChannelModerations(channel.Id, emptyPatch)
  3952  		require.Nil(t, res.Error)
  3953  		require.Equal(t, len(moderations), 4)
  3954  		for _, moderation := range moderations {
  3955  			if moderation.Name == "manage_members" {
  3956  				require.Empty(t, moderation.Roles.Guests)
  3957  			} else {
  3958  				require.Equal(t, moderation.Roles.Guests.Value, false)
  3959  				require.Equal(t, moderation.Roles.Guests.Enabled, false)
  3960  			}
  3961  
  3962  			require.Equal(t, moderation.Roles.Members.Value, true)
  3963  			require.Equal(t, moderation.Roles.Members.Enabled, true)
  3964  		}
  3965  
  3966  		patch := []*model.ChannelModerationPatch{
  3967  			{
  3968  				Name:  &createPosts,
  3969  				Roles: &model.ChannelModeratedRolesPatch{Members: model.NewBool(true)},
  3970  			},
  3971  		}
  3972  
  3973  		moderations, res = th.SystemAdminClient.PatchChannelModerations(channel.Id, patch)
  3974  		require.Nil(t, res.Error)
  3975  		require.Equal(t, len(moderations), 4)
  3976  		for _, moderation := range moderations {
  3977  			if moderation.Name == "manage_members" {
  3978  				require.Empty(t, moderation.Roles.Guests)
  3979  			} else {
  3980  				require.Equal(t, moderation.Roles.Guests.Value, false)
  3981  				require.Equal(t, moderation.Roles.Guests.Enabled, false)
  3982  			}
  3983  
  3984  			require.Equal(t, moderation.Roles.Members.Value, true)
  3985  			require.Equal(t, moderation.Roles.Members.Enabled, true)
  3986  		}
  3987  	})
  3988  
  3989  }
  3990  
  3991  func TestGetChannelMemberCountsByGroup(t *testing.T) {
  3992  	th := Setup(t).InitBasic()
  3993  	defer th.TearDown()
  3994  
  3995  	channel := th.BasicChannel
  3996  	t.Run("Errors without a license", func(t *testing.T) {
  3997  		_, res := th.SystemAdminClient.GetChannelMemberCountsByGroup(channel.Id, false, "")
  3998  		require.Equal(t, "api.channel.channel_member_counts_by_group.license.error", res.Error.Id)
  3999  	})
  4000  
  4001  	th.App.Srv().SetLicense(model.NewTestLicense())
  4002  
  4003  	t.Run("Errors without read permission to the channel", func(t *testing.T) {
  4004  		_, res := th.Client.GetChannelMemberCountsByGroup(model.NewId(), false, "")
  4005  		require.Equal(t, "api.context.permissions.app_error", res.Error.Id)
  4006  	})
  4007  
  4008  	t.Run("Returns empty for a channel with no members or groups", func(t *testing.T) {
  4009  		memberCounts, _ := th.SystemAdminClient.GetChannelMemberCountsByGroup(channel.Id, false, "")
  4010  		require.Equal(t, []*model.ChannelMemberCountByGroup{}, memberCounts)
  4011  	})
  4012  
  4013  	user := th.BasicUser
  4014  	user.Timezone["useAutomaticTimezone"] = "false"
  4015  	user.Timezone["manualTimezone"] = "XOXO/BLABLA"
  4016  	_, err := th.App.UpsertGroupMember(th.Group.Id, user.Id)
  4017  	require.Nil(t, err)
  4018  	_, resp := th.SystemAdminClient.UpdateUser(user)
  4019  	CheckNoError(t, resp)
  4020  
  4021  	user2 := th.BasicUser2
  4022  	user2.Timezone["automaticTimezone"] = "NoWhere/Island"
  4023  	_, err = th.App.UpsertGroupMember(th.Group.Id, user2.Id)
  4024  	require.Nil(t, err)
  4025  	_, resp = th.SystemAdminClient.UpdateUser(user2)
  4026  	CheckNoError(t, resp)
  4027  
  4028  	t.Run("Returns users in group without timezones", func(t *testing.T) {
  4029  		memberCounts, _ := th.SystemAdminClient.GetChannelMemberCountsByGroup(channel.Id, false, "")
  4030  		expectedMemberCounts := []*model.ChannelMemberCountByGroup{
  4031  			{
  4032  				GroupId:                     th.Group.Id,
  4033  				ChannelMemberCount:          2,
  4034  				ChannelMemberTimezonesCount: 0,
  4035  			},
  4036  		}
  4037  		require.Equal(t, expectedMemberCounts, memberCounts)
  4038  	})
  4039  
  4040  	t.Run("Returns users in group with timezones", func(t *testing.T) {
  4041  		memberCounts, _ := th.SystemAdminClient.GetChannelMemberCountsByGroup(channel.Id, true, "")
  4042  		expectedMemberCounts := []*model.ChannelMemberCountByGroup{
  4043  			{
  4044  				GroupId:                     th.Group.Id,
  4045  				ChannelMemberCount:          2,
  4046  				ChannelMemberTimezonesCount: 2,
  4047  			},
  4048  		}
  4049  		require.Equal(t, expectedMemberCounts, memberCounts)
  4050  	})
  4051  
  4052  	id := model.NewId()
  4053  	group := &model.Group{
  4054  		DisplayName: "dn_" + id,
  4055  		Name:        model.NewString("name" + id),
  4056  		Source:      model.GroupSourceLdap,
  4057  		RemoteId:    model.NewId(),
  4058  	}
  4059  
  4060  	_, err = th.App.CreateGroup(group)
  4061  	require.Nil(t, err)
  4062  	_, err = th.App.UpsertGroupMember(group.Id, user.Id)
  4063  	require.Nil(t, err)
  4064  
  4065  	t.Run("Returns multiple groups with users in group with timezones", func(t *testing.T) {
  4066  		memberCounts, _ := th.SystemAdminClient.GetChannelMemberCountsByGroup(channel.Id, true, "")
  4067  		expectedMemberCounts := []*model.ChannelMemberCountByGroup{
  4068  			{
  4069  				GroupId:                     group.Id,
  4070  				ChannelMemberCount:          1,
  4071  				ChannelMemberTimezonesCount: 1,
  4072  			},
  4073  			{
  4074  				GroupId:                     th.Group.Id,
  4075  				ChannelMemberCount:          2,
  4076  				ChannelMemberTimezonesCount: 2,
  4077  			},
  4078  		}
  4079  		require.ElementsMatch(t, expectedMemberCounts, memberCounts)
  4080  	})
  4081  }
  4082  
  4083  func TestMoveChannel(t *testing.T) {
  4084  	th := Setup(t).InitBasic()
  4085  	defer th.TearDown()
  4086  
  4087  	Client := th.Client
  4088  	team1 := th.BasicTeam
  4089  	team2 := th.CreateTeam()
  4090  
  4091  	t.Run("Should move channel", func(t *testing.T) {
  4092  		publicChannel := th.CreatePublicChannel()
  4093  		ch, resp := th.SystemAdminClient.MoveChannel(publicChannel.Id, team2.Id, false)
  4094  		require.Nil(t, resp.Error)
  4095  		require.Equal(t, team2.Id, ch.TeamId)
  4096  	})
  4097  
  4098  	t.Run("Should move private channel", func(t *testing.T) {
  4099  		channel := th.CreatePrivateChannel()
  4100  		ch, resp := th.SystemAdminClient.MoveChannel(channel.Id, team1.Id, false)
  4101  		require.Nil(t, resp.Error)
  4102  		require.Equal(t, team1.Id, ch.TeamId)
  4103  	})
  4104  
  4105  	t.Run("Should fail when trying to move a DM channel", func(t *testing.T) {
  4106  		user := th.CreateUser()
  4107  		dmChannel := th.CreateDmChannel(user)
  4108  		_, resp := Client.MoveChannel(dmChannel.Id, team1.Id, false)
  4109  		require.NotNil(t, resp.Error)
  4110  		CheckErrorMessage(t, resp, "api.channel.move_channel.type.invalid")
  4111  	})
  4112  
  4113  	t.Run("Should fail when trying to move a group channel", func(t *testing.T) {
  4114  		user := th.CreateUser()
  4115  
  4116  		gmChannel, err := th.App.CreateGroupChannel([]string{th.BasicUser.Id, th.SystemAdminUser.Id, th.TeamAdminUser.Id}, user.Id)
  4117  		require.Nil(t, err)
  4118  		_, resp := Client.MoveChannel(gmChannel.Id, team1.Id, false)
  4119  		require.NotNil(t, resp.Error)
  4120  		CheckErrorMessage(t, resp, "api.channel.move_channel.type.invalid")
  4121  	})
  4122  
  4123  	t.Run("Should fail due to permissions", func(t *testing.T) {
  4124  		publicChannel := th.CreatePublicChannel()
  4125  		_, resp := Client.MoveChannel(publicChannel.Id, team1.Id, false)
  4126  		require.NotNil(t, resp.Error)
  4127  		CheckErrorMessage(t, resp, "api.context.permissions.app_error")
  4128  	})
  4129  
  4130  	th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) {
  4131  		publicChannel := th.CreatePublicChannel()
  4132  		user := th.BasicUser
  4133  
  4134  		_, resp := client.RemoveTeamMember(team2.Id, user.Id)
  4135  		CheckNoError(t, resp)
  4136  
  4137  		_, resp = client.AddChannelMember(publicChannel.Id, user.Id)
  4138  		CheckNoError(t, resp)
  4139  
  4140  		_, resp = client.MoveChannel(publicChannel.Id, team2.Id, false)
  4141  		require.NotNil(t, resp.Error)
  4142  		CheckErrorMessage(t, resp, "app.channel.move_channel.members_do_not_match.error")
  4143  	}, "Should fail to move public channel due to a member not member of target team")
  4144  
  4145  	th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) {
  4146  		privateChannel := th.CreatePrivateChannel()
  4147  		user := th.BasicUser
  4148  
  4149  		_, resp := client.RemoveTeamMember(team2.Id, user.Id)
  4150  		CheckNoError(t, resp)
  4151  
  4152  		_, resp = client.AddChannelMember(privateChannel.Id, user.Id)
  4153  		CheckNoError(t, resp)
  4154  
  4155  		_, resp = client.MoveChannel(privateChannel.Id, team2.Id, false)
  4156  		require.NotNil(t, resp.Error)
  4157  		CheckErrorMessage(t, resp, "app.channel.move_channel.members_do_not_match.error")
  4158  	}, "Should fail to move private channel due to a member not member of target team")
  4159  
  4160  	th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) {
  4161  		publicChannel := th.CreatePublicChannel()
  4162  		user := th.BasicUser
  4163  
  4164  		_, resp := client.RemoveTeamMember(team2.Id, user.Id)
  4165  		CheckNoError(t, resp)
  4166  
  4167  		_, resp = client.AddChannelMember(publicChannel.Id, user.Id)
  4168  		CheckNoError(t, resp)
  4169  
  4170  		newChannel, resp := client.MoveChannel(publicChannel.Id, team2.Id, true)
  4171  		require.Nil(t, resp.Error)
  4172  		require.Equal(t, team2.Id, newChannel.TeamId)
  4173  	}, "Should be able to (force) move public channel by a member that is not member of target team")
  4174  
  4175  	th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) {
  4176  		privateChannel := th.CreatePrivateChannel()
  4177  		user := th.BasicUser
  4178  
  4179  		_, resp := client.RemoveTeamMember(team2.Id, user.Id)
  4180  		CheckNoError(t, resp)
  4181  
  4182  		_, resp = client.AddChannelMember(privateChannel.Id, user.Id)
  4183  		CheckNoError(t, resp)
  4184  
  4185  		newChannel, resp := client.MoveChannel(privateChannel.Id, team2.Id, true)
  4186  		require.Nil(t, resp.Error)
  4187  		require.Equal(t, team2.Id, newChannel.TeamId)
  4188  	}, "Should be able to (force) move private channel by a member that is not member of target team")
  4189  }
  4190  
  4191  func TestRootMentionsCount(t *testing.T) {
  4192  	th := Setup(t).InitBasic()
  4193  	defer th.TearDown()
  4194  
  4195  	Client := th.Client
  4196  	user := th.BasicUser
  4197  	channel := th.BasicChannel
  4198  
  4199  	// initially, MentionCountRoot is 0 in the database
  4200  	channelMember, err := th.App.Srv().Store.Channel().GetMember(context.Background(), channel.Id, user.Id)
  4201  	require.NoError(t, err)
  4202  	require.Equal(t, int64(0), channelMember.MentionCountRoot)
  4203  	require.Equal(t, int64(0), channelMember.MentionCount)
  4204  
  4205  	// mention the user in a root post
  4206  	post1, resp := th.SystemAdminClient.CreatePost(&model.Post{ChannelId: channel.Id, Message: "hey @" + user.Username})
  4207  	CheckNoError(t, resp)
  4208  	// mention the user in a reply post
  4209  	post2 := &model.Post{ChannelId: channel.Id, Message: "reply at @" + user.Username, RootId: post1.Id}
  4210  	_, resp = th.SystemAdminClient.CreatePost(post2)
  4211  	CheckNoError(t, resp)
  4212  
  4213  	// this should perform lazy migration and populate the field
  4214  	channelUnread, resp := Client.GetChannelUnread(channel.Id, user.Id)
  4215  	CheckNoError(t, resp)
  4216  	// reply post is not counted, so we should have one root mention
  4217  	require.EqualValues(t, int64(1), channelUnread.MentionCountRoot)
  4218  	// regular count stays the same
  4219  	require.Equal(t, int64(2), channelUnread.MentionCount)
  4220  	// validate that DB is updated
  4221  	channelMember, err = th.App.Srv().Store.Channel().GetMember(context.Background(), channel.Id, user.Id)
  4222  	require.NoError(t, err)
  4223  	require.EqualValues(t, int64(1), channelMember.MentionCountRoot)
  4224  
  4225  	// validate that Team level counts are calculated
  4226  	counts, appErr := th.App.GetTeamUnread(channel.TeamId, user.Id)
  4227  	require.Nil(t, appErr)
  4228  	require.Equal(t, int64(1), counts.MentionCountRoot)
  4229  	require.Equal(t, int64(2), counts.MentionCount)
  4230  }
  4231  
  4232  func TestViewChannelWithoutCollapsedThreads(t *testing.T) {
  4233  	th := Setup(t).InitBasic()
  4234  	defer th.TearDown()
  4235  
  4236  	os.Setenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS", "true")
  4237  	defer os.Unsetenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS")
  4238  	th.App.UpdateConfig(func(cfg *model.Config) {
  4239  		*cfg.ServiceSettings.ThreadAutoFollow = true
  4240  		*cfg.ServiceSettings.CollapsedThreads = model.COLLAPSED_THREADS_DEFAULT_ON
  4241  	})
  4242  
  4243  	Client := th.Client
  4244  	user := th.BasicUser
  4245  	team := th.BasicTeam
  4246  	channel := th.BasicChannel
  4247  
  4248  	// mention the user in a root post
  4249  	post1, resp := th.SystemAdminClient.CreatePost(&model.Post{ChannelId: channel.Id, Message: "hey @" + user.Username})
  4250  	CheckNoError(t, resp)
  4251  	// mention the user in a reply post
  4252  	post2 := &model.Post{ChannelId: channel.Id, Message: "reply at @" + user.Username, RootId: post1.Id}
  4253  	_, resp = th.SystemAdminClient.CreatePost(post2)
  4254  	CheckNoError(t, resp)
  4255  
  4256  	threads, resp := Client.GetUserThreads(user.Id, team.Id, model.GetUserThreadsOpts{})
  4257  	CheckNoError(t, resp)
  4258  	require.EqualValues(t, int64(1), threads.TotalUnreadMentions)
  4259  
  4260  	// simulate opening the channel from an old client
  4261  	_, resp = Client.ViewChannel(user.Id, &model.ChannelView{
  4262  		ChannelId:                 channel.Id,
  4263  		PrevChannelId:             "",
  4264  		CollapsedThreadsSupported: false,
  4265  	})
  4266  	CheckNoError(t, resp)
  4267  
  4268  	threads, resp = Client.GetUserThreads(user.Id, team.Id, model.GetUserThreadsOpts{})
  4269  	CheckNoError(t, resp)
  4270  	require.Zero(t, threads.TotalUnreadMentions)
  4271  }