github.com/vnforks/kid@v5.11.1+incompatible/api4/channel_test.go (about)

     1  // Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package api4
     5  
     6  import (
     7  	"fmt"
     8  	"net/http"
     9  	"reflect"
    10  	"sort"
    11  	"strconv"
    12  	"strings"
    13  	"testing"
    14  	"time"
    15  
    16  	"github.com/mattermost/mattermost-server/model"
    17  	"github.com/mattermost/mattermost-server/utils"
    18  	"github.com/stretchr/testify/assert"
    19  	"github.com/stretchr/testify/require"
    20  )
    21  
    22  func TestCreateChannel(t *testing.T) {
    23  	th := Setup().InitBasic()
    24  	defer th.TearDown()
    25  	Client := th.Client
    26  	team := th.BasicTeam
    27  
    28  	channel := &model.Channel{DisplayName: "Test API Name", Name: GenerateTestChannelName(), Type: model.CHANNEL_OPEN, TeamId: team.Id}
    29  	private := &model.Channel{DisplayName: "Test API Name", Name: GenerateTestChannelName(), Type: model.CHANNEL_PRIVATE, TeamId: team.Id}
    30  
    31  	rchannel, resp := Client.CreateChannel(channel)
    32  	CheckNoError(t, resp)
    33  	CheckCreatedStatus(t, resp)
    34  
    35  	if rchannel.Name != channel.Name {
    36  		t.Fatal("names did not match")
    37  	}
    38  
    39  	if rchannel.DisplayName != channel.DisplayName {
    40  		t.Fatal("display names did not match")
    41  	}
    42  
    43  	if rchannel.TeamId != channel.TeamId {
    44  		t.Fatal("team ids did not match")
    45  	}
    46  
    47  	rprivate, resp := Client.CreateChannel(private)
    48  	CheckNoError(t, resp)
    49  
    50  	if rprivate.Name != private.Name {
    51  		t.Fatal("names did not match")
    52  	}
    53  
    54  	if rprivate.Type != model.CHANNEL_PRIVATE {
    55  		t.Fatal("wrong channel type")
    56  	}
    57  
    58  	if rprivate.CreatorId != th.BasicUser.Id {
    59  		t.Fatal("wrong creator id")
    60  	}
    61  
    62  	_, resp = Client.CreateChannel(channel)
    63  	CheckErrorMessage(t, resp, "store.sql_channel.save_channel.exists.app_error")
    64  	CheckBadRequestStatus(t, resp)
    65  
    66  	direct := &model.Channel{DisplayName: "Test API Name", Name: GenerateTestChannelName(), Type: model.CHANNEL_DIRECT, TeamId: team.Id}
    67  	_, resp = Client.CreateChannel(direct)
    68  	CheckErrorMessage(t, resp, "api.channel.create_channel.direct_channel.app_error")
    69  	CheckBadRequestStatus(t, resp)
    70  
    71  	Client.Logout()
    72  	_, resp = Client.CreateChannel(channel)
    73  	CheckUnauthorizedStatus(t, resp)
    74  
    75  	userNotOnTeam := th.CreateUser()
    76  	Client.Login(userNotOnTeam.Email, userNotOnTeam.Password)
    77  
    78  	_, resp = Client.CreateChannel(channel)
    79  	CheckForbiddenStatus(t, resp)
    80  
    81  	_, resp = Client.CreateChannel(private)
    82  	CheckForbiddenStatus(t, resp)
    83  
    84  	// Check the appropriate permissions are enforced.
    85  	defaultRolePermissions := th.SaveDefaultRolePermissions()
    86  	defer func() {
    87  		th.RestoreDefaultRolePermissions(defaultRolePermissions)
    88  	}()
    89  
    90  	th.AddPermissionToRole(model.PERMISSION_CREATE_PUBLIC_CHANNEL.Id, model.TEAM_USER_ROLE_ID)
    91  	th.AddPermissionToRole(model.PERMISSION_CREATE_PRIVATE_CHANNEL.Id, model.TEAM_USER_ROLE_ID)
    92  
    93  	th.LoginBasic()
    94  
    95  	channel.Name = GenerateTestChannelName()
    96  	_, resp = Client.CreateChannel(channel)
    97  	CheckNoError(t, resp)
    98  
    99  	private.Name = GenerateTestChannelName()
   100  	_, resp = Client.CreateChannel(private)
   101  	CheckNoError(t, resp)
   102  
   103  	th.AddPermissionToRole(model.PERMISSION_CREATE_PUBLIC_CHANNEL.Id, model.TEAM_ADMIN_ROLE_ID)
   104  	th.AddPermissionToRole(model.PERMISSION_CREATE_PRIVATE_CHANNEL.Id, model.TEAM_ADMIN_ROLE_ID)
   105  	th.RemovePermissionFromRole(model.PERMISSION_CREATE_PUBLIC_CHANNEL.Id, model.TEAM_USER_ROLE_ID)
   106  	th.RemovePermissionFromRole(model.PERMISSION_CREATE_PRIVATE_CHANNEL.Id, model.TEAM_USER_ROLE_ID)
   107  
   108  	_, resp = Client.CreateChannel(channel)
   109  	CheckForbiddenStatus(t, resp)
   110  
   111  	_, resp = Client.CreateChannel(private)
   112  	CheckForbiddenStatus(t, resp)
   113  
   114  	th.LoginTeamAdmin()
   115  
   116  	channel.Name = GenerateTestChannelName()
   117  	_, resp = Client.CreateChannel(channel)
   118  	CheckNoError(t, resp)
   119  
   120  	private.Name = GenerateTestChannelName()
   121  	_, resp = Client.CreateChannel(private)
   122  	CheckNoError(t, resp)
   123  
   124  	channel.Name = GenerateTestChannelName()
   125  	_, resp = th.SystemAdminClient.CreateChannel(channel)
   126  	CheckNoError(t, resp)
   127  
   128  	private.Name = GenerateTestChannelName()
   129  	_, resp = th.SystemAdminClient.CreateChannel(private)
   130  	CheckNoError(t, resp)
   131  
   132  	// Test posting Garbage
   133  	if r, err := Client.DoApiPost("/channels", "garbage"); err == nil {
   134  		t.Fatal("should have errored")
   135  	} else {
   136  		if r.StatusCode != http.StatusBadRequest {
   137  			t.Log("actual: " + strconv.Itoa(r.StatusCode))
   138  			t.Log("expected: " + strconv.Itoa(http.StatusBadRequest))
   139  			t.Fatal("wrong status code")
   140  		}
   141  	}
   142  }
   143  
   144  func TestUpdateChannel(t *testing.T) {
   145  	th := Setup().InitBasic()
   146  	defer th.TearDown()
   147  	Client := th.Client
   148  	team := th.BasicTeam
   149  
   150  	channel := &model.Channel{DisplayName: "Test API Name", Name: GenerateTestChannelName(), Type: model.CHANNEL_OPEN, TeamId: team.Id}
   151  	private := &model.Channel{DisplayName: "Test API Name", Name: GenerateTestChannelName(), Type: model.CHANNEL_PRIVATE, TeamId: team.Id}
   152  
   153  	channel, _ = Client.CreateChannel(channel)
   154  	private, _ = Client.CreateChannel(private)
   155  
   156  	//Update a open channel
   157  	channel.DisplayName = "My new display name"
   158  	channel.Header = "My fancy header"
   159  	channel.Purpose = "Mattermost ftw!"
   160  
   161  	newChannel, resp := Client.UpdateChannel(channel)
   162  	CheckNoError(t, resp)
   163  
   164  	if newChannel.DisplayName != channel.DisplayName {
   165  		t.Fatal("Update failed for DisplayName")
   166  	}
   167  
   168  	if newChannel.Header != channel.Header {
   169  		t.Fatal("Update failed for Header")
   170  	}
   171  
   172  	if newChannel.Purpose != channel.Purpose {
   173  		t.Fatal("Update failed for Purpose")
   174  	}
   175  
   176  	//Update a private channel
   177  	private.DisplayName = "My new display name for private channel"
   178  	private.Header = "My fancy private header"
   179  	private.Purpose = "Mattermost ftw! in private mode"
   180  
   181  	newPrivateChannel, resp := Client.UpdateChannel(private)
   182  	CheckNoError(t, resp)
   183  
   184  	if newPrivateChannel.DisplayName != private.DisplayName {
   185  		t.Fatal("Update failed for DisplayName in private channel")
   186  	}
   187  
   188  	if newPrivateChannel.Header != private.Header {
   189  		t.Fatal("Update failed for Header in private channel")
   190  	}
   191  
   192  	if newPrivateChannel.Purpose != private.Purpose {
   193  		t.Fatal("Update failed for Purpose in private channel")
   194  	}
   195  
   196  	// Updating a private channel requires permission *and* membership, so this should fail.
   197  	_, resp = th.SystemAdminClient.UpdateChannel(private)
   198  	CheckForbiddenStatus(t, resp)
   199  
   200  	//Non existing channel
   201  	channel1 := &model.Channel{DisplayName: "Test API Name for apiv4", Name: GenerateTestChannelName(), Type: model.CHANNEL_OPEN, TeamId: team.Id}
   202  	_, resp = Client.UpdateChannel(channel1)
   203  	CheckNotFoundStatus(t, resp)
   204  
   205  	//Try to update with not logged user
   206  	Client.Logout()
   207  	_, resp = Client.UpdateChannel(channel)
   208  	CheckUnauthorizedStatus(t, resp)
   209  
   210  	//Try to update using another user
   211  	user := th.CreateUser()
   212  	Client.Login(user.Email, user.Password)
   213  
   214  	channel.DisplayName = "Should not update"
   215  	_, resp = Client.UpdateChannel(channel)
   216  	CheckForbiddenStatus(t, resp)
   217  
   218  	// Test updating the header of someone else's GM channel.
   219  	user1 := th.CreateUser()
   220  	user2 := th.CreateUser()
   221  	user3 := th.CreateUser()
   222  
   223  	groupChannel, resp := Client.CreateGroupChannel([]string{user1.Id, user2.Id})
   224  	CheckNoError(t, resp)
   225  
   226  	groupChannel.Header = "lolololol"
   227  	Client.Logout()
   228  	Client.Login(user3.Email, user3.Password)
   229  	_, resp = Client.UpdateChannel(groupChannel)
   230  	CheckForbiddenStatus(t, resp)
   231  
   232  	// Test updating the header of someone else's GM channel.
   233  	Client.Logout()
   234  	Client.Login(user.Email, user.Password)
   235  
   236  	directChannel, resp := Client.CreateDirectChannel(user.Id, user1.Id)
   237  	CheckNoError(t, resp)
   238  
   239  	directChannel.Header = "lolololol"
   240  	Client.Logout()
   241  	Client.Login(user3.Email, user3.Password)
   242  	_, resp = Client.UpdateChannel(directChannel)
   243  	CheckForbiddenStatus(t, resp)
   244  }
   245  
   246  func TestPatchChannel(t *testing.T) {
   247  	th := Setup().InitBasic()
   248  	defer th.TearDown()
   249  	Client := th.Client
   250  
   251  	patch := &model.ChannelPatch{
   252  		Name:        new(string),
   253  		DisplayName: new(string),
   254  		Header:      new(string),
   255  		Purpose:     new(string),
   256  	}
   257  	*patch.Name = model.NewId()
   258  	*patch.DisplayName = model.NewId()
   259  	*patch.Header = model.NewId()
   260  	*patch.Purpose = model.NewId()
   261  
   262  	channel, resp := Client.PatchChannel(th.BasicChannel.Id, patch)
   263  	CheckNoError(t, resp)
   264  
   265  	if *patch.Name != channel.Name {
   266  		t.Fatal("do not match")
   267  	} else if *patch.DisplayName != channel.DisplayName {
   268  		t.Fatal("do not match")
   269  	} else if *patch.Header != channel.Header {
   270  		t.Fatal("do not match")
   271  	} else if *patch.Purpose != channel.Purpose {
   272  		t.Fatal("do not match")
   273  	}
   274  
   275  	patch.Name = nil
   276  	oldName := channel.Name
   277  	channel, resp = Client.PatchChannel(th.BasicChannel.Id, patch)
   278  	CheckNoError(t, resp)
   279  
   280  	if channel.Name != oldName {
   281  		t.Fatal("should not have updated")
   282  	}
   283  
   284  	_, resp = Client.PatchChannel("junk", patch)
   285  	CheckBadRequestStatus(t, resp)
   286  
   287  	_, resp = Client.PatchChannel(model.NewId(), patch)
   288  	CheckNotFoundStatus(t, resp)
   289  
   290  	user := th.CreateUser()
   291  	Client.Login(user.Email, user.Password)
   292  	_, resp = Client.PatchChannel(th.BasicChannel.Id, patch)
   293  	CheckForbiddenStatus(t, resp)
   294  
   295  	_, resp = th.SystemAdminClient.PatchChannel(th.BasicChannel.Id, patch)
   296  	CheckNoError(t, resp)
   297  
   298  	Client.Logout()
   299  	Client.Login(th.BasicUser.Username, th.BasicUser.Password)
   300  
   301  	_, resp = th.Client.PatchChannel(th.BasicPrivateChannel.Id, patch)
   302  	CheckNoError(t, resp)
   303  
   304  	// Patching a private channel requires permission *and* membership, so this should fail.
   305  	_, resp = th.SystemAdminClient.PatchChannel(th.BasicPrivateChannel.Id, patch)
   306  	CheckForbiddenStatus(t, resp)
   307  
   308  	// Test updating the header of someone else's GM channel.
   309  	user1 := th.CreateUser()
   310  	user2 := th.CreateUser()
   311  	user3 := th.CreateUser()
   312  
   313  	groupChannel, resp := Client.CreateGroupChannel([]string{user1.Id, user2.Id})
   314  	CheckNoError(t, resp)
   315  
   316  	Client.Logout()
   317  	Client.Login(user3.Email, user3.Password)
   318  
   319  	channelPatch := &model.ChannelPatch{}
   320  	channelPatch.Header = new(string)
   321  	*channelPatch.Header = "lolololol"
   322  
   323  	_, resp = Client.PatchChannel(groupChannel.Id, channelPatch)
   324  	CheckForbiddenStatus(t, resp)
   325  
   326  	// Test updating the header of someone else's GM channel.
   327  	Client.Logout()
   328  	Client.Login(user.Email, user.Password)
   329  
   330  	directChannel, resp := Client.CreateDirectChannel(user.Id, user1.Id)
   331  	CheckNoError(t, resp)
   332  
   333  	Client.Logout()
   334  	Client.Login(user3.Email, user3.Password)
   335  	_, resp = Client.PatchChannel(directChannel.Id, channelPatch)
   336  	CheckForbiddenStatus(t, resp)
   337  }
   338  
   339  func TestCreateDirectChannel(t *testing.T) {
   340  	th := Setup().InitBasic()
   341  	defer th.TearDown()
   342  	Client := th.Client
   343  	user1 := th.BasicUser
   344  	user2 := th.BasicUser2
   345  	user3 := th.CreateUser()
   346  
   347  	dm, resp := Client.CreateDirectChannel(user1.Id, user2.Id)
   348  	CheckNoError(t, resp)
   349  
   350  	channelName := ""
   351  	if user2.Id > user1.Id {
   352  		channelName = user1.Id + "__" + user2.Id
   353  	} else {
   354  		channelName = user2.Id + "__" + user1.Id
   355  	}
   356  
   357  	if dm.Name != channelName {
   358  		t.Fatal("dm name didn't match")
   359  	}
   360  
   361  	_, resp = Client.CreateDirectChannel("junk", user2.Id)
   362  	CheckBadRequestStatus(t, resp)
   363  
   364  	_, resp = Client.CreateDirectChannel(user1.Id, model.NewId())
   365  	CheckBadRequestStatus(t, resp)
   366  
   367  	_, resp = Client.CreateDirectChannel(model.NewId(), user1.Id)
   368  	CheckBadRequestStatus(t, resp)
   369  
   370  	_, resp = Client.CreateDirectChannel(model.NewId(), user2.Id)
   371  	CheckForbiddenStatus(t, resp)
   372  
   373  	if r, err := Client.DoApiPost("/channels/direct", "garbage"); err == nil {
   374  		t.Fatal("should have errored")
   375  	} else {
   376  		if r.StatusCode != http.StatusBadRequest {
   377  			t.Log("actual: " + strconv.Itoa(r.StatusCode))
   378  			t.Log("expected: " + strconv.Itoa(http.StatusBadRequest))
   379  			t.Fatal("wrong status code")
   380  		}
   381  	}
   382  
   383  	Client.Logout()
   384  	_, resp = Client.CreateDirectChannel(model.NewId(), user2.Id)
   385  	CheckUnauthorizedStatus(t, resp)
   386  
   387  	_, resp = th.SystemAdminClient.CreateDirectChannel(user3.Id, user2.Id)
   388  	CheckNoError(t, resp)
   389  }
   390  
   391  func TestDeleteDirectChannel(t *testing.T) {
   392  	th := Setup().InitBasic()
   393  	defer th.TearDown()
   394  	Client := th.Client
   395  	user := th.BasicUser
   396  	user2 := th.BasicUser2
   397  
   398  	rgc, resp := Client.CreateDirectChannel(user.Id, user2.Id)
   399  	CheckNoError(t, resp)
   400  	CheckCreatedStatus(t, resp)
   401  	require.NotNil(t, rgc, "should have created a direct channel")
   402  
   403  	deleted, resp := Client.DeleteChannel(rgc.Id)
   404  	CheckErrorMessage(t, resp, "api.channel.delete_channel.type.invalid")
   405  	require.False(t, deleted, "should not have been able to delete direct channel.")
   406  }
   407  
   408  func TestCreateGroupChannel(t *testing.T) {
   409  	th := Setup().InitBasic()
   410  	defer th.TearDown()
   411  	Client := th.Client
   412  	user := th.BasicUser
   413  	user2 := th.BasicUser2
   414  	user3 := th.CreateUser()
   415  
   416  	userIds := []string{user.Id, user2.Id, user3.Id}
   417  
   418  	rgc, resp := Client.CreateGroupChannel(userIds)
   419  	CheckNoError(t, resp)
   420  	CheckCreatedStatus(t, resp)
   421  
   422  	if rgc == nil {
   423  		t.Fatal("should have created a group channel")
   424  	}
   425  
   426  	if rgc.Type != model.CHANNEL_GROUP {
   427  		t.Fatal("should have created a channel of group type")
   428  	}
   429  
   430  	m, _ := th.App.GetChannelMembersPage(rgc.Id, 0, 10)
   431  	if len(*m) != 3 {
   432  		t.Fatal("should have 3 channel members")
   433  	}
   434  
   435  	// saving duplicate group channel
   436  	rgc2, resp := Client.CreateGroupChannel([]string{user3.Id, user2.Id})
   437  	CheckNoError(t, resp)
   438  
   439  	if rgc.Id != rgc2.Id {
   440  		t.Fatal("should have returned existing channel")
   441  	}
   442  
   443  	m2, _ := th.App.GetChannelMembersPage(rgc2.Id, 0, 10)
   444  	if !reflect.DeepEqual(*m, *m2) {
   445  		t.Fatal("should be equal")
   446  	}
   447  
   448  	_, resp = Client.CreateGroupChannel([]string{user2.Id})
   449  	CheckBadRequestStatus(t, resp)
   450  
   451  	user4 := th.CreateUser()
   452  	user5 := th.CreateUser()
   453  	user6 := th.CreateUser()
   454  	user7 := th.CreateUser()
   455  	user8 := th.CreateUser()
   456  	user9 := th.CreateUser()
   457  
   458  	rgc, resp = Client.CreateGroupChannel([]string{user.Id, user2.Id, user3.Id, user4.Id, user5.Id, user6.Id, user7.Id, user8.Id, user9.Id})
   459  	CheckBadRequestStatus(t, resp)
   460  
   461  	if rgc != nil {
   462  		t.Fatal("should return nil")
   463  	}
   464  
   465  	_, resp = Client.CreateGroupChannel([]string{user.Id, user2.Id, user3.Id, GenerateTestId()})
   466  	CheckBadRequestStatus(t, resp)
   467  
   468  	_, resp = Client.CreateGroupChannel([]string{user.Id, user2.Id, user3.Id, "junk"})
   469  	CheckBadRequestStatus(t, resp)
   470  
   471  	Client.Logout()
   472  
   473  	_, resp = Client.CreateGroupChannel(userIds)
   474  	CheckUnauthorizedStatus(t, resp)
   475  
   476  	_, resp = th.SystemAdminClient.CreateGroupChannel(userIds)
   477  	CheckNoError(t, resp)
   478  }
   479  
   480  func TestDeleteGroupChannel(t *testing.T) {
   481  	th := Setup().InitBasic()
   482  	defer th.TearDown()
   483  	Client := th.Client
   484  	user := th.BasicUser
   485  	user2 := th.BasicUser2
   486  	user3 := th.CreateUser()
   487  
   488  	userIds := []string{user.Id, user2.Id, user3.Id}
   489  
   490  	rgc, resp := Client.CreateGroupChannel(userIds)
   491  	CheckNoError(t, resp)
   492  	CheckCreatedStatus(t, resp)
   493  	require.NotNil(t, rgc, "should have created a group channel")
   494  
   495  	deleted, resp := Client.DeleteChannel(rgc.Id)
   496  	CheckErrorMessage(t, resp, "api.channel.delete_channel.type.invalid")
   497  	require.False(t, deleted, "should not have been able to delete group channel.")
   498  }
   499  
   500  func TestGetChannel(t *testing.T) {
   501  	th := Setup().InitBasic()
   502  	defer th.TearDown()
   503  	Client := th.Client
   504  
   505  	channel, resp := Client.GetChannel(th.BasicChannel.Id, "")
   506  	CheckNoError(t, resp)
   507  
   508  	if channel.Id != th.BasicChannel.Id {
   509  		t.Fatal("ids did not match")
   510  	}
   511  
   512  	Client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser.Id)
   513  	_, resp = Client.GetChannel(th.BasicChannel.Id, "")
   514  	CheckNoError(t, resp)
   515  
   516  	channel, resp = Client.GetChannel(th.BasicPrivateChannel.Id, "")
   517  	CheckNoError(t, resp)
   518  
   519  	if channel.Id != th.BasicPrivateChannel.Id {
   520  		t.Fatal("ids did not match")
   521  	}
   522  
   523  	Client.RemoveUserFromChannel(th.BasicPrivateChannel.Id, th.BasicUser.Id)
   524  	_, resp = Client.GetChannel(th.BasicPrivateChannel.Id, "")
   525  	CheckForbiddenStatus(t, resp)
   526  
   527  	_, resp = Client.GetChannel(model.NewId(), "")
   528  	CheckNotFoundStatus(t, resp)
   529  
   530  	Client.Logout()
   531  	_, resp = Client.GetChannel(th.BasicChannel.Id, "")
   532  	CheckUnauthorizedStatus(t, resp)
   533  
   534  	user := th.CreateUser()
   535  	Client.Login(user.Email, user.Password)
   536  	_, resp = Client.GetChannel(th.BasicChannel.Id, "")
   537  	CheckForbiddenStatus(t, resp)
   538  
   539  	_, resp = th.SystemAdminClient.GetChannel(th.BasicChannel.Id, "")
   540  	CheckNoError(t, resp)
   541  
   542  	_, resp = th.SystemAdminClient.GetChannel(th.BasicPrivateChannel.Id, "")
   543  	CheckNoError(t, resp)
   544  
   545  	_, resp = th.SystemAdminClient.GetChannel(th.BasicUser.Id, "")
   546  	CheckNotFoundStatus(t, resp)
   547  }
   548  
   549  func TestGetDeletedChannelsForTeam(t *testing.T) {
   550  	th := Setup().InitBasic()
   551  	defer th.TearDown()
   552  	Client := th.Client
   553  	team := th.BasicTeam
   554  
   555  	_, resp := Client.GetDeletedChannelsForTeam(team.Id, 0, 100, "")
   556  	CheckForbiddenStatus(t, resp)
   557  
   558  	th.LoginTeamAdmin()
   559  
   560  	channels, resp := Client.GetDeletedChannelsForTeam(team.Id, 0, 100, "")
   561  	CheckNoError(t, resp)
   562  	numInitialChannelsForTeam := len(channels)
   563  
   564  	// create and delete public channel
   565  	publicChannel1 := th.CreatePublicChannel()
   566  	Client.DeleteChannel(publicChannel1.Id)
   567  
   568  	channels, resp = Client.GetDeletedChannelsForTeam(team.Id, 0, 100, "")
   569  	CheckNoError(t, resp)
   570  	if len(channels) != numInitialChannelsForTeam+1 {
   571  		t.Fatal("should be 1 deleted channel")
   572  	}
   573  
   574  	publicChannel2 := th.CreatePublicChannel()
   575  	Client.DeleteChannel(publicChannel2.Id)
   576  
   577  	channels, resp = Client.GetDeletedChannelsForTeam(team.Id, 0, 100, "")
   578  	CheckNoError(t, resp)
   579  	if len(channels) != numInitialChannelsForTeam+2 {
   580  		t.Fatal("should be 2 deleted channels")
   581  	}
   582  
   583  	channels, resp = Client.GetDeletedChannelsForTeam(team.Id, 0, 1, "")
   584  	CheckNoError(t, resp)
   585  	if len(channels) != 1 {
   586  		t.Fatal("should be one channel per page")
   587  	}
   588  
   589  	channels, resp = Client.GetDeletedChannelsForTeam(team.Id, 1, 1, "")
   590  	CheckNoError(t, resp)
   591  	if len(channels) != 1 {
   592  		t.Fatal("should be one channel per page")
   593  	}
   594  }
   595  
   596  func TestGetPublicChannelsForTeam(t *testing.T) {
   597  	th := Setup().InitBasic()
   598  	defer th.TearDown()
   599  	Client := th.Client
   600  	team := th.BasicTeam
   601  	publicChannel1 := th.BasicChannel
   602  	publicChannel2 := th.BasicChannel2
   603  
   604  	channels, resp := Client.GetPublicChannelsForTeam(team.Id, 0, 100, "")
   605  	CheckNoError(t, resp)
   606  	if len(channels) != 4 {
   607  		t.Fatal("wrong length")
   608  	}
   609  
   610  	for i, c := range channels {
   611  		if c.Type != model.CHANNEL_OPEN {
   612  			t.Fatal("should include open channel only")
   613  		}
   614  
   615  		// only check the created 2 public channels
   616  		if i < 2 && !(c.DisplayName == publicChannel1.DisplayName || c.DisplayName == publicChannel2.DisplayName) {
   617  			t.Logf("channel %v: %v", i, c.DisplayName)
   618  			t.Fatal("should match public channel display name only")
   619  		}
   620  	}
   621  
   622  	privateChannel := th.CreatePrivateChannel()
   623  	channels, resp = Client.GetPublicChannelsForTeam(team.Id, 0, 100, "")
   624  	CheckNoError(t, resp)
   625  	if len(channels) != 4 {
   626  		t.Fatal("wrong length")
   627  	}
   628  
   629  	for _, c := range channels {
   630  		if c.Type != model.CHANNEL_OPEN {
   631  			t.Fatal("should not include private channel")
   632  		}
   633  
   634  		if c.DisplayName == privateChannel.DisplayName {
   635  			t.Fatal("should not match private channel display name")
   636  		}
   637  	}
   638  
   639  	channels, resp = Client.GetPublicChannelsForTeam(team.Id, 0, 1, "")
   640  	CheckNoError(t, resp)
   641  	if len(channels) != 1 {
   642  		t.Fatal("should be one channel per page")
   643  	}
   644  
   645  	channels, resp = Client.GetPublicChannelsForTeam(team.Id, 1, 1, "")
   646  	CheckNoError(t, resp)
   647  	if len(channels) != 1 {
   648  		t.Fatal("should be one channel per page")
   649  	}
   650  
   651  	channels, resp = Client.GetPublicChannelsForTeam(team.Id, 10000, 100, "")
   652  	CheckNoError(t, resp)
   653  	if len(channels) != 0 {
   654  		t.Fatal("should be no channel")
   655  	}
   656  
   657  	_, resp = Client.GetPublicChannelsForTeam("junk", 0, 100, "")
   658  	CheckBadRequestStatus(t, resp)
   659  
   660  	_, resp = Client.GetPublicChannelsForTeam(model.NewId(), 0, 100, "")
   661  	CheckForbiddenStatus(t, resp)
   662  
   663  	Client.Logout()
   664  	_, resp = Client.GetPublicChannelsForTeam(team.Id, 0, 100, "")
   665  	CheckUnauthorizedStatus(t, resp)
   666  
   667  	user := th.CreateUser()
   668  	Client.Login(user.Email, user.Password)
   669  	_, resp = Client.GetPublicChannelsForTeam(team.Id, 0, 100, "")
   670  	CheckForbiddenStatus(t, resp)
   671  
   672  	_, resp = th.SystemAdminClient.GetPublicChannelsForTeam(team.Id, 0, 100, "")
   673  	CheckNoError(t, resp)
   674  }
   675  
   676  func TestGetPublicChannelsByIdsForTeam(t *testing.T) {
   677  	th := Setup().InitBasic()
   678  	defer th.TearDown()
   679  	Client := th.Client
   680  	teamId := th.BasicTeam.Id
   681  	input := []string{th.BasicChannel.Id}
   682  	output := []string{th.BasicChannel.DisplayName}
   683  
   684  	channels, resp := Client.GetPublicChannelsByIdsForTeam(teamId, input)
   685  	CheckNoError(t, resp)
   686  
   687  	if len(channels) != 1 {
   688  		t.Fatal("should return 1 channel")
   689  	}
   690  
   691  	if (channels)[0].DisplayName != output[0] {
   692  		t.Fatal("missing channel")
   693  	}
   694  
   695  	input = append(input, GenerateTestId())
   696  	input = append(input, th.BasicChannel2.Id)
   697  	input = append(input, th.BasicPrivateChannel.Id)
   698  	output = append(output, th.BasicChannel2.DisplayName)
   699  	sort.Strings(output)
   700  
   701  	channels, resp = Client.GetPublicChannelsByIdsForTeam(teamId, input)
   702  	CheckNoError(t, resp)
   703  
   704  	if len(channels) != 2 {
   705  		t.Fatal("should return 2 channels")
   706  	}
   707  
   708  	for i, c := range channels {
   709  		if c.DisplayName != output[i] {
   710  			t.Fatal("missing channel")
   711  		}
   712  	}
   713  
   714  	_, resp = Client.GetPublicChannelsByIdsForTeam(GenerateTestId(), input)
   715  	CheckForbiddenStatus(t, resp)
   716  
   717  	_, resp = Client.GetPublicChannelsByIdsForTeam(teamId, []string{})
   718  	CheckBadRequestStatus(t, resp)
   719  
   720  	_, resp = Client.GetPublicChannelsByIdsForTeam(teamId, []string{"junk"})
   721  	CheckBadRequestStatus(t, resp)
   722  
   723  	_, resp = Client.GetPublicChannelsByIdsForTeam(teamId, []string{GenerateTestId()})
   724  	CheckNotFoundStatus(t, resp)
   725  
   726  	_, resp = Client.GetPublicChannelsByIdsForTeam(teamId, []string{th.BasicPrivateChannel.Id})
   727  	CheckNotFoundStatus(t, resp)
   728  
   729  	Client.Logout()
   730  
   731  	_, resp = Client.GetPublicChannelsByIdsForTeam(teamId, input)
   732  	CheckUnauthorizedStatus(t, resp)
   733  
   734  	_, resp = th.SystemAdminClient.GetPublicChannelsByIdsForTeam(teamId, input)
   735  	CheckNoError(t, resp)
   736  }
   737  
   738  func TestGetChannelsForTeamForUser(t *testing.T) {
   739  	th := Setup().InitBasic()
   740  	defer th.TearDown()
   741  	Client := th.Client
   742  
   743  	channels, resp := Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, "")
   744  	CheckNoError(t, resp)
   745  
   746  	found := make([]bool, 3)
   747  	for _, c := range channels {
   748  		if c.Id == th.BasicChannel.Id {
   749  			found[0] = true
   750  		} else if c.Id == th.BasicChannel2.Id {
   751  			found[1] = true
   752  		} else if c.Id == th.BasicPrivateChannel.Id {
   753  			found[2] = true
   754  		}
   755  
   756  		if c.TeamId != th.BasicTeam.Id && c.TeamId != "" {
   757  			t.Fatal("wrong team")
   758  		}
   759  	}
   760  
   761  	for _, f := range found {
   762  		if !f {
   763  			t.Fatal("missing a channel")
   764  		}
   765  	}
   766  
   767  	channels, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, resp.Etag)
   768  	CheckEtag(t, channels, resp)
   769  
   770  	_, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, "junk", "")
   771  	CheckBadRequestStatus(t, resp)
   772  
   773  	_, resp = Client.GetChannelsForTeamForUser("junk", th.BasicUser.Id, "")
   774  	CheckBadRequestStatus(t, resp)
   775  
   776  	_, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser2.Id, "")
   777  	CheckForbiddenStatus(t, resp)
   778  
   779  	_, resp = Client.GetChannelsForTeamForUser(model.NewId(), th.BasicUser.Id, "")
   780  	CheckForbiddenStatus(t, resp)
   781  
   782  	_, resp = th.SystemAdminClient.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, "")
   783  	CheckNoError(t, resp)
   784  }
   785  
   786  func TestGetAllChannels(t *testing.T) {
   787  	th := Setup().InitBasic()
   788  	defer th.TearDown()
   789  	Client := th.Client
   790  
   791  	channels, resp := th.SystemAdminClient.GetAllChannels(0, 20, "")
   792  	CheckNoError(t, resp)
   793  
   794  	// At least, all the not-deleted channels created during the InitBasic
   795  	require.True(t, len(*channels) >= 3)
   796  	for _, c := range *channels {
   797  		require.NotEqual(t, c.TeamId, "")
   798  	}
   799  
   800  	channels, resp = th.SystemAdminClient.GetAllChannels(0, 10, "")
   801  	CheckNoError(t, resp)
   802  	require.True(t, len(*channels) >= 3)
   803  
   804  	channels, resp = th.SystemAdminClient.GetAllChannels(1, 1, "")
   805  	CheckNoError(t, resp)
   806  	require.Len(t, *channels, 1)
   807  
   808  	channels, resp = th.SystemAdminClient.GetAllChannels(10000, 10000, "")
   809  	CheckNoError(t, resp)
   810  	require.Len(t, *channels, 0)
   811  
   812  	_, resp = Client.GetAllChannels(0, 20, "")
   813  	CheckForbiddenStatus(t, resp)
   814  }
   815  
   816  func TestSearchChannels(t *testing.T) {
   817  	th := Setup().InitBasic()
   818  	defer th.TearDown()
   819  	Client := th.Client
   820  
   821  	search := &model.ChannelSearch{Term: th.BasicChannel.Name}
   822  
   823  	channels, resp := Client.SearchChannels(th.BasicTeam.Id, search)
   824  	CheckNoError(t, resp)
   825  
   826  	found := false
   827  	for _, c := range channels {
   828  		if c.Type != model.CHANNEL_OPEN {
   829  			t.Fatal("should only return public channels")
   830  		}
   831  
   832  		if c.Id == th.BasicChannel.Id {
   833  			found = true
   834  		}
   835  	}
   836  
   837  	if !found {
   838  		t.Fatal("didn't find channel")
   839  	}
   840  
   841  	search.Term = th.BasicPrivateChannel.Name
   842  	channels, resp = Client.SearchChannels(th.BasicTeam.Id, search)
   843  	CheckNoError(t, resp)
   844  
   845  	found = false
   846  	for _, c := range channels {
   847  		if c.Id == th.BasicPrivateChannel.Id {
   848  			found = true
   849  		}
   850  	}
   851  
   852  	if found {
   853  		t.Fatal("shouldn't find private channel")
   854  	}
   855  
   856  	search.Term = ""
   857  	_, resp = Client.SearchChannels(th.BasicTeam.Id, search)
   858  	CheckNoError(t, resp)
   859  
   860  	search.Term = th.BasicChannel.Name
   861  	_, resp = Client.SearchChannels(model.NewId(), search)
   862  	CheckForbiddenStatus(t, resp)
   863  
   864  	_, resp = Client.SearchChannels("junk", search)
   865  	CheckBadRequestStatus(t, resp)
   866  
   867  	_, resp = th.SystemAdminClient.SearchChannels(th.BasicTeam.Id, search)
   868  	CheckNoError(t, resp)
   869  }
   870  
   871  func TestSearchAllChannels(t *testing.T) {
   872  	th := Setup().InitBasic()
   873  	defer th.TearDown()
   874  	Client := th.Client
   875  
   876  	search := &model.ChannelSearch{Term: th.BasicChannel.Name}
   877  
   878  	channels, resp := th.SystemAdminClient.SearchAllChannels(search)
   879  	CheckNoError(t, resp)
   880  
   881  	assert.Len(t, *channels, 1)
   882  	assert.Equal(t, (*channels)[0].Id, th.BasicChannel.Id)
   883  
   884  	search.Term = th.BasicPrivateChannel.Name
   885  	channels, resp = th.SystemAdminClient.SearchAllChannels(search)
   886  	CheckNoError(t, resp)
   887  
   888  	assert.Len(t, *channels, 1)
   889  	assert.Equal(t, (*channels)[0].Id, th.BasicPrivateChannel.Id)
   890  
   891  	search.Term = ""
   892  	channels, resp = th.SystemAdminClient.SearchAllChannels(search)
   893  	CheckNoError(t, resp)
   894  	// At least, all the not-deleted channels created during the InitBasic
   895  	assert.True(t, len(*channels) >= 3)
   896  
   897  	search.Term = th.BasicChannel.Name
   898  	_, resp = Client.SearchAllChannels(search)
   899  	CheckForbiddenStatus(t, resp)
   900  }
   901  
   902  func TestDeleteChannel(t *testing.T) {
   903  	th := Setup().InitBasic()
   904  	defer th.TearDown()
   905  	Client := th.Client
   906  	team := th.BasicTeam
   907  	user := th.BasicUser
   908  	user2 := th.BasicUser2
   909  
   910  	// successful delete of public channel
   911  	publicChannel1 := th.CreatePublicChannel()
   912  	pass, resp := Client.DeleteChannel(publicChannel1.Id)
   913  	CheckNoError(t, resp)
   914  
   915  	if !pass {
   916  		t.Fatal("should have passed")
   917  	}
   918  
   919  	if ch, err := th.App.GetChannel(publicChannel1.Id); err == nil && ch.DeleteAt == 0 {
   920  		t.Fatal("should have failed to get deleted channel")
   921  	}
   922  
   923  	post1 := &model.Post{ChannelId: publicChannel1.Id, Message: "a" + GenerateTestId() + "a"}
   924  	if _, err := Client.CreatePost(post1); err == nil {
   925  		t.Fatal("should have failed to post to deleted channel")
   926  	}
   927  
   928  	// successful delete of private channel
   929  	privateChannel2 := th.CreatePrivateChannel()
   930  	_, resp = Client.DeleteChannel(privateChannel2.Id)
   931  	CheckNoError(t, resp)
   932  
   933  	// successful delete of channel with multiple members
   934  	publicChannel3 := th.CreatePublicChannel()
   935  	th.App.AddUserToChannel(user, publicChannel3)
   936  	th.App.AddUserToChannel(user2, publicChannel3)
   937  	_, resp = Client.DeleteChannel(publicChannel3.Id)
   938  	CheckNoError(t, resp)
   939  
   940  	// default channel cannot be deleted.
   941  	defaultChannel, _ := th.App.GetChannelByName(model.DEFAULT_CHANNEL, team.Id, false)
   942  	pass, resp = Client.DeleteChannel(defaultChannel.Id)
   943  	CheckBadRequestStatus(t, resp)
   944  
   945  	if pass {
   946  		t.Fatal("should have failed")
   947  	}
   948  
   949  	// check system admin can delete a channel without any appropriate team or channel membership.
   950  	sdTeam := th.CreateTeamWithClient(Client)
   951  	sdPublicChannel := &model.Channel{
   952  		DisplayName: "dn_" + model.NewId(),
   953  		Name:        GenerateTestChannelName(),
   954  		Type:        model.CHANNEL_OPEN,
   955  		TeamId:      sdTeam.Id,
   956  	}
   957  	sdPublicChannel, resp = Client.CreateChannel(sdPublicChannel)
   958  	CheckNoError(t, resp)
   959  	_, resp = th.SystemAdminClient.DeleteChannel(sdPublicChannel.Id)
   960  	CheckNoError(t, resp)
   961  
   962  	sdPrivateChannel := &model.Channel{
   963  		DisplayName: "dn_" + model.NewId(),
   964  		Name:        GenerateTestChannelName(),
   965  		Type:        model.CHANNEL_PRIVATE,
   966  		TeamId:      sdTeam.Id,
   967  	}
   968  	sdPrivateChannel, resp = Client.CreateChannel(sdPrivateChannel)
   969  	CheckNoError(t, resp)
   970  	_, resp = th.SystemAdminClient.DeleteChannel(sdPrivateChannel.Id)
   971  	CheckNoError(t, resp)
   972  
   973  	th.LoginBasic()
   974  	publicChannel5 := th.CreatePublicChannel()
   975  	Client.Logout()
   976  
   977  	Client.Login(user.Id, user.Password)
   978  	_, resp = Client.DeleteChannel(publicChannel5.Id)
   979  	CheckUnauthorizedStatus(t, resp)
   980  
   981  	_, resp = Client.DeleteChannel("junk")
   982  	CheckUnauthorizedStatus(t, resp)
   983  
   984  	Client.Logout()
   985  	_, resp = Client.DeleteChannel(GenerateTestId())
   986  	CheckUnauthorizedStatus(t, resp)
   987  
   988  	_, resp = th.SystemAdminClient.DeleteChannel(publicChannel5.Id)
   989  	CheckNoError(t, resp)
   990  }
   991  
   992  func TestDeleteChannel2(t *testing.T) {
   993  	th := Setup().InitBasic()
   994  	defer th.TearDown()
   995  	Client := th.Client
   996  	user := th.BasicUser
   997  
   998  	// Check the appropriate permissions are enforced.
   999  	defaultRolePermissions := th.SaveDefaultRolePermissions()
  1000  	defer func() {
  1001  		th.RestoreDefaultRolePermissions(defaultRolePermissions)
  1002  	}()
  1003  
  1004  	th.AddPermissionToRole(model.PERMISSION_DELETE_PUBLIC_CHANNEL.Id, model.CHANNEL_USER_ROLE_ID)
  1005  	th.AddPermissionToRole(model.PERMISSION_DELETE_PRIVATE_CHANNEL.Id, model.CHANNEL_USER_ROLE_ID)
  1006  
  1007  	// channels created by SystemAdmin
  1008  	publicChannel6 := th.CreateChannelWithClient(th.SystemAdminClient, model.CHANNEL_OPEN)
  1009  	privateChannel7 := th.CreateChannelWithClient(th.SystemAdminClient, model.CHANNEL_PRIVATE)
  1010  	th.App.AddUserToChannel(user, publicChannel6)
  1011  	th.App.AddUserToChannel(user, privateChannel7)
  1012  	th.App.AddUserToChannel(user, privateChannel7)
  1013  
  1014  	// successful delete by user
  1015  	_, resp := Client.DeleteChannel(publicChannel6.Id)
  1016  	CheckNoError(t, resp)
  1017  
  1018  	_, resp = Client.DeleteChannel(privateChannel7.Id)
  1019  	CheckNoError(t, resp)
  1020  
  1021  	// Restrict permissions to Channel Admins
  1022  	th.RemovePermissionFromRole(model.PERMISSION_DELETE_PUBLIC_CHANNEL.Id, model.CHANNEL_USER_ROLE_ID)
  1023  	th.RemovePermissionFromRole(model.PERMISSION_DELETE_PRIVATE_CHANNEL.Id, model.CHANNEL_USER_ROLE_ID)
  1024  	th.AddPermissionToRole(model.PERMISSION_DELETE_PUBLIC_CHANNEL.Id, model.CHANNEL_ADMIN_ROLE_ID)
  1025  	th.AddPermissionToRole(model.PERMISSION_DELETE_PRIVATE_CHANNEL.Id, model.CHANNEL_ADMIN_ROLE_ID)
  1026  
  1027  	// channels created by SystemAdmin
  1028  	publicChannel6 = th.CreateChannelWithClient(th.SystemAdminClient, model.CHANNEL_OPEN)
  1029  	privateChannel7 = th.CreateChannelWithClient(th.SystemAdminClient, model.CHANNEL_PRIVATE)
  1030  	th.App.AddUserToChannel(user, publicChannel6)
  1031  	th.App.AddUserToChannel(user, privateChannel7)
  1032  	th.App.AddUserToChannel(user, privateChannel7)
  1033  
  1034  	// cannot delete by user
  1035  	_, resp = Client.DeleteChannel(publicChannel6.Id)
  1036  	CheckForbiddenStatus(t, resp)
  1037  
  1038  	_, resp = Client.DeleteChannel(privateChannel7.Id)
  1039  	CheckForbiddenStatus(t, resp)
  1040  
  1041  	// successful delete by channel admin
  1042  	th.MakeUserChannelAdmin(user, publicChannel6)
  1043  	th.MakeUserChannelAdmin(user, privateChannel7)
  1044  	th.App.Srv.Store.Channel().ClearCaches()
  1045  
  1046  	_, resp = Client.DeleteChannel(publicChannel6.Id)
  1047  	CheckNoError(t, resp)
  1048  
  1049  	_, resp = Client.DeleteChannel(privateChannel7.Id)
  1050  	CheckNoError(t, resp)
  1051  
  1052  	// Make sure team admins don't have permission to delete channels.
  1053  	th.RemovePermissionFromRole(model.PERMISSION_DELETE_PUBLIC_CHANNEL.Id, model.CHANNEL_ADMIN_ROLE_ID)
  1054  	th.RemovePermissionFromRole(model.PERMISSION_DELETE_PRIVATE_CHANNEL.Id, model.CHANNEL_ADMIN_ROLE_ID)
  1055  
  1056  	// last member of a public channel should have required permission to delete
  1057  	publicChannel6 = th.CreateChannelWithClient(th.Client, model.CHANNEL_OPEN)
  1058  	_, resp = Client.DeleteChannel(publicChannel6.Id)
  1059  	CheckForbiddenStatus(t, resp)
  1060  
  1061  	// last member of a private channel should not be able to delete it if they don't have required permissions
  1062  	privateChannel7 = th.CreateChannelWithClient(th.Client, model.CHANNEL_PRIVATE)
  1063  	_, resp = Client.DeleteChannel(privateChannel7.Id)
  1064  	CheckForbiddenStatus(t, resp)
  1065  }
  1066  
  1067  func TestConvertChannelToPrivate(t *testing.T) {
  1068  	th := Setup().InitBasic()
  1069  	defer th.TearDown()
  1070  	Client := th.Client
  1071  
  1072  	defaultChannel, _ := th.App.GetChannelByName(model.DEFAULT_CHANNEL, th.BasicTeam.Id, false)
  1073  	_, resp := Client.ConvertChannelToPrivate(defaultChannel.Id)
  1074  	CheckForbiddenStatus(t, resp)
  1075  
  1076  	privateChannel := th.CreatePrivateChannel()
  1077  	_, resp = Client.ConvertChannelToPrivate(privateChannel.Id)
  1078  	CheckForbiddenStatus(t, resp)
  1079  
  1080  	publicChannel := th.CreatePublicChannel()
  1081  	_, resp = Client.ConvertChannelToPrivate(publicChannel.Id)
  1082  	CheckForbiddenStatus(t, resp)
  1083  
  1084  	th.LoginTeamAdmin()
  1085  	rchannel, resp := Client.ConvertChannelToPrivate(publicChannel.Id)
  1086  	CheckOKStatus(t, resp)
  1087  	if rchannel.Type != model.CHANNEL_PRIVATE {
  1088  		t.Fatal("channel should be converted from public to private")
  1089  	}
  1090  
  1091  	rchannel, resp = th.SystemAdminClient.ConvertChannelToPrivate(privateChannel.Id)
  1092  	CheckBadRequestStatus(t, resp)
  1093  	if rchannel != nil {
  1094  		t.Fatal("should not return a channel")
  1095  	}
  1096  
  1097  	rchannel, resp = th.SystemAdminClient.ConvertChannelToPrivate(defaultChannel.Id)
  1098  	CheckBadRequestStatus(t, resp)
  1099  	if rchannel != nil {
  1100  		t.Fatal("should not return a channel")
  1101  	}
  1102  
  1103  	WebSocketClient, err := th.CreateWebSocketClient()
  1104  	if err != nil {
  1105  		t.Fatal(err)
  1106  	}
  1107  	WebSocketClient.Listen()
  1108  
  1109  	publicChannel2 := th.CreatePublicChannel()
  1110  	rchannel, resp = th.SystemAdminClient.ConvertChannelToPrivate(publicChannel2.Id)
  1111  	CheckOKStatus(t, resp)
  1112  	if rchannel.Type != model.CHANNEL_PRIVATE {
  1113  		t.Fatal("channel should be converted from public to private")
  1114  	}
  1115  
  1116  	stop := make(chan bool)
  1117  	eventHit := false
  1118  
  1119  	go func() {
  1120  		for {
  1121  			select {
  1122  			case resp := <-WebSocketClient.EventChannel:
  1123  				if resp.Event == model.WEBSOCKET_EVENT_CHANNEL_CONVERTED && resp.Data["channel_id"].(string) == publicChannel2.Id {
  1124  					eventHit = true
  1125  				}
  1126  			case <-stop:
  1127  				return
  1128  			}
  1129  		}
  1130  	}()
  1131  
  1132  	time.Sleep(400 * time.Millisecond)
  1133  
  1134  	stop <- true
  1135  
  1136  	if !eventHit {
  1137  		t.Fatal("did not receive channel_converted event")
  1138  	}
  1139  }
  1140  
  1141  func TestRestoreChannel(t *testing.T) {
  1142  	th := Setup().InitBasic()
  1143  	defer th.TearDown()
  1144  	Client := th.Client
  1145  
  1146  	publicChannel1 := th.CreatePublicChannel()
  1147  	Client.DeleteChannel(publicChannel1.Id)
  1148  
  1149  	privateChannel1 := th.CreatePrivateChannel()
  1150  	Client.DeleteChannel(privateChannel1.Id)
  1151  
  1152  	_, resp := Client.RestoreChannel(publicChannel1.Id)
  1153  	CheckForbiddenStatus(t, resp)
  1154  
  1155  	_, resp = Client.RestoreChannel(privateChannel1.Id)
  1156  	CheckForbiddenStatus(t, resp)
  1157  
  1158  	th.LoginTeamAdmin()
  1159  
  1160  	_, resp = Client.RestoreChannel(publicChannel1.Id)
  1161  	CheckOKStatus(t, resp)
  1162  
  1163  	_, resp = Client.RestoreChannel(privateChannel1.Id)
  1164  	CheckOKStatus(t, resp)
  1165  }
  1166  
  1167  func TestGetChannelByName(t *testing.T) {
  1168  	th := Setup().InitBasic()
  1169  	defer th.TearDown()
  1170  	Client := th.Client
  1171  
  1172  	channel, resp := Client.GetChannelByName(th.BasicChannel.Name, th.BasicTeam.Id, "")
  1173  	CheckNoError(t, resp)
  1174  
  1175  	if channel.Name != th.BasicChannel.Name {
  1176  		t.Fatal("names did not match")
  1177  	}
  1178  
  1179  	channel, resp = Client.GetChannelByName(th.BasicPrivateChannel.Name, th.BasicTeam.Id, "")
  1180  	CheckNoError(t, resp)
  1181  
  1182  	if channel.Name != th.BasicPrivateChannel.Name {
  1183  		t.Fatal("names did not match")
  1184  	}
  1185  
  1186  	_, resp = Client.GetChannelByName(strings.ToUpper(th.BasicPrivateChannel.Name), th.BasicTeam.Id, "")
  1187  	CheckNoError(t, resp)
  1188  
  1189  	_, resp = Client.GetChannelByName(th.BasicDeletedChannel.Name, th.BasicTeam.Id, "")
  1190  	CheckNotFoundStatus(t, resp)
  1191  
  1192  	channel, resp = Client.GetChannelByNameIncludeDeleted(th.BasicDeletedChannel.Name, th.BasicTeam.Id, "")
  1193  	CheckNoError(t, resp)
  1194  
  1195  	if channel.Name != th.BasicDeletedChannel.Name {
  1196  		t.Fatal("names did not match")
  1197  	}
  1198  
  1199  	Client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser.Id)
  1200  	_, resp = Client.GetChannelByName(th.BasicChannel.Name, th.BasicTeam.Id, "")
  1201  	CheckNoError(t, resp)
  1202  
  1203  	Client.RemoveUserFromChannel(th.BasicPrivateChannel.Id, th.BasicUser.Id)
  1204  	_, resp = Client.GetChannelByName(th.BasicPrivateChannel.Name, th.BasicTeam.Id, "")
  1205  	CheckForbiddenStatus(t, resp)
  1206  
  1207  	_, resp = Client.GetChannelByName(GenerateTestChannelName(), th.BasicTeam.Id, "")
  1208  	CheckNotFoundStatus(t, resp)
  1209  
  1210  	_, resp = Client.GetChannelByName(GenerateTestChannelName(), "junk", "")
  1211  	CheckBadRequestStatus(t, resp)
  1212  
  1213  	Client.Logout()
  1214  	_, resp = Client.GetChannelByName(th.BasicChannel.Name, th.BasicTeam.Id, "")
  1215  	CheckUnauthorizedStatus(t, resp)
  1216  
  1217  	user := th.CreateUser()
  1218  	Client.Login(user.Email, user.Password)
  1219  	_, resp = Client.GetChannelByName(th.BasicChannel.Name, th.BasicTeam.Id, "")
  1220  	CheckForbiddenStatus(t, resp)
  1221  
  1222  	_, resp = th.SystemAdminClient.GetChannelByName(th.BasicChannel.Name, th.BasicTeam.Id, "")
  1223  	CheckNoError(t, resp)
  1224  }
  1225  
  1226  func TestGetChannelByNameForTeamName(t *testing.T) {
  1227  	th := Setup().InitBasic()
  1228  	defer th.TearDown()
  1229  	Client := th.Client
  1230  
  1231  	channel, resp := th.SystemAdminClient.GetChannelByNameForTeamName(th.BasicChannel.Name, th.BasicTeam.Name, "")
  1232  	CheckNoError(t, resp)
  1233  
  1234  	if channel.Name != th.BasicChannel.Name {
  1235  		t.Fatal("names did not match")
  1236  	}
  1237  
  1238  	_, resp = Client.GetChannelByNameForTeamName(th.BasicChannel.Name, th.BasicTeam.Name, "")
  1239  	CheckNoError(t, resp)
  1240  
  1241  	_, resp = Client.GetChannelByNameForTeamName(th.BasicDeletedChannel.Name, th.BasicTeam.Name, "")
  1242  	CheckNotFoundStatus(t, resp)
  1243  
  1244  	channel, resp = Client.GetChannelByNameForTeamNameIncludeDeleted(th.BasicDeletedChannel.Name, th.BasicTeam.Name, "")
  1245  	CheckNoError(t, resp)
  1246  
  1247  	if channel.Name != th.BasicDeletedChannel.Name {
  1248  		t.Fatal("names did not match")
  1249  	}
  1250  
  1251  	_, resp = Client.GetChannelByNameForTeamName(th.BasicChannel.Name, model.NewRandomString(15), "")
  1252  	CheckNotFoundStatus(t, resp)
  1253  
  1254  	_, resp = Client.GetChannelByNameForTeamName(GenerateTestChannelName(), th.BasicTeam.Name, "")
  1255  	CheckNotFoundStatus(t, resp)
  1256  
  1257  	Client.Logout()
  1258  	_, resp = Client.GetChannelByNameForTeamName(th.BasicChannel.Name, th.BasicTeam.Name, "")
  1259  	CheckUnauthorizedStatus(t, resp)
  1260  
  1261  	user := th.CreateUser()
  1262  	Client.Login(user.Email, user.Password)
  1263  	_, resp = Client.GetChannelByNameForTeamName(th.BasicChannel.Name, th.BasicTeam.Name, "")
  1264  	CheckForbiddenStatus(t, resp)
  1265  }
  1266  
  1267  func TestGetChannelMembers(t *testing.T) {
  1268  	th := Setup().InitBasic()
  1269  	defer th.TearDown()
  1270  	Client := th.Client
  1271  
  1272  	members, resp := Client.GetChannelMembers(th.BasicChannel.Id, 0, 60, "")
  1273  	CheckNoError(t, resp)
  1274  
  1275  	if len(*members) != 3 {
  1276  		t.Fatal("should only be 3 users in channel")
  1277  	}
  1278  
  1279  	members, resp = Client.GetChannelMembers(th.BasicChannel.Id, 0, 2, "")
  1280  	CheckNoError(t, resp)
  1281  
  1282  	if len(*members) != 2 {
  1283  		t.Fatal("should only be 2 users")
  1284  	}
  1285  
  1286  	members, resp = Client.GetChannelMembers(th.BasicChannel.Id, 1, 1, "")
  1287  	CheckNoError(t, resp)
  1288  
  1289  	if len(*members) != 1 {
  1290  		t.Fatal("should only be 1 user")
  1291  	}
  1292  
  1293  	members, resp = Client.GetChannelMembers(th.BasicChannel.Id, 1000, 100000, "")
  1294  	CheckNoError(t, resp)
  1295  
  1296  	if len(*members) != 0 {
  1297  		t.Fatal("should be 0 users")
  1298  	}
  1299  
  1300  	_, resp = Client.GetChannelMembers("", 0, 60, "")
  1301  	CheckBadRequestStatus(t, resp)
  1302  
  1303  	_, resp = Client.GetChannelMembers("junk", 0, 60, "")
  1304  	CheckBadRequestStatus(t, resp)
  1305  
  1306  	_, resp = Client.GetChannelMembers(model.NewId(), 0, 60, "")
  1307  	CheckForbiddenStatus(t, resp)
  1308  
  1309  	Client.Logout()
  1310  	_, resp = Client.GetChannelMembers(th.BasicChannel.Id, 0, 60, "")
  1311  	CheckUnauthorizedStatus(t, resp)
  1312  
  1313  	user := th.CreateUser()
  1314  	Client.Login(user.Email, user.Password)
  1315  	_, resp = Client.GetChannelMembers(th.BasicChannel.Id, 0, 60, "")
  1316  	CheckForbiddenStatus(t, resp)
  1317  
  1318  	_, resp = th.SystemAdminClient.GetChannelMembers(th.BasicChannel.Id, 0, 60, "")
  1319  	CheckNoError(t, resp)
  1320  }
  1321  
  1322  func TestGetChannelMembersByIds(t *testing.T) {
  1323  	th := Setup().InitBasic()
  1324  	defer th.TearDown()
  1325  	Client := th.Client
  1326  
  1327  	cm, resp := Client.GetChannelMembersByIds(th.BasicChannel.Id, []string{th.BasicUser.Id})
  1328  	CheckNoError(t, resp)
  1329  
  1330  	if (*cm)[0].UserId != th.BasicUser.Id {
  1331  		t.Fatal("returned wrong user")
  1332  	}
  1333  
  1334  	_, resp = Client.GetChannelMembersByIds(th.BasicChannel.Id, []string{})
  1335  	CheckBadRequestStatus(t, resp)
  1336  
  1337  	cm1, resp := Client.GetChannelMembersByIds(th.BasicChannel.Id, []string{"junk"})
  1338  	CheckNoError(t, resp)
  1339  	if len(*cm1) > 0 {
  1340  		t.Fatal("no users should be returned")
  1341  	}
  1342  
  1343  	cm1, resp = Client.GetChannelMembersByIds(th.BasicChannel.Id, []string{"junk", th.BasicUser.Id})
  1344  	CheckNoError(t, resp)
  1345  	if len(*cm1) != 1 {
  1346  		t.Fatal("1 member should be returned")
  1347  	}
  1348  
  1349  	cm1, resp = Client.GetChannelMembersByIds(th.BasicChannel.Id, []string{th.BasicUser2.Id, th.BasicUser.Id})
  1350  	CheckNoError(t, resp)
  1351  	if len(*cm1) != 2 {
  1352  		t.Fatal("2 members should be returned")
  1353  	}
  1354  
  1355  	_, resp = Client.GetChannelMembersByIds("junk", []string{th.BasicUser.Id})
  1356  	CheckBadRequestStatus(t, resp)
  1357  
  1358  	_, resp = Client.GetChannelMembersByIds(model.NewId(), []string{th.BasicUser.Id})
  1359  	CheckForbiddenStatus(t, resp)
  1360  
  1361  	Client.Logout()
  1362  	_, resp = Client.GetChannelMembersByIds(th.BasicChannel.Id, []string{th.BasicUser.Id})
  1363  	CheckUnauthorizedStatus(t, resp)
  1364  
  1365  	_, resp = th.SystemAdminClient.GetChannelMembersByIds(th.BasicChannel.Id, []string{th.BasicUser2.Id, th.BasicUser.Id})
  1366  	CheckNoError(t, resp)
  1367  }
  1368  
  1369  func TestGetChannelMember(t *testing.T) {
  1370  	th := Setup().InitBasic()
  1371  	defer th.TearDown()
  1372  	Client := th.Client
  1373  
  1374  	member, resp := Client.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "")
  1375  	CheckNoError(t, resp)
  1376  
  1377  	if member.ChannelId != th.BasicChannel.Id {
  1378  		t.Fatal("wrong channel id")
  1379  	}
  1380  
  1381  	if member.UserId != th.BasicUser.Id {
  1382  		t.Fatal("wrong user id")
  1383  	}
  1384  
  1385  	_, resp = Client.GetChannelMember("", th.BasicUser.Id, "")
  1386  	CheckNotFoundStatus(t, resp)
  1387  
  1388  	_, resp = Client.GetChannelMember("junk", th.BasicUser.Id, "")
  1389  	CheckBadRequestStatus(t, resp)
  1390  
  1391  	_, resp = Client.GetChannelMember(model.NewId(), th.BasicUser.Id, "")
  1392  	CheckForbiddenStatus(t, resp)
  1393  
  1394  	_, resp = Client.GetChannelMember(th.BasicChannel.Id, "", "")
  1395  	CheckNotFoundStatus(t, resp)
  1396  
  1397  	_, resp = Client.GetChannelMember(th.BasicChannel.Id, "junk", "")
  1398  	CheckBadRequestStatus(t, resp)
  1399  
  1400  	_, resp = Client.GetChannelMember(th.BasicChannel.Id, model.NewId(), "")
  1401  	CheckNotFoundStatus(t, resp)
  1402  
  1403  	Client.Logout()
  1404  	_, resp = Client.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "")
  1405  	CheckUnauthorizedStatus(t, resp)
  1406  
  1407  	user := th.CreateUser()
  1408  	Client.Login(user.Email, user.Password)
  1409  	_, resp = Client.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "")
  1410  	CheckForbiddenStatus(t, resp)
  1411  
  1412  	_, resp = th.SystemAdminClient.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "")
  1413  	CheckNoError(t, resp)
  1414  }
  1415  
  1416  func TestGetChannelMembersForUser(t *testing.T) {
  1417  	th := Setup().InitBasic()
  1418  	defer th.TearDown()
  1419  	Client := th.Client
  1420  
  1421  	members, resp := Client.GetChannelMembersForUser(th.BasicUser.Id, th.BasicTeam.Id, "")
  1422  	CheckNoError(t, resp)
  1423  
  1424  	if len(*members) != 6 {
  1425  		t.Fatal("should have 6 members on team")
  1426  	}
  1427  
  1428  	_, resp = Client.GetChannelMembersForUser("", th.BasicTeam.Id, "")
  1429  	CheckNotFoundStatus(t, resp)
  1430  
  1431  	_, resp = Client.GetChannelMembersForUser("junk", th.BasicTeam.Id, "")
  1432  	CheckBadRequestStatus(t, resp)
  1433  
  1434  	_, resp = Client.GetChannelMembersForUser(model.NewId(), th.BasicTeam.Id, "")
  1435  	CheckForbiddenStatus(t, resp)
  1436  
  1437  	_, resp = Client.GetChannelMembersForUser(th.BasicUser.Id, "", "")
  1438  	CheckNotFoundStatus(t, resp)
  1439  
  1440  	_, resp = Client.GetChannelMembersForUser(th.BasicUser.Id, "junk", "")
  1441  	CheckBadRequestStatus(t, resp)
  1442  
  1443  	_, resp = Client.GetChannelMembersForUser(th.BasicUser.Id, model.NewId(), "")
  1444  	CheckForbiddenStatus(t, resp)
  1445  
  1446  	Client.Logout()
  1447  	_, resp = Client.GetChannelMembersForUser(th.BasicUser.Id, th.BasicTeam.Id, "")
  1448  	CheckUnauthorizedStatus(t, resp)
  1449  
  1450  	user := th.CreateUser()
  1451  	Client.Login(user.Email, user.Password)
  1452  	_, resp = Client.GetChannelMembersForUser(th.BasicUser.Id, th.BasicTeam.Id, "")
  1453  	CheckForbiddenStatus(t, resp)
  1454  
  1455  	_, resp = th.SystemAdminClient.GetChannelMembersForUser(th.BasicUser.Id, th.BasicTeam.Id, "")
  1456  	CheckNoError(t, resp)
  1457  }
  1458  
  1459  func TestViewChannel(t *testing.T) {
  1460  	th := Setup().InitBasic()
  1461  	defer th.TearDown()
  1462  	Client := th.Client
  1463  
  1464  	view := &model.ChannelView{
  1465  		ChannelId: th.BasicChannel.Id,
  1466  	}
  1467  
  1468  	viewResp, resp := Client.ViewChannel(th.BasicUser.Id, view)
  1469  	CheckNoError(t, resp)
  1470  
  1471  	if viewResp.Status != "OK" {
  1472  		t.Fatal("should have passed")
  1473  	}
  1474  
  1475  	channel, _ := th.App.GetChannel(th.BasicChannel.Id)
  1476  
  1477  	if lastViewedAt := viewResp.LastViewedAtTimes[channel.Id]; lastViewedAt != channel.LastPostAt {
  1478  		t.Fatal("LastPostAt does not match returned LastViewedAt time")
  1479  	}
  1480  
  1481  	view.PrevChannelId = th.BasicChannel.Id
  1482  	_, resp = Client.ViewChannel(th.BasicUser.Id, view)
  1483  	CheckNoError(t, resp)
  1484  
  1485  	view.PrevChannelId = ""
  1486  	_, resp = Client.ViewChannel(th.BasicUser.Id, view)
  1487  	CheckNoError(t, resp)
  1488  
  1489  	view.PrevChannelId = "junk"
  1490  	_, resp = Client.ViewChannel(th.BasicUser.Id, view)
  1491  	CheckBadRequestStatus(t, resp)
  1492  
  1493  	// All blank is OK we use it for clicking off of the browser.
  1494  	view.PrevChannelId = ""
  1495  	view.ChannelId = ""
  1496  	_, resp = Client.ViewChannel(th.BasicUser.Id, view)
  1497  	CheckNoError(t, resp)
  1498  
  1499  	view.PrevChannelId = ""
  1500  	view.ChannelId = "junk"
  1501  	_, resp = Client.ViewChannel(th.BasicUser.Id, view)
  1502  	CheckBadRequestStatus(t, resp)
  1503  
  1504  	view.ChannelId = "correctlysizedjunkdddfdfdf"
  1505  	_, resp = Client.ViewChannel(th.BasicUser.Id, view)
  1506  	CheckBadRequestStatus(t, resp)
  1507  	view.ChannelId = th.BasicChannel.Id
  1508  
  1509  	member, resp := Client.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "")
  1510  	CheckNoError(t, resp)
  1511  	channel, resp = Client.GetChannel(th.BasicChannel.Id, "")
  1512  	CheckNoError(t, resp)
  1513  
  1514  	if member.MsgCount != channel.TotalMsgCount {
  1515  		t.Fatal("should match message counts")
  1516  	}
  1517  
  1518  	if member.MentionCount != 0 {
  1519  		t.Fatal("should have no mentions")
  1520  	}
  1521  
  1522  	_, resp = Client.ViewChannel("junk", view)
  1523  	CheckBadRequestStatus(t, resp)
  1524  
  1525  	_, resp = Client.ViewChannel(th.BasicUser2.Id, view)
  1526  	CheckForbiddenStatus(t, resp)
  1527  
  1528  	if r, err := Client.DoApiPost(fmt.Sprintf("/channels/members/%v/view", th.BasicUser.Id), "garbage"); err == nil {
  1529  		t.Fatal("should have errored")
  1530  	} else {
  1531  		if r.StatusCode != http.StatusBadRequest {
  1532  			t.Log("actual: " + strconv.Itoa(r.StatusCode))
  1533  			t.Log("expected: " + strconv.Itoa(http.StatusBadRequest))
  1534  			t.Fatal("wrong status code")
  1535  		}
  1536  	}
  1537  
  1538  	Client.Logout()
  1539  	_, resp = Client.ViewChannel(th.BasicUser.Id, view)
  1540  	CheckUnauthorizedStatus(t, resp)
  1541  
  1542  	_, resp = th.SystemAdminClient.ViewChannel(th.BasicUser.Id, view)
  1543  	CheckNoError(t, resp)
  1544  }
  1545  
  1546  func TestGetChannelUnread(t *testing.T) {
  1547  	th := Setup().InitBasic()
  1548  	defer th.TearDown()
  1549  	Client := th.Client
  1550  	user := th.BasicUser
  1551  	channel := th.BasicChannel
  1552  
  1553  	channelUnread, resp := Client.GetChannelUnread(channel.Id, user.Id)
  1554  	CheckNoError(t, resp)
  1555  	if channelUnread.TeamId != th.BasicTeam.Id {
  1556  		t.Fatal("wrong team id returned for a regular user call")
  1557  	} else if channelUnread.ChannelId != channel.Id {
  1558  		t.Fatal("wrong team id returned for a regular user call")
  1559  	}
  1560  
  1561  	_, resp = Client.GetChannelUnread("junk", user.Id)
  1562  	CheckBadRequestStatus(t, resp)
  1563  
  1564  	_, resp = Client.GetChannelUnread(channel.Id, "junk")
  1565  	CheckBadRequestStatus(t, resp)
  1566  
  1567  	_, resp = Client.GetChannelUnread(channel.Id, model.NewId())
  1568  	CheckForbiddenStatus(t, resp)
  1569  
  1570  	_, resp = Client.GetChannelUnread(model.NewId(), user.Id)
  1571  	CheckForbiddenStatus(t, resp)
  1572  
  1573  	newUser := th.CreateUser()
  1574  	Client.Login(newUser.Email, newUser.Password)
  1575  	_, resp = Client.GetChannelUnread(th.BasicChannel.Id, user.Id)
  1576  	CheckForbiddenStatus(t, resp)
  1577  
  1578  	Client.Logout()
  1579  
  1580  	_, resp = th.SystemAdminClient.GetChannelUnread(channel.Id, user.Id)
  1581  	CheckNoError(t, resp)
  1582  
  1583  	_, resp = th.SystemAdminClient.GetChannelUnread(model.NewId(), user.Id)
  1584  	CheckForbiddenStatus(t, resp)
  1585  
  1586  	_, resp = th.SystemAdminClient.GetChannelUnread(channel.Id, model.NewId())
  1587  	CheckNotFoundStatus(t, resp)
  1588  }
  1589  
  1590  func TestGetChannelStats(t *testing.T) {
  1591  	th := Setup().InitBasic()
  1592  	defer th.TearDown()
  1593  	Client := th.Client
  1594  	channel := th.CreatePrivateChannel()
  1595  
  1596  	stats, resp := Client.GetChannelStats(channel.Id, "")
  1597  	CheckNoError(t, resp)
  1598  
  1599  	if stats.ChannelId != channel.Id {
  1600  		t.Fatal("couldnt't get extra info")
  1601  	} else if stats.MemberCount != 1 {
  1602  		t.Fatal("got incorrect member count")
  1603  	}
  1604  
  1605  	_, resp = Client.GetChannelStats("junk", "")
  1606  	CheckBadRequestStatus(t, resp)
  1607  
  1608  	_, resp = Client.GetChannelStats(model.NewId(), "")
  1609  	CheckForbiddenStatus(t, resp)
  1610  
  1611  	Client.Logout()
  1612  	_, resp = Client.GetChannelStats(channel.Id, "")
  1613  	CheckUnauthorizedStatus(t, resp)
  1614  
  1615  	th.LoginBasic2()
  1616  
  1617  	_, resp = Client.GetChannelStats(channel.Id, "")
  1618  	CheckForbiddenStatus(t, resp)
  1619  
  1620  	_, resp = th.SystemAdminClient.GetChannelStats(channel.Id, "")
  1621  	CheckNoError(t, resp)
  1622  }
  1623  
  1624  func TestGetPinnedPosts(t *testing.T) {
  1625  	th := Setup().InitBasic()
  1626  	defer th.TearDown()
  1627  	Client := th.Client
  1628  	channel := th.BasicChannel
  1629  
  1630  	posts, resp := Client.GetPinnedPosts(channel.Id, "")
  1631  	CheckNoError(t, resp)
  1632  	if len(posts.Posts) != 0 {
  1633  		t.Fatal("should not have gotten a pinned post")
  1634  	}
  1635  
  1636  	pinnedPost := th.CreatePinnedPost()
  1637  	posts, resp = Client.GetPinnedPosts(channel.Id, "")
  1638  	CheckNoError(t, resp)
  1639  	if len(posts.Posts) != 1 {
  1640  		t.Fatal("should have returned 1 pinned post")
  1641  	}
  1642  	if _, ok := posts.Posts[pinnedPost.Id]; !ok {
  1643  		t.Fatal("missing pinned post")
  1644  	}
  1645  
  1646  	posts, resp = Client.GetPinnedPosts(channel.Id, resp.Etag)
  1647  	CheckEtag(t, posts, resp)
  1648  
  1649  	_, resp = Client.GetPinnedPosts(GenerateTestId(), "")
  1650  	CheckForbiddenStatus(t, resp)
  1651  
  1652  	_, resp = Client.GetPinnedPosts("junk", "")
  1653  	CheckBadRequestStatus(t, resp)
  1654  
  1655  	Client.Logout()
  1656  	_, resp = Client.GetPinnedPosts(channel.Id, "")
  1657  	CheckUnauthorizedStatus(t, resp)
  1658  
  1659  	_, resp = th.SystemAdminClient.GetPinnedPosts(channel.Id, "")
  1660  	CheckNoError(t, resp)
  1661  }
  1662  
  1663  func TestUpdateChannelRoles(t *testing.T) {
  1664  	th := Setup().InitBasic()
  1665  	defer th.TearDown()
  1666  	Client := th.Client
  1667  
  1668  	const CHANNEL_ADMIN = "channel_user channel_admin"
  1669  	const CHANNEL_MEMBER = "channel_user"
  1670  
  1671  	// User 1 creates a channel, making them channel admin by default.
  1672  	channel := th.CreatePublicChannel()
  1673  
  1674  	// Adds User 2 to the channel, making them a channel member by default.
  1675  	th.App.AddUserToChannel(th.BasicUser2, channel)
  1676  
  1677  	// User 1 promotes User 2
  1678  	pass, resp := Client.UpdateChannelRoles(channel.Id, th.BasicUser2.Id, CHANNEL_ADMIN)
  1679  	CheckNoError(t, resp)
  1680  
  1681  	if !pass {
  1682  		t.Fatal("should have passed")
  1683  	}
  1684  
  1685  	member, resp := Client.GetChannelMember(channel.Id, th.BasicUser2.Id, "")
  1686  	CheckNoError(t, resp)
  1687  
  1688  	if member.Roles != CHANNEL_ADMIN {
  1689  		t.Fatal("roles don't match")
  1690  	}
  1691  
  1692  	// User 1 demotes User 2
  1693  	_, resp = Client.UpdateChannelRoles(channel.Id, th.BasicUser2.Id, CHANNEL_MEMBER)
  1694  	CheckNoError(t, resp)
  1695  
  1696  	th.LoginBasic2()
  1697  
  1698  	// User 2 cannot demote User 1
  1699  	_, resp = Client.UpdateChannelRoles(channel.Id, th.BasicUser.Id, CHANNEL_MEMBER)
  1700  	CheckForbiddenStatus(t, resp)
  1701  
  1702  	// User 2 cannot promote self
  1703  	_, resp = Client.UpdateChannelRoles(channel.Id, th.BasicUser2.Id, CHANNEL_ADMIN)
  1704  	CheckForbiddenStatus(t, resp)
  1705  
  1706  	th.LoginBasic()
  1707  
  1708  	// User 1 demotes self
  1709  	_, resp = Client.UpdateChannelRoles(channel.Id, th.BasicUser.Id, CHANNEL_MEMBER)
  1710  	CheckNoError(t, resp)
  1711  
  1712  	// System Admin promotes User 1
  1713  	_, resp = th.SystemAdminClient.UpdateChannelRoles(channel.Id, th.BasicUser.Id, CHANNEL_ADMIN)
  1714  	CheckNoError(t, resp)
  1715  
  1716  	// System Admin demotes User 1
  1717  	_, resp = th.SystemAdminClient.UpdateChannelRoles(channel.Id, th.BasicUser.Id, CHANNEL_MEMBER)
  1718  	CheckNoError(t, resp)
  1719  
  1720  	// System Admin promotes User 1
  1721  	_, resp = th.SystemAdminClient.UpdateChannelRoles(channel.Id, th.BasicUser.Id, CHANNEL_ADMIN)
  1722  	CheckNoError(t, resp)
  1723  
  1724  	th.LoginBasic()
  1725  
  1726  	_, resp = Client.UpdateChannelRoles(channel.Id, th.BasicUser.Id, "junk")
  1727  	CheckBadRequestStatus(t, resp)
  1728  
  1729  	_, resp = Client.UpdateChannelRoles(channel.Id, "junk", CHANNEL_MEMBER)
  1730  	CheckBadRequestStatus(t, resp)
  1731  
  1732  	_, resp = Client.UpdateChannelRoles("junk", th.BasicUser.Id, CHANNEL_MEMBER)
  1733  	CheckBadRequestStatus(t, resp)
  1734  
  1735  	_, resp = Client.UpdateChannelRoles(channel.Id, model.NewId(), CHANNEL_MEMBER)
  1736  	CheckNotFoundStatus(t, resp)
  1737  
  1738  	_, resp = Client.UpdateChannelRoles(model.NewId(), th.BasicUser.Id, CHANNEL_MEMBER)
  1739  	CheckForbiddenStatus(t, resp)
  1740  }
  1741  
  1742  func TestUpdateChannelMemberSchemeRoles(t *testing.T) {
  1743  	th := Setup().InitBasic()
  1744  	defer th.TearDown()
  1745  	SystemAdminClient := th.SystemAdminClient
  1746  	th.LoginBasic()
  1747  
  1748  	s1 := &model.SchemeRoles{
  1749  		SchemeAdmin: false,
  1750  		SchemeUser:  false,
  1751  	}
  1752  	_, r1 := SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s1)
  1753  	CheckNoError(t, r1)
  1754  
  1755  	tm1, rtm1 := SystemAdminClient.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "")
  1756  	CheckNoError(t, rtm1)
  1757  	assert.Equal(t, false, tm1.SchemeUser)
  1758  	assert.Equal(t, false, tm1.SchemeAdmin)
  1759  
  1760  	s2 := &model.SchemeRoles{
  1761  		SchemeAdmin: false,
  1762  		SchemeUser:  true,
  1763  	}
  1764  	_, r2 := SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s2)
  1765  	CheckNoError(t, r2)
  1766  
  1767  	tm2, rtm2 := SystemAdminClient.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "")
  1768  	CheckNoError(t, rtm2)
  1769  	assert.Equal(t, true, tm2.SchemeUser)
  1770  	assert.Equal(t, false, tm2.SchemeAdmin)
  1771  
  1772  	s3 := &model.SchemeRoles{
  1773  		SchemeAdmin: true,
  1774  		SchemeUser:  false,
  1775  	}
  1776  	_, r3 := SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s3)
  1777  	CheckNoError(t, r3)
  1778  
  1779  	tm3, rtm3 := SystemAdminClient.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "")
  1780  	CheckNoError(t, rtm3)
  1781  	assert.Equal(t, false, tm3.SchemeUser)
  1782  	assert.Equal(t, true, tm3.SchemeAdmin)
  1783  
  1784  	s4 := &model.SchemeRoles{
  1785  		SchemeAdmin: true,
  1786  		SchemeUser:  true,
  1787  	}
  1788  	_, r4 := SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s4)
  1789  	CheckNoError(t, r4)
  1790  
  1791  	tm4, rtm4 := SystemAdminClient.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "")
  1792  	CheckNoError(t, rtm4)
  1793  	assert.Equal(t, true, tm4.SchemeUser)
  1794  	assert.Equal(t, true, tm4.SchemeAdmin)
  1795  
  1796  	_, resp := SystemAdminClient.UpdateChannelMemberSchemeRoles(model.NewId(), th.BasicUser.Id, s4)
  1797  	CheckForbiddenStatus(t, resp)
  1798  
  1799  	_, resp = SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, model.NewId(), s4)
  1800  	CheckNotFoundStatus(t, resp)
  1801  
  1802  	_, resp = SystemAdminClient.UpdateChannelMemberSchemeRoles("ASDF", th.BasicUser.Id, s4)
  1803  	CheckBadRequestStatus(t, resp)
  1804  
  1805  	_, resp = SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, "ASDF", s4)
  1806  	CheckBadRequestStatus(t, resp)
  1807  
  1808  	th.LoginBasic2()
  1809  	_, resp = th.Client.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s4)
  1810  	CheckForbiddenStatus(t, resp)
  1811  
  1812  	SystemAdminClient.Logout()
  1813  	_, resp = SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.SystemAdminUser.Id, s4)
  1814  	CheckUnauthorizedStatus(t, resp)
  1815  }
  1816  
  1817  func TestUpdateChannelNotifyProps(t *testing.T) {
  1818  	th := Setup().InitBasic()
  1819  	defer th.TearDown()
  1820  	Client := th.Client
  1821  
  1822  	props := map[string]string{}
  1823  	props[model.DESKTOP_NOTIFY_PROP] = model.CHANNEL_NOTIFY_MENTION
  1824  	props[model.MARK_UNREAD_NOTIFY_PROP] = model.CHANNEL_MARK_UNREAD_MENTION
  1825  
  1826  	pass, resp := Client.UpdateChannelNotifyProps(th.BasicChannel.Id, th.BasicUser.Id, props)
  1827  	CheckNoError(t, resp)
  1828  
  1829  	if !pass {
  1830  		t.Fatal("should have passed")
  1831  	}
  1832  
  1833  	member, err := th.App.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id)
  1834  	if err != nil {
  1835  		t.Fatal(err)
  1836  	}
  1837  
  1838  	if member.NotifyProps[model.DESKTOP_NOTIFY_PROP] != model.CHANNEL_NOTIFY_MENTION {
  1839  		t.Fatal("bad update")
  1840  	} else if member.NotifyProps[model.MARK_UNREAD_NOTIFY_PROP] != model.CHANNEL_MARK_UNREAD_MENTION {
  1841  		t.Fatal("bad update")
  1842  	}
  1843  
  1844  	_, resp = Client.UpdateChannelNotifyProps("junk", th.BasicUser.Id, props)
  1845  	CheckBadRequestStatus(t, resp)
  1846  
  1847  	_, resp = Client.UpdateChannelNotifyProps(th.BasicChannel.Id, "junk", props)
  1848  	CheckBadRequestStatus(t, resp)
  1849  
  1850  	_, resp = Client.UpdateChannelNotifyProps(model.NewId(), th.BasicUser.Id, props)
  1851  	CheckNotFoundStatus(t, resp)
  1852  
  1853  	_, resp = Client.UpdateChannelNotifyProps(th.BasicChannel.Id, model.NewId(), props)
  1854  	CheckForbiddenStatus(t, resp)
  1855  
  1856  	_, resp = Client.UpdateChannelNotifyProps(th.BasicChannel.Id, th.BasicUser.Id, map[string]string{})
  1857  	CheckNoError(t, resp)
  1858  
  1859  	Client.Logout()
  1860  	_, resp = Client.UpdateChannelNotifyProps(th.BasicChannel.Id, th.BasicUser.Id, props)
  1861  	CheckUnauthorizedStatus(t, resp)
  1862  
  1863  	_, resp = th.SystemAdminClient.UpdateChannelNotifyProps(th.BasicChannel.Id, th.BasicUser.Id, props)
  1864  	CheckNoError(t, resp)
  1865  }
  1866  
  1867  func TestAddChannelMember(t *testing.T) {
  1868  	th := Setup().InitBasic()
  1869  	defer th.TearDown()
  1870  	Client := th.Client
  1871  	user := th.BasicUser
  1872  	user2 := th.BasicUser2
  1873  	team := th.BasicTeam
  1874  	publicChannel := th.CreatePublicChannel()
  1875  	privateChannel := th.CreatePrivateChannel()
  1876  
  1877  	user3 := th.CreateUserWithClient(th.SystemAdminClient)
  1878  	_, resp := th.SystemAdminClient.AddTeamMember(team.Id, user3.Id)
  1879  	CheckNoError(t, resp)
  1880  
  1881  	cm, resp := Client.AddChannelMember(publicChannel.Id, user2.Id)
  1882  	CheckNoError(t, resp)
  1883  	CheckCreatedStatus(t, resp)
  1884  
  1885  	if cm.ChannelId != publicChannel.Id {
  1886  		t.Fatal("should have returned exact channel")
  1887  	}
  1888  
  1889  	if cm.UserId != user2.Id {
  1890  		t.Fatal("should have returned exact user added to public channel")
  1891  	}
  1892  
  1893  	cm, resp = Client.AddChannelMember(privateChannel.Id, user2.Id)
  1894  	CheckNoError(t, resp)
  1895  
  1896  	if cm.ChannelId != privateChannel.Id {
  1897  		t.Fatal("should have returned exact channel")
  1898  	}
  1899  
  1900  	if cm.UserId != user2.Id {
  1901  		t.Fatal("should have returned exact user added to private channel")
  1902  	}
  1903  
  1904  	post := &model.Post{ChannelId: publicChannel.Id, Message: "a" + GenerateTestId() + "a"}
  1905  	rpost, err := Client.CreatePost(post)
  1906  	if err == nil {
  1907  		t.Fatal("should have created a post")
  1908  	}
  1909  
  1910  	Client.RemoveUserFromChannel(publicChannel.Id, user.Id)
  1911  	_, resp = Client.AddChannelMemberWithRootId(publicChannel.Id, user.Id, rpost.Id)
  1912  	CheckNoError(t, resp)
  1913  	CheckCreatedStatus(t, resp)
  1914  
  1915  	Client.RemoveUserFromChannel(publicChannel.Id, user.Id)
  1916  	_, resp = Client.AddChannelMemberWithRootId(publicChannel.Id, user.Id, "junk")
  1917  	CheckBadRequestStatus(t, resp)
  1918  
  1919  	_, resp = Client.AddChannelMemberWithRootId(publicChannel.Id, user.Id, GenerateTestId())
  1920  	CheckNotFoundStatus(t, resp)
  1921  
  1922  	Client.RemoveUserFromChannel(publicChannel.Id, user.Id)
  1923  	_, resp = Client.AddChannelMember(publicChannel.Id, user.Id)
  1924  	CheckNoError(t, resp)
  1925  
  1926  	cm, resp = Client.AddChannelMember(publicChannel.Id, "junk")
  1927  	CheckBadRequestStatus(t, resp)
  1928  
  1929  	if cm != nil {
  1930  		t.Fatal("should return nothing")
  1931  	}
  1932  
  1933  	_, resp = Client.AddChannelMember(publicChannel.Id, GenerateTestId())
  1934  	CheckNotFoundStatus(t, resp)
  1935  
  1936  	_, resp = Client.AddChannelMember("junk", user2.Id)
  1937  	CheckBadRequestStatus(t, resp)
  1938  
  1939  	_, resp = Client.AddChannelMember(GenerateTestId(), user2.Id)
  1940  	CheckNotFoundStatus(t, resp)
  1941  
  1942  	otherUser := th.CreateUser()
  1943  	otherChannel := th.CreatePublicChannel()
  1944  	Client.Logout()
  1945  	Client.Login(user2.Id, user2.Password)
  1946  
  1947  	_, resp = Client.AddChannelMember(publicChannel.Id, otherUser.Id)
  1948  	CheckUnauthorizedStatus(t, resp)
  1949  
  1950  	_, resp = Client.AddChannelMember(privateChannel.Id, otherUser.Id)
  1951  	CheckUnauthorizedStatus(t, resp)
  1952  
  1953  	_, resp = Client.AddChannelMember(otherChannel.Id, otherUser.Id)
  1954  	CheckUnauthorizedStatus(t, resp)
  1955  
  1956  	Client.Logout()
  1957  	Client.Login(user.Id, user.Password)
  1958  
  1959  	// should fail adding user who is not a member of the team
  1960  	_, resp = Client.AddChannelMember(otherChannel.Id, otherUser.Id)
  1961  	CheckUnauthorizedStatus(t, resp)
  1962  
  1963  	Client.DeleteChannel(otherChannel.Id)
  1964  
  1965  	// should fail adding user to a deleted channel
  1966  	_, resp = Client.AddChannelMember(otherChannel.Id, user2.Id)
  1967  	CheckUnauthorizedStatus(t, resp)
  1968  
  1969  	Client.Logout()
  1970  	_, resp = Client.AddChannelMember(publicChannel.Id, user2.Id)
  1971  	CheckUnauthorizedStatus(t, resp)
  1972  
  1973  	_, resp = Client.AddChannelMember(privateChannel.Id, user2.Id)
  1974  	CheckUnauthorizedStatus(t, resp)
  1975  
  1976  	_, resp = th.SystemAdminClient.AddChannelMember(publicChannel.Id, user2.Id)
  1977  	CheckNoError(t, resp)
  1978  
  1979  	_, resp = th.SystemAdminClient.AddChannelMember(privateChannel.Id, user2.Id)
  1980  	CheckNoError(t, resp)
  1981  
  1982  	// Check the appropriate permissions are enforced.
  1983  	defaultRolePermissions := th.SaveDefaultRolePermissions()
  1984  	defer func() {
  1985  		th.RestoreDefaultRolePermissions(defaultRolePermissions)
  1986  	}()
  1987  
  1988  	th.AddPermissionToRole(model.PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS.Id, model.CHANNEL_USER_ROLE_ID)
  1989  
  1990  	// Check that a regular channel user can add other users.
  1991  	Client.Login(user2.Username, user2.Password)
  1992  	privateChannel = th.CreatePrivateChannel()
  1993  	_, resp = Client.AddChannelMember(privateChannel.Id, user.Id)
  1994  	CheckNoError(t, resp)
  1995  	Client.Logout()
  1996  
  1997  	Client.Login(user.Username, user.Password)
  1998  	_, resp = Client.AddChannelMember(privateChannel.Id, user3.Id)
  1999  	CheckNoError(t, resp)
  2000  	Client.Logout()
  2001  
  2002  	// Restrict the permission for adding users to Channel Admins
  2003  	th.AddPermissionToRole(model.PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS.Id, model.CHANNEL_ADMIN_ROLE_ID)
  2004  	th.RemovePermissionFromRole(model.PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS.Id, model.CHANNEL_USER_ROLE_ID)
  2005  
  2006  	Client.Login(user2.Username, user2.Password)
  2007  	privateChannel = th.CreatePrivateChannel()
  2008  	_, resp = Client.AddChannelMember(privateChannel.Id, user.Id)
  2009  	CheckNoError(t, resp)
  2010  	Client.Logout()
  2011  
  2012  	Client.Login(user.Username, user.Password)
  2013  	_, resp = Client.AddChannelMember(privateChannel.Id, user3.Id)
  2014  	CheckForbiddenStatus(t, resp)
  2015  	Client.Logout()
  2016  
  2017  	th.MakeUserChannelAdmin(user, privateChannel)
  2018  	th.App.InvalidateAllCaches()
  2019  
  2020  	Client.Login(user.Username, user.Password)
  2021  	_, resp = Client.AddChannelMember(privateChannel.Id, user3.Id)
  2022  	CheckNoError(t, resp)
  2023  	Client.Logout()
  2024  }
  2025  
  2026  func TestRemoveChannelMember(t *testing.T) {
  2027  	th := Setup().InitBasic()
  2028  	user1 := th.BasicUser
  2029  	user2 := th.BasicUser2
  2030  	team := th.BasicTeam
  2031  	defer th.TearDown()
  2032  	Client := th.Client
  2033  
  2034  	pass, resp := Client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser2.Id)
  2035  	CheckNoError(t, resp)
  2036  
  2037  	if !pass {
  2038  		t.Fatal("should have passed")
  2039  	}
  2040  
  2041  	_, resp = Client.RemoveUserFromChannel(th.BasicChannel.Id, "junk")
  2042  	CheckBadRequestStatus(t, resp)
  2043  
  2044  	_, resp = Client.RemoveUserFromChannel(th.BasicChannel.Id, model.NewId())
  2045  	CheckNotFoundStatus(t, resp)
  2046  
  2047  	_, resp = Client.RemoveUserFromChannel(model.NewId(), th.BasicUser2.Id)
  2048  	CheckNotFoundStatus(t, resp)
  2049  
  2050  	th.LoginBasic2()
  2051  	_, resp = Client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser.Id)
  2052  	CheckForbiddenStatus(t, resp)
  2053  
  2054  	th.App.AddUserToChannel(th.BasicUser2, th.BasicChannel)
  2055  	_, resp = Client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser2.Id)
  2056  	CheckNoError(t, resp)
  2057  
  2058  	_, resp = Client.RemoveUserFromChannel(th.BasicChannel2.Id, th.BasicUser.Id)
  2059  	CheckNoError(t, resp)
  2060  
  2061  	_, resp = th.SystemAdminClient.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser.Id)
  2062  	CheckNoError(t, resp)
  2063  
  2064  	// Leave deleted channel
  2065  	th.LoginBasic()
  2066  	deletedChannel := th.CreatePublicChannel()
  2067  	th.App.AddUserToChannel(th.BasicUser, deletedChannel)
  2068  	th.App.AddUserToChannel(th.BasicUser2, deletedChannel)
  2069  
  2070  	deletedChannel.DeleteAt = 1
  2071  	th.App.UpdateChannel(deletedChannel)
  2072  
  2073  	_, resp = Client.RemoveUserFromChannel(deletedChannel.Id, th.BasicUser.Id)
  2074  	CheckNoError(t, resp)
  2075  
  2076  	th.LoginBasic()
  2077  	private := th.CreatePrivateChannel()
  2078  	th.App.AddUserToChannel(th.BasicUser2, private)
  2079  
  2080  	_, resp = Client.RemoveUserFromChannel(private.Id, th.BasicUser2.Id)
  2081  	CheckNoError(t, resp)
  2082  
  2083  	th.LoginBasic2()
  2084  	_, resp = Client.RemoveUserFromChannel(private.Id, th.BasicUser.Id)
  2085  	CheckForbiddenStatus(t, resp)
  2086  
  2087  	_, resp = th.SystemAdminClient.RemoveUserFromChannel(private.Id, th.BasicUser.Id)
  2088  	CheckNoError(t, resp)
  2089  
  2090  	th.LoginBasic()
  2091  	th.UpdateUserToNonTeamAdmin(user1, team)
  2092  	th.App.InvalidateAllCaches()
  2093  
  2094  	// Check the appropriate permissions are enforced.
  2095  	defaultRolePermissions := th.SaveDefaultRolePermissions()
  2096  	defer func() {
  2097  		th.RestoreDefaultRolePermissions(defaultRolePermissions)
  2098  	}()
  2099  
  2100  	th.AddPermissionToRole(model.PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS.Id, model.CHANNEL_USER_ROLE_ID)
  2101  
  2102  	// Check that a regular channel user can remove other users.
  2103  	privateChannel := th.CreateChannelWithClient(th.SystemAdminClient, model.CHANNEL_PRIVATE)
  2104  	_, resp = th.SystemAdminClient.AddChannelMember(privateChannel.Id, user1.Id)
  2105  	CheckNoError(t, resp)
  2106  	_, resp = th.SystemAdminClient.AddChannelMember(privateChannel.Id, user2.Id)
  2107  	CheckNoError(t, resp)
  2108  
  2109  	_, resp = Client.RemoveUserFromChannel(privateChannel.Id, user2.Id)
  2110  	CheckNoError(t, resp)
  2111  
  2112  	// Restrict the permission for adding users to Channel Admins
  2113  	th.AddPermissionToRole(model.PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS.Id, model.CHANNEL_ADMIN_ROLE_ID)
  2114  	th.RemovePermissionFromRole(model.PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS.Id, model.CHANNEL_USER_ROLE_ID)
  2115  
  2116  	privateChannel = th.CreateChannelWithClient(th.SystemAdminClient, model.CHANNEL_PRIVATE)
  2117  	_, resp = th.SystemAdminClient.AddChannelMember(privateChannel.Id, user1.Id)
  2118  	CheckNoError(t, resp)
  2119  	_, resp = th.SystemAdminClient.AddChannelMember(privateChannel.Id, user2.Id)
  2120  	CheckNoError(t, resp)
  2121  
  2122  	_, resp = Client.RemoveUserFromChannel(privateChannel.Id, user2.Id)
  2123  	CheckForbiddenStatus(t, resp)
  2124  
  2125  	th.MakeUserChannelAdmin(user1, privateChannel)
  2126  	th.App.InvalidateAllCaches()
  2127  
  2128  	_, resp = Client.RemoveUserFromChannel(privateChannel.Id, user2.Id)
  2129  	CheckNoError(t, resp)
  2130  
  2131  	// Test on preventing removal of user from a direct channel
  2132  	directChannel, resp := Client.CreateDirectChannel(user1.Id, user2.Id)
  2133  	CheckNoError(t, resp)
  2134  
  2135  	_, resp = Client.RemoveUserFromChannel(directChannel.Id, user1.Id)
  2136  	CheckBadRequestStatus(t, resp)
  2137  
  2138  	_, resp = Client.RemoveUserFromChannel(directChannel.Id, user2.Id)
  2139  	CheckBadRequestStatus(t, resp)
  2140  
  2141  	_, resp = th.SystemAdminClient.RemoveUserFromChannel(directChannel.Id, user1.Id)
  2142  	CheckBadRequestStatus(t, resp)
  2143  
  2144  	// Test on preventing removal of user from a group channel
  2145  	user3 := th.CreateUser()
  2146  	groupChannel, resp := Client.CreateGroupChannel([]string{user1.Id, user2.Id, user3.Id})
  2147  	CheckNoError(t, resp)
  2148  
  2149  	_, resp = Client.RemoveUserFromChannel(groupChannel.Id, user1.Id)
  2150  	CheckBadRequestStatus(t, resp)
  2151  
  2152  	_, resp = th.SystemAdminClient.RemoveUserFromChannel(groupChannel.Id, user1.Id)
  2153  	CheckBadRequestStatus(t, resp)
  2154  }
  2155  
  2156  func TestAutocompleteChannels(t *testing.T) {
  2157  	th := Setup().InitBasic()
  2158  	defer th.TearDown()
  2159  
  2160  	// A private channel to make sure private channels are not used
  2161  	utils.DisableDebugLogForTest()
  2162  	ptown, _ := th.Client.CreateChannel(&model.Channel{
  2163  		DisplayName: "Town",
  2164  		Name:        "town",
  2165  		Type:        model.CHANNEL_PRIVATE,
  2166  		TeamId:      th.BasicTeam.Id,
  2167  	})
  2168  	utils.EnableDebugLogForTest()
  2169  	defer func() {
  2170  		th.Client.DeleteChannel(ptown.Id)
  2171  	}()
  2172  
  2173  	for _, tc := range []struct {
  2174  		description      string
  2175  		teamId           string
  2176  		fragment         string
  2177  		expectedIncludes []string
  2178  		expectedExcludes []string
  2179  	}{
  2180  		{
  2181  			"Basic town-square",
  2182  			th.BasicTeam.Id,
  2183  			"town",
  2184  			[]string{"town-square"},
  2185  			[]string{"off-topic", "town"},
  2186  		},
  2187  		{
  2188  			"Basic off-topic",
  2189  			th.BasicTeam.Id,
  2190  			"off-to",
  2191  			[]string{"off-topic"},
  2192  			[]string{"town-square", "town"},
  2193  		},
  2194  		{
  2195  			"Basic town square and off topic",
  2196  			th.BasicTeam.Id,
  2197  			"to",
  2198  			[]string{"off-topic", "town-square"},
  2199  			[]string{"town"},
  2200  		},
  2201  	} {
  2202  		t.Run(tc.description, func(t *testing.T) {
  2203  			channels, resp := th.Client.AutocompleteChannelsForTeam(tc.teamId, tc.fragment)
  2204  			if resp.Error != nil {
  2205  				t.Fatal("Err: " + resp.Error.Error())
  2206  			}
  2207  			for _, expectedInclude := range tc.expectedIncludes {
  2208  				found := false
  2209  				for _, channel := range *channels {
  2210  					if channel.Name == expectedInclude {
  2211  						found = true
  2212  						break
  2213  					}
  2214  				}
  2215  				if !found {
  2216  					t.Fatal("Expected but didn't find channel: " + expectedInclude)
  2217  				}
  2218  			}
  2219  			for _, expectedExclude := range tc.expectedExcludes {
  2220  				for _, channel := range *channels {
  2221  					if channel.Name == expectedExclude {
  2222  						t.Fatal("Found channel we didn't want: " + expectedExclude)
  2223  					}
  2224  				}
  2225  			}
  2226  		})
  2227  	}
  2228  }
  2229  
  2230  func TestAutocompleteChannelsForSearch(t *testing.T) {
  2231  	th := Setup().InitBasic()
  2232  	defer th.TearDown()
  2233  
  2234  	th.LoginSystemAdminWithClient(th.SystemAdminClient)
  2235  	th.LoginBasicWithClient(th.Client)
  2236  
  2237  	u1 := th.CreateUserWithClient(th.SystemAdminClient)
  2238  	u2 := th.CreateUserWithClient(th.SystemAdminClient)
  2239  	u3 := th.CreateUserWithClient(th.SystemAdminClient)
  2240  	u4 := th.CreateUserWithClient(th.SystemAdminClient)
  2241  
  2242  	// A private channel to make sure private channels are not used
  2243  	utils.DisableDebugLogForTest()
  2244  	ptown, _ := th.SystemAdminClient.CreateChannel(&model.Channel{
  2245  		DisplayName: "Town",
  2246  		Name:        "town",
  2247  		Type:        model.CHANNEL_PRIVATE,
  2248  		TeamId:      th.BasicTeam.Id,
  2249  	})
  2250  	defer func() {
  2251  		th.Client.DeleteChannel(ptown.Id)
  2252  	}()
  2253  	mypriv, _ := th.Client.CreateChannel(&model.Channel{
  2254  		DisplayName: "My private town",
  2255  		Name:        "townpriv",
  2256  		Type:        model.CHANNEL_PRIVATE,
  2257  		TeamId:      th.BasicTeam.Id,
  2258  	})
  2259  	defer func() {
  2260  		th.Client.DeleteChannel(mypriv.Id)
  2261  	}()
  2262  	utils.EnableDebugLogForTest()
  2263  
  2264  	dc1, resp := th.Client.CreateDirectChannel(th.BasicUser.Id, u1.Id)
  2265  	CheckNoError(t, resp)
  2266  	defer func() {
  2267  		th.Client.DeleteChannel(dc1.Id)
  2268  	}()
  2269  
  2270  	dc2, resp := th.SystemAdminClient.CreateDirectChannel(u2.Id, u3.Id)
  2271  	CheckNoError(t, resp)
  2272  	defer func() {
  2273  		th.SystemAdminClient.DeleteChannel(dc2.Id)
  2274  	}()
  2275  
  2276  	gc1, resp := th.Client.CreateGroupChannel([]string{th.BasicUser.Id, u2.Id, u3.Id})
  2277  	CheckNoError(t, resp)
  2278  	defer func() {
  2279  		th.Client.DeleteChannel(gc1.Id)
  2280  	}()
  2281  
  2282  	gc2, resp := th.SystemAdminClient.CreateGroupChannel([]string{u2.Id, u3.Id, u4.Id})
  2283  	CheckNoError(t, resp)
  2284  	defer func() {
  2285  		th.SystemAdminClient.DeleteChannel(gc2.Id)
  2286  	}()
  2287  
  2288  	for _, tc := range []struct {
  2289  		description      string
  2290  		teamId           string
  2291  		fragment         string
  2292  		expectedIncludes []string
  2293  		expectedExcludes []string
  2294  	}{
  2295  		{
  2296  			"Basic town-square",
  2297  			th.BasicTeam.Id,
  2298  			"town",
  2299  			[]string{"town-square", "townpriv"},
  2300  			[]string{"off-topic", "town"},
  2301  		},
  2302  		{
  2303  			"Basic off-topic",
  2304  			th.BasicTeam.Id,
  2305  			"off-to",
  2306  			[]string{"off-topic"},
  2307  			[]string{"town-square", "town", "townpriv"},
  2308  		},
  2309  		{
  2310  			"Basic town square and off topic",
  2311  			th.BasicTeam.Id,
  2312  			"to",
  2313  			[]string{"off-topic", "town-square", "townpriv"},
  2314  			[]string{"town"},
  2315  		},
  2316  		{
  2317  			"Direct and group messages",
  2318  			th.BasicTeam.Id,
  2319  			"fakeuser",
  2320  			[]string{dc1.Name, gc1.Name},
  2321  			[]string{dc2.Name, gc2.Name},
  2322  		},
  2323  	} {
  2324  		t.Run(tc.description, func(t *testing.T) {
  2325  			channels, resp := th.Client.AutocompleteChannelsForTeamForSearch(tc.teamId, tc.fragment)
  2326  			if resp.Error != nil {
  2327  				t.Fatal("Err: " + resp.Error.Error())
  2328  			}
  2329  			for _, expectedInclude := range tc.expectedIncludes {
  2330  				found := false
  2331  				for _, channel := range *channels {
  2332  					if channel.Name == expectedInclude {
  2333  						found = true
  2334  						break
  2335  					}
  2336  				}
  2337  				if !found {
  2338  					t.Fatal("Expected but didn't find channel: " + expectedInclude + " Channels: " + fmt.Sprintf("%v", channels))
  2339  				}
  2340  			}
  2341  
  2342  			for _, expectedExclude := range tc.expectedExcludes {
  2343  				for _, channel := range *channels {
  2344  					if channel.Name == expectedExclude {
  2345  						t.Fatal("Found channel we didn't want: " + expectedExclude)
  2346  					}
  2347  				}
  2348  			}
  2349  		})
  2350  	}
  2351  }
  2352  
  2353  func TestUpdateChannelScheme(t *testing.T) {
  2354  	th := Setup().InitBasic()
  2355  	defer th.TearDown()
  2356  
  2357  	th.App.SetLicense(model.NewTestLicense(""))
  2358  
  2359  	th.App.SetPhase2PermissionsMigrationStatus(true)
  2360  
  2361  	team, resp := th.SystemAdminClient.CreateTeam(&model.Team{
  2362  		DisplayName:     "Name",
  2363  		Description:     "Some description",
  2364  		CompanyName:     "Some company name",
  2365  		AllowOpenInvite: false,
  2366  		InviteId:        "inviteid0",
  2367  		Name:            "z-z-" + model.NewId() + "a",
  2368  		Email:           "success+" + model.NewId() + "@simulator.amazonses.com",
  2369  		Type:            model.TEAM_OPEN,
  2370  	})
  2371  	CheckNoError(t, resp)
  2372  
  2373  	channel, resp := th.SystemAdminClient.CreateChannel(&model.Channel{
  2374  		DisplayName: "Name",
  2375  		Name:        "z-z-" + model.NewId() + "a",
  2376  		Type:        model.CHANNEL_OPEN,
  2377  		TeamId:      team.Id,
  2378  	})
  2379  	CheckNoError(t, resp)
  2380  
  2381  	channelScheme, resp := th.SystemAdminClient.CreateScheme(&model.Scheme{
  2382  		DisplayName: "DisplayName",
  2383  		Name:        model.NewId(),
  2384  		Description: "Some description",
  2385  		Scope:       model.SCHEME_SCOPE_CHANNEL,
  2386  	})
  2387  	CheckNoError(t, resp)
  2388  
  2389  	teamScheme, resp := th.SystemAdminClient.CreateScheme(&model.Scheme{
  2390  		DisplayName: "DisplayName",
  2391  		Name:        model.NewId(),
  2392  		Description: "Some description",
  2393  		Scope:       model.SCHEME_SCOPE_TEAM,
  2394  	})
  2395  	CheckNoError(t, resp)
  2396  
  2397  	// Test the setup/base case.
  2398  	_, resp = th.SystemAdminClient.UpdateChannelScheme(channel.Id, channelScheme.Id)
  2399  	CheckNoError(t, resp)
  2400  
  2401  	// Test various invalid channel and scheme id combinations.
  2402  	_, resp = th.SystemAdminClient.UpdateChannelScheme(channel.Id, "x")
  2403  	CheckBadRequestStatus(t, resp)
  2404  	_, resp = th.SystemAdminClient.UpdateChannelScheme("x", channelScheme.Id)
  2405  	CheckBadRequestStatus(t, resp)
  2406  	_, resp = th.SystemAdminClient.UpdateChannelScheme("x", "x")
  2407  	CheckBadRequestStatus(t, resp)
  2408  
  2409  	// Test that permissions are required.
  2410  	_, resp = th.Client.UpdateChannelScheme(channel.Id, channelScheme.Id)
  2411  	CheckForbiddenStatus(t, resp)
  2412  
  2413  	// Test that a license is requried.
  2414  	th.App.SetLicense(nil)
  2415  	_, resp = th.SystemAdminClient.UpdateChannelScheme(channel.Id, channelScheme.Id)
  2416  	CheckNotImplementedStatus(t, resp)
  2417  	th.App.SetLicense(model.NewTestLicense(""))
  2418  
  2419  	// Test an invalid scheme scope.
  2420  	_, resp = th.SystemAdminClient.UpdateChannelScheme(channel.Id, teamScheme.Id)
  2421  	CheckBadRequestStatus(t, resp)
  2422  
  2423  	// Test that an unauthenticated user gets rejected.
  2424  	th.SystemAdminClient.Logout()
  2425  	_, resp = th.SystemAdminClient.UpdateChannelScheme(channel.Id, channelScheme.Id)
  2426  	CheckUnauthorizedStatus(t, resp)
  2427  }
  2428  
  2429  func TestGetChannelMembersTimezones(t *testing.T) {
  2430  	th := Setup().InitBasic()
  2431  	defer th.TearDown()
  2432  	Client := th.Client
  2433  
  2434  	user := th.BasicUser
  2435  	user.Timezone["useAutomaticTimezone"] = "false"
  2436  	user.Timezone["manualTimezone"] = "XOXO/BLABLA"
  2437  	_, resp := Client.UpdateUser(user)
  2438  	CheckNoError(t, resp)
  2439  
  2440  	user2 := th.BasicUser2
  2441  	user2.Timezone["automaticTimezone"] = "NoWhere/Island"
  2442  	_, resp = th.SystemAdminClient.UpdateUser(user2)
  2443  	CheckNoError(t, resp)
  2444  
  2445  	timezone, resp := Client.GetChannelMembersTimezones(th.BasicChannel.Id)
  2446  	CheckNoError(t, resp)
  2447  	if len(timezone) != 2 {
  2448  		t.Fatal("should return 2 timezones")
  2449  	}
  2450  
  2451  	//both users have same timezone
  2452  	user2.Timezone["automaticTimezone"] = "XOXO/BLABLA"
  2453  	_, resp = th.SystemAdminClient.UpdateUser(user2)
  2454  	CheckNoError(t, resp)
  2455  
  2456  	timezone, resp = Client.GetChannelMembersTimezones(th.BasicChannel.Id)
  2457  	CheckNoError(t, resp)
  2458  	if len(timezone) != 1 {
  2459  		t.Fatal("should return 1 timezone")
  2460  	}
  2461  
  2462  	//no timezone set should return empty
  2463  	user2.Timezone["automaticTimezone"] = ""
  2464  	_, resp = th.SystemAdminClient.UpdateUser(user2)
  2465  	CheckNoError(t, resp)
  2466  
  2467  	user.Timezone["manualTimezone"] = ""
  2468  	_, resp = Client.UpdateUser(user)
  2469  
  2470  	timezone, resp = Client.GetChannelMembersTimezones(th.BasicChannel.Id)
  2471  	CheckNoError(t, resp)
  2472  	if len(timezone) > 0 {
  2473  		t.Fatal("should return 0 timezone")
  2474  	}
  2475  
  2476  }