github.com/turgay/mattermost-server@v5.3.2-0.20181002173352-2945e8a2b0ce+incompatible/app/channel_test.go (about)

     1  // Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package app
     5  
     6  import (
     7  	"testing"
     8  
     9  	"github.com/mattermost/mattermost-server/model"
    10  	"github.com/mattermost/mattermost-server/store"
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  func TestPermanentDeleteChannel(t *testing.T) {
    16  	th := Setup().InitBasic()
    17  	defer th.TearDown()
    18  
    19  	th.App.UpdateConfig(func(cfg *model.Config) {
    20  		cfg.ServiceSettings.EnableIncomingWebhooks = true
    21  		cfg.ServiceSettings.EnableOutgoingWebhooks = true
    22  	})
    23  
    24  	channel, err := th.App.CreateChannel(&model.Channel{DisplayName: "deletion-test", Name: "deletion-test", Type: model.CHANNEL_OPEN, TeamId: th.BasicTeam.Id}, false)
    25  	if err != nil {
    26  		t.Fatal(err.Error())
    27  	}
    28  	defer func() {
    29  		th.App.PermanentDeleteChannel(channel)
    30  	}()
    31  
    32  	incoming, err := th.App.CreateIncomingWebhookForChannel(th.BasicUser.Id, channel, &model.IncomingWebhook{ChannelId: channel.Id})
    33  	if err != nil {
    34  		t.Fatal(err.Error())
    35  	}
    36  	defer th.App.DeleteIncomingWebhook(incoming.Id)
    37  
    38  	if incoming, err = th.App.GetIncomingWebhook(incoming.Id); incoming == nil || err != nil {
    39  		t.Fatal("unable to get new incoming webhook")
    40  	}
    41  
    42  	outgoing, err := th.App.CreateOutgoingWebhook(&model.OutgoingWebhook{
    43  		ChannelId:    channel.Id,
    44  		TeamId:       channel.TeamId,
    45  		CreatorId:    th.BasicUser.Id,
    46  		CallbackURLs: []string{"http://foo"},
    47  	})
    48  	if err != nil {
    49  		t.Fatal(err.Error())
    50  	}
    51  	defer th.App.DeleteOutgoingWebhook(outgoing.Id)
    52  
    53  	if outgoing, err = th.App.GetOutgoingWebhook(outgoing.Id); outgoing == nil || err != nil {
    54  		t.Fatal("unable to get new outgoing webhook")
    55  	}
    56  
    57  	if err := th.App.PermanentDeleteChannel(channel); err != nil {
    58  		t.Fatal(err.Error())
    59  	}
    60  
    61  	if incoming, err = th.App.GetIncomingWebhook(incoming.Id); incoming != nil || err == nil {
    62  		t.Error("incoming webhook wasn't deleted")
    63  	}
    64  
    65  	if outgoing, err = th.App.GetOutgoingWebhook(outgoing.Id); outgoing != nil || err == nil {
    66  		t.Error("outgoing webhook wasn't deleted")
    67  	}
    68  }
    69  
    70  func TestMoveChannel(t *testing.T) {
    71  	th := Setup().InitBasic()
    72  	defer th.TearDown()
    73  
    74  	sourceTeam := th.CreateTeam()
    75  	targetTeam := th.CreateTeam()
    76  	channel1 := th.CreateChannel(sourceTeam)
    77  	defer func() {
    78  		th.App.PermanentDeleteChannel(channel1)
    79  		th.App.PermanentDeleteTeam(sourceTeam)
    80  		th.App.PermanentDeleteTeam(targetTeam)
    81  	}()
    82  
    83  	if _, err := th.App.AddUserToTeam(sourceTeam.Id, th.BasicUser.Id, ""); err != nil {
    84  		t.Fatal(err)
    85  	}
    86  	if _, err := th.App.AddUserToTeam(sourceTeam.Id, th.BasicUser2.Id, ""); err != nil {
    87  		t.Fatal(err)
    88  	}
    89  
    90  	if _, err := th.App.AddUserToTeam(targetTeam.Id, th.BasicUser.Id, ""); err != nil {
    91  		t.Fatal(err)
    92  	}
    93  
    94  	if _, err := th.App.AddUserToChannel(th.BasicUser, channel1); err != nil {
    95  		t.Fatal(err)
    96  	}
    97  	if _, err := th.App.AddUserToChannel(th.BasicUser2, channel1); err != nil {
    98  		t.Fatal(err)
    99  	}
   100  
   101  	if err := th.App.MoveChannel(targetTeam, channel1, th.BasicUser); err == nil {
   102  		t.Fatal("Should have failed due to mismatched members.")
   103  	}
   104  
   105  	if _, err := th.App.AddUserToTeam(targetTeam.Id, th.BasicUser2.Id, ""); err != nil {
   106  		t.Fatal(err)
   107  	}
   108  
   109  	if err := th.App.MoveChannel(targetTeam, channel1, th.BasicUser); err != nil {
   110  		t.Fatal(err)
   111  	}
   112  }
   113  
   114  func TestJoinDefaultChannelsCreatesChannelMemberHistoryRecordTownSquare(t *testing.T) {
   115  	th := Setup().InitBasic()
   116  	defer th.TearDown()
   117  
   118  	// figure out the initial number of users in town square
   119  	townSquareChannelId := store.Must(th.App.Srv.Store.Channel().GetByName(th.BasicTeam.Id, "town-square", true)).(*model.Channel).Id
   120  	initialNumTownSquareUsers := len(store.Must(th.App.Srv.Store.ChannelMemberHistory().GetUsersInChannelDuring(model.GetMillis()-100, model.GetMillis()+100, townSquareChannelId)).([]*model.ChannelMemberHistoryResult))
   121  
   122  	// create a new user that joins the default channels
   123  	user := th.CreateUser()
   124  	th.App.JoinDefaultChannels(th.BasicTeam.Id, user, false, "")
   125  
   126  	// there should be a ChannelMemberHistory record for the user
   127  	histories := store.Must(th.App.Srv.Store.ChannelMemberHistory().GetUsersInChannelDuring(model.GetMillis()-100, model.GetMillis()+100, townSquareChannelId)).([]*model.ChannelMemberHistoryResult)
   128  	assert.Len(t, histories, initialNumTownSquareUsers+1)
   129  
   130  	found := false
   131  	for _, history := range histories {
   132  		if user.Id == history.UserId && townSquareChannelId == history.ChannelId {
   133  			found = true
   134  			break
   135  		}
   136  	}
   137  	assert.True(t, found)
   138  }
   139  
   140  func TestJoinDefaultChannelsCreatesChannelMemberHistoryRecordOffTopic(t *testing.T) {
   141  	th := Setup().InitBasic()
   142  	defer th.TearDown()
   143  
   144  	// figure out the initial number of users in off-topic
   145  	offTopicChannelId := store.Must(th.App.Srv.Store.Channel().GetByName(th.BasicTeam.Id, "off-topic", true)).(*model.Channel).Id
   146  	initialNumTownSquareUsers := len(store.Must(th.App.Srv.Store.ChannelMemberHistory().GetUsersInChannelDuring(model.GetMillis()-100, model.GetMillis()+100, offTopicChannelId)).([]*model.ChannelMemberHistoryResult))
   147  
   148  	// create a new user that joins the default channels
   149  	user := th.CreateUser()
   150  	th.App.JoinDefaultChannels(th.BasicTeam.Id, user, false, "")
   151  
   152  	// there should be a ChannelMemberHistory record for the user
   153  	histories := store.Must(th.App.Srv.Store.ChannelMemberHistory().GetUsersInChannelDuring(model.GetMillis()-100, model.GetMillis()+100, offTopicChannelId)).([]*model.ChannelMemberHistoryResult)
   154  	assert.Len(t, histories, initialNumTownSquareUsers+1)
   155  
   156  	found := false
   157  	for _, history := range histories {
   158  		if user.Id == history.UserId && offTopicChannelId == history.ChannelId {
   159  			found = true
   160  			break
   161  		}
   162  	}
   163  	assert.True(t, found)
   164  }
   165  
   166  func TestJoinDefaultChannelsExperimentalDefaultChannels(t *testing.T) {
   167  	th := Setup().InitBasic()
   168  	defer th.TearDown()
   169  
   170  	basicChannel2 := th.CreateChannel(th.BasicTeam)
   171  	defaultChannelList := []string{th.BasicChannel.Name, basicChannel2.Name, basicChannel2.Name}
   172  	th.App.Config().TeamSettings.ExperimentalDefaultChannels = defaultChannelList
   173  
   174  	user := th.CreateUser()
   175  	th.App.JoinDefaultChannels(th.BasicTeam.Id, user, false, "")
   176  
   177  	for _, channelName := range defaultChannelList {
   178  		channel, err := th.App.GetChannelByName(channelName, th.BasicTeam.Id, false)
   179  
   180  		if err != nil {
   181  			t.Errorf("Expected nil, got %s", err)
   182  		}
   183  
   184  		member, err := th.App.GetChannelMember(channel.Id, user.Id)
   185  
   186  		if member == nil {
   187  			t.Errorf("Expected member object, got nil")
   188  		}
   189  
   190  		if err != nil {
   191  			t.Errorf("Expected nil object, got %s", err)
   192  		}
   193  	}
   194  }
   195  
   196  func TestCreateChannelPublicCreatesChannelMemberHistoryRecord(t *testing.T) {
   197  	th := Setup().InitBasic()
   198  	defer th.TearDown()
   199  
   200  	// creates a public channel and adds basic user to it
   201  	publicChannel := th.createChannel(th.BasicTeam, model.CHANNEL_OPEN)
   202  
   203  	// there should be a ChannelMemberHistory record for the user
   204  	histories := store.Must(th.App.Srv.Store.ChannelMemberHistory().GetUsersInChannelDuring(model.GetMillis()-100, model.GetMillis()+100, publicChannel.Id)).([]*model.ChannelMemberHistoryResult)
   205  	assert.Len(t, histories, 1)
   206  	assert.Equal(t, th.BasicUser.Id, histories[0].UserId)
   207  	assert.Equal(t, publicChannel.Id, histories[0].ChannelId)
   208  }
   209  
   210  func TestCreateChannelPrivateCreatesChannelMemberHistoryRecord(t *testing.T) {
   211  	th := Setup().InitBasic()
   212  	defer th.TearDown()
   213  
   214  	// creates a private channel and adds basic user to it
   215  	privateChannel := th.createChannel(th.BasicTeam, model.CHANNEL_PRIVATE)
   216  
   217  	// there should be a ChannelMemberHistory record for the user
   218  	histories := store.Must(th.App.Srv.Store.ChannelMemberHistory().GetUsersInChannelDuring(model.GetMillis()-100, model.GetMillis()+100, privateChannel.Id)).([]*model.ChannelMemberHistoryResult)
   219  	assert.Len(t, histories, 1)
   220  	assert.Equal(t, th.BasicUser.Id, histories[0].UserId)
   221  	assert.Equal(t, privateChannel.Id, histories[0].ChannelId)
   222  }
   223  
   224  func TestUpdateChannelPrivacy(t *testing.T) {
   225  	th := Setup().InitBasic()
   226  	defer th.TearDown()
   227  
   228  	privateChannel := th.createChannel(th.BasicTeam, model.CHANNEL_PRIVATE)
   229  	privateChannel.Type = model.CHANNEL_OPEN
   230  
   231  	if publicChannel, err := th.App.UpdateChannelPrivacy(privateChannel, th.BasicUser); err != nil {
   232  		t.Fatal("Failed to update channel privacy. Error: " + err.Error())
   233  	} else {
   234  		assert.Equal(t, publicChannel.Id, privateChannel.Id)
   235  		assert.Equal(t, publicChannel.Type, model.CHANNEL_OPEN)
   236  	}
   237  }
   238  
   239  func TestCreateGroupChannelCreatesChannelMemberHistoryRecord(t *testing.T) {
   240  	th := Setup().InitBasic()
   241  	defer th.TearDown()
   242  
   243  	user1 := th.CreateUser()
   244  	user2 := th.CreateUser()
   245  
   246  	groupUserIds := make([]string, 0)
   247  	groupUserIds = append(groupUserIds, user1.Id)
   248  	groupUserIds = append(groupUserIds, user2.Id)
   249  	groupUserIds = append(groupUserIds, th.BasicUser.Id)
   250  
   251  	if channel, err := th.App.CreateGroupChannel(groupUserIds, th.BasicUser.Id); err != nil {
   252  		t.Fatal("Failed to create group channel. Error: " + err.Message)
   253  	} else {
   254  		// there should be a ChannelMemberHistory record for each user
   255  		histories := store.Must(th.App.Srv.Store.ChannelMemberHistory().GetUsersInChannelDuring(model.GetMillis()-100, model.GetMillis()+100, channel.Id)).([]*model.ChannelMemberHistoryResult)
   256  		assert.Len(t, histories, 3)
   257  
   258  		channelMemberHistoryUserIds := make([]string, 0)
   259  		for _, history := range histories {
   260  			assert.Equal(t, channel.Id, history.ChannelId)
   261  			channelMemberHistoryUserIds = append(channelMemberHistoryUserIds, history.UserId)
   262  		}
   263  		assert.Equal(t, groupUserIds, channelMemberHistoryUserIds)
   264  	}
   265  }
   266  
   267  func TestCreateDirectChannelCreatesChannelMemberHistoryRecord(t *testing.T) {
   268  	th := Setup().InitBasic()
   269  	defer th.TearDown()
   270  
   271  	user1 := th.CreateUser()
   272  	user2 := th.CreateUser()
   273  
   274  	if channel, err := th.App.CreateDirectChannel(user1.Id, user2.Id); err != nil {
   275  		t.Fatal("Failed to create direct channel. Error: " + err.Message)
   276  	} else {
   277  		// there should be a ChannelMemberHistory record for both users
   278  		histories := store.Must(th.App.Srv.Store.ChannelMemberHistory().GetUsersInChannelDuring(model.GetMillis()-100, model.GetMillis()+100, channel.Id)).([]*model.ChannelMemberHistoryResult)
   279  		assert.Len(t, histories, 2)
   280  
   281  		historyId0 := histories[0].UserId
   282  		historyId1 := histories[1].UserId
   283  		switch historyId0 {
   284  		case user1.Id:
   285  			assert.Equal(t, user2.Id, historyId1)
   286  		case user2.Id:
   287  			assert.Equal(t, user1.Id, historyId1)
   288  		default:
   289  			t.Fatal("Unexpected user id " + historyId0 + " in ChannelMemberHistory table")
   290  		}
   291  	}
   292  }
   293  
   294  func TestGetDirectChannelCreatesChannelMemberHistoryRecord(t *testing.T) {
   295  	th := Setup().InitBasic()
   296  	defer th.TearDown()
   297  
   298  	user1 := th.CreateUser()
   299  	user2 := th.CreateUser()
   300  
   301  	// this function call implicitly creates a direct channel between the two users if one doesn't already exist
   302  	if channel, err := th.App.GetDirectChannel(user1.Id, user2.Id); err != nil {
   303  		t.Fatal("Failed to create direct channel. Error: " + err.Message)
   304  	} else {
   305  		// there should be a ChannelMemberHistory record for both users
   306  		histories := store.Must(th.App.Srv.Store.ChannelMemberHistory().GetUsersInChannelDuring(model.GetMillis()-100, model.GetMillis()+100, channel.Id)).([]*model.ChannelMemberHistoryResult)
   307  		assert.Len(t, histories, 2)
   308  
   309  		historyId0 := histories[0].UserId
   310  		historyId1 := histories[1].UserId
   311  		switch historyId0 {
   312  		case user1.Id:
   313  			assert.Equal(t, user2.Id, historyId1)
   314  		case user2.Id:
   315  			assert.Equal(t, user1.Id, historyId1)
   316  		default:
   317  			t.Fatal("Unexpected user id " + historyId0 + " in ChannelMemberHistory table")
   318  		}
   319  	}
   320  }
   321  
   322  func TestAddUserToChannelCreatesChannelMemberHistoryRecord(t *testing.T) {
   323  	th := Setup().InitBasic()
   324  	defer th.TearDown()
   325  
   326  	// create a user and add it to a channel
   327  	user := th.CreateUser()
   328  	if _, err := th.App.AddTeamMember(th.BasicTeam.Id, user.Id); err != nil {
   329  		t.Fatal("Failed to add user to team. Error: " + err.Message)
   330  	}
   331  
   332  	groupUserIds := make([]string, 0)
   333  	groupUserIds = append(groupUserIds, th.BasicUser.Id)
   334  	groupUserIds = append(groupUserIds, user.Id)
   335  
   336  	channel := th.createChannel(th.BasicTeam, model.CHANNEL_OPEN)
   337  	if _, err := th.App.AddUserToChannel(user, channel); err != nil {
   338  		t.Fatal("Failed to add user to channel. Error: " + err.Message)
   339  	}
   340  
   341  	// there should be a ChannelMemberHistory record for the user
   342  	histories := store.Must(th.App.Srv.Store.ChannelMemberHistory().GetUsersInChannelDuring(model.GetMillis()-100, model.GetMillis()+100, channel.Id)).([]*model.ChannelMemberHistoryResult)
   343  	assert.Len(t, histories, 2)
   344  	channelMemberHistoryUserIds := make([]string, 0)
   345  	for _, history := range histories {
   346  		assert.Equal(t, channel.Id, history.ChannelId)
   347  		channelMemberHistoryUserIds = append(channelMemberHistoryUserIds, history.UserId)
   348  	}
   349  	assert.Equal(t, groupUserIds, channelMemberHistoryUserIds)
   350  }
   351  
   352  func TestRemoveUserFromChannelUpdatesChannelMemberHistoryRecord(t *testing.T) {
   353  	th := Setup().InitBasic()
   354  	defer th.TearDown()
   355  
   356  	// a user creates a channel
   357  	publicChannel := th.createChannel(th.BasicTeam, model.CHANNEL_OPEN)
   358  	histories := store.Must(th.App.Srv.Store.ChannelMemberHistory().GetUsersInChannelDuring(model.GetMillis()-100, model.GetMillis()+100, publicChannel.Id)).([]*model.ChannelMemberHistoryResult)
   359  	assert.Len(t, histories, 1)
   360  	assert.Equal(t, th.BasicUser.Id, histories[0].UserId)
   361  	assert.Equal(t, publicChannel.Id, histories[0].ChannelId)
   362  	assert.Nil(t, histories[0].LeaveTime)
   363  
   364  	// the user leaves that channel
   365  	if err := th.App.LeaveChannel(publicChannel.Id, th.BasicUser.Id); err != nil {
   366  		t.Fatal("Failed to remove user from channel. Error: " + err.Message)
   367  	}
   368  	histories = store.Must(th.App.Srv.Store.ChannelMemberHistory().GetUsersInChannelDuring(model.GetMillis()-100, model.GetMillis()+100, publicChannel.Id)).([]*model.ChannelMemberHistoryResult)
   369  	assert.Len(t, histories, 1)
   370  	assert.Equal(t, th.BasicUser.Id, histories[0].UserId)
   371  	assert.Equal(t, publicChannel.Id, histories[0].ChannelId)
   372  	assert.NotNil(t, histories[0].LeaveTime)
   373  }
   374  
   375  func TestAddChannelMemberNoUserRequestor(t *testing.T) {
   376  	th := Setup().InitBasic()
   377  	defer th.TearDown()
   378  
   379  	// create a user and add it to a channel
   380  	user := th.CreateUser()
   381  	if _, err := th.App.AddTeamMember(th.BasicTeam.Id, user.Id); err != nil {
   382  		t.Fatal("Failed to add user to team. Error: " + err.Message)
   383  	}
   384  
   385  	groupUserIds := make([]string, 0)
   386  	groupUserIds = append(groupUserIds, th.BasicUser.Id)
   387  	groupUserIds = append(groupUserIds, user.Id)
   388  
   389  	channel := th.createChannel(th.BasicTeam, model.CHANNEL_OPEN)
   390  	userRequestorId := ""
   391  	postRootId := ""
   392  	if _, err := th.App.AddChannelMember(user.Id, channel, userRequestorId, postRootId, false); err != nil {
   393  		t.Fatal("Failed to add user to channel. Error: " + err.Message)
   394  	}
   395  
   396  	// there should be a ChannelMemberHistory record for the user
   397  	histories := store.Must(th.App.Srv.Store.ChannelMemberHistory().GetUsersInChannelDuring(model.GetMillis()-100, model.GetMillis()+100, channel.Id)).([]*model.ChannelMemberHistoryResult)
   398  	assert.Len(t, histories, 2)
   399  	channelMemberHistoryUserIds := make([]string, 0)
   400  	for _, history := range histories {
   401  		assert.Equal(t, channel.Id, history.ChannelId)
   402  		channelMemberHistoryUserIds = append(channelMemberHistoryUserIds, history.UserId)
   403  	}
   404  	assert.Equal(t, groupUserIds, channelMemberHistoryUserIds)
   405  
   406  	postList := store.Must(th.App.Srv.Store.Post().GetPosts(channel.Id, 0, 1, false)).(*model.PostList)
   407  	if assert.Len(t, postList.Order, 1) {
   408  		post := postList.Posts[postList.Order[0]]
   409  
   410  		assert.Equal(t, model.POST_JOIN_CHANNEL, post.Type)
   411  		assert.Equal(t, user.Id, post.UserId)
   412  		assert.Equal(t, user.Username, post.Props["username"])
   413  	}
   414  }
   415  
   416  func TestAppUpdateChannelScheme(t *testing.T) {
   417  	th := Setup().InitBasic()
   418  	defer th.TearDown()
   419  
   420  	channel := th.BasicChannel
   421  	mockID := model.NewString("x")
   422  	channel.SchemeId = mockID
   423  
   424  	updatedChannel, err := th.App.UpdateChannelScheme(channel)
   425  	if err != nil {
   426  		t.Fatal(err)
   427  	}
   428  
   429  	if updatedChannel.SchemeId != mockID {
   430  		t.Fatal("Wrong Channel SchemeId")
   431  	}
   432  }
   433  
   434  func TestFillInChannelProps(t *testing.T) {
   435  	th := Setup().InitBasic()
   436  	defer th.TearDown()
   437  
   438  	channelPublic1, err := th.App.CreateChannel(&model.Channel{DisplayName: "Public 1", Name: "public1", Type: model.CHANNEL_OPEN, TeamId: th.BasicTeam.Id}, false)
   439  	require.Nil(t, err)
   440  	defer th.App.PermanentDeleteChannel(channelPublic1)
   441  
   442  	channelPublic2, err := th.App.CreateChannel(&model.Channel{DisplayName: "Public 2", Name: "public2", Type: model.CHANNEL_OPEN, TeamId: th.BasicTeam.Id}, false)
   443  	require.Nil(t, err)
   444  	defer th.App.PermanentDeleteChannel(channelPublic2)
   445  
   446  	channelPrivate, err := th.App.CreateChannel(&model.Channel{DisplayName: "Private", Name: "private", Type: model.CHANNEL_PRIVATE, TeamId: th.BasicTeam.Id}, false)
   447  	require.Nil(t, err)
   448  	defer th.App.PermanentDeleteChannel(channelPrivate)
   449  
   450  	otherTeamId := model.NewId()
   451  	otherTeam := &model.Team{
   452  		DisplayName: "dn_" + otherTeamId,
   453  		Name:        "name" + otherTeamId,
   454  		Email:       "success+" + otherTeamId + "@simulator.amazonses.com",
   455  		Type:        model.TEAM_OPEN,
   456  	}
   457  	otherTeam, err = th.App.CreateTeam(otherTeam)
   458  	require.Nil(t, err)
   459  	defer th.App.PermanentDeleteTeam(otherTeam)
   460  
   461  	channelOtherTeam, err := th.App.CreateChannel(&model.Channel{DisplayName: "Other Team Channel", Name: "other-team", Type: model.CHANNEL_OPEN, TeamId: otherTeam.Id}, false)
   462  	require.Nil(t, err)
   463  	defer th.App.PermanentDeleteChannel(channelOtherTeam)
   464  
   465  	// Note that purpose is intentionally plaintext below.
   466  
   467  	t.Run("single channels", func(t *testing.T) {
   468  		testCases := []struct {
   469  			Description          string
   470  			Channel              *model.Channel
   471  			ExpectedChannelProps map[string]interface{}
   472  		}{
   473  			{
   474  				"channel on basic team without references",
   475  				&model.Channel{
   476  					TeamId:  th.BasicTeam.Id,
   477  					Header:  "No references",
   478  					Purpose: "No references",
   479  				},
   480  				nil,
   481  			},
   482  			{
   483  				"channel on basic team",
   484  				&model.Channel{
   485  					TeamId:  th.BasicTeam.Id,
   486  					Header:  "~public1, ~private, ~other-team",
   487  					Purpose: "~public2, ~private, ~other-team",
   488  				},
   489  				map[string]interface{}{
   490  					"channel_mentions": map[string]interface{}{
   491  						"public1": map[string]interface{}{
   492  							"display_name": "Public 1",
   493  						},
   494  					},
   495  				},
   496  			},
   497  			{
   498  				"channel on other team",
   499  				&model.Channel{
   500  					TeamId:  otherTeam.Id,
   501  					Header:  "~public1, ~private, ~other-team",
   502  					Purpose: "~public2, ~private, ~other-team",
   503  				},
   504  				map[string]interface{}{
   505  					"channel_mentions": map[string]interface{}{
   506  						"other-team": map[string]interface{}{
   507  							"display_name": "Other Team Channel",
   508  						},
   509  					},
   510  				},
   511  			},
   512  		}
   513  
   514  		for _, testCase := range testCases {
   515  			t.Run(testCase.Description, func(t *testing.T) {
   516  				err = th.App.FillInChannelProps(testCase.Channel)
   517  				require.Nil(t, err)
   518  
   519  				assert.Equal(t, testCase.ExpectedChannelProps, testCase.Channel.Props)
   520  			})
   521  		}
   522  	})
   523  
   524  	t.Run("multiple channels", func(t *testing.T) {
   525  		testCases := []struct {
   526  			Description          string
   527  			Channels             *model.ChannelList
   528  			ExpectedChannelProps map[string]interface{}
   529  		}{
   530  			{
   531  				"single channel on basic team",
   532  				&model.ChannelList{
   533  					{
   534  						Name:    "test",
   535  						TeamId:  th.BasicTeam.Id,
   536  						Header:  "~public1, ~private, ~other-team",
   537  						Purpose: "~public2, ~private, ~other-team",
   538  					},
   539  				},
   540  				map[string]interface{}{
   541  					"test": map[string]interface{}{
   542  						"channel_mentions": map[string]interface{}{
   543  							"public1": map[string]interface{}{
   544  								"display_name": "Public 1",
   545  							},
   546  						},
   547  					},
   548  				},
   549  			},
   550  			{
   551  				"multiple channels on basic team",
   552  				&model.ChannelList{
   553  					{
   554  						Name:    "test",
   555  						TeamId:  th.BasicTeam.Id,
   556  						Header:  "~public1, ~private, ~other-team",
   557  						Purpose: "~public2, ~private, ~other-team",
   558  					},
   559  					{
   560  						Name:    "test2",
   561  						TeamId:  th.BasicTeam.Id,
   562  						Header:  "~private, ~other-team",
   563  						Purpose: "~public2, ~private, ~other-team",
   564  					},
   565  					{
   566  						Name:    "test3",
   567  						TeamId:  th.BasicTeam.Id,
   568  						Header:  "No references",
   569  						Purpose: "No references",
   570  					},
   571  				},
   572  				map[string]interface{}{
   573  					"test": map[string]interface{}{
   574  						"channel_mentions": map[string]interface{}{
   575  							"public1": map[string]interface{}{
   576  								"display_name": "Public 1",
   577  							},
   578  						},
   579  					},
   580  					"test2": map[string]interface{}(nil),
   581  					"test3": map[string]interface{}(nil),
   582  				},
   583  			},
   584  			{
   585  				"multiple channels across teams",
   586  				&model.ChannelList{
   587  					{
   588  						Name:    "test",
   589  						TeamId:  th.BasicTeam.Id,
   590  						Header:  "~public1, ~private, ~other-team",
   591  						Purpose: "~public2, ~private, ~other-team",
   592  					},
   593  					{
   594  						Name:    "test2",
   595  						TeamId:  otherTeam.Id,
   596  						Header:  "~private, ~other-team",
   597  						Purpose: "~public2, ~private, ~other-team",
   598  					},
   599  					{
   600  						Name:    "test3",
   601  						TeamId:  th.BasicTeam.Id,
   602  						Header:  "No references",
   603  						Purpose: "No references",
   604  					},
   605  				},
   606  				map[string]interface{}{
   607  					"test": map[string]interface{}{
   608  						"channel_mentions": map[string]interface{}{
   609  							"public1": map[string]interface{}{
   610  								"display_name": "Public 1",
   611  							},
   612  						},
   613  					},
   614  					"test2": map[string]interface{}{
   615  						"channel_mentions": map[string]interface{}{
   616  							"other-team": map[string]interface{}{
   617  								"display_name": "Other Team Channel",
   618  							},
   619  						},
   620  					},
   621  					"test3": map[string]interface{}(nil),
   622  				},
   623  			},
   624  		}
   625  
   626  		for _, testCase := range testCases {
   627  			t.Run(testCase.Description, func(t *testing.T) {
   628  				err = th.App.FillInChannelsProps(testCase.Channels)
   629  				require.Nil(t, err)
   630  
   631  				for _, channel := range *testCase.Channels {
   632  					assert.Equal(t, testCase.ExpectedChannelProps[channel.Name], channel.Props)
   633  				}
   634  			})
   635  		}
   636  	})
   637  }
   638  
   639  func TestRenameChannel(t *testing.T) {
   640  	th := Setup().InitBasic()
   641  	defer th.TearDown()
   642  
   643  	testCases := []struct {
   644  		Name                string
   645  		Channel             *model.Channel
   646  		ExpectError         bool
   647  		ExpectedName        string
   648  		ExpectedDisplayName string
   649  	}{
   650  		{
   651  			"Rename open channel",
   652  			th.createChannel(th.BasicTeam, model.CHANNEL_OPEN),
   653  			false,
   654  			"newchannelname",
   655  			"New Display Name",
   656  		},
   657  		{
   658  			"Fail on rename direct message channel",
   659  			th.CreateDmChannel(th.BasicUser2),
   660  			true,
   661  			"",
   662  			"",
   663  		},
   664  		{
   665  			"Fail on rename direct message channel",
   666  			th.CreateGroupChannel(th.BasicUser2, th.CreateUser()),
   667  			true,
   668  			"",
   669  			"",
   670  		},
   671  	}
   672  
   673  	for _, tc := range testCases {
   674  		t.Run(tc.Name, func(t *testing.T) {
   675  			channel, err := th.App.RenameChannel(tc.Channel, "newchannelname", "New Display Name")
   676  			if tc.ExpectError {
   677  				assert.NotNil(t, err)
   678  			} else {
   679  				assert.Equal(t, tc.ExpectedName, channel.Name)
   680  				assert.Equal(t, tc.ExpectedDisplayName, channel.DisplayName)
   681  			}
   682  		})
   683  	}
   684  }