github.com/mattermosttest/mattermost-server/v5@v5.0.0-20200917143240-9dfa12e121f9/store/storetest/channel_store.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package storetest
     5  
     6  import (
     7  	"database/sql"
     8  	"errors"
     9  	"sort"
    10  	"strconv"
    11  	"strings"
    12  	"testing"
    13  	"time"
    14  
    15  	"github.com/stretchr/testify/assert"
    16  	"github.com/stretchr/testify/require"
    17  
    18  	"github.com/mattermost/gorp"
    19  	"github.com/mattermost/mattermost-server/v5/model"
    20  	"github.com/mattermost/mattermost-server/v5/services/timezones"
    21  	"github.com/mattermost/mattermost-server/v5/store"
    22  	"github.com/mattermost/mattermost-server/v5/utils"
    23  )
    24  
    25  type SqlSupplier interface {
    26  	GetMaster() *gorp.DbMap
    27  	DriverName() string
    28  }
    29  
    30  func cleanupChannels(t *testing.T, ss store.Store) {
    31  	list, err := ss.Channel().GetAllChannels(0, 100000, store.ChannelSearchOpts{IncludeDeleted: true})
    32  	require.Nilf(t, err, "error cleaning all channels: %v", err)
    33  	for _, channel := range *list {
    34  		ss.Channel().PermanentDelete(channel.Id)
    35  	}
    36  }
    37  
    38  func TestChannelStore(t *testing.T, ss store.Store, s SqlSupplier) {
    39  	createDefaultRoles(t, ss)
    40  
    41  	t.Run("Save", func(t *testing.T) { testChannelStoreSave(t, ss) })
    42  	t.Run("SaveDirectChannel", func(t *testing.T) { testChannelStoreSaveDirectChannel(t, ss, s) })
    43  	t.Run("CreateDirectChannel", func(t *testing.T) { testChannelStoreCreateDirectChannel(t, ss) })
    44  	t.Run("Update", func(t *testing.T) { testChannelStoreUpdate(t, ss) })
    45  	t.Run("GetChannelUnread", func(t *testing.T) { testGetChannelUnread(t, ss) })
    46  	t.Run("Get", func(t *testing.T) { testChannelStoreGet(t, ss, s) })
    47  	t.Run("GetChannelsByIds", func(t *testing.T) { testChannelStoreGetChannelsByIds(t, ss) })
    48  	t.Run("GetForPost", func(t *testing.T) { testChannelStoreGetForPost(t, ss) })
    49  	t.Run("Restore", func(t *testing.T) { testChannelStoreRestore(t, ss) })
    50  	t.Run("Delete", func(t *testing.T) { testChannelStoreDelete(t, ss) })
    51  	t.Run("GetByName", func(t *testing.T) { testChannelStoreGetByName(t, ss) })
    52  	t.Run("GetByNames", func(t *testing.T) { testChannelStoreGetByNames(t, ss) })
    53  	t.Run("GetDeletedByName", func(t *testing.T) { testChannelStoreGetDeletedByName(t, ss) })
    54  	t.Run("GetDeleted", func(t *testing.T) { testChannelStoreGetDeleted(t, ss) })
    55  	t.Run("ChannelMemberStore", func(t *testing.T) { testChannelMemberStore(t, ss) })
    56  	t.Run("SaveMember", func(t *testing.T) { testChannelSaveMember(t, ss) })
    57  	t.Run("SaveMultipleMembers", func(t *testing.T) { testChannelSaveMultipleMembers(t, ss) })
    58  	t.Run("UpdateMember", func(t *testing.T) { testChannelUpdateMember(t, ss) })
    59  	t.Run("UpdateMultipleMembers", func(t *testing.T) { testChannelUpdateMultipleMembers(t, ss) })
    60  	t.Run("RemoveMember", func(t *testing.T) { testChannelRemoveMember(t, ss) })
    61  	t.Run("RemoveMembers", func(t *testing.T) { testChannelRemoveMembers(t, ss) })
    62  	t.Run("ChannelDeleteMemberStore", func(t *testing.T) { testChannelDeleteMemberStore(t, ss) })
    63  	t.Run("GetChannels", func(t *testing.T) { testChannelStoreGetChannels(t, ss) })
    64  	t.Run("GetAllChannels", func(t *testing.T) { testChannelStoreGetAllChannels(t, ss, s) })
    65  	t.Run("GetMoreChannels", func(t *testing.T) { testChannelStoreGetMoreChannels(t, ss) })
    66  	t.Run("GetPrivateChannelsForTeam", func(t *testing.T) { testChannelStoreGetPrivateChannelsForTeam(t, ss) })
    67  	t.Run("GetPublicChannelsForTeam", func(t *testing.T) { testChannelStoreGetPublicChannelsForTeam(t, ss) })
    68  	t.Run("GetPublicChannelsByIdsForTeam", func(t *testing.T) { testChannelStoreGetPublicChannelsByIdsForTeam(t, ss) })
    69  	t.Run("GetChannelCounts", func(t *testing.T) { testChannelStoreGetChannelCounts(t, ss) })
    70  	t.Run("GetMembersForUser", func(t *testing.T) { testChannelStoreGetMembersForUser(t, ss) })
    71  	t.Run("GetMembersForUserWithPagination", func(t *testing.T) { testChannelStoreGetMembersForUserWithPagination(t, ss) })
    72  	t.Run("CountPostsAfter", func(t *testing.T) { testCountPostsAfter(t, ss) })
    73  	t.Run("UpdateLastViewedAt", func(t *testing.T) { testChannelStoreUpdateLastViewedAt(t, ss) })
    74  	t.Run("IncrementMentionCount", func(t *testing.T) { testChannelStoreIncrementMentionCount(t, ss) })
    75  	t.Run("UpdateChannelMember", func(t *testing.T) { testUpdateChannelMember(t, ss) })
    76  	t.Run("GetMember", func(t *testing.T) { testGetMember(t, ss) })
    77  	t.Run("GetMemberForPost", func(t *testing.T) { testChannelStoreGetMemberForPost(t, ss) })
    78  	t.Run("GetMemberCount", func(t *testing.T) { testGetMemberCount(t, ss) })
    79  	t.Run("GetMemberCountsByGroup", func(t *testing.T) { testGetMemberCountsByGroup(t, ss) })
    80  	t.Run("GetGuestCount", func(t *testing.T) { testGetGuestCount(t, ss) })
    81  	t.Run("SearchInTeam", func(t *testing.T) { testChannelStoreSearchInTeam(t, ss, s) })
    82  	t.Run("SearchMore", func(t *testing.T) { testChannelStoreSearchMore(t, ss) })
    83  	t.Run("SearchForUserInTeam", func(t *testing.T) { testChannelStoreSearchForUserInTeam(t, ss) })
    84  	t.Run("SearchAllChannels", func(t *testing.T) { testChannelStoreSearchAllChannels(t, ss) })
    85  	t.Run("GetMembersByIds", func(t *testing.T) { testChannelStoreGetMembersByIds(t, ss) })
    86  	t.Run("SearchGroupChannels", func(t *testing.T) { testChannelStoreSearchGroupChannels(t, ss) })
    87  	t.Run("AnalyticsDeletedTypeCount", func(t *testing.T) { testChannelStoreAnalyticsDeletedTypeCount(t, ss) })
    88  	t.Run("GetPinnedPosts", func(t *testing.T) { testChannelStoreGetPinnedPosts(t, ss) })
    89  	t.Run("GetPinnedPostCount", func(t *testing.T) { testChannelStoreGetPinnedPostCount(t, ss) })
    90  	t.Run("MaxChannelsPerTeam", func(t *testing.T) { testChannelStoreMaxChannelsPerTeam(t, ss) })
    91  	t.Run("GetChannelsByScheme", func(t *testing.T) { testChannelStoreGetChannelsByScheme(t, ss) })
    92  	t.Run("MigrateChannelMembers", func(t *testing.T) { testChannelStoreMigrateChannelMembers(t, ss) })
    93  	t.Run("ResetAllChannelSchemes", func(t *testing.T) { testResetAllChannelSchemes(t, ss) })
    94  	t.Run("ClearAllCustomRoleAssignments", func(t *testing.T) { testChannelStoreClearAllCustomRoleAssignments(t, ss) })
    95  	t.Run("MaterializedPublicChannels", func(t *testing.T) { testMaterializedPublicChannels(t, ss, s) })
    96  	t.Run("GetAllChannelsForExportAfter", func(t *testing.T) { testChannelStoreGetAllChannelsForExportAfter(t, ss) })
    97  	t.Run("GetChannelMembersForExport", func(t *testing.T) { testChannelStoreGetChannelMembersForExport(t, ss) })
    98  	t.Run("RemoveAllDeactivatedMembers", func(t *testing.T) { testChannelStoreRemoveAllDeactivatedMembers(t, ss, s) })
    99  	t.Run("ExportAllDirectChannels", func(t *testing.T) { testChannelStoreExportAllDirectChannels(t, ss, s) })
   100  	t.Run("ExportAllDirectChannelsExcludePrivateAndPublic", func(t *testing.T) { testChannelStoreExportAllDirectChannelsExcludePrivateAndPublic(t, ss, s) })
   101  	t.Run("ExportAllDirectChannelsDeletedChannel", func(t *testing.T) { testChannelStoreExportAllDirectChannelsDeletedChannel(t, ss, s) })
   102  	t.Run("GetChannelsBatchForIndexing", func(t *testing.T) { testChannelStoreGetChannelsBatchForIndexing(t, ss) })
   103  	t.Run("GroupSyncedChannelCount", func(t *testing.T) { testGroupSyncedChannelCount(t, ss) })
   104  	t.Run("CreateInitialSidebarCategories", func(t *testing.T) { testCreateInitialSidebarCategories(t, ss) })
   105  	t.Run("CreateSidebarCategory", func(t *testing.T) { testCreateSidebarCategory(t, ss) })
   106  	t.Run("GetSidebarCategory", func(t *testing.T) { testGetSidebarCategory(t, ss, s) })
   107  	t.Run("GetSidebarCategories", func(t *testing.T) { testGetSidebarCategories(t, ss) })
   108  	t.Run("UpdateSidebarCategories", func(t *testing.T) { testUpdateSidebarCategories(t, ss, s) })
   109  	t.Run("DeleteSidebarCategory", func(t *testing.T) { testDeleteSidebarCategory(t, ss, s) })
   110  }
   111  
   112  func testChannelStoreSave(t *testing.T, ss store.Store) {
   113  	teamId := model.NewId()
   114  
   115  	o1 := model.Channel{}
   116  	o1.TeamId = teamId
   117  	o1.DisplayName = "Name"
   118  	o1.Name = "zz" + model.NewId() + "b"
   119  	o1.Type = model.CHANNEL_OPEN
   120  
   121  	_, nErr := ss.Channel().Save(&o1, -1)
   122  	require.Nil(t, nErr, "couldn't save item", nErr)
   123  
   124  	_, nErr = ss.Channel().Save(&o1, -1)
   125  	require.NotNil(t, nErr, "shouldn't be able to update from save")
   126  
   127  	o1.Id = ""
   128  	_, nErr = ss.Channel().Save(&o1, -1)
   129  	require.NotNil(t, nErr, "should be unique name")
   130  
   131  	o1.Id = ""
   132  	o1.Name = "zz" + model.NewId() + "b"
   133  	o1.Type = model.CHANNEL_DIRECT
   134  	_, nErr = ss.Channel().Save(&o1, -1)
   135  	require.NotNil(t, nErr, "should not be able to save direct channel")
   136  
   137  	o1 = model.Channel{}
   138  	o1.TeamId = teamId
   139  	o1.DisplayName = "Name"
   140  	o1.Name = "zz" + model.NewId() + "b"
   141  	o1.Type = model.CHANNEL_OPEN
   142  
   143  	_, nErr = ss.Channel().Save(&o1, -1)
   144  	require.Nil(t, nErr, "should have saved channel")
   145  
   146  	o2 := o1
   147  	o2.Id = ""
   148  
   149  	_, nErr = ss.Channel().Save(&o2, -1)
   150  	require.NotNil(t, nErr, "should have failed to save a duplicate channel")
   151  	var cErr *store.ErrConflict
   152  	require.True(t, errors.As(nErr, &cErr))
   153  
   154  	err := ss.Channel().Delete(o1.Id, 100)
   155  	require.Nil(t, err, "should have deleted channel")
   156  
   157  	o2.Id = ""
   158  	_, nErr = ss.Channel().Save(&o2, -1)
   159  	require.NotNil(t, nErr, "should have failed to save a duplicate of an archived channel")
   160  	require.True(t, errors.As(nErr, &cErr))
   161  }
   162  
   163  func testChannelStoreSaveDirectChannel(t *testing.T, ss store.Store, s SqlSupplier) {
   164  	teamId := model.NewId()
   165  
   166  	o1 := model.Channel{}
   167  	o1.TeamId = teamId
   168  	o1.DisplayName = "Name"
   169  	o1.Name = "zz" + model.NewId() + "b"
   170  	o1.Type = model.CHANNEL_DIRECT
   171  
   172  	u1 := &model.User{}
   173  	u1.Email = MakeEmail()
   174  	u1.Nickname = model.NewId()
   175  	_, err := ss.User().Save(u1)
   176  	require.Nil(t, err)
   177  	_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1)
   178  	require.Nil(t, err)
   179  
   180  	u2 := &model.User{}
   181  	u2.Email = MakeEmail()
   182  	u2.Nickname = model.NewId()
   183  	_, err = ss.User().Save(u2)
   184  	require.Nil(t, err)
   185  	_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}, -1)
   186  	require.Nil(t, err)
   187  
   188  	m1 := model.ChannelMember{}
   189  	m1.ChannelId = o1.Id
   190  	m1.UserId = u1.Id
   191  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
   192  
   193  	m2 := model.ChannelMember{}
   194  	m2.ChannelId = o1.Id
   195  	m2.UserId = u2.Id
   196  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
   197  
   198  	_, nErr := ss.Channel().SaveDirectChannel(&o1, &m1, &m2)
   199  	require.Nil(t, nErr, "couldn't save direct channel", nErr)
   200  
   201  	members, err := ss.Channel().GetMembers(o1.Id, 0, 100)
   202  	require.Nil(t, err)
   203  	require.Len(t, *members, 2, "should have saved 2 members")
   204  
   205  	_, nErr = ss.Channel().SaveDirectChannel(&o1, &m1, &m2)
   206  	require.NotNil(t, nErr, "shoudn't be a able to update from save")
   207  
   208  	// Attempt to save a direct channel that already exists
   209  	o1a := model.Channel{
   210  		TeamId:      o1.TeamId,
   211  		DisplayName: o1.DisplayName,
   212  		Name:        o1.Name,
   213  		Type:        o1.Type,
   214  	}
   215  
   216  	returnedChannel, nErr := ss.Channel().SaveDirectChannel(&o1a, &m1, &m2)
   217  	require.NotNil(t, nErr, "should've failed to save a duplicate direct channel")
   218  	var cErr *store.ErrConflict
   219  	require.Truef(t, errors.As(nErr, &cErr), "should've returned CHANNEL_EXISTS_ERROR")
   220  	require.Equal(t, o1.Id, returnedChannel.Id, "should've failed to save a duplicate direct channel")
   221  
   222  	// Attempt to save a non-direct channel
   223  	o1.Id = ""
   224  	o1.Name = "zz" + model.NewId() + "b"
   225  	o1.Type = model.CHANNEL_OPEN
   226  	_, nErr = ss.Channel().SaveDirectChannel(&o1, &m1, &m2)
   227  	require.NotNil(t, nErr, "Should not be able to save non-direct channel")
   228  
   229  	// Save yourself Direct Message
   230  	o1.Id = ""
   231  	o1.DisplayName = "Myself"
   232  	o1.Name = "zz" + model.NewId() + "b"
   233  	o1.Type = model.CHANNEL_DIRECT
   234  	_, nErr = ss.Channel().SaveDirectChannel(&o1, &m1, &m1)
   235  	require.Nil(t, nErr, "couldn't save direct channel", nErr)
   236  
   237  	members, err = ss.Channel().GetMembers(o1.Id, 0, 100)
   238  	require.Nil(t, err)
   239  	require.Len(t, *members, 1, "should have saved just 1 member")
   240  
   241  	// Manually truncate Channels table until testlib can handle cleanups
   242  	s.GetMaster().Exec("TRUNCATE Channels")
   243  }
   244  
   245  func testChannelStoreCreateDirectChannel(t *testing.T, ss store.Store) {
   246  	u1 := &model.User{}
   247  	u1.Email = MakeEmail()
   248  	u1.Nickname = model.NewId()
   249  	_, err := ss.User().Save(u1)
   250  	require.Nil(t, err)
   251  	_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1)
   252  	require.Nil(t, err)
   253  
   254  	u2 := &model.User{}
   255  	u2.Email = MakeEmail()
   256  	u2.Nickname = model.NewId()
   257  	_, err = ss.User().Save(u2)
   258  	require.Nil(t, err)
   259  	_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}, -1)
   260  	require.Nil(t, err)
   261  
   262  	c1, nErr := ss.Channel().CreateDirectChannel(u1, u2)
   263  	require.Nil(t, nErr, "couldn't create direct channel", nErr)
   264  	defer func() {
   265  		ss.Channel().PermanentDeleteMembersByChannel(c1.Id)
   266  		ss.Channel().PermanentDelete(c1.Id)
   267  	}()
   268  
   269  	members, err := ss.Channel().GetMembers(c1.Id, 0, 100)
   270  	require.Nil(t, err)
   271  	require.Len(t, *members, 2, "should have saved 2 members")
   272  }
   273  
   274  func testChannelStoreUpdate(t *testing.T, ss store.Store) {
   275  	o1 := model.Channel{}
   276  	o1.TeamId = model.NewId()
   277  	o1.DisplayName = "Name"
   278  	o1.Name = "zz" + model.NewId() + "b"
   279  	o1.Type = model.CHANNEL_OPEN
   280  
   281  	_, nErr := ss.Channel().Save(&o1, -1)
   282  	require.Nil(t, nErr)
   283  
   284  	o2 := model.Channel{}
   285  	o2.TeamId = o1.TeamId
   286  	o2.DisplayName = "Name"
   287  	o2.Name = "zz" + model.NewId() + "b"
   288  	o2.Type = model.CHANNEL_OPEN
   289  
   290  	_, nErr = ss.Channel().Save(&o2, -1)
   291  	require.Nil(t, nErr)
   292  
   293  	time.Sleep(100 * time.Millisecond)
   294  
   295  	_, err := ss.Channel().Update(&o1)
   296  	require.Nil(t, err, err)
   297  
   298  	o1.DeleteAt = 100
   299  	_, err = ss.Channel().Update(&o1)
   300  	require.NotNil(t, err, "update should have failed because channel is archived")
   301  
   302  	o1.DeleteAt = 0
   303  	o1.Id = "missing"
   304  	_, err = ss.Channel().Update(&o1)
   305  	require.NotNil(t, err, "Update should have failed because of missing key")
   306  
   307  	o1.Id = model.NewId()
   308  	_, err = ss.Channel().Update(&o1)
   309  	require.NotNil(t, err, "update should have failed because id change")
   310  
   311  	o2.Name = o1.Name
   312  	_, err = ss.Channel().Update(&o2)
   313  	require.NotNil(t, err, "update should have failed because of existing name")
   314  }
   315  
   316  func testGetChannelUnread(t *testing.T, ss store.Store) {
   317  	teamId1 := model.NewId()
   318  	teamId2 := model.NewId()
   319  
   320  	uid := model.NewId()
   321  	m1 := &model.TeamMember{TeamId: teamId1, UserId: uid}
   322  	m2 := &model.TeamMember{TeamId: teamId2, UserId: uid}
   323  	_, err := ss.Team().SaveMember(m1, -1)
   324  	require.Nil(t, err)
   325  	_, err = ss.Team().SaveMember(m2, -1)
   326  	require.Nil(t, err)
   327  	notifyPropsModel := model.GetDefaultChannelNotifyProps()
   328  
   329  	// Setup Channel 1
   330  	c1 := &model.Channel{TeamId: m1.TeamId, Name: model.NewId(), DisplayName: "Downtown", Type: model.CHANNEL_OPEN, TotalMsgCount: 100}
   331  	_, nErr := ss.Channel().Save(c1, -1)
   332  	require.Nil(t, nErr)
   333  
   334  	cm1 := &model.ChannelMember{ChannelId: c1.Id, UserId: m1.UserId, NotifyProps: notifyPropsModel, MsgCount: 90}
   335  	_, err = ss.Channel().SaveMember(cm1)
   336  	require.Nil(t, err)
   337  
   338  	// Setup Channel 2
   339  	c2 := &model.Channel{TeamId: m2.TeamId, Name: model.NewId(), DisplayName: "Cultural", Type: model.CHANNEL_OPEN, TotalMsgCount: 100}
   340  	_, nErr = ss.Channel().Save(c2, -1)
   341  	require.Nil(t, nErr)
   342  
   343  	cm2 := &model.ChannelMember{ChannelId: c2.Id, UserId: m2.UserId, NotifyProps: notifyPropsModel, MsgCount: 90, MentionCount: 5}
   344  	_, err = ss.Channel().SaveMember(cm2)
   345  	require.Nil(t, err)
   346  
   347  	// Check for Channel 1
   348  	ch, err := ss.Channel().GetChannelUnread(c1.Id, uid)
   349  
   350  	require.Nil(t, err, err)
   351  	require.Equal(t, c1.Id, ch.ChannelId, "Wrong channel id")
   352  	require.Equal(t, teamId1, ch.TeamId, "Wrong team id for channel 1")
   353  	require.NotNil(t, ch.NotifyProps, "wrong props for channel 1")
   354  	require.EqualValues(t, 0, ch.MentionCount, "wrong MentionCount for channel 1")
   355  	require.EqualValues(t, 10, ch.MsgCount, "wrong MsgCount for channel 1")
   356  
   357  	// Check for Channel 2
   358  	ch2, err := ss.Channel().GetChannelUnread(c2.Id, uid)
   359  
   360  	require.Nil(t, err, err)
   361  	require.Equal(t, c2.Id, ch2.ChannelId, "Wrong channel id")
   362  	require.Equal(t, teamId2, ch2.TeamId, "Wrong team id")
   363  	require.EqualValues(t, 5, ch2.MentionCount, "wrong MentionCount for channel 2")
   364  	require.EqualValues(t, 10, ch2.MsgCount, "wrong MsgCount for channel 2")
   365  }
   366  
   367  func testChannelStoreGet(t *testing.T, ss store.Store, s SqlSupplier) {
   368  	o1 := model.Channel{}
   369  	o1.TeamId = model.NewId()
   370  	o1.DisplayName = "Name"
   371  	o1.Name = "zz" + model.NewId() + "b"
   372  	o1.Type = model.CHANNEL_OPEN
   373  	_, nErr := ss.Channel().Save(&o1, -1)
   374  	require.Nil(t, nErr)
   375  
   376  	c1 := &model.Channel{}
   377  	c1, err := ss.Channel().Get(o1.Id, false)
   378  	require.Nil(t, err, err)
   379  	require.Equal(t, o1.ToJson(), c1.ToJson(), "invalid returned channel")
   380  
   381  	_, err = ss.Channel().Get("", false)
   382  	require.NotNil(t, err, "missing id should have failed")
   383  
   384  	u1 := &model.User{}
   385  	u1.Email = MakeEmail()
   386  	u1.Nickname = model.NewId()
   387  	_, err = ss.User().Save(u1)
   388  	require.Nil(t, err)
   389  	_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1)
   390  	require.Nil(t, err)
   391  
   392  	u2 := model.User{}
   393  	u2.Email = MakeEmail()
   394  	u2.Nickname = model.NewId()
   395  	_, err = ss.User().Save(&u2)
   396  	require.Nil(t, err)
   397  	_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}, -1)
   398  	require.Nil(t, err)
   399  
   400  	o2 := model.Channel{}
   401  	o2.TeamId = model.NewId()
   402  	o2.DisplayName = "Direct Name"
   403  	o2.Name = "zz" + model.NewId() + "b"
   404  	o2.Type = model.CHANNEL_DIRECT
   405  
   406  	m1 := model.ChannelMember{}
   407  	m1.ChannelId = o2.Id
   408  	m1.UserId = u1.Id
   409  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
   410  
   411  	m2 := model.ChannelMember{}
   412  	m2.ChannelId = o2.Id
   413  	m2.UserId = u2.Id
   414  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
   415  
   416  	_, nErr = ss.Channel().SaveDirectChannel(&o2, &m1, &m2)
   417  	require.Nil(t, nErr)
   418  
   419  	c2, err := ss.Channel().Get(o2.Id, false)
   420  	require.Nil(t, err, err)
   421  	require.Equal(t, o2.ToJson(), c2.ToJson(), "invalid returned channel")
   422  
   423  	c4, err := ss.Channel().Get(o2.Id, true)
   424  	require.Nil(t, err, err)
   425  	require.Equal(t, o2.ToJson(), c4.ToJson(), "invalid returned channel")
   426  
   427  	channels, chanErr := ss.Channel().GetAll(o1.TeamId)
   428  	require.Nil(t, chanErr, chanErr)
   429  	require.Greater(t, len(channels), 0, "too little")
   430  
   431  	channelsTeam, err := ss.Channel().GetTeamChannels(o1.TeamId)
   432  	require.Nil(t, err, err)
   433  	require.Greater(t, len(*channelsTeam), 0, "too little")
   434  
   435  	// Manually truncate Channels table until testlib can handle cleanups
   436  	s.GetMaster().Exec("TRUNCATE Channels")
   437  }
   438  
   439  func testChannelStoreGetChannelsByIds(t *testing.T, ss store.Store) {
   440  	o1 := model.Channel{}
   441  	o1.TeamId = model.NewId()
   442  	o1.DisplayName = "Name"
   443  	o1.Name = "aa" + model.NewId() + "b"
   444  	o1.Type = model.CHANNEL_OPEN
   445  	_, nErr := ss.Channel().Save(&o1, -1)
   446  	require.Nil(t, nErr)
   447  
   448  	u1 := &model.User{}
   449  	u1.Email = MakeEmail()
   450  	u1.Nickname = model.NewId()
   451  	_, err := ss.User().Save(u1)
   452  	require.Nil(t, err)
   453  	_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1)
   454  	require.Nil(t, err)
   455  
   456  	u2 := model.User{}
   457  	u2.Email = MakeEmail()
   458  	u2.Nickname = model.NewId()
   459  	_, err = ss.User().Save(&u2)
   460  	require.Nil(t, err)
   461  	_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}, -1)
   462  	require.Nil(t, err)
   463  
   464  	o2 := model.Channel{}
   465  	o2.TeamId = model.NewId()
   466  	o2.DisplayName = "Direct Name"
   467  	o2.Name = "bb" + model.NewId() + "b"
   468  	o2.Type = model.CHANNEL_DIRECT
   469  
   470  	o3 := model.Channel{}
   471  	o3.TeamId = model.NewId()
   472  	o3.DisplayName = "Deleted channel"
   473  	o3.Name = "cc" + model.NewId() + "b"
   474  	o3.Type = model.CHANNEL_OPEN
   475  	_, nErr = ss.Channel().Save(&o3, -1)
   476  	require.Nil(t, nErr)
   477  	nErr = ss.Channel().Delete(o3.Id, 123)
   478  	require.Nil(t, nErr)
   479  	o3.DeleteAt = 123
   480  	o3.UpdateAt = 123
   481  
   482  	m1 := model.ChannelMember{}
   483  	m1.ChannelId = o2.Id
   484  	m1.UserId = u1.Id
   485  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
   486  
   487  	m2 := model.ChannelMember{}
   488  	m2.ChannelId = o2.Id
   489  	m2.UserId = u2.Id
   490  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
   491  
   492  	_, nErr = ss.Channel().SaveDirectChannel(&o2, &m1, &m2)
   493  	require.Nil(t, nErr)
   494  
   495  	t.Run("Get 2 existing channels", func(t *testing.T) {
   496  		r1, err := ss.Channel().GetChannelsByIds([]string{o1.Id, o2.Id}, false)
   497  		require.Nil(t, err, err)
   498  		require.Len(t, r1, 2, "invalid returned channels, exepected 2 and got "+strconv.Itoa(len(r1)))
   499  		require.Equal(t, o1.ToJson(), r1[0].ToJson())
   500  		require.Equal(t, o2.ToJson(), r1[1].ToJson())
   501  	})
   502  
   503  	t.Run("Get 1 existing and 1 not existing channel", func(t *testing.T) {
   504  		nonexistentId := "abcd1234"
   505  		r2, err := ss.Channel().GetChannelsByIds([]string{o1.Id, nonexistentId}, false)
   506  		require.Nil(t, err, err)
   507  		require.Len(t, r2, 1, "invalid returned channels, expected 1 and got "+strconv.Itoa(len(r2)))
   508  		require.Equal(t, o1.ToJson(), r2[0].ToJson(), "invalid returned channel")
   509  	})
   510  
   511  	t.Run("Get 2 existing and 1 deleted channel", func(t *testing.T) {
   512  		r1, err := ss.Channel().GetChannelsByIds([]string{o1.Id, o2.Id, o3.Id}, true)
   513  		require.Nil(t, err, err)
   514  		require.Len(t, r1, 3, "invalid returned channels, exepected 3 and got "+strconv.Itoa(len(r1)))
   515  		require.Equal(t, o1.ToJson(), r1[0].ToJson())
   516  		require.Equal(t, o2.ToJson(), r1[1].ToJson())
   517  		require.Equal(t, o3.ToJson(), r1[2].ToJson())
   518  	})
   519  }
   520  
   521  func testChannelStoreGetForPost(t *testing.T, ss store.Store) {
   522  
   523  	ch := &model.Channel{
   524  		TeamId:      model.NewId(),
   525  		DisplayName: "Name",
   526  		Name:        "zz" + model.NewId() + "b",
   527  		Type:        model.CHANNEL_OPEN,
   528  	}
   529  	o1, nErr := ss.Channel().Save(ch, -1)
   530  	require.Nil(t, nErr)
   531  
   532  	p1, err := ss.Post().Save(&model.Post{
   533  		UserId:    model.NewId(),
   534  		ChannelId: o1.Id,
   535  		Message:   "test",
   536  	})
   537  	require.Nil(t, err)
   538  
   539  	channel, chanErr := ss.Channel().GetForPost(p1.Id)
   540  	require.Nil(t, chanErr, chanErr)
   541  	require.Equal(t, o1.Id, channel.Id, "incorrect channel returned")
   542  }
   543  
   544  func testChannelStoreRestore(t *testing.T, ss store.Store) {
   545  	o1 := model.Channel{}
   546  	o1.TeamId = model.NewId()
   547  	o1.DisplayName = "Channel1"
   548  	o1.Name = "zz" + model.NewId() + "b"
   549  	o1.Type = model.CHANNEL_OPEN
   550  	_, nErr := ss.Channel().Save(&o1, -1)
   551  	require.Nil(t, nErr)
   552  
   553  	err := ss.Channel().Delete(o1.Id, model.GetMillis())
   554  	require.Nil(t, err, err)
   555  
   556  	c, _ := ss.Channel().Get(o1.Id, false)
   557  	require.NotEqual(t, 0, c.DeleteAt, "should have been deleted")
   558  
   559  	err = ss.Channel().Restore(o1.Id, model.GetMillis())
   560  	require.Nil(t, err, err)
   561  
   562  	c, _ = ss.Channel().Get(o1.Id, false)
   563  	require.EqualValues(t, 0, c.DeleteAt, "should have been restored")
   564  }
   565  
   566  func testChannelStoreDelete(t *testing.T, ss store.Store) {
   567  	o1 := model.Channel{}
   568  	o1.TeamId = model.NewId()
   569  	o1.DisplayName = "Channel1"
   570  	o1.Name = "zz" + model.NewId() + "b"
   571  	o1.Type = model.CHANNEL_OPEN
   572  	_, nErr := ss.Channel().Save(&o1, -1)
   573  	require.Nil(t, nErr)
   574  
   575  	o2 := model.Channel{}
   576  	o2.TeamId = o1.TeamId
   577  	o2.DisplayName = "Channel2"
   578  	o2.Name = "zz" + model.NewId() + "b"
   579  	o2.Type = model.CHANNEL_OPEN
   580  	_, nErr = ss.Channel().Save(&o2, -1)
   581  	require.Nil(t, nErr)
   582  
   583  	o3 := model.Channel{}
   584  	o3.TeamId = o1.TeamId
   585  	o3.DisplayName = "Channel3"
   586  	o3.Name = "zz" + model.NewId() + "b"
   587  	o3.Type = model.CHANNEL_OPEN
   588  	_, nErr = ss.Channel().Save(&o3, -1)
   589  	require.Nil(t, nErr)
   590  
   591  	o4 := model.Channel{}
   592  	o4.TeamId = o1.TeamId
   593  	o4.DisplayName = "Channel4"
   594  	o4.Name = "zz" + model.NewId() + "b"
   595  	o4.Type = model.CHANNEL_OPEN
   596  	_, nErr = ss.Channel().Save(&o4, -1)
   597  	require.Nil(t, nErr)
   598  
   599  	m1 := model.ChannelMember{}
   600  	m1.ChannelId = o1.Id
   601  	m1.UserId = model.NewId()
   602  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
   603  	_, err := ss.Channel().SaveMember(&m1)
   604  	require.Nil(t, err)
   605  
   606  	m2 := model.ChannelMember{}
   607  	m2.ChannelId = o2.Id
   608  	m2.UserId = m1.UserId
   609  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
   610  	_, err = ss.Channel().SaveMember(&m2)
   611  	require.Nil(t, err)
   612  
   613  	nErr = ss.Channel().Delete(o1.Id, model.GetMillis())
   614  	require.Nil(t, nErr, nErr)
   615  
   616  	c, _ := ss.Channel().Get(o1.Id, false)
   617  	require.NotEqual(t, 0, c.DeleteAt, "should have been deleted")
   618  
   619  	nErr = ss.Channel().Delete(o3.Id, model.GetMillis())
   620  	require.Nil(t, nErr, nErr)
   621  
   622  	list, nErr := ss.Channel().GetChannels(o1.TeamId, m1.UserId, false, 0)
   623  	require.Nil(t, nErr)
   624  	require.Len(t, *list, 1, "invalid number of channels")
   625  
   626  	list, nErr = ss.Channel().GetMoreChannels(o1.TeamId, m1.UserId, 0, 100)
   627  	require.Nil(t, nErr)
   628  	require.Len(t, *list, 1, "invalid number of channels")
   629  
   630  	cresult := ss.Channel().PermanentDelete(o2.Id)
   631  	require.Nil(t, cresult)
   632  
   633  	list, nErr = ss.Channel().GetChannels(o1.TeamId, m1.UserId, false, 0)
   634  	if assert.NotNil(t, nErr) {
   635  		var nfErr *store.ErrNotFound
   636  		require.True(t, errors.As(nErr, &nfErr))
   637  	} else {
   638  		require.Equal(t, &model.ChannelList{}, list)
   639  	}
   640  
   641  	nErr = ss.Channel().PermanentDeleteByTeam(o1.TeamId)
   642  	require.Nil(t, nErr, nErr)
   643  }
   644  
   645  func testChannelStoreGetByName(t *testing.T, ss store.Store) {
   646  	o1 := model.Channel{}
   647  	o1.TeamId = model.NewId()
   648  	o1.DisplayName = "Name"
   649  	o1.Name = "zz" + model.NewId() + "b"
   650  	o1.Type = model.CHANNEL_OPEN
   651  	_, nErr := ss.Channel().Save(&o1, -1)
   652  	require.Nil(t, nErr)
   653  
   654  	result, err := ss.Channel().GetByName(o1.TeamId, o1.Name, true)
   655  	require.Nil(t, err)
   656  	require.Equal(t, o1.ToJson(), result.ToJson(), "invalid returned channel")
   657  
   658  	channelID := result.Id
   659  
   660  	result, err = ss.Channel().GetByName(o1.TeamId, "", true)
   661  	require.NotNil(t, err, "Missing id should have failed")
   662  
   663  	result, err = ss.Channel().GetByName(o1.TeamId, o1.Name, false)
   664  	require.Nil(t, err)
   665  	require.Equal(t, o1.ToJson(), result.ToJson(), "invalid returned channel")
   666  
   667  	result, err = ss.Channel().GetByName(o1.TeamId, "", false)
   668  	require.NotNil(t, err, "Missing id should have failed")
   669  
   670  	nErr = ss.Channel().Delete(channelID, model.GetMillis())
   671  	require.Nil(t, nErr, "channel should have been deleted")
   672  
   673  	result, err = ss.Channel().GetByName(o1.TeamId, o1.Name, false)
   674  	require.NotNil(t, err, "Deleted channel should not be returned by GetByName()")
   675  }
   676  
   677  func testChannelStoreGetByNames(t *testing.T, ss store.Store) {
   678  	o1 := model.Channel{
   679  		TeamId:      model.NewId(),
   680  		DisplayName: "Name",
   681  		Name:        "zz" + model.NewId() + "b",
   682  		Type:        model.CHANNEL_OPEN,
   683  	}
   684  	_, nErr := ss.Channel().Save(&o1, -1)
   685  	require.Nil(t, nErr)
   686  
   687  	o2 := model.Channel{
   688  		TeamId:      o1.TeamId,
   689  		DisplayName: "Name",
   690  		Name:        "zz" + model.NewId() + "b",
   691  		Type:        model.CHANNEL_OPEN,
   692  	}
   693  	_, nErr = ss.Channel().Save(&o2, -1)
   694  	require.Nil(t, nErr)
   695  
   696  	for index, tc := range []struct {
   697  		TeamId      string
   698  		Names       []string
   699  		ExpectedIds []string
   700  	}{
   701  		{o1.TeamId, []string{o1.Name}, []string{o1.Id}},
   702  		{o1.TeamId, []string{o1.Name, o2.Name}, []string{o1.Id, o2.Id}},
   703  		{o1.TeamId, nil, nil},
   704  		{o1.TeamId, []string{"foo"}, nil},
   705  		{o1.TeamId, []string{o1.Name, "foo", o2.Name, o2.Name}, []string{o1.Id, o2.Id}},
   706  		{"", []string{o1.Name, "foo", o2.Name, o2.Name}, []string{o1.Id, o2.Id}},
   707  		{"asd", []string{o1.Name, "foo", o2.Name, o2.Name}, nil},
   708  	} {
   709  		var channels []*model.Channel
   710  		channels, err := ss.Channel().GetByNames(tc.TeamId, tc.Names, true)
   711  		require.Nil(t, err)
   712  		var ids []string
   713  		for _, channel := range channels {
   714  			ids = append(ids, channel.Id)
   715  		}
   716  		sort.Strings(ids)
   717  		sort.Strings(tc.ExpectedIds)
   718  		assert.Equal(t, tc.ExpectedIds, ids, "tc %v", index)
   719  	}
   720  
   721  	err := ss.Channel().Delete(o1.Id, model.GetMillis())
   722  	require.Nil(t, err, "channel should have been deleted")
   723  
   724  	err = ss.Channel().Delete(o2.Id, model.GetMillis())
   725  	require.Nil(t, err, "channel should have been deleted")
   726  
   727  	channels, nErr := ss.Channel().GetByNames(o1.TeamId, []string{o1.Name}, false)
   728  	require.Nil(t, nErr)
   729  	assert.Empty(t, channels)
   730  }
   731  
   732  func testChannelStoreGetDeletedByName(t *testing.T, ss store.Store) {
   733  	o1 := &model.Channel{}
   734  	o1.TeamId = model.NewId()
   735  	o1.DisplayName = "Name"
   736  	o1.Name = "zz" + model.NewId() + "b"
   737  	o1.Type = model.CHANNEL_OPEN
   738  	_, nErr := ss.Channel().Save(o1, -1)
   739  	require.Nil(t, nErr)
   740  
   741  	now := model.GetMillis()
   742  	err := ss.Channel().Delete(o1.Id, now)
   743  	require.Nil(t, err, "channel should have been deleted")
   744  	o1.DeleteAt = now
   745  	o1.UpdateAt = now
   746  
   747  	r1, nErr := ss.Channel().GetDeletedByName(o1.TeamId, o1.Name)
   748  	require.Nil(t, nErr)
   749  	require.Equal(t, o1, r1)
   750  
   751  	_, nErr = ss.Channel().GetDeletedByName(o1.TeamId, "")
   752  	require.NotNil(t, nErr, "missing id should have failed")
   753  }
   754  
   755  func testChannelStoreGetDeleted(t *testing.T, ss store.Store) {
   756  	o1 := model.Channel{}
   757  	o1.TeamId = model.NewId()
   758  	o1.DisplayName = "Channel1"
   759  	o1.Name = "zz" + model.NewId() + "b"
   760  	o1.Type = model.CHANNEL_OPEN
   761  
   762  	userId := model.NewId()
   763  
   764  	_, nErr := ss.Channel().Save(&o1, -1)
   765  	require.Nil(t, nErr)
   766  
   767  	err := ss.Channel().Delete(o1.Id, model.GetMillis())
   768  	require.Nil(t, err, "channel should have been deleted")
   769  
   770  	list, nErr := ss.Channel().GetDeleted(o1.TeamId, 0, 100, userId)
   771  	require.Nil(t, nErr, nErr)
   772  	require.Len(t, *list, 1, "wrong list")
   773  	require.Equal(t, o1.Name, (*list)[0].Name, "missing channel")
   774  
   775  	o2 := model.Channel{}
   776  	o2.TeamId = o1.TeamId
   777  	o2.DisplayName = "Channel2"
   778  	o2.Name = "zz" + model.NewId() + "b"
   779  	o2.Type = model.CHANNEL_OPEN
   780  	_, nErr = ss.Channel().Save(&o2, -1)
   781  	require.Nil(t, nErr)
   782  
   783  	list, nErr = ss.Channel().GetDeleted(o1.TeamId, 0, 100, userId)
   784  	require.Nil(t, nErr, nErr)
   785  	require.Len(t, *list, 1, "wrong list")
   786  
   787  	o3 := model.Channel{}
   788  	o3.TeamId = o1.TeamId
   789  	o3.DisplayName = "Channel3"
   790  	o3.Name = "zz" + model.NewId() + "b"
   791  	o3.Type = model.CHANNEL_OPEN
   792  
   793  	_, nErr = ss.Channel().Save(&o3, -1)
   794  	require.Nil(t, nErr)
   795  
   796  	err = ss.Channel().Delete(o3.Id, model.GetMillis())
   797  	require.Nil(t, err, "channel should have been deleted")
   798  
   799  	list, nErr = ss.Channel().GetDeleted(o1.TeamId, 0, 100, userId)
   800  	require.Nil(t, nErr, nErr)
   801  	require.Len(t, *list, 2, "wrong list length")
   802  
   803  	list, nErr = ss.Channel().GetDeleted(o1.TeamId, 0, 1, userId)
   804  	require.Nil(t, nErr, nErr)
   805  	require.Len(t, *list, 1, "wrong list length")
   806  
   807  	list, nErr = ss.Channel().GetDeleted(o1.TeamId, 1, 1, userId)
   808  	require.Nil(t, nErr, nErr)
   809  	require.Len(t, *list, 1, "wrong list length")
   810  
   811  }
   812  
   813  func testChannelMemberStore(t *testing.T, ss store.Store) {
   814  	c1 := &model.Channel{}
   815  	c1.TeamId = model.NewId()
   816  	c1.DisplayName = "NameName"
   817  	c1.Name = "zz" + model.NewId() + "b"
   818  	c1.Type = model.CHANNEL_OPEN
   819  	c1, nErr := ss.Channel().Save(c1, -1)
   820  	require.Nil(t, nErr)
   821  
   822  	c1t1, _ := ss.Channel().Get(c1.Id, false)
   823  	assert.EqualValues(t, 0, c1t1.ExtraUpdateAt, "ExtraUpdateAt should be 0")
   824  
   825  	u1 := model.User{}
   826  	u1.Email = MakeEmail()
   827  	u1.Nickname = model.NewId()
   828  	_, err := ss.User().Save(&u1)
   829  	require.Nil(t, err)
   830  	_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1)
   831  	require.Nil(t, err)
   832  
   833  	u2 := model.User{}
   834  	u2.Email = MakeEmail()
   835  	u2.Nickname = model.NewId()
   836  	_, err = ss.User().Save(&u2)
   837  	require.Nil(t, err)
   838  	_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}, -1)
   839  	require.Nil(t, err)
   840  
   841  	o1 := model.ChannelMember{}
   842  	o1.ChannelId = c1.Id
   843  	o1.UserId = u1.Id
   844  	o1.NotifyProps = model.GetDefaultChannelNotifyProps()
   845  	_, err = ss.Channel().SaveMember(&o1)
   846  	require.Nil(t, err)
   847  
   848  	o2 := model.ChannelMember{}
   849  	o2.ChannelId = c1.Id
   850  	o2.UserId = u2.Id
   851  	o2.NotifyProps = model.GetDefaultChannelNotifyProps()
   852  	_, err = ss.Channel().SaveMember(&o2)
   853  	require.Nil(t, err)
   854  
   855  	c1t2, _ := ss.Channel().Get(c1.Id, false)
   856  	assert.EqualValues(t, 0, c1t2.ExtraUpdateAt, "ExtraUpdateAt should be 0")
   857  
   858  	count, err := ss.Channel().GetMemberCount(o1.ChannelId, true)
   859  	require.Nil(t, err)
   860  	require.EqualValues(t, 2, count, "should have saved 2 members")
   861  
   862  	count, err = ss.Channel().GetMemberCount(o1.ChannelId, true)
   863  	require.Nil(t, err)
   864  	require.EqualValues(t, 2, count, "should have saved 2 members")
   865  	require.EqualValues(
   866  		t,
   867  		2,
   868  		ss.Channel().GetMemberCountFromCache(o1.ChannelId),
   869  		"should have saved 2 members")
   870  
   871  	require.EqualValues(
   872  		t,
   873  		0,
   874  		ss.Channel().GetMemberCountFromCache("junk"),
   875  		"should have saved 0 members")
   876  
   877  	count, err = ss.Channel().GetMemberCount(o1.ChannelId, false)
   878  	require.Nil(t, err)
   879  	require.EqualValues(t, 2, count, "should have saved 2 members")
   880  
   881  	err = ss.Channel().RemoveMember(o2.ChannelId, o2.UserId)
   882  	require.Nil(t, err)
   883  
   884  	count, err = ss.Channel().GetMemberCount(o1.ChannelId, false)
   885  	require.Nil(t, err)
   886  	require.EqualValues(t, 1, count, "should have removed 1 member")
   887  
   888  	c1t3, _ := ss.Channel().Get(c1.Id, false)
   889  	assert.EqualValues(t, 0, c1t3.ExtraUpdateAt, "ExtraUpdateAt should be 0")
   890  
   891  	member, _ := ss.Channel().GetMember(o1.ChannelId, o1.UserId)
   892  	require.Equal(t, o1.ChannelId, member.ChannelId, "should have go member")
   893  
   894  	_, err = ss.Channel().SaveMember(&o1)
   895  	require.NotNil(t, err, "should have been a duplicate")
   896  
   897  	c1t4, _ := ss.Channel().Get(c1.Id, false)
   898  	assert.EqualValues(t, 0, c1t4.ExtraUpdateAt, "ExtraUpdateAt should be 0")
   899  }
   900  
   901  func testChannelSaveMember(t *testing.T, ss store.Store) {
   902  	u1, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
   903  	require.Nil(t, err)
   904  	defaultNotifyProps := model.GetDefaultChannelNotifyProps()
   905  
   906  	t.Run("not valid channel member", func(t *testing.T) {
   907  		member := &model.ChannelMember{ChannelId: "wrong", UserId: u1.Id, NotifyProps: defaultNotifyProps}
   908  		_, err = ss.Channel().SaveMember(member)
   909  		require.NotNil(t, err)
   910  		require.Equal(t, "model.channel_member.is_valid.channel_id.app_error", err.Id)
   911  	})
   912  
   913  	t.Run("duplicated entries should fail", func(t *testing.T) {
   914  		channelID1 := model.NewId()
   915  		m1 := &model.ChannelMember{ChannelId: channelID1, UserId: u1.Id, NotifyProps: defaultNotifyProps}
   916  		_, err = ss.Channel().SaveMember(m1)
   917  		require.Nil(t, err)
   918  		m2 := &model.ChannelMember{ChannelId: channelID1, UserId: u1.Id, NotifyProps: defaultNotifyProps}
   919  		_, err = ss.Channel().SaveMember(m2)
   920  		require.NotNil(t, err)
   921  		require.Equal(t, "store.sql_channel.save_member.exists.app_error", err.Id)
   922  	})
   923  
   924  	t.Run("insert member correctly (in channel without channel scheme and team without scheme)", func(t *testing.T) {
   925  		team := &model.Team{
   926  			DisplayName: "Name",
   927  			Name:        "zz" + model.NewId(),
   928  			Email:       MakeEmail(),
   929  			Type:        model.TEAM_OPEN,
   930  		}
   931  
   932  		team, err = ss.Team().Save(team)
   933  		require.Nil(t, err)
   934  
   935  		channel := &model.Channel{
   936  			DisplayName: "DisplayName",
   937  			Name:        "z-z-z" + model.NewId() + "b",
   938  			Type:        model.CHANNEL_OPEN,
   939  			TeamId:      team.Id,
   940  		}
   941  		channel, nErr := ss.Channel().Save(channel, -1)
   942  		require.Nil(t, nErr)
   943  		defer func() { ss.Channel().PermanentDelete(channel.Id) }()
   944  
   945  		testCases := []struct {
   946  			Name                  string
   947  			SchemeGuest           bool
   948  			SchemeUser            bool
   949  			SchemeAdmin           bool
   950  			ExplicitRoles         string
   951  			ExpectedRoles         string
   952  			ExpectedExplicitRoles string
   953  			ExpectedSchemeGuest   bool
   954  			ExpectedSchemeUser    bool
   955  			ExpectedSchemeAdmin   bool
   956  		}{
   957  			{
   958  				Name:               "channel user implicit",
   959  				SchemeUser:         true,
   960  				ExpectedRoles:      "channel_user",
   961  				ExpectedSchemeUser: true,
   962  			},
   963  			{
   964  				Name:               "channel user explicit",
   965  				ExplicitRoles:      "channel_user",
   966  				ExpectedRoles:      "channel_user",
   967  				ExpectedSchemeUser: true,
   968  			},
   969  			{
   970  				Name:                "channel guest implicit",
   971  				SchemeGuest:         true,
   972  				ExpectedRoles:       "channel_guest",
   973  				ExpectedSchemeGuest: true,
   974  			},
   975  			{
   976  				Name:                "channel guest explicit",
   977  				ExplicitRoles:       "channel_guest",
   978  				ExpectedRoles:       "channel_guest",
   979  				ExpectedSchemeGuest: true,
   980  			},
   981  			{
   982  				Name:                "channel admin implicit",
   983  				SchemeUser:          true,
   984  				SchemeAdmin:         true,
   985  				ExpectedRoles:       "channel_user channel_admin",
   986  				ExpectedSchemeUser:  true,
   987  				ExpectedSchemeAdmin: true,
   988  			},
   989  			{
   990  				Name:                "channel admin explicit",
   991  				ExplicitRoles:       "channel_user channel_admin",
   992  				ExpectedRoles:       "channel_user channel_admin",
   993  				ExpectedSchemeUser:  true,
   994  				ExpectedSchemeAdmin: true,
   995  			},
   996  			{
   997  				Name:                  "channel user implicit and explicit custom role",
   998  				SchemeUser:            true,
   999  				ExplicitRoles:         "test",
  1000  				ExpectedRoles:         "test channel_user",
  1001  				ExpectedExplicitRoles: "test",
  1002  				ExpectedSchemeUser:    true,
  1003  			},
  1004  			{
  1005  				Name:                  "channel user explicit and explicit custom role",
  1006  				ExplicitRoles:         "channel_user test",
  1007  				ExpectedRoles:         "test channel_user",
  1008  				ExpectedExplicitRoles: "test",
  1009  				ExpectedSchemeUser:    true,
  1010  			},
  1011  			{
  1012  				Name:                  "channel guest implicit and explicit custom role",
  1013  				SchemeGuest:           true,
  1014  				ExplicitRoles:         "test",
  1015  				ExpectedRoles:         "test channel_guest",
  1016  				ExpectedExplicitRoles: "test",
  1017  				ExpectedSchemeGuest:   true,
  1018  			},
  1019  			{
  1020  				Name:                  "channel guest explicit and explicit custom role",
  1021  				ExplicitRoles:         "channel_guest test",
  1022  				ExpectedRoles:         "test channel_guest",
  1023  				ExpectedExplicitRoles: "test",
  1024  				ExpectedSchemeGuest:   true,
  1025  			},
  1026  			{
  1027  				Name:                  "channel admin implicit and explicit custom role",
  1028  				SchemeUser:            true,
  1029  				SchemeAdmin:           true,
  1030  				ExplicitRoles:         "test",
  1031  				ExpectedRoles:         "test channel_user channel_admin",
  1032  				ExpectedExplicitRoles: "test",
  1033  				ExpectedSchemeUser:    true,
  1034  				ExpectedSchemeAdmin:   true,
  1035  			},
  1036  			{
  1037  				Name:                  "channel admin explicit and explicit custom role",
  1038  				ExplicitRoles:         "channel_user channel_admin test",
  1039  				ExpectedRoles:         "test channel_user channel_admin",
  1040  				ExpectedExplicitRoles: "test",
  1041  				ExpectedSchemeUser:    true,
  1042  				ExpectedSchemeAdmin:   true,
  1043  			},
  1044  			{
  1045  				Name:                  "channel member with only explicit custom roles",
  1046  				ExplicitRoles:         "test test2",
  1047  				ExpectedRoles:         "test test2",
  1048  				ExpectedExplicitRoles: "test test2",
  1049  			},
  1050  		}
  1051  
  1052  		for _, tc := range testCases {
  1053  			t.Run(tc.Name, func(t *testing.T) {
  1054  				member := &model.ChannelMember{
  1055  					ChannelId:     channel.Id,
  1056  					UserId:        u1.Id,
  1057  					SchemeGuest:   tc.SchemeGuest,
  1058  					SchemeUser:    tc.SchemeUser,
  1059  					SchemeAdmin:   tc.SchemeAdmin,
  1060  					ExplicitRoles: tc.ExplicitRoles,
  1061  					NotifyProps:   defaultNotifyProps,
  1062  				}
  1063  				member, err = ss.Channel().SaveMember(member)
  1064  				require.Nil(t, err)
  1065  				defer ss.Channel().RemoveMember(channel.Id, u1.Id)
  1066  				assert.Equal(t, tc.ExpectedRoles, member.Roles)
  1067  				assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles)
  1068  				assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest)
  1069  				assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser)
  1070  				assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin)
  1071  			})
  1072  		}
  1073  	})
  1074  
  1075  	t.Run("insert member correctly (in channel without scheme and team with scheme)", func(t *testing.T) {
  1076  		ts := &model.Scheme{
  1077  			Name:        model.NewId(),
  1078  			DisplayName: model.NewId(),
  1079  			Description: model.NewId(),
  1080  			Scope:       model.SCHEME_SCOPE_TEAM,
  1081  		}
  1082  		ts, nErr := ss.Scheme().Save(ts)
  1083  		require.Nil(t, nErr)
  1084  
  1085  		team := &model.Team{
  1086  			DisplayName: "Name",
  1087  			Name:        "zz" + model.NewId(),
  1088  			Email:       MakeEmail(),
  1089  			Type:        model.TEAM_OPEN,
  1090  			SchemeId:    &ts.Id,
  1091  		}
  1092  
  1093  		team, err = ss.Team().Save(team)
  1094  		require.Nil(t, err)
  1095  
  1096  		channel := &model.Channel{
  1097  			DisplayName: "DisplayName",
  1098  			Name:        "z-z-z" + model.NewId() + "b",
  1099  			Type:        model.CHANNEL_OPEN,
  1100  			TeamId:      team.Id,
  1101  		}
  1102  		channel, nErr = ss.Channel().Save(channel, -1)
  1103  		require.Nil(t, nErr)
  1104  		defer func() { ss.Channel().PermanentDelete(channel.Id) }()
  1105  
  1106  		testCases := []struct {
  1107  			Name                  string
  1108  			SchemeGuest           bool
  1109  			SchemeUser            bool
  1110  			SchemeAdmin           bool
  1111  			ExplicitRoles         string
  1112  			ExpectedRoles         string
  1113  			ExpectedExplicitRoles string
  1114  			ExpectedSchemeGuest   bool
  1115  			ExpectedSchemeUser    bool
  1116  			ExpectedSchemeAdmin   bool
  1117  		}{
  1118  			{
  1119  				Name:               "channel user implicit",
  1120  				SchemeUser:         true,
  1121  				ExpectedRoles:      ts.DefaultChannelUserRole,
  1122  				ExpectedSchemeUser: true,
  1123  			},
  1124  			{
  1125  				Name:               "channel user explicit",
  1126  				ExplicitRoles:      "channel_user",
  1127  				ExpectedRoles:      ts.DefaultChannelUserRole,
  1128  				ExpectedSchemeUser: true,
  1129  			},
  1130  			{
  1131  				Name:                "channel guest implicit",
  1132  				SchemeGuest:         true,
  1133  				ExpectedRoles:       ts.DefaultChannelGuestRole,
  1134  				ExpectedSchemeGuest: true,
  1135  			},
  1136  			{
  1137  				Name:                "channel guest explicit",
  1138  				ExplicitRoles:       "channel_guest",
  1139  				ExpectedRoles:       ts.DefaultChannelGuestRole,
  1140  				ExpectedSchemeGuest: true,
  1141  			},
  1142  			{
  1143  				Name:                "channel admin implicit",
  1144  				SchemeUser:          true,
  1145  				SchemeAdmin:         true,
  1146  				ExpectedRoles:       ts.DefaultChannelUserRole + " " + ts.DefaultChannelAdminRole,
  1147  				ExpectedSchemeUser:  true,
  1148  				ExpectedSchemeAdmin: true,
  1149  			},
  1150  			{
  1151  				Name:                "channel admin explicit",
  1152  				ExplicitRoles:       "channel_user channel_admin",
  1153  				ExpectedRoles:       ts.DefaultChannelUserRole + " " + ts.DefaultChannelAdminRole,
  1154  				ExpectedSchemeUser:  true,
  1155  				ExpectedSchemeAdmin: true,
  1156  			},
  1157  			{
  1158  				Name:                  "channel user implicit and explicit custom role",
  1159  				SchemeUser:            true,
  1160  				ExplicitRoles:         "test",
  1161  				ExpectedRoles:         "test " + ts.DefaultChannelUserRole,
  1162  				ExpectedExplicitRoles: "test",
  1163  				ExpectedSchemeUser:    true,
  1164  			},
  1165  			{
  1166  				Name:                  "channel user explicit and explicit custom role",
  1167  				ExplicitRoles:         "channel_user test",
  1168  				ExpectedRoles:         "test " + ts.DefaultChannelUserRole,
  1169  				ExpectedExplicitRoles: "test",
  1170  				ExpectedSchemeUser:    true,
  1171  			},
  1172  			{
  1173  				Name:                  "channel guest implicit and explicit custom role",
  1174  				SchemeGuest:           true,
  1175  				ExplicitRoles:         "test",
  1176  				ExpectedRoles:         "test " + ts.DefaultChannelGuestRole,
  1177  				ExpectedExplicitRoles: "test",
  1178  				ExpectedSchemeGuest:   true,
  1179  			},
  1180  			{
  1181  				Name:                  "channel guest explicit and explicit custom role",
  1182  				ExplicitRoles:         "channel_guest test",
  1183  				ExpectedRoles:         "test " + ts.DefaultChannelGuestRole,
  1184  				ExpectedExplicitRoles: "test",
  1185  				ExpectedSchemeGuest:   true,
  1186  			},
  1187  			{
  1188  				Name:                  "channel admin implicit and explicit custom role",
  1189  				SchemeUser:            true,
  1190  				SchemeAdmin:           true,
  1191  				ExplicitRoles:         "test",
  1192  				ExpectedRoles:         "test " + ts.DefaultChannelUserRole + " " + ts.DefaultChannelAdminRole,
  1193  				ExpectedExplicitRoles: "test",
  1194  				ExpectedSchemeUser:    true,
  1195  				ExpectedSchemeAdmin:   true,
  1196  			},
  1197  			{
  1198  				Name:                  "channel admin explicit and explicit custom role",
  1199  				ExplicitRoles:         "channel_user channel_admin test",
  1200  				ExpectedRoles:         "test " + ts.DefaultChannelUserRole + " " + ts.DefaultChannelAdminRole,
  1201  				ExpectedExplicitRoles: "test",
  1202  				ExpectedSchemeUser:    true,
  1203  				ExpectedSchemeAdmin:   true,
  1204  			},
  1205  			{
  1206  				Name:                  "channel member with only explicit custom roles",
  1207  				ExplicitRoles:         "test test2",
  1208  				ExpectedRoles:         "test test2",
  1209  				ExpectedExplicitRoles: "test test2",
  1210  			},
  1211  		}
  1212  
  1213  		for _, tc := range testCases {
  1214  			t.Run(tc.Name, func(t *testing.T) {
  1215  				member := &model.ChannelMember{
  1216  					ChannelId:     channel.Id,
  1217  					UserId:        u1.Id,
  1218  					SchemeGuest:   tc.SchemeGuest,
  1219  					SchemeUser:    tc.SchemeUser,
  1220  					SchemeAdmin:   tc.SchemeAdmin,
  1221  					ExplicitRoles: tc.ExplicitRoles,
  1222  					NotifyProps:   defaultNotifyProps,
  1223  				}
  1224  				member, err = ss.Channel().SaveMember(member)
  1225  				require.Nil(t, err)
  1226  				defer ss.Channel().RemoveMember(channel.Id, u1.Id)
  1227  				assert.Equal(t, tc.ExpectedRoles, member.Roles)
  1228  				assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles)
  1229  				assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest)
  1230  				assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser)
  1231  				assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin)
  1232  			})
  1233  		}
  1234  	})
  1235  
  1236  	t.Run("insert member correctly (in channel with channel scheme)", func(t *testing.T) {
  1237  		cs := &model.Scheme{
  1238  			Name:        model.NewId(),
  1239  			DisplayName: model.NewId(),
  1240  			Description: model.NewId(),
  1241  			Scope:       model.SCHEME_SCOPE_CHANNEL,
  1242  		}
  1243  		cs, nErr := ss.Scheme().Save(cs)
  1244  		require.Nil(t, nErr)
  1245  
  1246  		team := &model.Team{
  1247  			DisplayName: "Name",
  1248  			Name:        "zz" + model.NewId(),
  1249  			Email:       MakeEmail(),
  1250  			Type:        model.TEAM_OPEN,
  1251  		}
  1252  
  1253  		team, err = ss.Team().Save(team)
  1254  		require.Nil(t, err)
  1255  
  1256  		channel, nErr := ss.Channel().Save(&model.Channel{
  1257  			DisplayName: "DisplayName",
  1258  			Name:        "z-z-z" + model.NewId() + "b",
  1259  			Type:        model.CHANNEL_OPEN,
  1260  			TeamId:      team.Id,
  1261  			SchemeId:    &cs.Id,
  1262  		}, -1)
  1263  		require.Nil(t, nErr)
  1264  		defer func() { ss.Channel().PermanentDelete(channel.Id) }()
  1265  
  1266  		testCases := []struct {
  1267  			Name                  string
  1268  			SchemeGuest           bool
  1269  			SchemeUser            bool
  1270  			SchemeAdmin           bool
  1271  			ExplicitRoles         string
  1272  			ExpectedRoles         string
  1273  			ExpectedExplicitRoles string
  1274  			ExpectedSchemeGuest   bool
  1275  			ExpectedSchemeUser    bool
  1276  			ExpectedSchemeAdmin   bool
  1277  		}{
  1278  			{
  1279  				Name:               "channel user implicit",
  1280  				SchemeUser:         true,
  1281  				ExpectedRoles:      cs.DefaultChannelUserRole,
  1282  				ExpectedSchemeUser: true,
  1283  			},
  1284  			{
  1285  				Name:               "channel user explicit",
  1286  				ExplicitRoles:      "channel_user",
  1287  				ExpectedRoles:      cs.DefaultChannelUserRole,
  1288  				ExpectedSchemeUser: true,
  1289  			},
  1290  			{
  1291  				Name:                "channel guest implicit",
  1292  				SchemeGuest:         true,
  1293  				ExpectedRoles:       cs.DefaultChannelGuestRole,
  1294  				ExpectedSchemeGuest: true,
  1295  			},
  1296  			{
  1297  				Name:                "channel guest explicit",
  1298  				ExplicitRoles:       "channel_guest",
  1299  				ExpectedRoles:       cs.DefaultChannelGuestRole,
  1300  				ExpectedSchemeGuest: true,
  1301  			},
  1302  			{
  1303  				Name:                "channel admin implicit",
  1304  				SchemeUser:          true,
  1305  				SchemeAdmin:         true,
  1306  				ExpectedRoles:       cs.DefaultChannelUserRole + " " + cs.DefaultChannelAdminRole,
  1307  				ExpectedSchemeUser:  true,
  1308  				ExpectedSchemeAdmin: true,
  1309  			},
  1310  			{
  1311  				Name:                "channel admin explicit",
  1312  				ExplicitRoles:       "channel_user channel_admin",
  1313  				ExpectedRoles:       cs.DefaultChannelUserRole + " " + cs.DefaultChannelAdminRole,
  1314  				ExpectedSchemeUser:  true,
  1315  				ExpectedSchemeAdmin: true,
  1316  			},
  1317  			{
  1318  				Name:                  "channel user implicit and explicit custom role",
  1319  				SchemeUser:            true,
  1320  				ExplicitRoles:         "test",
  1321  				ExpectedRoles:         "test " + cs.DefaultChannelUserRole,
  1322  				ExpectedExplicitRoles: "test",
  1323  				ExpectedSchemeUser:    true,
  1324  			},
  1325  			{
  1326  				Name:                  "channel user explicit and explicit custom role",
  1327  				ExplicitRoles:         "channel_user test",
  1328  				ExpectedRoles:         "test " + cs.DefaultChannelUserRole,
  1329  				ExpectedExplicitRoles: "test",
  1330  				ExpectedSchemeUser:    true,
  1331  			},
  1332  			{
  1333  				Name:                  "channel guest implicit and explicit custom role",
  1334  				SchemeGuest:           true,
  1335  				ExplicitRoles:         "test",
  1336  				ExpectedRoles:         "test " + cs.DefaultChannelGuestRole,
  1337  				ExpectedExplicitRoles: "test",
  1338  				ExpectedSchemeGuest:   true,
  1339  			},
  1340  			{
  1341  				Name:                  "channel guest explicit and explicit custom role",
  1342  				ExplicitRoles:         "channel_guest test",
  1343  				ExpectedRoles:         "test " + cs.DefaultChannelGuestRole,
  1344  				ExpectedExplicitRoles: "test",
  1345  				ExpectedSchemeGuest:   true,
  1346  			},
  1347  			{
  1348  				Name:                  "channel admin implicit and explicit custom role",
  1349  				SchemeUser:            true,
  1350  				SchemeAdmin:           true,
  1351  				ExplicitRoles:         "test",
  1352  				ExpectedRoles:         "test " + cs.DefaultChannelUserRole + " " + cs.DefaultChannelAdminRole,
  1353  				ExpectedExplicitRoles: "test",
  1354  				ExpectedSchemeUser:    true,
  1355  				ExpectedSchemeAdmin:   true,
  1356  			},
  1357  			{
  1358  				Name:                  "channel admin explicit and explicit custom role",
  1359  				ExplicitRoles:         "channel_user channel_admin test",
  1360  				ExpectedRoles:         "test " + cs.DefaultChannelUserRole + " " + cs.DefaultChannelAdminRole,
  1361  				ExpectedExplicitRoles: "test",
  1362  				ExpectedSchemeUser:    true,
  1363  				ExpectedSchemeAdmin:   true,
  1364  			},
  1365  			{
  1366  				Name:                  "channel member with only explicit custom roles",
  1367  				ExplicitRoles:         "test test2",
  1368  				ExpectedRoles:         "test test2",
  1369  				ExpectedExplicitRoles: "test test2",
  1370  			},
  1371  		}
  1372  
  1373  		for _, tc := range testCases {
  1374  			t.Run(tc.Name, func(t *testing.T) {
  1375  				member := &model.ChannelMember{
  1376  					ChannelId:     channel.Id,
  1377  					UserId:        u1.Id,
  1378  					SchemeGuest:   tc.SchemeGuest,
  1379  					SchemeUser:    tc.SchemeUser,
  1380  					SchemeAdmin:   tc.SchemeAdmin,
  1381  					ExplicitRoles: tc.ExplicitRoles,
  1382  					NotifyProps:   defaultNotifyProps,
  1383  				}
  1384  				member, err = ss.Channel().SaveMember(member)
  1385  				require.Nil(t, err)
  1386  				defer ss.Channel().RemoveMember(channel.Id, u1.Id)
  1387  				assert.Equal(t, tc.ExpectedRoles, member.Roles)
  1388  				assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles)
  1389  				assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest)
  1390  				assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser)
  1391  				assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin)
  1392  			})
  1393  		}
  1394  	})
  1395  }
  1396  
  1397  func testChannelSaveMultipleMembers(t *testing.T, ss store.Store) {
  1398  	u1, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  1399  	require.Nil(t, err)
  1400  	u2, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  1401  	require.Nil(t, err)
  1402  	defaultNotifyProps := model.GetDefaultChannelNotifyProps()
  1403  
  1404  	t.Run("any not valid channel member", func(t *testing.T) {
  1405  		m1 := &model.ChannelMember{ChannelId: "wrong", UserId: u1.Id, NotifyProps: defaultNotifyProps}
  1406  		m2 := &model.ChannelMember{ChannelId: model.NewId(), UserId: u2.Id, NotifyProps: defaultNotifyProps}
  1407  		_, err = ss.Channel().SaveMultipleMembers([]*model.ChannelMember{m1, m2})
  1408  		require.NotNil(t, err)
  1409  		require.Equal(t, "model.channel_member.is_valid.channel_id.app_error", err.Id)
  1410  	})
  1411  
  1412  	t.Run("duplicated entries should fail", func(t *testing.T) {
  1413  		channelID1 := model.NewId()
  1414  		m1 := &model.ChannelMember{ChannelId: channelID1, UserId: u1.Id, NotifyProps: defaultNotifyProps}
  1415  		m2 := &model.ChannelMember{ChannelId: channelID1, UserId: u1.Id, NotifyProps: defaultNotifyProps}
  1416  		_, err = ss.Channel().SaveMultipleMembers([]*model.ChannelMember{m1, m2})
  1417  		require.NotNil(t, err)
  1418  		require.Equal(t, "store.sql_channel.save_member.exists.app_error", err.Id)
  1419  	})
  1420  
  1421  	t.Run("insert members correctly (in channel without channel scheme and team without scheme)", func(t *testing.T) {
  1422  		team := &model.Team{
  1423  			DisplayName: "Name",
  1424  			Name:        "zz" + model.NewId(),
  1425  			Email:       MakeEmail(),
  1426  			Type:        model.TEAM_OPEN,
  1427  		}
  1428  
  1429  		team, err = ss.Team().Save(team)
  1430  		require.Nil(t, err)
  1431  
  1432  		channel := &model.Channel{
  1433  			DisplayName: "DisplayName",
  1434  			Name:        "z-z-z" + model.NewId() + "b",
  1435  			Type:        model.CHANNEL_OPEN,
  1436  			TeamId:      team.Id,
  1437  		}
  1438  		channel, nErr := ss.Channel().Save(channel, -1)
  1439  		require.Nil(t, nErr)
  1440  		defer func() { ss.Channel().PermanentDelete(channel.Id) }()
  1441  
  1442  		testCases := []struct {
  1443  			Name                  string
  1444  			SchemeGuest           bool
  1445  			SchemeUser            bool
  1446  			SchemeAdmin           bool
  1447  			ExplicitRoles         string
  1448  			ExpectedRoles         string
  1449  			ExpectedExplicitRoles string
  1450  			ExpectedSchemeGuest   bool
  1451  			ExpectedSchemeUser    bool
  1452  			ExpectedSchemeAdmin   bool
  1453  		}{
  1454  			{
  1455  				Name:               "channel user implicit",
  1456  				SchemeUser:         true,
  1457  				ExpectedRoles:      "channel_user",
  1458  				ExpectedSchemeUser: true,
  1459  			},
  1460  			{
  1461  				Name:               "channel user explicit",
  1462  				ExplicitRoles:      "channel_user",
  1463  				ExpectedRoles:      "channel_user",
  1464  				ExpectedSchemeUser: true,
  1465  			},
  1466  			{
  1467  				Name:                "channel guest implicit",
  1468  				SchemeGuest:         true,
  1469  				ExpectedRoles:       "channel_guest",
  1470  				ExpectedSchemeGuest: true,
  1471  			},
  1472  			{
  1473  				Name:                "channel guest explicit",
  1474  				ExplicitRoles:       "channel_guest",
  1475  				ExpectedRoles:       "channel_guest",
  1476  				ExpectedSchemeGuest: true,
  1477  			},
  1478  			{
  1479  				Name:                "channel admin implicit",
  1480  				SchemeUser:          true,
  1481  				SchemeAdmin:         true,
  1482  				ExpectedRoles:       "channel_user channel_admin",
  1483  				ExpectedSchemeUser:  true,
  1484  				ExpectedSchemeAdmin: true,
  1485  			},
  1486  			{
  1487  				Name:                "channel admin explicit",
  1488  				ExplicitRoles:       "channel_user channel_admin",
  1489  				ExpectedRoles:       "channel_user channel_admin",
  1490  				ExpectedSchemeUser:  true,
  1491  				ExpectedSchemeAdmin: true,
  1492  			},
  1493  			{
  1494  				Name:                  "channel user implicit and explicit custom role",
  1495  				SchemeUser:            true,
  1496  				ExplicitRoles:         "test",
  1497  				ExpectedRoles:         "test channel_user",
  1498  				ExpectedExplicitRoles: "test",
  1499  				ExpectedSchemeUser:    true,
  1500  			},
  1501  			{
  1502  				Name:                  "channel user explicit and explicit custom role",
  1503  				ExplicitRoles:         "channel_user test",
  1504  				ExpectedRoles:         "test channel_user",
  1505  				ExpectedExplicitRoles: "test",
  1506  				ExpectedSchemeUser:    true,
  1507  			},
  1508  			{
  1509  				Name:                  "channel guest implicit and explicit custom role",
  1510  				SchemeGuest:           true,
  1511  				ExplicitRoles:         "test",
  1512  				ExpectedRoles:         "test channel_guest",
  1513  				ExpectedExplicitRoles: "test",
  1514  				ExpectedSchemeGuest:   true,
  1515  			},
  1516  			{
  1517  				Name:                  "channel guest explicit and explicit custom role",
  1518  				ExplicitRoles:         "channel_guest test",
  1519  				ExpectedRoles:         "test channel_guest",
  1520  				ExpectedExplicitRoles: "test",
  1521  				ExpectedSchemeGuest:   true,
  1522  			},
  1523  			{
  1524  				Name:                  "channel admin implicit and explicit custom role",
  1525  				SchemeUser:            true,
  1526  				SchemeAdmin:           true,
  1527  				ExplicitRoles:         "test",
  1528  				ExpectedRoles:         "test channel_user channel_admin",
  1529  				ExpectedExplicitRoles: "test",
  1530  				ExpectedSchemeUser:    true,
  1531  				ExpectedSchemeAdmin:   true,
  1532  			},
  1533  			{
  1534  				Name:                  "channel admin explicit and explicit custom role",
  1535  				ExplicitRoles:         "channel_user channel_admin test",
  1536  				ExpectedRoles:         "test channel_user channel_admin",
  1537  				ExpectedExplicitRoles: "test",
  1538  				ExpectedSchemeUser:    true,
  1539  				ExpectedSchemeAdmin:   true,
  1540  			},
  1541  			{
  1542  				Name:                  "channel member with only explicit custom roles",
  1543  				ExplicitRoles:         "test test2",
  1544  				ExpectedRoles:         "test test2",
  1545  				ExpectedExplicitRoles: "test test2",
  1546  			},
  1547  		}
  1548  
  1549  		for _, tc := range testCases {
  1550  			t.Run(tc.Name, func(t *testing.T) {
  1551  				member := &model.ChannelMember{
  1552  					ChannelId:     channel.Id,
  1553  					UserId:        u1.Id,
  1554  					SchemeGuest:   tc.SchemeGuest,
  1555  					SchemeUser:    tc.SchemeUser,
  1556  					SchemeAdmin:   tc.SchemeAdmin,
  1557  					ExplicitRoles: tc.ExplicitRoles,
  1558  					NotifyProps:   defaultNotifyProps,
  1559  				}
  1560  				otherMember := &model.ChannelMember{
  1561  					ChannelId:     channel.Id,
  1562  					UserId:        u2.Id,
  1563  					SchemeGuest:   tc.SchemeGuest,
  1564  					SchemeUser:    tc.SchemeUser,
  1565  					SchemeAdmin:   tc.SchemeAdmin,
  1566  					ExplicitRoles: tc.ExplicitRoles,
  1567  					NotifyProps:   defaultNotifyProps,
  1568  				}
  1569  				var members []*model.ChannelMember
  1570  				members, err = ss.Channel().SaveMultipleMembers([]*model.ChannelMember{member, otherMember})
  1571  				require.Nil(t, err)
  1572  				require.Len(t, members, 2)
  1573  				member = members[0]
  1574  				defer ss.Channel().RemoveMember(channel.Id, u1.Id)
  1575  				defer ss.Channel().RemoveMember(channel.Id, u2.Id)
  1576  
  1577  				assert.Equal(t, tc.ExpectedRoles, member.Roles)
  1578  				assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles)
  1579  				assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest)
  1580  				assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser)
  1581  				assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin)
  1582  			})
  1583  		}
  1584  	})
  1585  
  1586  	t.Run("insert members correctly (in channel without scheme and team with scheme)", func(t *testing.T) {
  1587  		ts := &model.Scheme{
  1588  			Name:        model.NewId(),
  1589  			DisplayName: model.NewId(),
  1590  			Description: model.NewId(),
  1591  			Scope:       model.SCHEME_SCOPE_TEAM,
  1592  		}
  1593  		ts, nErr := ss.Scheme().Save(ts)
  1594  		require.Nil(t, nErr)
  1595  
  1596  		team := &model.Team{
  1597  			DisplayName: "Name",
  1598  			Name:        "zz" + model.NewId(),
  1599  			Email:       MakeEmail(),
  1600  			Type:        model.TEAM_OPEN,
  1601  			SchemeId:    &ts.Id,
  1602  		}
  1603  
  1604  		team, err = ss.Team().Save(team)
  1605  		require.Nil(t, err)
  1606  
  1607  		channel := &model.Channel{
  1608  			DisplayName: "DisplayName",
  1609  			Name:        "z-z-z" + model.NewId() + "b",
  1610  			Type:        model.CHANNEL_OPEN,
  1611  			TeamId:      team.Id,
  1612  		}
  1613  		channel, nErr = ss.Channel().Save(channel, -1)
  1614  		require.Nil(t, nErr)
  1615  		defer func() { ss.Channel().PermanentDelete(channel.Id) }()
  1616  
  1617  		testCases := []struct {
  1618  			Name                  string
  1619  			SchemeGuest           bool
  1620  			SchemeUser            bool
  1621  			SchemeAdmin           bool
  1622  			ExplicitRoles         string
  1623  			ExpectedRoles         string
  1624  			ExpectedExplicitRoles string
  1625  			ExpectedSchemeGuest   bool
  1626  			ExpectedSchemeUser    bool
  1627  			ExpectedSchemeAdmin   bool
  1628  		}{
  1629  			{
  1630  				Name:               "channel user implicit",
  1631  				SchemeUser:         true,
  1632  				ExpectedRoles:      ts.DefaultChannelUserRole,
  1633  				ExpectedSchemeUser: true,
  1634  			},
  1635  			{
  1636  				Name:               "channel user explicit",
  1637  				ExplicitRoles:      "channel_user",
  1638  				ExpectedRoles:      ts.DefaultChannelUserRole,
  1639  				ExpectedSchemeUser: true,
  1640  			},
  1641  			{
  1642  				Name:                "channel guest implicit",
  1643  				SchemeGuest:         true,
  1644  				ExpectedRoles:       ts.DefaultChannelGuestRole,
  1645  				ExpectedSchemeGuest: true,
  1646  			},
  1647  			{
  1648  				Name:                "channel guest explicit",
  1649  				ExplicitRoles:       "channel_guest",
  1650  				ExpectedRoles:       ts.DefaultChannelGuestRole,
  1651  				ExpectedSchemeGuest: true,
  1652  			},
  1653  			{
  1654  				Name:                "channel admin implicit",
  1655  				SchemeUser:          true,
  1656  				SchemeAdmin:         true,
  1657  				ExpectedRoles:       ts.DefaultChannelUserRole + " " + ts.DefaultChannelAdminRole,
  1658  				ExpectedSchemeUser:  true,
  1659  				ExpectedSchemeAdmin: true,
  1660  			},
  1661  			{
  1662  				Name:                "channel admin explicit",
  1663  				ExplicitRoles:       "channel_user channel_admin",
  1664  				ExpectedRoles:       ts.DefaultChannelUserRole + " " + ts.DefaultChannelAdminRole,
  1665  				ExpectedSchemeUser:  true,
  1666  				ExpectedSchemeAdmin: true,
  1667  			},
  1668  			{
  1669  				Name:                  "channel user implicit and explicit custom role",
  1670  				SchemeUser:            true,
  1671  				ExplicitRoles:         "test",
  1672  				ExpectedRoles:         "test " + ts.DefaultChannelUserRole,
  1673  				ExpectedExplicitRoles: "test",
  1674  				ExpectedSchemeUser:    true,
  1675  			},
  1676  			{
  1677  				Name:                  "channel user explicit and explicit custom role",
  1678  				ExplicitRoles:         "channel_user test",
  1679  				ExpectedRoles:         "test " + ts.DefaultChannelUserRole,
  1680  				ExpectedExplicitRoles: "test",
  1681  				ExpectedSchemeUser:    true,
  1682  			},
  1683  			{
  1684  				Name:                  "channel guest implicit and explicit custom role",
  1685  				SchemeGuest:           true,
  1686  				ExplicitRoles:         "test",
  1687  				ExpectedRoles:         "test " + ts.DefaultChannelGuestRole,
  1688  				ExpectedExplicitRoles: "test",
  1689  				ExpectedSchemeGuest:   true,
  1690  			},
  1691  			{
  1692  				Name:                  "channel guest explicit and explicit custom role",
  1693  				ExplicitRoles:         "channel_guest test",
  1694  				ExpectedRoles:         "test " + ts.DefaultChannelGuestRole,
  1695  				ExpectedExplicitRoles: "test",
  1696  				ExpectedSchemeGuest:   true,
  1697  			},
  1698  			{
  1699  				Name:                  "channel admin implicit and explicit custom role",
  1700  				SchemeUser:            true,
  1701  				SchemeAdmin:           true,
  1702  				ExplicitRoles:         "test",
  1703  				ExpectedRoles:         "test " + ts.DefaultChannelUserRole + " " + ts.DefaultChannelAdminRole,
  1704  				ExpectedExplicitRoles: "test",
  1705  				ExpectedSchemeUser:    true,
  1706  				ExpectedSchemeAdmin:   true,
  1707  			},
  1708  			{
  1709  				Name:                  "channel admin explicit and explicit custom role",
  1710  				ExplicitRoles:         "channel_user channel_admin test",
  1711  				ExpectedRoles:         "test " + ts.DefaultChannelUserRole + " " + ts.DefaultChannelAdminRole,
  1712  				ExpectedExplicitRoles: "test",
  1713  				ExpectedSchemeUser:    true,
  1714  				ExpectedSchemeAdmin:   true,
  1715  			},
  1716  			{
  1717  				Name:                  "channel member with only explicit custom roles",
  1718  				ExplicitRoles:         "test test2",
  1719  				ExpectedRoles:         "test test2",
  1720  				ExpectedExplicitRoles: "test test2",
  1721  			},
  1722  		}
  1723  
  1724  		for _, tc := range testCases {
  1725  			t.Run(tc.Name, func(t *testing.T) {
  1726  				member := &model.ChannelMember{
  1727  					ChannelId:     channel.Id,
  1728  					UserId:        u1.Id,
  1729  					SchemeGuest:   tc.SchemeGuest,
  1730  					SchemeUser:    tc.SchemeUser,
  1731  					SchemeAdmin:   tc.SchemeAdmin,
  1732  					ExplicitRoles: tc.ExplicitRoles,
  1733  					NotifyProps:   defaultNotifyProps,
  1734  				}
  1735  				otherMember := &model.ChannelMember{
  1736  					ChannelId:     channel.Id,
  1737  					UserId:        u2.Id,
  1738  					SchemeGuest:   tc.SchemeGuest,
  1739  					SchemeUser:    tc.SchemeUser,
  1740  					SchemeAdmin:   tc.SchemeAdmin,
  1741  					ExplicitRoles: tc.ExplicitRoles,
  1742  					NotifyProps:   defaultNotifyProps,
  1743  				}
  1744  				var members []*model.ChannelMember
  1745  				members, err = ss.Channel().SaveMultipleMembers([]*model.ChannelMember{member, otherMember})
  1746  				require.Nil(t, err)
  1747  				require.Len(t, members, 2)
  1748  				member = members[0]
  1749  				defer ss.Channel().RemoveMember(channel.Id, u1.Id)
  1750  				defer ss.Channel().RemoveMember(channel.Id, u2.Id)
  1751  
  1752  				assert.Equal(t, tc.ExpectedRoles, member.Roles)
  1753  				assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles)
  1754  				assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest)
  1755  				assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser)
  1756  				assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin)
  1757  			})
  1758  		}
  1759  	})
  1760  
  1761  	t.Run("insert members correctly (in channel with channel scheme)", func(t *testing.T) {
  1762  		cs := &model.Scheme{
  1763  			Name:        model.NewId(),
  1764  			DisplayName: model.NewId(),
  1765  			Description: model.NewId(),
  1766  			Scope:       model.SCHEME_SCOPE_CHANNEL,
  1767  		}
  1768  		cs, nErr := ss.Scheme().Save(cs)
  1769  		require.Nil(t, nErr)
  1770  
  1771  		team := &model.Team{
  1772  			DisplayName: "Name",
  1773  			Name:        "zz" + model.NewId(),
  1774  			Email:       MakeEmail(),
  1775  			Type:        model.TEAM_OPEN,
  1776  		}
  1777  
  1778  		team, err = ss.Team().Save(team)
  1779  		require.Nil(t, err)
  1780  
  1781  		channel, nErr := ss.Channel().Save(&model.Channel{
  1782  			DisplayName: "DisplayName",
  1783  			Name:        "z-z-z" + model.NewId() + "b",
  1784  			Type:        model.CHANNEL_OPEN,
  1785  			TeamId:      team.Id,
  1786  			SchemeId:    &cs.Id,
  1787  		}, -1)
  1788  		require.Nil(t, nErr)
  1789  		defer func() { ss.Channel().PermanentDelete(channel.Id) }()
  1790  
  1791  		testCases := []struct {
  1792  			Name                  string
  1793  			SchemeGuest           bool
  1794  			SchemeUser            bool
  1795  			SchemeAdmin           bool
  1796  			ExplicitRoles         string
  1797  			ExpectedRoles         string
  1798  			ExpectedExplicitRoles string
  1799  			ExpectedSchemeGuest   bool
  1800  			ExpectedSchemeUser    bool
  1801  			ExpectedSchemeAdmin   bool
  1802  		}{
  1803  			{
  1804  				Name:               "channel user implicit",
  1805  				SchemeUser:         true,
  1806  				ExpectedRoles:      cs.DefaultChannelUserRole,
  1807  				ExpectedSchemeUser: true,
  1808  			},
  1809  			{
  1810  				Name:               "channel user explicit",
  1811  				ExplicitRoles:      "channel_user",
  1812  				ExpectedRoles:      cs.DefaultChannelUserRole,
  1813  				ExpectedSchemeUser: true,
  1814  			},
  1815  			{
  1816  				Name:                "channel guest implicit",
  1817  				SchemeGuest:         true,
  1818  				ExpectedRoles:       cs.DefaultChannelGuestRole,
  1819  				ExpectedSchemeGuest: true,
  1820  			},
  1821  			{
  1822  				Name:                "channel guest explicit",
  1823  				ExplicitRoles:       "channel_guest",
  1824  				ExpectedRoles:       cs.DefaultChannelGuestRole,
  1825  				ExpectedSchemeGuest: true,
  1826  			},
  1827  			{
  1828  				Name:                "channel admin implicit",
  1829  				SchemeUser:          true,
  1830  				SchemeAdmin:         true,
  1831  				ExpectedRoles:       cs.DefaultChannelUserRole + " " + cs.DefaultChannelAdminRole,
  1832  				ExpectedSchemeUser:  true,
  1833  				ExpectedSchemeAdmin: true,
  1834  			},
  1835  			{
  1836  				Name:                "channel admin explicit",
  1837  				ExplicitRoles:       "channel_user channel_admin",
  1838  				ExpectedRoles:       cs.DefaultChannelUserRole + " " + cs.DefaultChannelAdminRole,
  1839  				ExpectedSchemeUser:  true,
  1840  				ExpectedSchemeAdmin: true,
  1841  			},
  1842  			{
  1843  				Name:                  "channel user implicit and explicit custom role",
  1844  				SchemeUser:            true,
  1845  				ExplicitRoles:         "test",
  1846  				ExpectedRoles:         "test " + cs.DefaultChannelUserRole,
  1847  				ExpectedExplicitRoles: "test",
  1848  				ExpectedSchemeUser:    true,
  1849  			},
  1850  			{
  1851  				Name:                  "channel user explicit and explicit custom role",
  1852  				ExplicitRoles:         "channel_user test",
  1853  				ExpectedRoles:         "test " + cs.DefaultChannelUserRole,
  1854  				ExpectedExplicitRoles: "test",
  1855  				ExpectedSchemeUser:    true,
  1856  			},
  1857  			{
  1858  				Name:                  "channel guest implicit and explicit custom role",
  1859  				SchemeGuest:           true,
  1860  				ExplicitRoles:         "test",
  1861  				ExpectedRoles:         "test " + cs.DefaultChannelGuestRole,
  1862  				ExpectedExplicitRoles: "test",
  1863  				ExpectedSchemeGuest:   true,
  1864  			},
  1865  			{
  1866  				Name:                  "channel guest explicit and explicit custom role",
  1867  				ExplicitRoles:         "channel_guest test",
  1868  				ExpectedRoles:         "test " + cs.DefaultChannelGuestRole,
  1869  				ExpectedExplicitRoles: "test",
  1870  				ExpectedSchemeGuest:   true,
  1871  			},
  1872  			{
  1873  				Name:                  "channel admin implicit and explicit custom role",
  1874  				SchemeUser:            true,
  1875  				SchemeAdmin:           true,
  1876  				ExplicitRoles:         "test",
  1877  				ExpectedRoles:         "test " + cs.DefaultChannelUserRole + " " + cs.DefaultChannelAdminRole,
  1878  				ExpectedExplicitRoles: "test",
  1879  				ExpectedSchemeUser:    true,
  1880  				ExpectedSchemeAdmin:   true,
  1881  			},
  1882  			{
  1883  				Name:                  "channel admin explicit and explicit custom role",
  1884  				ExplicitRoles:         "channel_user channel_admin test",
  1885  				ExpectedRoles:         "test " + cs.DefaultChannelUserRole + " " + cs.DefaultChannelAdminRole,
  1886  				ExpectedExplicitRoles: "test",
  1887  				ExpectedSchemeUser:    true,
  1888  				ExpectedSchemeAdmin:   true,
  1889  			},
  1890  			{
  1891  				Name:                  "channel member with only explicit custom roles",
  1892  				ExplicitRoles:         "test test2",
  1893  				ExpectedRoles:         "test test2",
  1894  				ExpectedExplicitRoles: "test test2",
  1895  			},
  1896  		}
  1897  
  1898  		for _, tc := range testCases {
  1899  			t.Run(tc.Name, func(t *testing.T) {
  1900  				member := &model.ChannelMember{
  1901  					ChannelId:     channel.Id,
  1902  					UserId:        u1.Id,
  1903  					SchemeGuest:   tc.SchemeGuest,
  1904  					SchemeUser:    tc.SchemeUser,
  1905  					SchemeAdmin:   tc.SchemeAdmin,
  1906  					ExplicitRoles: tc.ExplicitRoles,
  1907  					NotifyProps:   defaultNotifyProps,
  1908  				}
  1909  				otherMember := &model.ChannelMember{
  1910  					ChannelId:     channel.Id,
  1911  					UserId:        u2.Id,
  1912  					SchemeGuest:   tc.SchemeGuest,
  1913  					SchemeUser:    tc.SchemeUser,
  1914  					SchemeAdmin:   tc.SchemeAdmin,
  1915  					ExplicitRoles: tc.ExplicitRoles,
  1916  					NotifyProps:   defaultNotifyProps,
  1917  				}
  1918  				members, err := ss.Channel().SaveMultipleMembers([]*model.ChannelMember{member, otherMember})
  1919  				require.Nil(t, err)
  1920  				require.Len(t, members, 2)
  1921  				member = members[0]
  1922  				defer ss.Channel().RemoveMember(channel.Id, u1.Id)
  1923  				defer ss.Channel().RemoveMember(channel.Id, u2.Id)
  1924  
  1925  				assert.Equal(t, tc.ExpectedRoles, member.Roles)
  1926  				assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles)
  1927  				assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest)
  1928  				assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser)
  1929  				assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin)
  1930  			})
  1931  		}
  1932  	})
  1933  }
  1934  
  1935  func testChannelUpdateMember(t *testing.T, ss store.Store) {
  1936  	u1, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  1937  	require.Nil(t, err)
  1938  	defaultNotifyProps := model.GetDefaultChannelNotifyProps()
  1939  
  1940  	t.Run("not valid channel member", func(t *testing.T) {
  1941  		member := &model.ChannelMember{ChannelId: "wrong", UserId: u1.Id, NotifyProps: defaultNotifyProps}
  1942  		_, err = ss.Channel().UpdateMember(member)
  1943  		require.NotNil(t, err)
  1944  		require.Equal(t, "model.channel_member.is_valid.channel_id.app_error", err.Id)
  1945  	})
  1946  
  1947  	t.Run("insert member correctly (in channel without channel scheme and team without scheme)", func(t *testing.T) {
  1948  		team := &model.Team{
  1949  			DisplayName: "Name",
  1950  			Name:        "zz" + model.NewId(),
  1951  			Email:       MakeEmail(),
  1952  			Type:        model.TEAM_OPEN,
  1953  		}
  1954  
  1955  		team, err = ss.Team().Save(team)
  1956  		require.Nil(t, err)
  1957  
  1958  		channel := &model.Channel{
  1959  			DisplayName: "DisplayName",
  1960  			Name:        "z-z-z" + model.NewId() + "b",
  1961  			Type:        model.CHANNEL_OPEN,
  1962  			TeamId:      team.Id,
  1963  		}
  1964  		channel, nErr := ss.Channel().Save(channel, -1)
  1965  		require.Nil(t, nErr)
  1966  		defer func() { ss.Channel().PermanentDelete(channel.Id) }()
  1967  
  1968  		member := &model.ChannelMember{
  1969  			ChannelId:   channel.Id,
  1970  			UserId:      u1.Id,
  1971  			NotifyProps: defaultNotifyProps,
  1972  		}
  1973  		member, err = ss.Channel().SaveMember(member)
  1974  		require.Nil(t, err)
  1975  
  1976  		testCases := []struct {
  1977  			Name                  string
  1978  			SchemeGuest           bool
  1979  			SchemeUser            bool
  1980  			SchemeAdmin           bool
  1981  			ExplicitRoles         string
  1982  			ExpectedRoles         string
  1983  			ExpectedExplicitRoles string
  1984  			ExpectedSchemeGuest   bool
  1985  			ExpectedSchemeUser    bool
  1986  			ExpectedSchemeAdmin   bool
  1987  		}{
  1988  			{
  1989  				Name:               "channel user implicit",
  1990  				SchemeUser:         true,
  1991  				ExpectedRoles:      "channel_user",
  1992  				ExpectedSchemeUser: true,
  1993  			},
  1994  			{
  1995  				Name:               "channel user explicit",
  1996  				ExplicitRoles:      "channel_user",
  1997  				ExpectedRoles:      "channel_user",
  1998  				ExpectedSchemeUser: true,
  1999  			},
  2000  			{
  2001  				Name:                "channel guest implicit",
  2002  				SchemeGuest:         true,
  2003  				ExpectedRoles:       "channel_guest",
  2004  				ExpectedSchemeGuest: true,
  2005  			},
  2006  			{
  2007  				Name:                "channel guest explicit",
  2008  				ExplicitRoles:       "channel_guest",
  2009  				ExpectedRoles:       "channel_guest",
  2010  				ExpectedSchemeGuest: true,
  2011  			},
  2012  			{
  2013  				Name:                "channel admin implicit",
  2014  				SchemeUser:          true,
  2015  				SchemeAdmin:         true,
  2016  				ExpectedRoles:       "channel_user channel_admin",
  2017  				ExpectedSchemeUser:  true,
  2018  				ExpectedSchemeAdmin: true,
  2019  			},
  2020  			{
  2021  				Name:                "channel admin explicit",
  2022  				ExplicitRoles:       "channel_user channel_admin",
  2023  				ExpectedRoles:       "channel_user channel_admin",
  2024  				ExpectedSchemeUser:  true,
  2025  				ExpectedSchemeAdmin: true,
  2026  			},
  2027  			{
  2028  				Name:                  "channel user implicit and explicit custom role",
  2029  				SchemeUser:            true,
  2030  				ExplicitRoles:         "test",
  2031  				ExpectedRoles:         "test channel_user",
  2032  				ExpectedExplicitRoles: "test",
  2033  				ExpectedSchemeUser:    true,
  2034  			},
  2035  			{
  2036  				Name:                  "channel user explicit and explicit custom role",
  2037  				ExplicitRoles:         "channel_user test",
  2038  				ExpectedRoles:         "test channel_user",
  2039  				ExpectedExplicitRoles: "test",
  2040  				ExpectedSchemeUser:    true,
  2041  			},
  2042  			{
  2043  				Name:                  "channel guest implicit and explicit custom role",
  2044  				SchemeGuest:           true,
  2045  				ExplicitRoles:         "test",
  2046  				ExpectedRoles:         "test channel_guest",
  2047  				ExpectedExplicitRoles: "test",
  2048  				ExpectedSchemeGuest:   true,
  2049  			},
  2050  			{
  2051  				Name:                  "channel guest explicit and explicit custom role",
  2052  				ExplicitRoles:         "channel_guest test",
  2053  				ExpectedRoles:         "test channel_guest",
  2054  				ExpectedExplicitRoles: "test",
  2055  				ExpectedSchemeGuest:   true,
  2056  			},
  2057  			{
  2058  				Name:                  "channel admin implicit and explicit custom role",
  2059  				SchemeUser:            true,
  2060  				SchemeAdmin:           true,
  2061  				ExplicitRoles:         "test",
  2062  				ExpectedRoles:         "test channel_user channel_admin",
  2063  				ExpectedExplicitRoles: "test",
  2064  				ExpectedSchemeUser:    true,
  2065  				ExpectedSchemeAdmin:   true,
  2066  			},
  2067  			{
  2068  				Name:                  "channel admin explicit and explicit custom role",
  2069  				ExplicitRoles:         "channel_user channel_admin test",
  2070  				ExpectedRoles:         "test channel_user channel_admin",
  2071  				ExpectedExplicitRoles: "test",
  2072  				ExpectedSchemeUser:    true,
  2073  				ExpectedSchemeAdmin:   true,
  2074  			},
  2075  			{
  2076  				Name:                  "channel member with only explicit custom roles",
  2077  				ExplicitRoles:         "test test2",
  2078  				ExpectedRoles:         "test test2",
  2079  				ExpectedExplicitRoles: "test test2",
  2080  			},
  2081  		}
  2082  
  2083  		for _, tc := range testCases {
  2084  			t.Run(tc.Name, func(t *testing.T) {
  2085  				member.SchemeGuest = tc.SchemeGuest
  2086  				member.SchemeUser = tc.SchemeUser
  2087  				member.SchemeAdmin = tc.SchemeAdmin
  2088  				member.ExplicitRoles = tc.ExplicitRoles
  2089  				member, err = ss.Channel().UpdateMember(member)
  2090  				require.Nil(t, err)
  2091  				assert.Equal(t, tc.ExpectedRoles, member.Roles)
  2092  				assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles)
  2093  				assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest)
  2094  				assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser)
  2095  				assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin)
  2096  			})
  2097  		}
  2098  	})
  2099  
  2100  	t.Run("insert member correctly (in channel without scheme and team with scheme)", func(t *testing.T) {
  2101  		ts := &model.Scheme{
  2102  			Name:        model.NewId(),
  2103  			DisplayName: model.NewId(),
  2104  			Description: model.NewId(),
  2105  			Scope:       model.SCHEME_SCOPE_TEAM,
  2106  		}
  2107  		ts, nErr := ss.Scheme().Save(ts)
  2108  		require.Nil(t, nErr)
  2109  
  2110  		team := &model.Team{
  2111  			DisplayName: "Name",
  2112  			Name:        "zz" + model.NewId(),
  2113  			Email:       MakeEmail(),
  2114  			Type:        model.TEAM_OPEN,
  2115  			SchemeId:    &ts.Id,
  2116  		}
  2117  
  2118  		team, err = ss.Team().Save(team)
  2119  		require.Nil(t, err)
  2120  
  2121  		channel := &model.Channel{
  2122  			DisplayName: "DisplayName",
  2123  			Name:        "z-z-z" + model.NewId() + "b",
  2124  			Type:        model.CHANNEL_OPEN,
  2125  			TeamId:      team.Id,
  2126  		}
  2127  		channel, nErr = ss.Channel().Save(channel, -1)
  2128  		require.Nil(t, nErr)
  2129  		defer func() { ss.Channel().PermanentDelete(channel.Id) }()
  2130  
  2131  		member := &model.ChannelMember{
  2132  			ChannelId:   channel.Id,
  2133  			UserId:      u1.Id,
  2134  			NotifyProps: defaultNotifyProps,
  2135  		}
  2136  		member, err = ss.Channel().SaveMember(member)
  2137  		require.Nil(t, err)
  2138  
  2139  		testCases := []struct {
  2140  			Name                  string
  2141  			SchemeGuest           bool
  2142  			SchemeUser            bool
  2143  			SchemeAdmin           bool
  2144  			ExplicitRoles         string
  2145  			ExpectedRoles         string
  2146  			ExpectedExplicitRoles string
  2147  			ExpectedSchemeGuest   bool
  2148  			ExpectedSchemeUser    bool
  2149  			ExpectedSchemeAdmin   bool
  2150  		}{
  2151  			{
  2152  				Name:               "channel user implicit",
  2153  				SchemeUser:         true,
  2154  				ExpectedRoles:      ts.DefaultChannelUserRole,
  2155  				ExpectedSchemeUser: true,
  2156  			},
  2157  			{
  2158  				Name:               "channel user explicit",
  2159  				ExplicitRoles:      "channel_user",
  2160  				ExpectedRoles:      ts.DefaultChannelUserRole,
  2161  				ExpectedSchemeUser: true,
  2162  			},
  2163  			{
  2164  				Name:                "channel guest implicit",
  2165  				SchemeGuest:         true,
  2166  				ExpectedRoles:       ts.DefaultChannelGuestRole,
  2167  				ExpectedSchemeGuest: true,
  2168  			},
  2169  			{
  2170  				Name:                "channel guest explicit",
  2171  				ExplicitRoles:       "channel_guest",
  2172  				ExpectedRoles:       ts.DefaultChannelGuestRole,
  2173  				ExpectedSchemeGuest: true,
  2174  			},
  2175  			{
  2176  				Name:                "channel admin implicit",
  2177  				SchemeUser:          true,
  2178  				SchemeAdmin:         true,
  2179  				ExpectedRoles:       ts.DefaultChannelUserRole + " " + ts.DefaultChannelAdminRole,
  2180  				ExpectedSchemeUser:  true,
  2181  				ExpectedSchemeAdmin: true,
  2182  			},
  2183  			{
  2184  				Name:                "channel admin explicit",
  2185  				ExplicitRoles:       "channel_user channel_admin",
  2186  				ExpectedRoles:       ts.DefaultChannelUserRole + " " + ts.DefaultChannelAdminRole,
  2187  				ExpectedSchemeUser:  true,
  2188  				ExpectedSchemeAdmin: true,
  2189  			},
  2190  			{
  2191  				Name:                  "channel user implicit and explicit custom role",
  2192  				SchemeUser:            true,
  2193  				ExplicitRoles:         "test",
  2194  				ExpectedRoles:         "test " + ts.DefaultChannelUserRole,
  2195  				ExpectedExplicitRoles: "test",
  2196  				ExpectedSchemeUser:    true,
  2197  			},
  2198  			{
  2199  				Name:                  "channel user explicit and explicit custom role",
  2200  				ExplicitRoles:         "channel_user test",
  2201  				ExpectedRoles:         "test " + ts.DefaultChannelUserRole,
  2202  				ExpectedExplicitRoles: "test",
  2203  				ExpectedSchemeUser:    true,
  2204  			},
  2205  			{
  2206  				Name:                  "channel guest implicit and explicit custom role",
  2207  				SchemeGuest:           true,
  2208  				ExplicitRoles:         "test",
  2209  				ExpectedRoles:         "test " + ts.DefaultChannelGuestRole,
  2210  				ExpectedExplicitRoles: "test",
  2211  				ExpectedSchemeGuest:   true,
  2212  			},
  2213  			{
  2214  				Name:                  "channel guest explicit and explicit custom role",
  2215  				ExplicitRoles:         "channel_guest test",
  2216  				ExpectedRoles:         "test " + ts.DefaultChannelGuestRole,
  2217  				ExpectedExplicitRoles: "test",
  2218  				ExpectedSchemeGuest:   true,
  2219  			},
  2220  			{
  2221  				Name:                  "channel admin implicit and explicit custom role",
  2222  				SchemeUser:            true,
  2223  				SchemeAdmin:           true,
  2224  				ExplicitRoles:         "test",
  2225  				ExpectedRoles:         "test " + ts.DefaultChannelUserRole + " " + ts.DefaultChannelAdminRole,
  2226  				ExpectedExplicitRoles: "test",
  2227  				ExpectedSchemeUser:    true,
  2228  				ExpectedSchemeAdmin:   true,
  2229  			},
  2230  			{
  2231  				Name:                  "channel admin explicit and explicit custom role",
  2232  				ExplicitRoles:         "channel_user channel_admin test",
  2233  				ExpectedRoles:         "test " + ts.DefaultChannelUserRole + " " + ts.DefaultChannelAdminRole,
  2234  				ExpectedExplicitRoles: "test",
  2235  				ExpectedSchemeUser:    true,
  2236  				ExpectedSchemeAdmin:   true,
  2237  			},
  2238  			{
  2239  				Name:                  "channel member with only explicit custom roles",
  2240  				ExplicitRoles:         "test test2",
  2241  				ExpectedRoles:         "test test2",
  2242  				ExpectedExplicitRoles: "test test2",
  2243  			},
  2244  		}
  2245  
  2246  		for _, tc := range testCases {
  2247  			t.Run(tc.Name, func(t *testing.T) {
  2248  				member.SchemeGuest = tc.SchemeGuest
  2249  				member.SchemeUser = tc.SchemeUser
  2250  				member.SchemeAdmin = tc.SchemeAdmin
  2251  				member.ExplicitRoles = tc.ExplicitRoles
  2252  				member, err = ss.Channel().UpdateMember(member)
  2253  				require.Nil(t, err)
  2254  				assert.Equal(t, tc.ExpectedRoles, member.Roles)
  2255  				assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles)
  2256  				assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest)
  2257  				assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser)
  2258  				assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin)
  2259  			})
  2260  		}
  2261  	})
  2262  
  2263  	t.Run("insert member correctly (in channel with channel scheme)", func(t *testing.T) {
  2264  		cs := &model.Scheme{
  2265  			Name:        model.NewId(),
  2266  			DisplayName: model.NewId(),
  2267  			Description: model.NewId(),
  2268  			Scope:       model.SCHEME_SCOPE_CHANNEL,
  2269  		}
  2270  		cs, nErr := ss.Scheme().Save(cs)
  2271  		require.Nil(t, nErr)
  2272  
  2273  		team := &model.Team{
  2274  			DisplayName: "Name",
  2275  			Name:        "zz" + model.NewId(),
  2276  			Email:       MakeEmail(),
  2277  			Type:        model.TEAM_OPEN,
  2278  		}
  2279  
  2280  		team, err = ss.Team().Save(team)
  2281  		require.Nil(t, err)
  2282  
  2283  		channel, nErr := ss.Channel().Save(&model.Channel{
  2284  			DisplayName: "DisplayName",
  2285  			Name:        "z-z-z" + model.NewId() + "b",
  2286  			Type:        model.CHANNEL_OPEN,
  2287  			TeamId:      team.Id,
  2288  			SchemeId:    &cs.Id,
  2289  		}, -1)
  2290  		require.Nil(t, nErr)
  2291  		defer func() { ss.Channel().PermanentDelete(channel.Id) }()
  2292  
  2293  		member := &model.ChannelMember{
  2294  			ChannelId:   channel.Id,
  2295  			UserId:      u1.Id,
  2296  			NotifyProps: defaultNotifyProps,
  2297  		}
  2298  		member, err = ss.Channel().SaveMember(member)
  2299  		require.Nil(t, err)
  2300  
  2301  		testCases := []struct {
  2302  			Name                  string
  2303  			SchemeGuest           bool
  2304  			SchemeUser            bool
  2305  			SchemeAdmin           bool
  2306  			ExplicitRoles         string
  2307  			ExpectedRoles         string
  2308  			ExpectedExplicitRoles string
  2309  			ExpectedSchemeGuest   bool
  2310  			ExpectedSchemeUser    bool
  2311  			ExpectedSchemeAdmin   bool
  2312  		}{
  2313  			{
  2314  				Name:               "channel user implicit",
  2315  				SchemeUser:         true,
  2316  				ExpectedRoles:      cs.DefaultChannelUserRole,
  2317  				ExpectedSchemeUser: true,
  2318  			},
  2319  			{
  2320  				Name:               "channel user explicit",
  2321  				ExplicitRoles:      "channel_user",
  2322  				ExpectedRoles:      cs.DefaultChannelUserRole,
  2323  				ExpectedSchemeUser: true,
  2324  			},
  2325  			{
  2326  				Name:                "channel guest implicit",
  2327  				SchemeGuest:         true,
  2328  				ExpectedRoles:       cs.DefaultChannelGuestRole,
  2329  				ExpectedSchemeGuest: true,
  2330  			},
  2331  			{
  2332  				Name:                "channel guest explicit",
  2333  				ExplicitRoles:       "channel_guest",
  2334  				ExpectedRoles:       cs.DefaultChannelGuestRole,
  2335  				ExpectedSchemeGuest: true,
  2336  			},
  2337  			{
  2338  				Name:                "channel admin implicit",
  2339  				SchemeUser:          true,
  2340  				SchemeAdmin:         true,
  2341  				ExpectedRoles:       cs.DefaultChannelUserRole + " " + cs.DefaultChannelAdminRole,
  2342  				ExpectedSchemeUser:  true,
  2343  				ExpectedSchemeAdmin: true,
  2344  			},
  2345  			{
  2346  				Name:                "channel admin explicit",
  2347  				ExplicitRoles:       "channel_user channel_admin",
  2348  				ExpectedRoles:       cs.DefaultChannelUserRole + " " + cs.DefaultChannelAdminRole,
  2349  				ExpectedSchemeUser:  true,
  2350  				ExpectedSchemeAdmin: true,
  2351  			},
  2352  			{
  2353  				Name:                  "channel user implicit and explicit custom role",
  2354  				SchemeUser:            true,
  2355  				ExplicitRoles:         "test",
  2356  				ExpectedRoles:         "test " + cs.DefaultChannelUserRole,
  2357  				ExpectedExplicitRoles: "test",
  2358  				ExpectedSchemeUser:    true,
  2359  			},
  2360  			{
  2361  				Name:                  "channel user explicit and explicit custom role",
  2362  				ExplicitRoles:         "channel_user test",
  2363  				ExpectedRoles:         "test " + cs.DefaultChannelUserRole,
  2364  				ExpectedExplicitRoles: "test",
  2365  				ExpectedSchemeUser:    true,
  2366  			},
  2367  			{
  2368  				Name:                  "channel guest implicit and explicit custom role",
  2369  				SchemeGuest:           true,
  2370  				ExplicitRoles:         "test",
  2371  				ExpectedRoles:         "test " + cs.DefaultChannelGuestRole,
  2372  				ExpectedExplicitRoles: "test",
  2373  				ExpectedSchemeGuest:   true,
  2374  			},
  2375  			{
  2376  				Name:                  "channel guest explicit and explicit custom role",
  2377  				ExplicitRoles:         "channel_guest test",
  2378  				ExpectedRoles:         "test " + cs.DefaultChannelGuestRole,
  2379  				ExpectedExplicitRoles: "test",
  2380  				ExpectedSchemeGuest:   true,
  2381  			},
  2382  			{
  2383  				Name:                  "channel admin implicit and explicit custom role",
  2384  				SchemeUser:            true,
  2385  				SchemeAdmin:           true,
  2386  				ExplicitRoles:         "test",
  2387  				ExpectedRoles:         "test " + cs.DefaultChannelUserRole + " " + cs.DefaultChannelAdminRole,
  2388  				ExpectedExplicitRoles: "test",
  2389  				ExpectedSchemeUser:    true,
  2390  				ExpectedSchemeAdmin:   true,
  2391  			},
  2392  			{
  2393  				Name:                  "channel admin explicit and explicit custom role",
  2394  				ExplicitRoles:         "channel_user channel_admin test",
  2395  				ExpectedRoles:         "test " + cs.DefaultChannelUserRole + " " + cs.DefaultChannelAdminRole,
  2396  				ExpectedExplicitRoles: "test",
  2397  				ExpectedSchemeUser:    true,
  2398  				ExpectedSchemeAdmin:   true,
  2399  			},
  2400  			{
  2401  				Name:                  "channel member with only explicit custom roles",
  2402  				ExplicitRoles:         "test test2",
  2403  				ExpectedRoles:         "test test2",
  2404  				ExpectedExplicitRoles: "test test2",
  2405  			},
  2406  		}
  2407  
  2408  		for _, tc := range testCases {
  2409  			t.Run(tc.Name, func(t *testing.T) {
  2410  				member.SchemeGuest = tc.SchemeGuest
  2411  				member.SchemeUser = tc.SchemeUser
  2412  				member.SchemeAdmin = tc.SchemeAdmin
  2413  				member.ExplicitRoles = tc.ExplicitRoles
  2414  				member, err = ss.Channel().UpdateMember(member)
  2415  				require.Nil(t, err)
  2416  				assert.Equal(t, tc.ExpectedRoles, member.Roles)
  2417  				assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles)
  2418  				assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest)
  2419  				assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser)
  2420  				assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin)
  2421  			})
  2422  		}
  2423  	})
  2424  }
  2425  
  2426  func testChannelUpdateMultipleMembers(t *testing.T, ss store.Store) {
  2427  	u1, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  2428  	require.Nil(t, err)
  2429  	u2, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  2430  	require.Nil(t, err)
  2431  	defaultNotifyProps := model.GetDefaultChannelNotifyProps()
  2432  
  2433  	t.Run("any not valid channel member", func(t *testing.T) {
  2434  		m1 := &model.ChannelMember{ChannelId: "wrong", UserId: u1.Id, NotifyProps: defaultNotifyProps}
  2435  		m2 := &model.ChannelMember{ChannelId: model.NewId(), UserId: u2.Id, NotifyProps: defaultNotifyProps}
  2436  		_, err = ss.Channel().SaveMultipleMembers([]*model.ChannelMember{m1, m2})
  2437  		require.NotNil(t, err)
  2438  		require.Equal(t, "model.channel_member.is_valid.channel_id.app_error", err.Id)
  2439  	})
  2440  
  2441  	t.Run("duplicated entries should fail", func(t *testing.T) {
  2442  		channelID1 := model.NewId()
  2443  		m1 := &model.ChannelMember{ChannelId: channelID1, UserId: u1.Id, NotifyProps: defaultNotifyProps}
  2444  		m2 := &model.ChannelMember{ChannelId: channelID1, UserId: u1.Id, NotifyProps: defaultNotifyProps}
  2445  		_, err = ss.Channel().SaveMultipleMembers([]*model.ChannelMember{m1, m2})
  2446  		require.NotNil(t, err)
  2447  		require.Equal(t, "store.sql_channel.save_member.exists.app_error", err.Id)
  2448  	})
  2449  
  2450  	t.Run("insert members correctly (in channel without channel scheme and team without scheme)", func(t *testing.T) {
  2451  		team := &model.Team{
  2452  			DisplayName: "Name",
  2453  			Name:        "zz" + model.NewId(),
  2454  			Email:       MakeEmail(),
  2455  			Type:        model.TEAM_OPEN,
  2456  		}
  2457  
  2458  		team, err = ss.Team().Save(team)
  2459  		require.Nil(t, err)
  2460  
  2461  		channel := &model.Channel{
  2462  			DisplayName: "DisplayName",
  2463  			Name:        "z-z-z" + model.NewId() + "b",
  2464  			Type:        model.CHANNEL_OPEN,
  2465  			TeamId:      team.Id,
  2466  		}
  2467  		channel, nErr := ss.Channel().Save(channel, -1)
  2468  		require.Nil(t, nErr)
  2469  		defer func() { ss.Channel().PermanentDelete(channel.Id) }()
  2470  
  2471  		member := &model.ChannelMember{ChannelId: channel.Id, UserId: u1.Id, NotifyProps: defaultNotifyProps}
  2472  		otherMember := &model.ChannelMember{ChannelId: channel.Id, UserId: u2.Id, NotifyProps: defaultNotifyProps}
  2473  		var members []*model.ChannelMember
  2474  		members, err = ss.Channel().SaveMultipleMembers([]*model.ChannelMember{member, otherMember})
  2475  		require.Nil(t, err)
  2476  		defer ss.Channel().RemoveMember(channel.Id, u1.Id)
  2477  		defer ss.Channel().RemoveMember(channel.Id, u2.Id)
  2478  		require.Len(t, members, 2)
  2479  		member = members[0]
  2480  		otherMember = members[1]
  2481  
  2482  		testCases := []struct {
  2483  			Name                  string
  2484  			SchemeGuest           bool
  2485  			SchemeUser            bool
  2486  			SchemeAdmin           bool
  2487  			ExplicitRoles         string
  2488  			ExpectedRoles         string
  2489  			ExpectedExplicitRoles string
  2490  			ExpectedSchemeGuest   bool
  2491  			ExpectedSchemeUser    bool
  2492  			ExpectedSchemeAdmin   bool
  2493  		}{
  2494  			{
  2495  				Name:               "channel user implicit",
  2496  				SchemeUser:         true,
  2497  				ExpectedRoles:      "channel_user",
  2498  				ExpectedSchemeUser: true,
  2499  			},
  2500  			{
  2501  				Name:               "channel user explicit",
  2502  				ExplicitRoles:      "channel_user",
  2503  				ExpectedRoles:      "channel_user",
  2504  				ExpectedSchemeUser: true,
  2505  			},
  2506  			{
  2507  				Name:                "channel guest implicit",
  2508  				SchemeGuest:         true,
  2509  				ExpectedRoles:       "channel_guest",
  2510  				ExpectedSchemeGuest: true,
  2511  			},
  2512  			{
  2513  				Name:                "channel guest explicit",
  2514  				ExplicitRoles:       "channel_guest",
  2515  				ExpectedRoles:       "channel_guest",
  2516  				ExpectedSchemeGuest: true,
  2517  			},
  2518  			{
  2519  				Name:                "channel admin implicit",
  2520  				SchemeUser:          true,
  2521  				SchemeAdmin:         true,
  2522  				ExpectedRoles:       "channel_user channel_admin",
  2523  				ExpectedSchemeUser:  true,
  2524  				ExpectedSchemeAdmin: true,
  2525  			},
  2526  			{
  2527  				Name:                "channel admin explicit",
  2528  				ExplicitRoles:       "channel_user channel_admin",
  2529  				ExpectedRoles:       "channel_user channel_admin",
  2530  				ExpectedSchemeUser:  true,
  2531  				ExpectedSchemeAdmin: true,
  2532  			},
  2533  			{
  2534  				Name:                  "channel user implicit and explicit custom role",
  2535  				SchemeUser:            true,
  2536  				ExplicitRoles:         "test",
  2537  				ExpectedRoles:         "test channel_user",
  2538  				ExpectedExplicitRoles: "test",
  2539  				ExpectedSchemeUser:    true,
  2540  			},
  2541  			{
  2542  				Name:                  "channel user explicit and explicit custom role",
  2543  				ExplicitRoles:         "channel_user test",
  2544  				ExpectedRoles:         "test channel_user",
  2545  				ExpectedExplicitRoles: "test",
  2546  				ExpectedSchemeUser:    true,
  2547  			},
  2548  			{
  2549  				Name:                  "channel guest implicit and explicit custom role",
  2550  				SchemeGuest:           true,
  2551  				ExplicitRoles:         "test",
  2552  				ExpectedRoles:         "test channel_guest",
  2553  				ExpectedExplicitRoles: "test",
  2554  				ExpectedSchemeGuest:   true,
  2555  			},
  2556  			{
  2557  				Name:                  "channel guest explicit and explicit custom role",
  2558  				ExplicitRoles:         "channel_guest test",
  2559  				ExpectedRoles:         "test channel_guest",
  2560  				ExpectedExplicitRoles: "test",
  2561  				ExpectedSchemeGuest:   true,
  2562  			},
  2563  			{
  2564  				Name:                  "channel admin implicit and explicit custom role",
  2565  				SchemeUser:            true,
  2566  				SchemeAdmin:           true,
  2567  				ExplicitRoles:         "test",
  2568  				ExpectedRoles:         "test channel_user channel_admin",
  2569  				ExpectedExplicitRoles: "test",
  2570  				ExpectedSchemeUser:    true,
  2571  				ExpectedSchemeAdmin:   true,
  2572  			},
  2573  			{
  2574  				Name:                  "channel admin explicit and explicit custom role",
  2575  				ExplicitRoles:         "channel_user channel_admin test",
  2576  				ExpectedRoles:         "test channel_user channel_admin",
  2577  				ExpectedExplicitRoles: "test",
  2578  				ExpectedSchemeUser:    true,
  2579  				ExpectedSchemeAdmin:   true,
  2580  			},
  2581  			{
  2582  				Name:                  "channel member with only explicit custom roles",
  2583  				ExplicitRoles:         "test test2",
  2584  				ExpectedRoles:         "test test2",
  2585  				ExpectedExplicitRoles: "test test2",
  2586  			},
  2587  		}
  2588  
  2589  		for _, tc := range testCases {
  2590  			t.Run(tc.Name, func(t *testing.T) {
  2591  				member.SchemeGuest = tc.SchemeGuest
  2592  				member.SchemeUser = tc.SchemeUser
  2593  				member.SchemeAdmin = tc.SchemeAdmin
  2594  				member.ExplicitRoles = tc.ExplicitRoles
  2595  				var members []*model.ChannelMember
  2596  				members, err = ss.Channel().UpdateMultipleMembers([]*model.ChannelMember{member, otherMember})
  2597  				require.Nil(t, err)
  2598  				require.Len(t, members, 2)
  2599  				member = members[0]
  2600  
  2601  				assert.Equal(t, tc.ExpectedRoles, member.Roles)
  2602  				assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles)
  2603  				assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest)
  2604  				assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser)
  2605  				assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin)
  2606  			})
  2607  		}
  2608  	})
  2609  
  2610  	t.Run("insert members correctly (in channel without scheme and team with scheme)", func(t *testing.T) {
  2611  		ts := &model.Scheme{
  2612  			Name:        model.NewId(),
  2613  			DisplayName: model.NewId(),
  2614  			Description: model.NewId(),
  2615  			Scope:       model.SCHEME_SCOPE_TEAM,
  2616  		}
  2617  		ts, nErr := ss.Scheme().Save(ts)
  2618  		require.Nil(t, nErr)
  2619  
  2620  		team := &model.Team{
  2621  			DisplayName: "Name",
  2622  			Name:        "zz" + model.NewId(),
  2623  			Email:       MakeEmail(),
  2624  			Type:        model.TEAM_OPEN,
  2625  			SchemeId:    &ts.Id,
  2626  		}
  2627  
  2628  		team, err = ss.Team().Save(team)
  2629  		require.Nil(t, err)
  2630  
  2631  		channel := &model.Channel{
  2632  			DisplayName: "DisplayName",
  2633  			Name:        "z-z-z" + model.NewId() + "b",
  2634  			Type:        model.CHANNEL_OPEN,
  2635  			TeamId:      team.Id,
  2636  		}
  2637  		channel, nErr = ss.Channel().Save(channel, -1)
  2638  		require.Nil(t, nErr)
  2639  		defer func() { ss.Channel().PermanentDelete(channel.Id) }()
  2640  
  2641  		member := &model.ChannelMember{ChannelId: channel.Id, UserId: u1.Id, NotifyProps: defaultNotifyProps}
  2642  		otherMember := &model.ChannelMember{ChannelId: channel.Id, UserId: u2.Id, NotifyProps: defaultNotifyProps}
  2643  		var members []*model.ChannelMember
  2644  		members, err = ss.Channel().SaveMultipleMembers([]*model.ChannelMember{member, otherMember})
  2645  		require.Nil(t, err)
  2646  		defer ss.Channel().RemoveMember(channel.Id, u1.Id)
  2647  		defer ss.Channel().RemoveMember(channel.Id, u2.Id)
  2648  		require.Len(t, members, 2)
  2649  		member = members[0]
  2650  		otherMember = members[1]
  2651  
  2652  		testCases := []struct {
  2653  			Name                  string
  2654  			SchemeGuest           bool
  2655  			SchemeUser            bool
  2656  			SchemeAdmin           bool
  2657  			ExplicitRoles         string
  2658  			ExpectedRoles         string
  2659  			ExpectedExplicitRoles string
  2660  			ExpectedSchemeGuest   bool
  2661  			ExpectedSchemeUser    bool
  2662  			ExpectedSchemeAdmin   bool
  2663  		}{
  2664  			{
  2665  				Name:               "channel user implicit",
  2666  				SchemeUser:         true,
  2667  				ExpectedRoles:      ts.DefaultChannelUserRole,
  2668  				ExpectedSchemeUser: true,
  2669  			},
  2670  			{
  2671  				Name:               "channel user explicit",
  2672  				ExplicitRoles:      "channel_user",
  2673  				ExpectedRoles:      ts.DefaultChannelUserRole,
  2674  				ExpectedSchemeUser: true,
  2675  			},
  2676  			{
  2677  				Name:                "channel guest implicit",
  2678  				SchemeGuest:         true,
  2679  				ExpectedRoles:       ts.DefaultChannelGuestRole,
  2680  				ExpectedSchemeGuest: true,
  2681  			},
  2682  			{
  2683  				Name:                "channel guest explicit",
  2684  				ExplicitRoles:       "channel_guest",
  2685  				ExpectedRoles:       ts.DefaultChannelGuestRole,
  2686  				ExpectedSchemeGuest: true,
  2687  			},
  2688  			{
  2689  				Name:                "channel admin implicit",
  2690  				SchemeUser:          true,
  2691  				SchemeAdmin:         true,
  2692  				ExpectedRoles:       ts.DefaultChannelUserRole + " " + ts.DefaultChannelAdminRole,
  2693  				ExpectedSchemeUser:  true,
  2694  				ExpectedSchemeAdmin: true,
  2695  			},
  2696  			{
  2697  				Name:                "channel admin explicit",
  2698  				ExplicitRoles:       "channel_user channel_admin",
  2699  				ExpectedRoles:       ts.DefaultChannelUserRole + " " + ts.DefaultChannelAdminRole,
  2700  				ExpectedSchemeUser:  true,
  2701  				ExpectedSchemeAdmin: true,
  2702  			},
  2703  			{
  2704  				Name:                  "channel user implicit and explicit custom role",
  2705  				SchemeUser:            true,
  2706  				ExplicitRoles:         "test",
  2707  				ExpectedRoles:         "test " + ts.DefaultChannelUserRole,
  2708  				ExpectedExplicitRoles: "test",
  2709  				ExpectedSchemeUser:    true,
  2710  			},
  2711  			{
  2712  				Name:                  "channel user explicit and explicit custom role",
  2713  				ExplicitRoles:         "channel_user test",
  2714  				ExpectedRoles:         "test " + ts.DefaultChannelUserRole,
  2715  				ExpectedExplicitRoles: "test",
  2716  				ExpectedSchemeUser:    true,
  2717  			},
  2718  			{
  2719  				Name:                  "channel guest implicit and explicit custom role",
  2720  				SchemeGuest:           true,
  2721  				ExplicitRoles:         "test",
  2722  				ExpectedRoles:         "test " + ts.DefaultChannelGuestRole,
  2723  				ExpectedExplicitRoles: "test",
  2724  				ExpectedSchemeGuest:   true,
  2725  			},
  2726  			{
  2727  				Name:                  "channel guest explicit and explicit custom role",
  2728  				ExplicitRoles:         "channel_guest test",
  2729  				ExpectedRoles:         "test " + ts.DefaultChannelGuestRole,
  2730  				ExpectedExplicitRoles: "test",
  2731  				ExpectedSchemeGuest:   true,
  2732  			},
  2733  			{
  2734  				Name:                  "channel admin implicit and explicit custom role",
  2735  				SchemeUser:            true,
  2736  				SchemeAdmin:           true,
  2737  				ExplicitRoles:         "test",
  2738  				ExpectedRoles:         "test " + ts.DefaultChannelUserRole + " " + ts.DefaultChannelAdminRole,
  2739  				ExpectedExplicitRoles: "test",
  2740  				ExpectedSchemeUser:    true,
  2741  				ExpectedSchemeAdmin:   true,
  2742  			},
  2743  			{
  2744  				Name:                  "channel admin explicit and explicit custom role",
  2745  				ExplicitRoles:         "channel_user channel_admin test",
  2746  				ExpectedRoles:         "test " + ts.DefaultChannelUserRole + " " + ts.DefaultChannelAdminRole,
  2747  				ExpectedExplicitRoles: "test",
  2748  				ExpectedSchemeUser:    true,
  2749  				ExpectedSchemeAdmin:   true,
  2750  			},
  2751  			{
  2752  				Name:                  "channel member with only explicit custom roles",
  2753  				ExplicitRoles:         "test test2",
  2754  				ExpectedRoles:         "test test2",
  2755  				ExpectedExplicitRoles: "test test2",
  2756  			},
  2757  		}
  2758  
  2759  		for _, tc := range testCases {
  2760  			t.Run(tc.Name, func(t *testing.T) {
  2761  				member.SchemeGuest = tc.SchemeGuest
  2762  				member.SchemeUser = tc.SchemeUser
  2763  				member.SchemeAdmin = tc.SchemeAdmin
  2764  				member.ExplicitRoles = tc.ExplicitRoles
  2765  				var members []*model.ChannelMember
  2766  				members, err = ss.Channel().UpdateMultipleMembers([]*model.ChannelMember{member, otherMember})
  2767  				require.Nil(t, err)
  2768  				require.Len(t, members, 2)
  2769  				member = members[0]
  2770  
  2771  				assert.Equal(t, tc.ExpectedRoles, member.Roles)
  2772  				assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles)
  2773  				assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest)
  2774  				assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser)
  2775  				assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin)
  2776  			})
  2777  		}
  2778  	})
  2779  
  2780  	t.Run("insert members correctly (in channel with channel scheme)", func(t *testing.T) {
  2781  		cs := &model.Scheme{
  2782  			Name:        model.NewId(),
  2783  			DisplayName: model.NewId(),
  2784  			Description: model.NewId(),
  2785  			Scope:       model.SCHEME_SCOPE_CHANNEL,
  2786  		}
  2787  		cs, nErr := ss.Scheme().Save(cs)
  2788  		require.Nil(t, nErr)
  2789  
  2790  		team := &model.Team{
  2791  			DisplayName: "Name",
  2792  			Name:        "zz" + model.NewId(),
  2793  			Email:       MakeEmail(),
  2794  			Type:        model.TEAM_OPEN,
  2795  		}
  2796  
  2797  		team, err = ss.Team().Save(team)
  2798  		require.Nil(t, err)
  2799  
  2800  		channel, nErr := ss.Channel().Save(&model.Channel{
  2801  			DisplayName: "DisplayName",
  2802  			Name:        "z-z-z" + model.NewId() + "b",
  2803  			Type:        model.CHANNEL_OPEN,
  2804  			TeamId:      team.Id,
  2805  			SchemeId:    &cs.Id,
  2806  		}, -1)
  2807  		require.Nil(t, nErr)
  2808  		defer func() { ss.Channel().PermanentDelete(channel.Id) }()
  2809  
  2810  		member := &model.ChannelMember{ChannelId: channel.Id, UserId: u1.Id, NotifyProps: defaultNotifyProps}
  2811  		otherMember := &model.ChannelMember{ChannelId: channel.Id, UserId: u2.Id, NotifyProps: defaultNotifyProps}
  2812  		members, err := ss.Channel().SaveMultipleMembers([]*model.ChannelMember{member, otherMember})
  2813  		require.Nil(t, err)
  2814  		defer ss.Channel().RemoveMember(channel.Id, u1.Id)
  2815  		defer ss.Channel().RemoveMember(channel.Id, u2.Id)
  2816  		require.Len(t, members, 2)
  2817  		member = members[0]
  2818  		otherMember = members[1]
  2819  
  2820  		testCases := []struct {
  2821  			Name                  string
  2822  			SchemeGuest           bool
  2823  			SchemeUser            bool
  2824  			SchemeAdmin           bool
  2825  			ExplicitRoles         string
  2826  			ExpectedRoles         string
  2827  			ExpectedExplicitRoles string
  2828  			ExpectedSchemeGuest   bool
  2829  			ExpectedSchemeUser    bool
  2830  			ExpectedSchemeAdmin   bool
  2831  		}{
  2832  			{
  2833  				Name:               "channel user implicit",
  2834  				SchemeUser:         true,
  2835  				ExpectedRoles:      cs.DefaultChannelUserRole,
  2836  				ExpectedSchemeUser: true,
  2837  			},
  2838  			{
  2839  				Name:               "channel user explicit",
  2840  				ExplicitRoles:      "channel_user",
  2841  				ExpectedRoles:      cs.DefaultChannelUserRole,
  2842  				ExpectedSchemeUser: true,
  2843  			},
  2844  			{
  2845  				Name:                "channel guest implicit",
  2846  				SchemeGuest:         true,
  2847  				ExpectedRoles:       cs.DefaultChannelGuestRole,
  2848  				ExpectedSchemeGuest: true,
  2849  			},
  2850  			{
  2851  				Name:                "channel guest explicit",
  2852  				ExplicitRoles:       "channel_guest",
  2853  				ExpectedRoles:       cs.DefaultChannelGuestRole,
  2854  				ExpectedSchemeGuest: true,
  2855  			},
  2856  			{
  2857  				Name:                "channel admin implicit",
  2858  				SchemeUser:          true,
  2859  				SchemeAdmin:         true,
  2860  				ExpectedRoles:       cs.DefaultChannelUserRole + " " + cs.DefaultChannelAdminRole,
  2861  				ExpectedSchemeUser:  true,
  2862  				ExpectedSchemeAdmin: true,
  2863  			},
  2864  			{
  2865  				Name:                "channel admin explicit",
  2866  				ExplicitRoles:       "channel_user channel_admin",
  2867  				ExpectedRoles:       cs.DefaultChannelUserRole + " " + cs.DefaultChannelAdminRole,
  2868  				ExpectedSchemeUser:  true,
  2869  				ExpectedSchemeAdmin: true,
  2870  			},
  2871  			{
  2872  				Name:                  "channel user implicit and explicit custom role",
  2873  				SchemeUser:            true,
  2874  				ExplicitRoles:         "test",
  2875  				ExpectedRoles:         "test " + cs.DefaultChannelUserRole,
  2876  				ExpectedExplicitRoles: "test",
  2877  				ExpectedSchemeUser:    true,
  2878  			},
  2879  			{
  2880  				Name:                  "channel user explicit and explicit custom role",
  2881  				ExplicitRoles:         "channel_user test",
  2882  				ExpectedRoles:         "test " + cs.DefaultChannelUserRole,
  2883  				ExpectedExplicitRoles: "test",
  2884  				ExpectedSchemeUser:    true,
  2885  			},
  2886  			{
  2887  				Name:                  "channel guest implicit and explicit custom role",
  2888  				SchemeGuest:           true,
  2889  				ExplicitRoles:         "test",
  2890  				ExpectedRoles:         "test " + cs.DefaultChannelGuestRole,
  2891  				ExpectedExplicitRoles: "test",
  2892  				ExpectedSchemeGuest:   true,
  2893  			},
  2894  			{
  2895  				Name:                  "channel guest explicit and explicit custom role",
  2896  				ExplicitRoles:         "channel_guest test",
  2897  				ExpectedRoles:         "test " + cs.DefaultChannelGuestRole,
  2898  				ExpectedExplicitRoles: "test",
  2899  				ExpectedSchemeGuest:   true,
  2900  			},
  2901  			{
  2902  				Name:                  "channel admin implicit and explicit custom role",
  2903  				SchemeUser:            true,
  2904  				SchemeAdmin:           true,
  2905  				ExplicitRoles:         "test",
  2906  				ExpectedRoles:         "test " + cs.DefaultChannelUserRole + " " + cs.DefaultChannelAdminRole,
  2907  				ExpectedExplicitRoles: "test",
  2908  				ExpectedSchemeUser:    true,
  2909  				ExpectedSchemeAdmin:   true,
  2910  			},
  2911  			{
  2912  				Name:                  "channel admin explicit and explicit custom role",
  2913  				ExplicitRoles:         "channel_user channel_admin test",
  2914  				ExpectedRoles:         "test " + cs.DefaultChannelUserRole + " " + cs.DefaultChannelAdminRole,
  2915  				ExpectedExplicitRoles: "test",
  2916  				ExpectedSchemeUser:    true,
  2917  				ExpectedSchemeAdmin:   true,
  2918  			},
  2919  			{
  2920  				Name:                  "channel member with only explicit custom roles",
  2921  				ExplicitRoles:         "test test2",
  2922  				ExpectedRoles:         "test test2",
  2923  				ExpectedExplicitRoles: "test test2",
  2924  			},
  2925  		}
  2926  
  2927  		for _, tc := range testCases {
  2928  			t.Run(tc.Name, func(t *testing.T) {
  2929  				member.SchemeGuest = tc.SchemeGuest
  2930  				member.SchemeUser = tc.SchemeUser
  2931  				member.SchemeAdmin = tc.SchemeAdmin
  2932  				member.ExplicitRoles = tc.ExplicitRoles
  2933  				members, err := ss.Channel().UpdateMultipleMembers([]*model.ChannelMember{member, otherMember})
  2934  				require.Nil(t, err)
  2935  				require.Len(t, members, 2)
  2936  				member = members[0]
  2937  
  2938  				assert.Equal(t, tc.ExpectedRoles, member.Roles)
  2939  				assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles)
  2940  				assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest)
  2941  				assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser)
  2942  				assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin)
  2943  			})
  2944  		}
  2945  	})
  2946  }
  2947  
  2948  func testChannelRemoveMember(t *testing.T, ss store.Store) {
  2949  	u1, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  2950  	require.Nil(t, err)
  2951  	u2, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  2952  	require.Nil(t, err)
  2953  	u3, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  2954  	require.Nil(t, err)
  2955  	u4, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  2956  	require.Nil(t, err)
  2957  	channelID := model.NewId()
  2958  	defaultNotifyProps := model.GetDefaultChannelNotifyProps()
  2959  	m1 := &model.ChannelMember{ChannelId: channelID, UserId: u1.Id, NotifyProps: defaultNotifyProps}
  2960  	m2 := &model.ChannelMember{ChannelId: channelID, UserId: u2.Id, NotifyProps: defaultNotifyProps}
  2961  	m3 := &model.ChannelMember{ChannelId: channelID, UserId: u3.Id, NotifyProps: defaultNotifyProps}
  2962  	m4 := &model.ChannelMember{ChannelId: channelID, UserId: u4.Id, NotifyProps: defaultNotifyProps}
  2963  	_, err = ss.Channel().SaveMultipleMembers([]*model.ChannelMember{m1, m2, m3, m4})
  2964  	require.Nil(t, err)
  2965  
  2966  	t.Run("remove member from not existing channel", func(t *testing.T) {
  2967  		err = ss.Channel().RemoveMember("not-existing-channel", u1.Id)
  2968  		require.Nil(t, err)
  2969  		var membersCount int64
  2970  		membersCount, err = ss.Channel().GetMemberCount(channelID, false)
  2971  		require.Nil(t, err)
  2972  		require.Equal(t, int64(4), membersCount)
  2973  	})
  2974  
  2975  	t.Run("remove not existing member from an existing channel", func(t *testing.T) {
  2976  		err = ss.Channel().RemoveMember(channelID, model.NewId())
  2977  		require.Nil(t, err)
  2978  		var membersCount int64
  2979  		membersCount, err = ss.Channel().GetMemberCount(channelID, false)
  2980  		require.Nil(t, err)
  2981  		require.Equal(t, int64(4), membersCount)
  2982  	})
  2983  
  2984  	t.Run("remove existing member from an existing channel", func(t *testing.T) {
  2985  		err = ss.Channel().RemoveMember(channelID, u1.Id)
  2986  		require.Nil(t, err)
  2987  		defer ss.Channel().SaveMember(m1)
  2988  		var membersCount int64
  2989  		membersCount, err = ss.Channel().GetMemberCount(channelID, false)
  2990  		require.Nil(t, err)
  2991  		require.Equal(t, int64(3), membersCount)
  2992  	})
  2993  }
  2994  
  2995  func testChannelRemoveMembers(t *testing.T, ss store.Store) {
  2996  	u1, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  2997  	require.Nil(t, err)
  2998  	u2, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  2999  	require.Nil(t, err)
  3000  	u3, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  3001  	require.Nil(t, err)
  3002  	u4, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  3003  	require.Nil(t, err)
  3004  	channelID := model.NewId()
  3005  	defaultNotifyProps := model.GetDefaultChannelNotifyProps()
  3006  	m1 := &model.ChannelMember{ChannelId: channelID, UserId: u1.Id, NotifyProps: defaultNotifyProps}
  3007  	m2 := &model.ChannelMember{ChannelId: channelID, UserId: u2.Id, NotifyProps: defaultNotifyProps}
  3008  	m3 := &model.ChannelMember{ChannelId: channelID, UserId: u3.Id, NotifyProps: defaultNotifyProps}
  3009  	m4 := &model.ChannelMember{ChannelId: channelID, UserId: u4.Id, NotifyProps: defaultNotifyProps}
  3010  	_, err = ss.Channel().SaveMultipleMembers([]*model.ChannelMember{m1, m2, m3, m4})
  3011  	require.Nil(t, err)
  3012  
  3013  	t.Run("remove members from not existing channel", func(t *testing.T) {
  3014  		err = ss.Channel().RemoveMembers("not-existing-channel", []string{u1.Id, u2.Id, u3.Id, u4.Id})
  3015  		require.Nil(t, err)
  3016  		var membersCount int64
  3017  		membersCount, err = ss.Channel().GetMemberCount(channelID, false)
  3018  		require.Nil(t, err)
  3019  		require.Equal(t, int64(4), membersCount)
  3020  	})
  3021  
  3022  	t.Run("remove not existing members from an existing channel", func(t *testing.T) {
  3023  		err = ss.Channel().RemoveMembers(channelID, []string{model.NewId(), model.NewId()})
  3024  		require.Nil(t, err)
  3025  		var membersCount int64
  3026  		membersCount, err = ss.Channel().GetMemberCount(channelID, false)
  3027  		require.Nil(t, err)
  3028  		require.Equal(t, int64(4), membersCount)
  3029  	})
  3030  
  3031  	t.Run("remove not existing and not existing members from an existing channel", func(t *testing.T) {
  3032  		err = ss.Channel().RemoveMembers(channelID, []string{u1.Id, u2.Id, model.NewId(), model.NewId()})
  3033  		require.Nil(t, err)
  3034  		defer ss.Channel().SaveMultipleMembers([]*model.ChannelMember{m1, m2})
  3035  		var membersCount int64
  3036  		membersCount, err = ss.Channel().GetMemberCount(channelID, false)
  3037  		require.Nil(t, err)
  3038  		require.Equal(t, int64(2), membersCount)
  3039  	})
  3040  	t.Run("remove existing members from an existing channel", func(t *testing.T) {
  3041  		err = ss.Channel().RemoveMembers(channelID, []string{u1.Id, u2.Id, u3.Id})
  3042  		require.Nil(t, err)
  3043  		defer ss.Channel().SaveMultipleMembers([]*model.ChannelMember{m1, m2, m3})
  3044  		membersCount, err := ss.Channel().GetMemberCount(channelID, false)
  3045  		require.Nil(t, err)
  3046  		require.Equal(t, int64(1), membersCount)
  3047  	})
  3048  }
  3049  
  3050  func testChannelDeleteMemberStore(t *testing.T, ss store.Store) {
  3051  	c1 := &model.Channel{}
  3052  	c1.TeamId = model.NewId()
  3053  	c1.DisplayName = "NameName"
  3054  	c1.Name = "zz" + model.NewId() + "b"
  3055  	c1.Type = model.CHANNEL_OPEN
  3056  	c1, nErr := ss.Channel().Save(c1, -1)
  3057  	require.Nil(t, nErr)
  3058  
  3059  	c1t1, _ := ss.Channel().Get(c1.Id, false)
  3060  	assert.EqualValues(t, 0, c1t1.ExtraUpdateAt, "ExtraUpdateAt should be 0")
  3061  
  3062  	u1 := model.User{}
  3063  	u1.Email = MakeEmail()
  3064  	u1.Nickname = model.NewId()
  3065  	_, err := ss.User().Save(&u1)
  3066  	require.Nil(t, err)
  3067  	_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1)
  3068  	require.Nil(t, err)
  3069  
  3070  	u2 := model.User{}
  3071  	u2.Email = MakeEmail()
  3072  	u2.Nickname = model.NewId()
  3073  	_, err = ss.User().Save(&u2)
  3074  	require.Nil(t, err)
  3075  	_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}, -1)
  3076  	require.Nil(t, err)
  3077  
  3078  	o1 := model.ChannelMember{}
  3079  	o1.ChannelId = c1.Id
  3080  	o1.UserId = u1.Id
  3081  	o1.NotifyProps = model.GetDefaultChannelNotifyProps()
  3082  	_, err = ss.Channel().SaveMember(&o1)
  3083  	require.Nil(t, err)
  3084  
  3085  	o2 := model.ChannelMember{}
  3086  	o2.ChannelId = c1.Id
  3087  	o2.UserId = u2.Id
  3088  	o2.NotifyProps = model.GetDefaultChannelNotifyProps()
  3089  	_, err = ss.Channel().SaveMember(&o2)
  3090  	require.Nil(t, err)
  3091  
  3092  	c1t2, _ := ss.Channel().Get(c1.Id, false)
  3093  	assert.EqualValues(t, 0, c1t2.ExtraUpdateAt, "ExtraUpdateAt should be 0")
  3094  
  3095  	count, err := ss.Channel().GetMemberCount(o1.ChannelId, false)
  3096  	require.Nil(t, err)
  3097  	require.EqualValues(t, 2, count, "should have saved 2 members")
  3098  
  3099  	err = ss.Channel().PermanentDeleteMembersByUser(o2.UserId)
  3100  	require.Nil(t, err)
  3101  
  3102  	count, err = ss.Channel().GetMemberCount(o1.ChannelId, false)
  3103  	require.Nil(t, err)
  3104  	require.EqualValues(t, 1, count, "should have removed 1 member")
  3105  
  3106  	err = ss.Channel().PermanentDeleteMembersByChannel(o1.ChannelId)
  3107  	require.Nil(t, err, err)
  3108  
  3109  	count, err = ss.Channel().GetMemberCount(o1.ChannelId, false)
  3110  	require.Nil(t, err)
  3111  	require.EqualValues(t, 0, count, "should have removed all members")
  3112  }
  3113  
  3114  func testChannelStoreGetChannels(t *testing.T, ss store.Store) {
  3115  	team := model.NewId()
  3116  	o1 := model.Channel{}
  3117  	o1.TeamId = team
  3118  	o1.DisplayName = "Channel1"
  3119  	o1.Name = "zz" + model.NewId() + "b"
  3120  	o1.Type = model.CHANNEL_OPEN
  3121  	_, nErr := ss.Channel().Save(&o1, -1)
  3122  	require.Nil(t, nErr)
  3123  
  3124  	o2 := model.Channel{}
  3125  	o2.TeamId = team
  3126  	o2.DisplayName = "Channel2"
  3127  	o2.Name = "zz" + model.NewId() + "b"
  3128  	o2.Type = model.CHANNEL_OPEN
  3129  	_, nErr = ss.Channel().Save(&o2, -1)
  3130  	require.Nil(t, nErr)
  3131  
  3132  	o3 := model.Channel{}
  3133  	o3.TeamId = team
  3134  	o3.DisplayName = "Channel3"
  3135  	o3.Name = "zz" + model.NewId() + "b"
  3136  	o3.Type = model.CHANNEL_OPEN
  3137  	_, nErr = ss.Channel().Save(&o3, -1)
  3138  	require.Nil(t, nErr)
  3139  
  3140  	m1 := model.ChannelMember{}
  3141  	m1.ChannelId = o1.Id
  3142  	m1.UserId = model.NewId()
  3143  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
  3144  	_, err := ss.Channel().SaveMember(&m1)
  3145  	require.Nil(t, err)
  3146  
  3147  	m2 := model.ChannelMember{}
  3148  	m2.ChannelId = o1.Id
  3149  	m2.UserId = model.NewId()
  3150  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
  3151  	_, err = ss.Channel().SaveMember(&m2)
  3152  	require.Nil(t, err)
  3153  
  3154  	m3 := model.ChannelMember{}
  3155  	m3.ChannelId = o2.Id
  3156  	m3.UserId = m1.UserId
  3157  	m3.NotifyProps = model.GetDefaultChannelNotifyProps()
  3158  	_, err = ss.Channel().SaveMember(&m3)
  3159  	require.Nil(t, err)
  3160  
  3161  	m4 := model.ChannelMember{}
  3162  	m4.ChannelId = o3.Id
  3163  	m4.UserId = m1.UserId
  3164  	m4.NotifyProps = model.GetDefaultChannelNotifyProps()
  3165  	_, err = ss.Channel().SaveMember(&m4)
  3166  	require.Nil(t, err)
  3167  
  3168  	list, nErr := ss.Channel().GetChannels(o1.TeamId, m1.UserId, false, 0)
  3169  	require.Nil(t, nErr)
  3170  	require.Len(t, *list, 3)
  3171  	require.Equal(t, o1.Id, (*list)[0].Id, "missing channel")
  3172  	require.Equal(t, o2.Id, (*list)[1].Id, "missing channel")
  3173  	require.Equal(t, o3.Id, (*list)[2].Id, "missing channel")
  3174  
  3175  	ids, err := ss.Channel().GetAllChannelMembersForUser(m1.UserId, false, false)
  3176  	require.Nil(t, err)
  3177  	_, ok := ids[o1.Id]
  3178  	require.True(t, ok, "missing channel")
  3179  
  3180  	ids2, err := ss.Channel().GetAllChannelMembersForUser(m1.UserId, true, false)
  3181  	require.Nil(t, err)
  3182  	_, ok = ids2[o1.Id]
  3183  	require.True(t, ok, "missing channel")
  3184  
  3185  	ids3, err := ss.Channel().GetAllChannelMembersForUser(m1.UserId, true, false)
  3186  	require.Nil(t, err)
  3187  	_, ok = ids3[o1.Id]
  3188  	require.True(t, ok, "missing channel")
  3189  
  3190  	ids4, err := ss.Channel().GetAllChannelMembersForUser(m1.UserId, true, true)
  3191  	require.Nil(t, err)
  3192  	_, ok = ids4[o1.Id]
  3193  	require.True(t, ok, "missing channel")
  3194  
  3195  	nErr = ss.Channel().Delete(o2.Id, 10)
  3196  	require.NoError(t, nErr)
  3197  
  3198  	nErr = ss.Channel().Delete(o3.Id, 20)
  3199  	require.NoError(t, nErr)
  3200  
  3201  	// should return 1
  3202  	list, nErr = ss.Channel().GetChannels(o1.TeamId, m1.UserId, false, 0)
  3203  	require.Nil(t, nErr)
  3204  	require.Len(t, *list, 1)
  3205  	require.Equal(t, o1.Id, (*list)[0].Id, "missing channel")
  3206  
  3207  	// Should return all
  3208  	list, nErr = ss.Channel().GetChannels(o1.TeamId, m1.UserId, true, 0)
  3209  	require.Nil(t, nErr)
  3210  	require.Len(t, *list, 3)
  3211  	require.Equal(t, o1.Id, (*list)[0].Id, "missing channel")
  3212  	require.Equal(t, o2.Id, (*list)[1].Id, "missing channel")
  3213  	require.Equal(t, o3.Id, (*list)[2].Id, "missing channel")
  3214  
  3215  	// Should still return all
  3216  	list, nErr = ss.Channel().GetChannels(o1.TeamId, m1.UserId, true, 10)
  3217  	require.Nil(t, nErr)
  3218  	require.Len(t, *list, 3)
  3219  	require.Equal(t, o1.Id, (*list)[0].Id, "missing channel")
  3220  	require.Equal(t, o2.Id, (*list)[1].Id, "missing channel")
  3221  	require.Equal(t, o3.Id, (*list)[2].Id, "missing channel")
  3222  
  3223  	// Should return 2
  3224  	list, nErr = ss.Channel().GetChannels(o1.TeamId, m1.UserId, true, 20)
  3225  	require.Nil(t, nErr)
  3226  	require.Len(t, *list, 2)
  3227  	require.Equal(t, o1.Id, (*list)[0].Id, "missing channel")
  3228  	require.Equal(t, o3.Id, (*list)[1].Id, "missing channel")
  3229  
  3230  	require.True(
  3231  		t,
  3232  		ss.Channel().IsUserInChannelUseCache(m1.UserId, o1.Id),
  3233  		"missing channel")
  3234  	require.True(
  3235  		t,
  3236  		ss.Channel().IsUserInChannelUseCache(m1.UserId, o2.Id),
  3237  		"missing channel")
  3238  
  3239  	require.False(
  3240  		t,
  3241  		ss.Channel().IsUserInChannelUseCache(m1.UserId, "blahblah"),
  3242  		"missing channel")
  3243  
  3244  	require.False(
  3245  		t,
  3246  		ss.Channel().IsUserInChannelUseCache("blahblah", "blahblah"),
  3247  		"missing channel")
  3248  
  3249  	ss.Channel().InvalidateAllChannelMembersForUser(m1.UserId)
  3250  }
  3251  
  3252  func testChannelStoreGetAllChannels(t *testing.T, ss store.Store, s SqlSupplier) {
  3253  	cleanupChannels(t, ss)
  3254  
  3255  	t1 := model.Team{}
  3256  	t1.DisplayName = "Name"
  3257  	t1.Name = "zz" + model.NewId()
  3258  	t1.Email = MakeEmail()
  3259  	t1.Type = model.TEAM_OPEN
  3260  	_, err := ss.Team().Save(&t1)
  3261  	require.Nil(t, err)
  3262  
  3263  	t2 := model.Team{}
  3264  	t2.DisplayName = "Name2"
  3265  	t2.Name = "zz" + model.NewId()
  3266  	t2.Email = MakeEmail()
  3267  	t2.Type = model.TEAM_OPEN
  3268  	_, err = ss.Team().Save(&t2)
  3269  	require.Nil(t, err)
  3270  
  3271  	c1 := model.Channel{}
  3272  	c1.TeamId = t1.Id
  3273  	c1.DisplayName = "Channel1" + model.NewId()
  3274  	c1.Name = "zz" + model.NewId() + "b"
  3275  	c1.Type = model.CHANNEL_OPEN
  3276  	_, nErr := ss.Channel().Save(&c1, -1)
  3277  	require.Nil(t, nErr)
  3278  
  3279  	group := &model.Group{
  3280  		Name:        model.NewString(model.NewId()),
  3281  		DisplayName: model.NewId(),
  3282  		Source:      model.GroupSourceLdap,
  3283  		RemoteId:    model.NewId(),
  3284  	}
  3285  	_, err = ss.Group().Create(group)
  3286  	require.Nil(t, err)
  3287  
  3288  	_, err = ss.Group().CreateGroupSyncable(model.NewGroupChannel(group.Id, c1.Id, true))
  3289  	require.Nil(t, err)
  3290  
  3291  	c2 := model.Channel{}
  3292  	c2.TeamId = t1.Id
  3293  	c2.DisplayName = "Channel2" + model.NewId()
  3294  	c2.Name = "zz" + model.NewId() + "b"
  3295  	c2.Type = model.CHANNEL_OPEN
  3296  	_, nErr = ss.Channel().Save(&c2, -1)
  3297  	require.Nil(t, nErr)
  3298  	c2.DeleteAt = model.GetMillis()
  3299  	c2.UpdateAt = c2.DeleteAt
  3300  	nErr = ss.Channel().Delete(c2.Id, c2.DeleteAt)
  3301  	require.Nil(t, nErr, "channel should have been deleted")
  3302  
  3303  	c3 := model.Channel{}
  3304  	c3.TeamId = t2.Id
  3305  	c3.DisplayName = "Channel3" + model.NewId()
  3306  	c3.Name = "zz" + model.NewId() + "b"
  3307  	c3.Type = model.CHANNEL_PRIVATE
  3308  	_, nErr = ss.Channel().Save(&c3, -1)
  3309  	require.Nil(t, nErr)
  3310  
  3311  	u1 := model.User{Id: model.NewId()}
  3312  	u2 := model.User{Id: model.NewId()}
  3313  	_, nErr = ss.Channel().CreateDirectChannel(&u1, &u2)
  3314  	require.Nil(t, nErr)
  3315  
  3316  	userIds := []string{model.NewId(), model.NewId(), model.NewId()}
  3317  
  3318  	c5 := model.Channel{}
  3319  	c5.Name = model.GetGroupNameFromUserIds(userIds)
  3320  	c5.DisplayName = "GroupChannel" + model.NewId()
  3321  	c5.Name = "zz" + model.NewId() + "b"
  3322  	c5.Type = model.CHANNEL_GROUP
  3323  	_, nErr = ss.Channel().Save(&c5, -1)
  3324  	require.Nil(t, nErr)
  3325  
  3326  	list, nErr := ss.Channel().GetAllChannels(0, 10, store.ChannelSearchOpts{})
  3327  	require.Nil(t, nErr)
  3328  	assert.Len(t, *list, 2)
  3329  	assert.Equal(t, c1.Id, (*list)[0].Id)
  3330  	assert.Equal(t, "Name", (*list)[0].TeamDisplayName)
  3331  	assert.Equal(t, c3.Id, (*list)[1].Id)
  3332  	assert.Equal(t, "Name2", (*list)[1].TeamDisplayName)
  3333  
  3334  	count1, nErr := ss.Channel().GetAllChannelsCount(store.ChannelSearchOpts{})
  3335  	require.Nil(t, nErr)
  3336  
  3337  	list, nErr = ss.Channel().GetAllChannels(0, 10, store.ChannelSearchOpts{IncludeDeleted: true})
  3338  	require.Nil(t, nErr)
  3339  	assert.Len(t, *list, 3)
  3340  	assert.Equal(t, c1.Id, (*list)[0].Id)
  3341  	assert.Equal(t, "Name", (*list)[0].TeamDisplayName)
  3342  	assert.Equal(t, c2.Id, (*list)[1].Id)
  3343  	assert.Equal(t, c3.Id, (*list)[2].Id)
  3344  
  3345  	count2, nErr := ss.Channel().GetAllChannelsCount(store.ChannelSearchOpts{IncludeDeleted: true})
  3346  	require.Nil(t, nErr)
  3347  	require.True(t, func() bool {
  3348  		return count2 > count1
  3349  	}())
  3350  
  3351  	list, nErr = ss.Channel().GetAllChannels(0, 1, store.ChannelSearchOpts{IncludeDeleted: true})
  3352  	require.Nil(t, nErr)
  3353  	assert.Len(t, *list, 1)
  3354  	assert.Equal(t, c1.Id, (*list)[0].Id)
  3355  	assert.Equal(t, "Name", (*list)[0].TeamDisplayName)
  3356  
  3357  	// Not associated to group
  3358  	list, nErr = ss.Channel().GetAllChannels(0, 10, store.ChannelSearchOpts{NotAssociatedToGroup: group.Id})
  3359  	require.Nil(t, nErr)
  3360  	assert.Len(t, *list, 1)
  3361  
  3362  	// Exclude channel names
  3363  	list, nErr = ss.Channel().GetAllChannels(0, 10, store.ChannelSearchOpts{ExcludeChannelNames: []string{c1.Name}})
  3364  	require.Nil(t, nErr)
  3365  	assert.Len(t, *list, 1)
  3366  
  3367  	// Manually truncate Channels table until testlib can handle cleanups
  3368  	s.GetMaster().Exec("TRUNCATE Channels")
  3369  }
  3370  
  3371  func testChannelStoreGetMoreChannels(t *testing.T, ss store.Store) {
  3372  	teamId := model.NewId()
  3373  	otherTeamId := model.NewId()
  3374  	userId := model.NewId()
  3375  	otherUserId1 := model.NewId()
  3376  	otherUserId2 := model.NewId()
  3377  
  3378  	// o1 is a channel on the team to which the user (and the other user 1) belongs
  3379  	o1 := model.Channel{
  3380  		TeamId:      teamId,
  3381  		DisplayName: "Channel1",
  3382  		Name:        "zz" + model.NewId() + "b",
  3383  		Type:        model.CHANNEL_OPEN,
  3384  	}
  3385  	_, nErr := ss.Channel().Save(&o1, -1)
  3386  	require.Nil(t, nErr)
  3387  
  3388  	_, err := ss.Channel().SaveMember(&model.ChannelMember{
  3389  		ChannelId:   o1.Id,
  3390  		UserId:      userId,
  3391  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  3392  	})
  3393  	require.Nil(t, err)
  3394  
  3395  	_, err = ss.Channel().SaveMember(&model.ChannelMember{
  3396  		ChannelId:   o1.Id,
  3397  		UserId:      otherUserId1,
  3398  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  3399  	})
  3400  	require.Nil(t, err)
  3401  
  3402  	// o2 is a channel on the other team to which the user belongs
  3403  	o2 := model.Channel{
  3404  		TeamId:      otherTeamId,
  3405  		DisplayName: "Channel2",
  3406  		Name:        "zz" + model.NewId() + "b",
  3407  		Type:        model.CHANNEL_OPEN,
  3408  	}
  3409  	_, nErr = ss.Channel().Save(&o2, -1)
  3410  	require.Nil(t, nErr)
  3411  
  3412  	_, err = ss.Channel().SaveMember(&model.ChannelMember{
  3413  		ChannelId:   o2.Id,
  3414  		UserId:      otherUserId2,
  3415  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  3416  	})
  3417  	require.Nil(t, err)
  3418  
  3419  	// o3 is a channel on the team to which the user does not belong, and thus should show up
  3420  	// in "more channels"
  3421  	o3 := model.Channel{
  3422  		TeamId:      teamId,
  3423  		DisplayName: "ChannelA",
  3424  		Name:        "zz" + model.NewId() + "b",
  3425  		Type:        model.CHANNEL_OPEN,
  3426  	}
  3427  	_, nErr = ss.Channel().Save(&o3, -1)
  3428  	require.Nil(t, nErr)
  3429  
  3430  	// o4 is a private channel on the team to which the user does not belong
  3431  	o4 := model.Channel{
  3432  		TeamId:      teamId,
  3433  		DisplayName: "ChannelB",
  3434  		Name:        "zz" + model.NewId() + "b",
  3435  		Type:        model.CHANNEL_PRIVATE,
  3436  	}
  3437  	_, nErr = ss.Channel().Save(&o4, -1)
  3438  	require.Nil(t, nErr)
  3439  
  3440  	// o5 is another private channel on the team to which the user does belong
  3441  	o5 := model.Channel{
  3442  		TeamId:      teamId,
  3443  		DisplayName: "ChannelC",
  3444  		Name:        "zz" + model.NewId() + "b",
  3445  		Type:        model.CHANNEL_PRIVATE,
  3446  	}
  3447  	_, nErr = ss.Channel().Save(&o5, -1)
  3448  	require.Nil(t, nErr)
  3449  
  3450  	_, err = ss.Channel().SaveMember(&model.ChannelMember{
  3451  		ChannelId:   o5.Id,
  3452  		UserId:      userId,
  3453  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  3454  	})
  3455  	require.Nil(t, err)
  3456  
  3457  	t.Run("only o3 listed in more channels", func(t *testing.T) {
  3458  		list, channelErr := ss.Channel().GetMoreChannels(teamId, userId, 0, 100)
  3459  		require.Nil(t, channelErr)
  3460  		require.Equal(t, &model.ChannelList{&o3}, list)
  3461  	})
  3462  
  3463  	// o6 is another channel on the team to which the user does not belong, and would thus
  3464  	// start showing up in "more channels".
  3465  	o6 := model.Channel{
  3466  		TeamId:      teamId,
  3467  		DisplayName: "ChannelD",
  3468  		Name:        "zz" + model.NewId() + "b",
  3469  		Type:        model.CHANNEL_OPEN,
  3470  	}
  3471  	_, nErr = ss.Channel().Save(&o6, -1)
  3472  	require.Nil(t, nErr)
  3473  
  3474  	// o7 is another channel on the team to which the user does not belong, but is deleted,
  3475  	// and thus would not start showing up in "more channels"
  3476  	o7 := model.Channel{
  3477  		TeamId:      teamId,
  3478  		DisplayName: "ChannelD",
  3479  		Name:        "zz" + model.NewId() + "b",
  3480  		Type:        model.CHANNEL_OPEN,
  3481  	}
  3482  	_, nErr = ss.Channel().Save(&o7, -1)
  3483  	require.Nil(t, nErr)
  3484  
  3485  	nErr = ss.Channel().Delete(o7.Id, model.GetMillis())
  3486  	require.Nil(t, nErr, "channel should have been deleted")
  3487  
  3488  	t.Run("both o3 and o6 listed in more channels", func(t *testing.T) {
  3489  		list, err := ss.Channel().GetMoreChannels(teamId, userId, 0, 100)
  3490  		require.Nil(t, err)
  3491  		require.Equal(t, &model.ChannelList{&o3, &o6}, list)
  3492  	})
  3493  
  3494  	t.Run("only o3 listed in more channels with offset 0, limit 1", func(t *testing.T) {
  3495  		list, err := ss.Channel().GetMoreChannels(teamId, userId, 0, 1)
  3496  		require.Nil(t, err)
  3497  		require.Equal(t, &model.ChannelList{&o3}, list)
  3498  	})
  3499  
  3500  	t.Run("only o6 listed in more channels with offset 1, limit 1", func(t *testing.T) {
  3501  		list, err := ss.Channel().GetMoreChannels(teamId, userId, 1, 1)
  3502  		require.Nil(t, err)
  3503  		require.Equal(t, &model.ChannelList{&o6}, list)
  3504  	})
  3505  
  3506  	t.Run("verify analytics for open channels", func(t *testing.T) {
  3507  		count, err := ss.Channel().AnalyticsTypeCount(teamId, model.CHANNEL_OPEN)
  3508  		require.Nil(t, err)
  3509  		require.EqualValues(t, 4, count)
  3510  	})
  3511  
  3512  	t.Run("verify analytics for private channels", func(t *testing.T) {
  3513  		count, err := ss.Channel().AnalyticsTypeCount(teamId, model.CHANNEL_PRIVATE)
  3514  		require.Nil(t, err)
  3515  		require.EqualValues(t, 2, count)
  3516  	})
  3517  }
  3518  
  3519  func testChannelStoreGetPrivateChannelsForTeam(t *testing.T, ss store.Store) {
  3520  	teamId := model.NewId()
  3521  
  3522  	// p1 is a private channel on the team
  3523  	p1 := model.Channel{
  3524  		TeamId:      teamId,
  3525  		DisplayName: "PrivateChannel1Team1",
  3526  		Name:        "zz" + model.NewId() + "b",
  3527  		Type:        model.CHANNEL_PRIVATE,
  3528  	}
  3529  	_, nErr := ss.Channel().Save(&p1, -1)
  3530  	require.Nil(t, nErr)
  3531  
  3532  	// p2 is a private channel on another team
  3533  	p2 := model.Channel{
  3534  		TeamId:      model.NewId(),
  3535  		DisplayName: "PrivateChannel1Team2",
  3536  		Name:        "zz" + model.NewId() + "b",
  3537  		Type:        model.CHANNEL_PRIVATE,
  3538  	}
  3539  	_, nErr = ss.Channel().Save(&p2, -1)
  3540  	require.Nil(t, nErr)
  3541  
  3542  	// o1 is a public channel on the team
  3543  	o1 := model.Channel{
  3544  		TeamId:      teamId,
  3545  		DisplayName: "OpenChannel1Team1",
  3546  		Name:        "zz" + model.NewId() + "b",
  3547  		Type:        model.CHANNEL_OPEN,
  3548  	}
  3549  	_, nErr = ss.Channel().Save(&o1, -1)
  3550  	require.Nil(t, nErr)
  3551  
  3552  	t.Run("only p1 initially listed in private channels", func(t *testing.T) {
  3553  		list, channelErr := ss.Channel().GetPrivateChannelsForTeam(teamId, 0, 100)
  3554  		require.Nil(t, channelErr)
  3555  		require.Equal(t, &model.ChannelList{&p1}, list)
  3556  	})
  3557  
  3558  	// p3 is another private channel on the team
  3559  	p3 := model.Channel{
  3560  		TeamId:      teamId,
  3561  		DisplayName: "PrivateChannel2Team1",
  3562  		Name:        "zz" + model.NewId() + "b",
  3563  		Type:        model.CHANNEL_PRIVATE,
  3564  	}
  3565  	_, nErr = ss.Channel().Save(&p3, -1)
  3566  	require.Nil(t, nErr)
  3567  
  3568  	// p4 is another private, but deleted channel on the team
  3569  	p4 := model.Channel{
  3570  		TeamId:      teamId,
  3571  		DisplayName: "PrivateChannel3Team1",
  3572  		Name:        "zz" + model.NewId() + "b",
  3573  		Type:        model.CHANNEL_PRIVATE,
  3574  	}
  3575  	_, nErr = ss.Channel().Save(&p4, -1)
  3576  	require.Nil(t, nErr)
  3577  	err := ss.Channel().Delete(p4.Id, model.GetMillis())
  3578  	require.Nil(t, err, "channel should have been deleted")
  3579  
  3580  	t.Run("both p1 and p3 listed in private channels", func(t *testing.T) {
  3581  		list, err := ss.Channel().GetPrivateChannelsForTeam(teamId, 0, 100)
  3582  		require.Nil(t, err)
  3583  		require.Equal(t, &model.ChannelList{&p1, &p3}, list)
  3584  	})
  3585  
  3586  	t.Run("only p1 listed in private channels with offset 0, limit 1", func(t *testing.T) {
  3587  		list, err := ss.Channel().GetPrivateChannelsForTeam(teamId, 0, 1)
  3588  		require.Nil(t, err)
  3589  		require.Equal(t, &model.ChannelList{&p1}, list)
  3590  	})
  3591  
  3592  	t.Run("only p3 listed in private channels with offset 1, limit 1", func(t *testing.T) {
  3593  		list, err := ss.Channel().GetPrivateChannelsForTeam(teamId, 1, 1)
  3594  		require.Nil(t, err)
  3595  		require.Equal(t, &model.ChannelList{&p3}, list)
  3596  	})
  3597  
  3598  	t.Run("verify analytics for private channels", func(t *testing.T) {
  3599  		count, err := ss.Channel().AnalyticsTypeCount(teamId, model.CHANNEL_PRIVATE)
  3600  		require.Nil(t, err)
  3601  		require.EqualValues(t, 3, count)
  3602  	})
  3603  
  3604  	t.Run("verify analytics for open open channels", func(t *testing.T) {
  3605  		count, err := ss.Channel().AnalyticsTypeCount(teamId, model.CHANNEL_OPEN)
  3606  		require.Nil(t, err)
  3607  		require.EqualValues(t, 1, count)
  3608  	})
  3609  }
  3610  
  3611  func testChannelStoreGetPublicChannelsForTeam(t *testing.T, ss store.Store) {
  3612  	teamId := model.NewId()
  3613  
  3614  	// o1 is a public channel on the team
  3615  	o1 := model.Channel{
  3616  		TeamId:      teamId,
  3617  		DisplayName: "OpenChannel1Team1",
  3618  		Name:        "zz" + model.NewId() + "b",
  3619  		Type:        model.CHANNEL_OPEN,
  3620  	}
  3621  	_, nErr := ss.Channel().Save(&o1, -1)
  3622  	require.Nil(t, nErr)
  3623  
  3624  	// o2 is a public channel on another team
  3625  	o2 := model.Channel{
  3626  		TeamId:      model.NewId(),
  3627  		DisplayName: "OpenChannel1Team2",
  3628  		Name:        "zz" + model.NewId() + "b",
  3629  		Type:        model.CHANNEL_OPEN,
  3630  	}
  3631  	_, nErr = ss.Channel().Save(&o2, -1)
  3632  	require.Nil(t, nErr)
  3633  
  3634  	// o3 is a private channel on the team
  3635  	o3 := model.Channel{
  3636  		TeamId:      teamId,
  3637  		DisplayName: "PrivateChannel1Team1",
  3638  		Name:        "zz" + model.NewId() + "b",
  3639  		Type:        model.CHANNEL_PRIVATE,
  3640  	}
  3641  	_, nErr = ss.Channel().Save(&o3, -1)
  3642  	require.Nil(t, nErr)
  3643  
  3644  	t.Run("only o1 initially listed in public channels", func(t *testing.T) {
  3645  		list, channelErr := ss.Channel().GetPublicChannelsForTeam(teamId, 0, 100)
  3646  		require.Nil(t, channelErr)
  3647  		require.Equal(t, &model.ChannelList{&o1}, list)
  3648  	})
  3649  
  3650  	// o4 is another public channel on the team
  3651  	o4 := model.Channel{
  3652  		TeamId:      teamId,
  3653  		DisplayName: "OpenChannel2Team1",
  3654  		Name:        "zz" + model.NewId() + "b",
  3655  		Type:        model.CHANNEL_OPEN,
  3656  	}
  3657  	_, nErr = ss.Channel().Save(&o4, -1)
  3658  	require.Nil(t, nErr)
  3659  
  3660  	// o5 is another public, but deleted channel on the team
  3661  	o5 := model.Channel{
  3662  		TeamId:      teamId,
  3663  		DisplayName: "OpenChannel3Team1",
  3664  		Name:        "zz" + model.NewId() + "b",
  3665  		Type:        model.CHANNEL_OPEN,
  3666  	}
  3667  	_, nErr = ss.Channel().Save(&o5, -1)
  3668  	require.Nil(t, nErr)
  3669  	err := ss.Channel().Delete(o5.Id, model.GetMillis())
  3670  	require.Nil(t, err, "channel should have been deleted")
  3671  
  3672  	t.Run("both o1 and o4 listed in public channels", func(t *testing.T) {
  3673  		list, err := ss.Channel().GetPublicChannelsForTeam(teamId, 0, 100)
  3674  		require.Nil(t, err)
  3675  		require.Equal(t, &model.ChannelList{&o1, &o4}, list)
  3676  	})
  3677  
  3678  	t.Run("only o1 listed in public channels with offset 0, limit 1", func(t *testing.T) {
  3679  		list, err := ss.Channel().GetPublicChannelsForTeam(teamId, 0, 1)
  3680  		require.Nil(t, err)
  3681  		require.Equal(t, &model.ChannelList{&o1}, list)
  3682  	})
  3683  
  3684  	t.Run("only o4 listed in public channels with offset 1, limit 1", func(t *testing.T) {
  3685  		list, err := ss.Channel().GetPublicChannelsForTeam(teamId, 1, 1)
  3686  		require.Nil(t, err)
  3687  		require.Equal(t, &model.ChannelList{&o4}, list)
  3688  	})
  3689  
  3690  	t.Run("verify analytics for open channels", func(t *testing.T) {
  3691  		count, err := ss.Channel().AnalyticsTypeCount(teamId, model.CHANNEL_OPEN)
  3692  		require.Nil(t, err)
  3693  		require.EqualValues(t, 3, count)
  3694  	})
  3695  
  3696  	t.Run("verify analytics for private channels", func(t *testing.T) {
  3697  		count, err := ss.Channel().AnalyticsTypeCount(teamId, model.CHANNEL_PRIVATE)
  3698  		require.Nil(t, err)
  3699  		require.EqualValues(t, 1, count)
  3700  	})
  3701  }
  3702  
  3703  func testChannelStoreGetPublicChannelsByIdsForTeam(t *testing.T, ss store.Store) {
  3704  	teamId := model.NewId()
  3705  
  3706  	// oc1 is a public channel on the team
  3707  	oc1 := model.Channel{
  3708  		TeamId:      teamId,
  3709  		DisplayName: "OpenChannel1Team1",
  3710  		Name:        "zz" + model.NewId() + "b",
  3711  		Type:        model.CHANNEL_OPEN,
  3712  	}
  3713  	_, nErr := ss.Channel().Save(&oc1, -1)
  3714  	require.Nil(t, nErr)
  3715  
  3716  	// oc2 is a public channel on another team
  3717  	oc2 := model.Channel{
  3718  		TeamId:      model.NewId(),
  3719  		DisplayName: "OpenChannel2TeamOther",
  3720  		Name:        "zz" + model.NewId() + "b",
  3721  		Type:        model.CHANNEL_OPEN,
  3722  	}
  3723  	_, nErr = ss.Channel().Save(&oc2, -1)
  3724  	require.Nil(t, nErr)
  3725  
  3726  	// pc3 is a private channel on the team
  3727  	pc3 := model.Channel{
  3728  		TeamId:      teamId,
  3729  		DisplayName: "PrivateChannel3Team1",
  3730  		Name:        "zz" + model.NewId() + "b",
  3731  		Type:        model.CHANNEL_PRIVATE,
  3732  	}
  3733  	_, nErr = ss.Channel().Save(&pc3, -1)
  3734  	require.Nil(t, nErr)
  3735  
  3736  	t.Run("oc1 by itself should be found as a public channel in the team", func(t *testing.T) {
  3737  		list, channelErr := ss.Channel().GetPublicChannelsByIdsForTeam(teamId, []string{oc1.Id})
  3738  		require.Nil(t, channelErr)
  3739  		require.Equal(t, &model.ChannelList{&oc1}, list)
  3740  	})
  3741  
  3742  	t.Run("only oc1, among others, should be found as a public channel in the team", func(t *testing.T) {
  3743  		list, channelErr := ss.Channel().GetPublicChannelsByIdsForTeam(teamId, []string{oc1.Id, oc2.Id, model.NewId(), pc3.Id})
  3744  		require.Nil(t, channelErr)
  3745  		require.Equal(t, &model.ChannelList{&oc1}, list)
  3746  	})
  3747  
  3748  	// oc4 is another public channel on the team
  3749  	oc4 := model.Channel{
  3750  		TeamId:      teamId,
  3751  		DisplayName: "OpenChannel4Team1",
  3752  		Name:        "zz" + model.NewId() + "b",
  3753  		Type:        model.CHANNEL_OPEN,
  3754  	}
  3755  	_, nErr = ss.Channel().Save(&oc4, -1)
  3756  	require.Nil(t, nErr)
  3757  
  3758  	// oc4 is another public, but deleted channel on the team
  3759  	oc5 := model.Channel{
  3760  		TeamId:      teamId,
  3761  		DisplayName: "OpenChannel4Team1",
  3762  		Name:        "zz" + model.NewId() + "b",
  3763  		Type:        model.CHANNEL_OPEN,
  3764  	}
  3765  	_, nErr = ss.Channel().Save(&oc5, -1)
  3766  	require.Nil(t, nErr)
  3767  
  3768  	err := ss.Channel().Delete(oc5.Id, model.GetMillis())
  3769  	require.Nil(t, err, "channel should have been deleted")
  3770  
  3771  	t.Run("only oc1 and oc4, among others, should be found as a public channel in the team", func(t *testing.T) {
  3772  		list, err := ss.Channel().GetPublicChannelsByIdsForTeam(teamId, []string{oc1.Id, oc2.Id, model.NewId(), pc3.Id, oc4.Id})
  3773  		require.Nil(t, err)
  3774  		require.Equal(t, &model.ChannelList{&oc1, &oc4}, list)
  3775  	})
  3776  
  3777  	t.Run("random channel id should not be found as a public channel in the team", func(t *testing.T) {
  3778  		_, err := ss.Channel().GetPublicChannelsByIdsForTeam(teamId, []string{model.NewId()})
  3779  		require.NotNil(t, err)
  3780  		require.Equal(t, "store.sql_channel.get_channels_by_ids.not_found.app_error", err.Id)
  3781  	})
  3782  }
  3783  
  3784  func testChannelStoreGetChannelCounts(t *testing.T, ss store.Store) {
  3785  	o2 := model.Channel{}
  3786  	o2.TeamId = model.NewId()
  3787  	o2.DisplayName = "Channel2"
  3788  	o2.Name = "zz" + model.NewId() + "b"
  3789  	o2.Type = model.CHANNEL_OPEN
  3790  	_, nErr := ss.Channel().Save(&o2, -1)
  3791  	require.Nil(t, nErr)
  3792  
  3793  	o1 := model.Channel{}
  3794  	o1.TeamId = model.NewId()
  3795  	o1.DisplayName = "Channel1"
  3796  	o1.Name = "zz" + model.NewId() + "b"
  3797  	o1.Type = model.CHANNEL_OPEN
  3798  	_, nErr = ss.Channel().Save(&o1, -1)
  3799  	require.Nil(t, nErr)
  3800  
  3801  	m1 := model.ChannelMember{}
  3802  	m1.ChannelId = o1.Id
  3803  	m1.UserId = model.NewId()
  3804  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
  3805  	_, err := ss.Channel().SaveMember(&m1)
  3806  	require.Nil(t, err)
  3807  
  3808  	m2 := model.ChannelMember{}
  3809  	m2.ChannelId = o1.Id
  3810  	m2.UserId = model.NewId()
  3811  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
  3812  	_, err = ss.Channel().SaveMember(&m2)
  3813  	require.Nil(t, err)
  3814  
  3815  	m3 := model.ChannelMember{}
  3816  	m3.ChannelId = o2.Id
  3817  	m3.UserId = model.NewId()
  3818  	m3.NotifyProps = model.GetDefaultChannelNotifyProps()
  3819  	_, err = ss.Channel().SaveMember(&m3)
  3820  	require.Nil(t, err)
  3821  
  3822  	counts, _ := ss.Channel().GetChannelCounts(o1.TeamId, m1.UserId)
  3823  
  3824  	require.Len(t, counts.Counts, 1, "wrong number of counts")
  3825  	require.Len(t, counts.UpdateTimes, 1, "wrong number of update times")
  3826  }
  3827  
  3828  func testChannelStoreGetMembersForUser(t *testing.T, ss store.Store) {
  3829  	t1 := model.Team{}
  3830  	t1.DisplayName = "Name"
  3831  	t1.Name = "zz" + model.NewId()
  3832  	t1.Email = MakeEmail()
  3833  	t1.Type = model.TEAM_OPEN
  3834  	_, err := ss.Team().Save(&t1)
  3835  	require.Nil(t, err)
  3836  
  3837  	o1 := model.Channel{}
  3838  	o1.TeamId = t1.Id
  3839  	o1.DisplayName = "Channel1"
  3840  	o1.Name = "zz" + model.NewId() + "b"
  3841  	o1.Type = model.CHANNEL_OPEN
  3842  	_, nErr := ss.Channel().Save(&o1, -1)
  3843  	require.Nil(t, nErr)
  3844  
  3845  	o2 := model.Channel{}
  3846  	o2.TeamId = o1.TeamId
  3847  	o2.DisplayName = "Channel2"
  3848  	o2.Name = "zz" + model.NewId() + "b"
  3849  	o2.Type = model.CHANNEL_OPEN
  3850  	_, nErr = ss.Channel().Save(&o2, -1)
  3851  	require.Nil(t, nErr)
  3852  
  3853  	m1 := model.ChannelMember{}
  3854  	m1.ChannelId = o1.Id
  3855  	m1.UserId = model.NewId()
  3856  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
  3857  	_, err = ss.Channel().SaveMember(&m1)
  3858  	require.Nil(t, err)
  3859  
  3860  	m2 := model.ChannelMember{}
  3861  	m2.ChannelId = o2.Id
  3862  	m2.UserId = m1.UserId
  3863  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
  3864  	_, err = ss.Channel().SaveMember(&m2)
  3865  	require.Nil(t, err)
  3866  
  3867  	t.Run("with channels", func(t *testing.T) {
  3868  		var members *model.ChannelMembers
  3869  		members, err = ss.Channel().GetMembersForUser(o1.TeamId, m1.UserId)
  3870  		require.Nil(t, err)
  3871  
  3872  		assert.Len(t, *members, 2)
  3873  	})
  3874  
  3875  	t.Run("with channels and direct messages", func(t *testing.T) {
  3876  		user := model.User{Id: m1.UserId}
  3877  		u1 := model.User{Id: model.NewId()}
  3878  		u2 := model.User{Id: model.NewId()}
  3879  		u3 := model.User{Id: model.NewId()}
  3880  		u4 := model.User{Id: model.NewId()}
  3881  		_, nErr = ss.Channel().CreateDirectChannel(&u1, &user)
  3882  		require.Nil(t, nErr)
  3883  		_, nErr = ss.Channel().CreateDirectChannel(&u2, &user)
  3884  		require.Nil(t, nErr)
  3885  		// other user direct message
  3886  		_, nErr = ss.Channel().CreateDirectChannel(&u3, &u4)
  3887  		require.Nil(t, nErr)
  3888  
  3889  		var members *model.ChannelMembers
  3890  		members, err = ss.Channel().GetMembersForUser(o1.TeamId, m1.UserId)
  3891  		require.Nil(t, err)
  3892  
  3893  		assert.Len(t, *members, 4)
  3894  	})
  3895  
  3896  	t.Run("with channels, direct channels and group messages", func(t *testing.T) {
  3897  		userIds := []string{model.NewId(), model.NewId(), model.NewId(), m1.UserId}
  3898  		group := &model.Channel{
  3899  			Name:        model.GetGroupNameFromUserIds(userIds),
  3900  			DisplayName: "test",
  3901  			Type:        model.CHANNEL_GROUP,
  3902  		}
  3903  		var channel *model.Channel
  3904  		channel, nErr = ss.Channel().Save(group, 10000)
  3905  		require.Nil(t, nErr)
  3906  		for _, userId := range userIds {
  3907  			cm := &model.ChannelMember{
  3908  				UserId:      userId,
  3909  				ChannelId:   channel.Id,
  3910  				NotifyProps: model.GetDefaultChannelNotifyProps(),
  3911  				SchemeUser:  true,
  3912  			}
  3913  
  3914  			_, err = ss.Channel().SaveMember(cm)
  3915  			require.Nil(t, err)
  3916  		}
  3917  		var members *model.ChannelMembers
  3918  		members, err = ss.Channel().GetMembersForUser(o1.TeamId, m1.UserId)
  3919  		require.Nil(t, err)
  3920  
  3921  		assert.Len(t, *members, 5)
  3922  	})
  3923  }
  3924  
  3925  func testChannelStoreGetMembersForUserWithPagination(t *testing.T, ss store.Store) {
  3926  	t1 := model.Team{}
  3927  	t1.DisplayName = "Name"
  3928  	t1.Name = "zz" + model.NewId()
  3929  	t1.Email = MakeEmail()
  3930  	t1.Type = model.TEAM_OPEN
  3931  	_, err := ss.Team().Save(&t1)
  3932  	require.Nil(t, err)
  3933  
  3934  	o1 := model.Channel{}
  3935  	o1.TeamId = t1.Id
  3936  	o1.DisplayName = "Channel1"
  3937  	o1.Name = "zz" + model.NewId() + "b"
  3938  	o1.Type = model.CHANNEL_OPEN
  3939  	_, nErr := ss.Channel().Save(&o1, -1)
  3940  	require.Nil(t, nErr)
  3941  
  3942  	o2 := model.Channel{}
  3943  	o2.TeamId = o1.TeamId
  3944  	o2.DisplayName = "Channel2"
  3945  	o2.Name = "zz" + model.NewId() + "b"
  3946  	o2.Type = model.CHANNEL_OPEN
  3947  	_, nErr = ss.Channel().Save(&o2, -1)
  3948  	require.Nil(t, nErr)
  3949  
  3950  	m1 := model.ChannelMember{}
  3951  	m1.ChannelId = o1.Id
  3952  	m1.UserId = model.NewId()
  3953  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
  3954  	_, err = ss.Channel().SaveMember(&m1)
  3955  	require.Nil(t, err)
  3956  
  3957  	m2 := model.ChannelMember{}
  3958  	m2.ChannelId = o2.Id
  3959  	m2.UserId = m1.UserId
  3960  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
  3961  	_, err = ss.Channel().SaveMember(&m2)
  3962  	require.Nil(t, err)
  3963  
  3964  	members, err := ss.Channel().GetMembersForUserWithPagination(o1.TeamId, m1.UserId, 0, 1)
  3965  	require.Nil(t, err)
  3966  	assert.Len(t, *members, 1)
  3967  
  3968  	members, err = ss.Channel().GetMembersForUserWithPagination(o1.TeamId, m1.UserId, 1, 1)
  3969  	require.Nil(t, err)
  3970  	assert.Len(t, *members, 1)
  3971  }
  3972  
  3973  func testCountPostsAfter(t *testing.T, ss store.Store) {
  3974  	t.Run("should count all posts with or without the given user ID", func(t *testing.T) {
  3975  		userId1 := model.NewId()
  3976  		userId2 := model.NewId()
  3977  
  3978  		channelId := model.NewId()
  3979  
  3980  		p1, err := ss.Post().Save(&model.Post{
  3981  			UserId:    userId1,
  3982  			ChannelId: channelId,
  3983  			CreateAt:  1000,
  3984  		})
  3985  		require.Nil(t, err)
  3986  
  3987  		_, err = ss.Post().Save(&model.Post{
  3988  			UserId:    userId1,
  3989  			ChannelId: channelId,
  3990  			CreateAt:  1001,
  3991  		})
  3992  		require.Nil(t, err)
  3993  
  3994  		_, err = ss.Post().Save(&model.Post{
  3995  			UserId:    userId2,
  3996  			ChannelId: channelId,
  3997  			CreateAt:  1002,
  3998  		})
  3999  		require.Nil(t, err)
  4000  
  4001  		count, err := ss.Channel().CountPostsAfter(channelId, p1.CreateAt-1, "")
  4002  		require.Nil(t, err)
  4003  		assert.Equal(t, 3, count)
  4004  
  4005  		count, err = ss.Channel().CountPostsAfter(channelId, p1.CreateAt, "")
  4006  		require.Nil(t, err)
  4007  		assert.Equal(t, 2, count)
  4008  
  4009  		count, err = ss.Channel().CountPostsAfter(channelId, p1.CreateAt-1, userId1)
  4010  		require.Nil(t, err)
  4011  		assert.Equal(t, 2, count)
  4012  
  4013  		count, err = ss.Channel().CountPostsAfter(channelId, p1.CreateAt, userId1)
  4014  		require.Nil(t, err)
  4015  		assert.Equal(t, 1, count)
  4016  	})
  4017  
  4018  	t.Run("should not count deleted posts", func(t *testing.T) {
  4019  		userId1 := model.NewId()
  4020  
  4021  		channelId := model.NewId()
  4022  
  4023  		p1, err := ss.Post().Save(&model.Post{
  4024  			UserId:    userId1,
  4025  			ChannelId: channelId,
  4026  			CreateAt:  1000,
  4027  		})
  4028  		require.Nil(t, err)
  4029  
  4030  		_, err = ss.Post().Save(&model.Post{
  4031  			UserId:    userId1,
  4032  			ChannelId: channelId,
  4033  			CreateAt:  1001,
  4034  			DeleteAt:  1001,
  4035  		})
  4036  		require.Nil(t, err)
  4037  
  4038  		count, err := ss.Channel().CountPostsAfter(channelId, p1.CreateAt-1, "")
  4039  		require.Nil(t, err)
  4040  		assert.Equal(t, 1, count)
  4041  
  4042  		count, err = ss.Channel().CountPostsAfter(channelId, p1.CreateAt, "")
  4043  		require.Nil(t, err)
  4044  		assert.Equal(t, 0, count)
  4045  	})
  4046  
  4047  	t.Run("should count system/bot messages, but not join/leave messages", func(t *testing.T) {
  4048  		userId1 := model.NewId()
  4049  
  4050  		channelId := model.NewId()
  4051  
  4052  		p1, err := ss.Post().Save(&model.Post{
  4053  			UserId:    userId1,
  4054  			ChannelId: channelId,
  4055  			CreateAt:  1000,
  4056  		})
  4057  		require.Nil(t, err)
  4058  
  4059  		_, err = ss.Post().Save(&model.Post{
  4060  			UserId:    userId1,
  4061  			ChannelId: channelId,
  4062  			CreateAt:  1001,
  4063  			Type:      model.POST_JOIN_CHANNEL,
  4064  		})
  4065  		require.Nil(t, err)
  4066  
  4067  		_, err = ss.Post().Save(&model.Post{
  4068  			UserId:    userId1,
  4069  			ChannelId: channelId,
  4070  			CreateAt:  1002,
  4071  			Type:      model.POST_REMOVE_FROM_CHANNEL,
  4072  		})
  4073  		require.Nil(t, err)
  4074  
  4075  		_, err = ss.Post().Save(&model.Post{
  4076  			UserId:    userId1,
  4077  			ChannelId: channelId,
  4078  			CreateAt:  1003,
  4079  			Type:      model.POST_LEAVE_TEAM,
  4080  		})
  4081  		require.Nil(t, err)
  4082  
  4083  		p5, err := ss.Post().Save(&model.Post{
  4084  			UserId:    userId1,
  4085  			ChannelId: channelId,
  4086  			CreateAt:  1004,
  4087  			Type:      model.POST_HEADER_CHANGE,
  4088  		})
  4089  		require.Nil(t, err)
  4090  
  4091  		_, err = ss.Post().Save(&model.Post{
  4092  			UserId:    userId1,
  4093  			ChannelId: channelId,
  4094  			CreateAt:  1005,
  4095  			Type:      "custom_nps_survey",
  4096  		})
  4097  		require.Nil(t, err)
  4098  
  4099  		count, err := ss.Channel().CountPostsAfter(channelId, p1.CreateAt-1, "")
  4100  		require.Nil(t, err)
  4101  		assert.Equal(t, 3, count)
  4102  
  4103  		count, err = ss.Channel().CountPostsAfter(channelId, p1.CreateAt, "")
  4104  		require.Nil(t, err)
  4105  		assert.Equal(t, 2, count)
  4106  
  4107  		count, err = ss.Channel().CountPostsAfter(channelId, p5.CreateAt-1, "")
  4108  		require.Nil(t, err)
  4109  		assert.Equal(t, 2, count)
  4110  
  4111  		count, err = ss.Channel().CountPostsAfter(channelId, p5.CreateAt, "")
  4112  		require.Nil(t, err)
  4113  		assert.Equal(t, 1, count)
  4114  	})
  4115  }
  4116  
  4117  func testChannelStoreUpdateLastViewedAt(t *testing.T, ss store.Store) {
  4118  	o1 := model.Channel{}
  4119  	o1.TeamId = model.NewId()
  4120  	o1.DisplayName = "Channel1"
  4121  	o1.Name = "zz" + model.NewId() + "b"
  4122  	o1.Type = model.CHANNEL_OPEN
  4123  	o1.TotalMsgCount = 25
  4124  	o1.LastPostAt = 12345
  4125  	_, nErr := ss.Channel().Save(&o1, -1)
  4126  	require.Nil(t, nErr)
  4127  
  4128  	m1 := model.ChannelMember{}
  4129  	m1.ChannelId = o1.Id
  4130  	m1.UserId = model.NewId()
  4131  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
  4132  	_, err := ss.Channel().SaveMember(&m1)
  4133  	require.Nil(t, err)
  4134  
  4135  	o2 := model.Channel{}
  4136  	o2.TeamId = model.NewId()
  4137  	o2.DisplayName = "Channel1"
  4138  	o2.Name = "zz" + model.NewId() + "c"
  4139  	o2.Type = model.CHANNEL_OPEN
  4140  	o2.TotalMsgCount = 26
  4141  	o2.LastPostAt = 123456
  4142  	_, nErr = ss.Channel().Save(&o2, -1)
  4143  	require.Nil(t, nErr)
  4144  
  4145  	m2 := model.ChannelMember{}
  4146  	m2.ChannelId = o2.Id
  4147  	m2.UserId = m1.UserId
  4148  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
  4149  	_, err = ss.Channel().SaveMember(&m2)
  4150  	require.Nil(t, err)
  4151  
  4152  	var times map[string]int64
  4153  	times, err = ss.Channel().UpdateLastViewedAt([]string{m1.ChannelId}, m1.UserId)
  4154  	require.Nil(t, err, "failed to update ", err)
  4155  	require.Equal(t, o1.LastPostAt, times[o1.Id], "last viewed at time incorrect")
  4156  
  4157  	times, err = ss.Channel().UpdateLastViewedAt([]string{m1.ChannelId, m2.ChannelId}, m1.UserId)
  4158  	require.Nil(t, err, "failed to update ", err)
  4159  	require.Equal(t, o2.LastPostAt, times[o2.Id], "last viewed at time incorrect")
  4160  
  4161  	rm1, err := ss.Channel().GetMember(m1.ChannelId, m1.UserId)
  4162  	assert.Nil(t, err)
  4163  	assert.Equal(t, o1.LastPostAt, rm1.LastViewedAt)
  4164  	assert.Equal(t, o1.LastPostAt, rm1.LastUpdateAt)
  4165  	assert.Equal(t, o1.TotalMsgCount, rm1.MsgCount)
  4166  
  4167  	rm2, err := ss.Channel().GetMember(m2.ChannelId, m2.UserId)
  4168  	assert.Nil(t, err)
  4169  	assert.Equal(t, o2.LastPostAt, rm2.LastViewedAt)
  4170  	assert.Equal(t, o2.LastPostAt, rm2.LastUpdateAt)
  4171  	assert.Equal(t, o2.TotalMsgCount, rm2.MsgCount)
  4172  
  4173  	_, err = ss.Channel().UpdateLastViewedAt([]string{m1.ChannelId}, "missing id")
  4174  	require.Nil(t, err, "failed to update")
  4175  }
  4176  
  4177  func testChannelStoreIncrementMentionCount(t *testing.T, ss store.Store) {
  4178  	o1 := model.Channel{}
  4179  	o1.TeamId = model.NewId()
  4180  	o1.DisplayName = "Channel1"
  4181  	o1.Name = "zz" + model.NewId() + "b"
  4182  	o1.Type = model.CHANNEL_OPEN
  4183  	o1.TotalMsgCount = 25
  4184  	_, nErr := ss.Channel().Save(&o1, -1)
  4185  	require.Nil(t, nErr)
  4186  
  4187  	m1 := model.ChannelMember{}
  4188  	m1.ChannelId = o1.Id
  4189  	m1.UserId = model.NewId()
  4190  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
  4191  	_, err := ss.Channel().SaveMember(&m1)
  4192  	require.Nil(t, err)
  4193  
  4194  	err = ss.Channel().IncrementMentionCount(m1.ChannelId, m1.UserId)
  4195  	require.Nil(t, err, "failed to update")
  4196  
  4197  	err = ss.Channel().IncrementMentionCount(m1.ChannelId, "missing id")
  4198  	require.Nil(t, err, "failed to update")
  4199  
  4200  	err = ss.Channel().IncrementMentionCount("missing id", m1.UserId)
  4201  	require.Nil(t, err, "failed to update")
  4202  
  4203  	err = ss.Channel().IncrementMentionCount("missing id", "missing id")
  4204  	require.Nil(t, err, "failed to update")
  4205  }
  4206  
  4207  func testUpdateChannelMember(t *testing.T, ss store.Store) {
  4208  	userId := model.NewId()
  4209  
  4210  	c1 := &model.Channel{
  4211  		TeamId:      model.NewId(),
  4212  		DisplayName: model.NewId(),
  4213  		Name:        model.NewId(),
  4214  		Type:        model.CHANNEL_OPEN,
  4215  	}
  4216  	_, nErr := ss.Channel().Save(c1, -1)
  4217  	require.Nil(t, nErr)
  4218  
  4219  	m1 := &model.ChannelMember{
  4220  		ChannelId:   c1.Id,
  4221  		UserId:      userId,
  4222  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  4223  	}
  4224  	_, err := ss.Channel().SaveMember(m1)
  4225  	require.Nil(t, err)
  4226  
  4227  	m1.NotifyProps["test"] = "sometext"
  4228  	_, err = ss.Channel().UpdateMember(m1)
  4229  	require.Nil(t, err, err)
  4230  
  4231  	m1.UserId = ""
  4232  	_, err = ss.Channel().UpdateMember(m1)
  4233  	require.NotNil(t, err, "bad user id - should fail")
  4234  }
  4235  
  4236  func testGetMember(t *testing.T, ss store.Store) {
  4237  	userId := model.NewId()
  4238  
  4239  	c1 := &model.Channel{
  4240  		TeamId:      model.NewId(),
  4241  		DisplayName: model.NewId(),
  4242  		Name:        model.NewId(),
  4243  		Type:        model.CHANNEL_OPEN,
  4244  	}
  4245  	_, nErr := ss.Channel().Save(c1, -1)
  4246  	require.Nil(t, nErr)
  4247  
  4248  	c2 := &model.Channel{
  4249  		TeamId:      c1.TeamId,
  4250  		DisplayName: model.NewId(),
  4251  		Name:        model.NewId(),
  4252  		Type:        model.CHANNEL_OPEN,
  4253  	}
  4254  	_, nErr = ss.Channel().Save(c2, -1)
  4255  	require.Nil(t, nErr)
  4256  
  4257  	m1 := &model.ChannelMember{
  4258  		ChannelId:   c1.Id,
  4259  		UserId:      userId,
  4260  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  4261  	}
  4262  	_, err := ss.Channel().SaveMember(m1)
  4263  	require.Nil(t, err)
  4264  
  4265  	m2 := &model.ChannelMember{
  4266  		ChannelId:   c2.Id,
  4267  		UserId:      userId,
  4268  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  4269  	}
  4270  	_, err = ss.Channel().SaveMember(m2)
  4271  	require.Nil(t, err)
  4272  
  4273  	_, err = ss.Channel().GetMember(model.NewId(), userId)
  4274  	require.NotNil(t, err, "should've failed to get member for non-existent channel")
  4275  
  4276  	_, err = ss.Channel().GetMember(c1.Id, model.NewId())
  4277  	require.NotNil(t, err, "should've failed to get member for non-existent user")
  4278  
  4279  	member, err := ss.Channel().GetMember(c1.Id, userId)
  4280  	require.Nil(t, err, "shouldn't have errored when getting member", err)
  4281  	require.Equal(t, c1.Id, member.ChannelId, "should've gotten member of channel 1")
  4282  	require.Equal(t, userId, member.UserId, "should've have gotten member for user")
  4283  
  4284  	member, err = ss.Channel().GetMember(c2.Id, userId)
  4285  	require.Nil(t, err, "should'nt have errored when getting member", err)
  4286  	require.Equal(t, c2.Id, member.ChannelId, "should've gotten member of channel 2")
  4287  	require.Equal(t, userId, member.UserId, "should've gotten member for user")
  4288  
  4289  	props, err := ss.Channel().GetAllChannelMembersNotifyPropsForChannel(c2.Id, false)
  4290  	require.Nil(t, err, err)
  4291  	require.NotEqual(t, 0, len(props), "should not be empty")
  4292  
  4293  	props, err = ss.Channel().GetAllChannelMembersNotifyPropsForChannel(c2.Id, true)
  4294  	require.Nil(t, err, err)
  4295  	require.NotEqual(t, 0, len(props), "should not be empty")
  4296  
  4297  	ss.Channel().InvalidateCacheForChannelMembersNotifyProps(c2.Id)
  4298  }
  4299  
  4300  func testChannelStoreGetMemberForPost(t *testing.T, ss store.Store) {
  4301  	ch := &model.Channel{
  4302  		TeamId:      model.NewId(),
  4303  		DisplayName: "Name",
  4304  		Name:        "zz" + model.NewId() + "b",
  4305  		Type:        model.CHANNEL_OPEN,
  4306  	}
  4307  
  4308  	o1, nErr := ss.Channel().Save(ch, -1)
  4309  	require.Nil(t, nErr)
  4310  
  4311  	m1, err := ss.Channel().SaveMember(&model.ChannelMember{
  4312  		ChannelId:   o1.Id,
  4313  		UserId:      model.NewId(),
  4314  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  4315  	})
  4316  	require.Nil(t, err)
  4317  
  4318  	p1, err := ss.Post().Save(&model.Post{
  4319  		UserId:    model.NewId(),
  4320  		ChannelId: o1.Id,
  4321  		Message:   "test",
  4322  	})
  4323  	require.Nil(t, err)
  4324  
  4325  	r1, err := ss.Channel().GetMemberForPost(p1.Id, m1.UserId)
  4326  	require.Nil(t, err, err)
  4327  	require.Equal(t, m1.ToJson(), r1.ToJson(), "invalid returned channel member")
  4328  
  4329  	_, err = ss.Channel().GetMemberForPost(p1.Id, model.NewId())
  4330  	require.NotNil(t, err, "shouldn't have returned a member")
  4331  }
  4332  
  4333  func testGetMemberCount(t *testing.T, ss store.Store) {
  4334  	teamId := model.NewId()
  4335  
  4336  	c1 := model.Channel{
  4337  		TeamId:      teamId,
  4338  		DisplayName: "Channel1",
  4339  		Name:        "zz" + model.NewId() + "b",
  4340  		Type:        model.CHANNEL_OPEN,
  4341  	}
  4342  	_, nErr := ss.Channel().Save(&c1, -1)
  4343  	require.Nil(t, nErr)
  4344  
  4345  	c2 := model.Channel{
  4346  		TeamId:      teamId,
  4347  		DisplayName: "Channel2",
  4348  		Name:        "zz" + model.NewId() + "b",
  4349  		Type:        model.CHANNEL_OPEN,
  4350  	}
  4351  	_, nErr = ss.Channel().Save(&c2, -1)
  4352  	require.Nil(t, nErr)
  4353  
  4354  	u1 := &model.User{
  4355  		Email:    MakeEmail(),
  4356  		DeleteAt: 0,
  4357  	}
  4358  	_, err := ss.User().Save(u1)
  4359  	require.Nil(t, err)
  4360  	_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)
  4361  	require.Nil(t, err)
  4362  
  4363  	m1 := model.ChannelMember{
  4364  		ChannelId:   c1.Id,
  4365  		UserId:      u1.Id,
  4366  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  4367  	}
  4368  	_, err = ss.Channel().SaveMember(&m1)
  4369  	require.Nil(t, err)
  4370  
  4371  	count, channelErr := ss.Channel().GetMemberCount(c1.Id, false)
  4372  	require.Nilf(t, channelErr, "failed to get member count: %v", channelErr)
  4373  	require.EqualValuesf(t, 1, count, "got incorrect member count %v", count)
  4374  
  4375  	u2 := model.User{
  4376  		Email:    MakeEmail(),
  4377  		DeleteAt: 0,
  4378  	}
  4379  	_, err = ss.User().Save(&u2)
  4380  	require.Nil(t, err)
  4381  	_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)
  4382  	require.Nil(t, err)
  4383  
  4384  	m2 := model.ChannelMember{
  4385  		ChannelId:   c1.Id,
  4386  		UserId:      u2.Id,
  4387  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  4388  	}
  4389  	_, err = ss.Channel().SaveMember(&m2)
  4390  	require.Nil(t, err)
  4391  
  4392  	count, channelErr = ss.Channel().GetMemberCount(c1.Id, false)
  4393  	require.Nilf(t, channelErr, "failed to get member count: %v", channelErr)
  4394  	require.EqualValuesf(t, 2, count, "got incorrect member count %v", count)
  4395  
  4396  	// make sure members of other channels aren't counted
  4397  	u3 := model.User{
  4398  		Email:    MakeEmail(),
  4399  		DeleteAt: 0,
  4400  	}
  4401  	_, err = ss.User().Save(&u3)
  4402  	require.Nil(t, err)
  4403  	_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1)
  4404  	require.Nil(t, err)
  4405  
  4406  	m3 := model.ChannelMember{
  4407  		ChannelId:   c2.Id,
  4408  		UserId:      u3.Id,
  4409  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  4410  	}
  4411  	_, err = ss.Channel().SaveMember(&m3)
  4412  	require.Nil(t, err)
  4413  
  4414  	count, channelErr = ss.Channel().GetMemberCount(c1.Id, false)
  4415  	require.Nilf(t, channelErr, "failed to get member count: %v", channelErr)
  4416  	require.EqualValuesf(t, 2, count, "got incorrect member count %v", count)
  4417  
  4418  	// make sure inactive users aren't counted
  4419  	u4 := &model.User{
  4420  		Email:    MakeEmail(),
  4421  		DeleteAt: 10000,
  4422  	}
  4423  	_, err = ss.User().Save(u4)
  4424  	require.Nil(t, err)
  4425  	_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u4.Id}, -1)
  4426  	require.Nil(t, err)
  4427  
  4428  	m4 := model.ChannelMember{
  4429  		ChannelId:   c1.Id,
  4430  		UserId:      u4.Id,
  4431  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  4432  	}
  4433  	_, err = ss.Channel().SaveMember(&m4)
  4434  	require.Nil(t, err)
  4435  
  4436  	count, err = ss.Channel().GetMemberCount(c1.Id, false)
  4437  	require.Nilf(t, err, "failed to get member count: %v", err)
  4438  	require.EqualValuesf(t, 2, count, "got incorrect member count %v", count)
  4439  }
  4440  
  4441  func testGetMemberCountsByGroup(t *testing.T, ss store.Store) {
  4442  	var memberCounts []*model.ChannelMemberCountByGroup
  4443  	teamId := model.NewId()
  4444  	g1 := &model.Group{
  4445  		Name:        model.NewString(model.NewId()),
  4446  		DisplayName: model.NewId(),
  4447  		Source:      model.GroupSourceLdap,
  4448  		RemoteId:    model.NewId(),
  4449  	}
  4450  	_, err := ss.Group().Create(g1)
  4451  	require.Nil(t, err)
  4452  
  4453  	c1 := model.Channel{
  4454  		TeamId:      teamId,
  4455  		DisplayName: "Channel1",
  4456  		Name:        "zz" + model.NewId() + "b",
  4457  		Type:        model.CHANNEL_OPEN,
  4458  	}
  4459  	_, nErr := ss.Channel().Save(&c1, -1)
  4460  	require.Nil(t, nErr)
  4461  
  4462  	u1 := &model.User{
  4463  		Timezone: timezones.DefaultUserTimezone(),
  4464  		Email:    MakeEmail(),
  4465  		DeleteAt: 0,
  4466  	}
  4467  	_, err = ss.User().Save(u1)
  4468  	require.Nil(t, err)
  4469  	_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)
  4470  	require.Nil(t, err)
  4471  
  4472  	m1 := model.ChannelMember{
  4473  		ChannelId:   c1.Id,
  4474  		UserId:      u1.Id,
  4475  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  4476  	}
  4477  	_, err = ss.Channel().SaveMember(&m1)
  4478  	require.Nil(t, err)
  4479  
  4480  	t.Run("empty slice for channel with no groups", func(t *testing.T) {
  4481  		memberCounts, err = ss.Channel().GetMemberCountsByGroup(c1.Id, false)
  4482  		expectedMemberCounts := []*model.ChannelMemberCountByGroup{}
  4483  		require.Nil(t, err)
  4484  		require.Equal(t, expectedMemberCounts, memberCounts)
  4485  	})
  4486  
  4487  	_, err = ss.Group().UpsertMember(g1.Id, u1.Id)
  4488  	require.Nil(t, err)
  4489  
  4490  	t.Run("returns memberCountsByGroup without timezones", func(t *testing.T) {
  4491  		memberCounts, err = ss.Channel().GetMemberCountsByGroup(c1.Id, false)
  4492  		expectedMemberCounts := []*model.ChannelMemberCountByGroup{
  4493  			{
  4494  				GroupId:                     g1.Id,
  4495  				ChannelMemberCount:          1,
  4496  				ChannelMemberTimezonesCount: 0,
  4497  			},
  4498  		}
  4499  		require.Nil(t, err)
  4500  		require.Equal(t, expectedMemberCounts, memberCounts)
  4501  	})
  4502  
  4503  	t.Run("returns memberCountsByGroup with timezones when no timezones set", func(t *testing.T) {
  4504  		memberCounts, err = ss.Channel().GetMemberCountsByGroup(c1.Id, true)
  4505  		expectedMemberCounts := []*model.ChannelMemberCountByGroup{
  4506  			{
  4507  				GroupId:                     g1.Id,
  4508  				ChannelMemberCount:          1,
  4509  				ChannelMemberTimezonesCount: 0,
  4510  			},
  4511  		}
  4512  		require.Nil(t, err)
  4513  		require.Equal(t, expectedMemberCounts, memberCounts)
  4514  	})
  4515  
  4516  	g2 := &model.Group{
  4517  		Name:        model.NewString(model.NewId()),
  4518  		DisplayName: model.NewId(),
  4519  		Source:      model.GroupSourceLdap,
  4520  		RemoteId:    model.NewId(),
  4521  	}
  4522  	_, err = ss.Group().Create(g2)
  4523  	require.Nil(t, err)
  4524  
  4525  	// create 5 different users with 2 different timezones for group 2
  4526  	for i := 1; i <= 5; i++ {
  4527  		timeZone := timezones.DefaultUserTimezone()
  4528  		if i == 1 {
  4529  			timeZone["manualTimezone"] = "EDT"
  4530  			timeZone["useAutomaticTimezone"] = "false"
  4531  		}
  4532  
  4533  		u := &model.User{
  4534  			Timezone: timeZone,
  4535  			Email:    MakeEmail(),
  4536  			DeleteAt: 0,
  4537  		}
  4538  		_, err = ss.User().Save(u)
  4539  		require.Nil(t, err)
  4540  		_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u.Id}, -1)
  4541  		require.Nil(t, err)
  4542  
  4543  		m := model.ChannelMember{
  4544  			ChannelId:   c1.Id,
  4545  			UserId:      u.Id,
  4546  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  4547  		}
  4548  		_, err = ss.Channel().SaveMember(&m)
  4549  		require.Nil(t, err)
  4550  
  4551  		_, err = ss.Group().UpsertMember(g2.Id, u.Id)
  4552  		require.Nil(t, err)
  4553  	}
  4554  
  4555  	g3 := &model.Group{
  4556  		Name:        model.NewString(model.NewId()),
  4557  		DisplayName: model.NewId(),
  4558  		Source:      model.GroupSourceLdap,
  4559  		RemoteId:    model.NewId(),
  4560  	}
  4561  
  4562  	_, err = ss.Group().Create(g3)
  4563  	require.Nil(t, err)
  4564  
  4565  	// create 10 different users with 3 different timezones for group 3
  4566  	for i := 1; i <= 10; i++ {
  4567  		timeZone := timezones.DefaultUserTimezone()
  4568  
  4569  		if i == 1 || i == 2 {
  4570  			timeZone["manualTimezone"] = "EDT"
  4571  			timeZone["useAutomaticTimezone"] = "false"
  4572  		} else if i == 3 || i == 4 {
  4573  			timeZone["manualTimezone"] = "PST"
  4574  			timeZone["useAutomaticTimezone"] = "false"
  4575  		} else if i == 5 || i == 6 {
  4576  			timeZone["autoTimezone"] = "PST"
  4577  			timeZone["useAutomaticTimezone"] = "true"
  4578  		} else {
  4579  			// Give every user with auto timezone set to true a random manual timezone to ensure that manual timezone is not looked at if auto is set
  4580  			timeZone["useAutomaticTimezone"] = "true"
  4581  			timeZone["manualTimezone"] = "PST" + utils.RandomName(utils.Range{Begin: 5, End: 5}, utils.ALPHANUMERIC)
  4582  		}
  4583  
  4584  		u := &model.User{
  4585  			Timezone: timeZone,
  4586  			Email:    MakeEmail(),
  4587  			DeleteAt: 0,
  4588  		}
  4589  		_, err = ss.User().Save(u)
  4590  		require.Nil(t, err)
  4591  		_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u.Id}, -1)
  4592  		require.Nil(t, err)
  4593  
  4594  		m := model.ChannelMember{
  4595  			ChannelId:   c1.Id,
  4596  			UserId:      u.Id,
  4597  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  4598  		}
  4599  		_, err = ss.Channel().SaveMember(&m)
  4600  		require.Nil(t, err)
  4601  
  4602  		_, err = ss.Group().UpsertMember(g3.Id, u.Id)
  4603  		require.Nil(t, err)
  4604  	}
  4605  
  4606  	t.Run("returns memberCountsByGroup for multiple groups with lots of users without timezones", func(t *testing.T) {
  4607  		memberCounts, err = ss.Channel().GetMemberCountsByGroup(c1.Id, false)
  4608  		expectedMemberCounts := []*model.ChannelMemberCountByGroup{
  4609  			{
  4610  				GroupId:                     g1.Id,
  4611  				ChannelMemberCount:          1,
  4612  				ChannelMemberTimezonesCount: 0,
  4613  			},
  4614  			{
  4615  				GroupId:                     g2.Id,
  4616  				ChannelMemberCount:          5,
  4617  				ChannelMemberTimezonesCount: 0,
  4618  			},
  4619  			{
  4620  				GroupId:                     g3.Id,
  4621  				ChannelMemberCount:          10,
  4622  				ChannelMemberTimezonesCount: 0,
  4623  			},
  4624  		}
  4625  		require.Nil(t, err)
  4626  		require.ElementsMatch(t, expectedMemberCounts, memberCounts)
  4627  	})
  4628  
  4629  	t.Run("returns memberCountsByGroup for multiple groups with lots of users with timezones", func(t *testing.T) {
  4630  		memberCounts, err = ss.Channel().GetMemberCountsByGroup(c1.Id, true)
  4631  		expectedMemberCounts := []*model.ChannelMemberCountByGroup{
  4632  			{
  4633  				GroupId:                     g1.Id,
  4634  				ChannelMemberCount:          1,
  4635  				ChannelMemberTimezonesCount: 0,
  4636  			},
  4637  			{
  4638  				GroupId:                     g2.Id,
  4639  				ChannelMemberCount:          5,
  4640  				ChannelMemberTimezonesCount: 1,
  4641  			},
  4642  			{
  4643  				GroupId:                     g3.Id,
  4644  				ChannelMemberCount:          10,
  4645  				ChannelMemberTimezonesCount: 3,
  4646  			},
  4647  		}
  4648  		require.Nil(t, err)
  4649  		require.ElementsMatch(t, expectedMemberCounts, memberCounts)
  4650  	})
  4651  }
  4652  
  4653  func testGetGuestCount(t *testing.T, ss store.Store) {
  4654  	teamId := model.NewId()
  4655  
  4656  	c1 := model.Channel{
  4657  		TeamId:      teamId,
  4658  		DisplayName: "Channel1",
  4659  		Name:        "zz" + model.NewId() + "b",
  4660  		Type:        model.CHANNEL_OPEN,
  4661  	}
  4662  	_, nErr := ss.Channel().Save(&c1, -1)
  4663  	require.Nil(t, nErr)
  4664  
  4665  	c2 := model.Channel{
  4666  		TeamId:      teamId,
  4667  		DisplayName: "Channel2",
  4668  		Name:        "zz" + model.NewId() + "b",
  4669  		Type:        model.CHANNEL_OPEN,
  4670  	}
  4671  	_, nErr = ss.Channel().Save(&c2, -1)
  4672  	require.Nil(t, nErr)
  4673  
  4674  	t.Run("Regular member doesn't count", func(t *testing.T) {
  4675  		u1 := &model.User{
  4676  			Email:    MakeEmail(),
  4677  			DeleteAt: 0,
  4678  			Roles:    model.SYSTEM_USER_ROLE_ID,
  4679  		}
  4680  		_, err := ss.User().Save(u1)
  4681  		require.Nil(t, err)
  4682  		_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)
  4683  		require.Nil(t, err)
  4684  
  4685  		m1 := model.ChannelMember{
  4686  			ChannelId:   c1.Id,
  4687  			UserId:      u1.Id,
  4688  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  4689  			SchemeGuest: false,
  4690  		}
  4691  		_, err = ss.Channel().SaveMember(&m1)
  4692  		require.Nil(t, err)
  4693  
  4694  		count, channelErr := ss.Channel().GetGuestCount(c1.Id, false)
  4695  		require.Nil(t, channelErr)
  4696  		require.Equal(t, int64(0), count)
  4697  	})
  4698  
  4699  	t.Run("Guest member does count", func(t *testing.T) {
  4700  		u2 := model.User{
  4701  			Email:    MakeEmail(),
  4702  			DeleteAt: 0,
  4703  			Roles:    model.SYSTEM_GUEST_ROLE_ID,
  4704  		}
  4705  		_, err := ss.User().Save(&u2)
  4706  		require.Nil(t, err)
  4707  		_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)
  4708  		require.Nil(t, err)
  4709  
  4710  		m2 := model.ChannelMember{
  4711  			ChannelId:   c1.Id,
  4712  			UserId:      u2.Id,
  4713  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  4714  			SchemeGuest: true,
  4715  		}
  4716  		_, err = ss.Channel().SaveMember(&m2)
  4717  		require.Nil(t, err)
  4718  
  4719  		count, channelErr := ss.Channel().GetGuestCount(c1.Id, false)
  4720  		require.Nil(t, channelErr)
  4721  		require.Equal(t, int64(1), count)
  4722  	})
  4723  
  4724  	t.Run("make sure members of other channels aren't counted", func(t *testing.T) {
  4725  		u3 := model.User{
  4726  			Email:    MakeEmail(),
  4727  			DeleteAt: 0,
  4728  			Roles:    model.SYSTEM_GUEST_ROLE_ID,
  4729  		}
  4730  		_, err := ss.User().Save(&u3)
  4731  		require.Nil(t, err)
  4732  		_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1)
  4733  		require.Nil(t, err)
  4734  
  4735  		m3 := model.ChannelMember{
  4736  			ChannelId:   c2.Id,
  4737  			UserId:      u3.Id,
  4738  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  4739  			SchemeGuest: true,
  4740  		}
  4741  		_, err = ss.Channel().SaveMember(&m3)
  4742  		require.Nil(t, err)
  4743  
  4744  		count, channelErr := ss.Channel().GetGuestCount(c1.Id, false)
  4745  		require.Nil(t, channelErr)
  4746  		require.Equal(t, int64(1), count)
  4747  	})
  4748  
  4749  	t.Run("make sure inactive users aren't counted", func(t *testing.T) {
  4750  		u4 := &model.User{
  4751  			Email:    MakeEmail(),
  4752  			DeleteAt: 10000,
  4753  			Roles:    model.SYSTEM_GUEST_ROLE_ID,
  4754  		}
  4755  		_, err := ss.User().Save(u4)
  4756  		require.Nil(t, err)
  4757  		_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u4.Id}, -1)
  4758  		require.Nil(t, err)
  4759  
  4760  		m4 := model.ChannelMember{
  4761  			ChannelId:   c1.Id,
  4762  			UserId:      u4.Id,
  4763  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  4764  			SchemeGuest: true,
  4765  		}
  4766  		_, err = ss.Channel().SaveMember(&m4)
  4767  		require.Nil(t, err)
  4768  
  4769  		count, channelErr := ss.Channel().GetGuestCount(c1.Id, false)
  4770  		require.Nil(t, channelErr)
  4771  		require.Equal(t, int64(1), count)
  4772  	})
  4773  }
  4774  
  4775  func testChannelStoreSearchMore(t *testing.T, ss store.Store) {
  4776  	teamId := model.NewId()
  4777  	otherTeamId := model.NewId()
  4778  
  4779  	o1 := model.Channel{
  4780  		TeamId:      teamId,
  4781  		DisplayName: "ChannelA",
  4782  		Name:        "zz" + model.NewId() + "b",
  4783  		Type:        model.CHANNEL_OPEN,
  4784  	}
  4785  	_, nErr := ss.Channel().Save(&o1, -1)
  4786  	require.Nil(t, nErr)
  4787  
  4788  	m1 := model.ChannelMember{
  4789  		ChannelId:   o1.Id,
  4790  		UserId:      model.NewId(),
  4791  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  4792  	}
  4793  	_, err := ss.Channel().SaveMember(&m1)
  4794  	require.Nil(t, err)
  4795  
  4796  	m2 := model.ChannelMember{
  4797  		ChannelId:   o1.Id,
  4798  		UserId:      model.NewId(),
  4799  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  4800  	}
  4801  	_, err = ss.Channel().SaveMember(&m2)
  4802  	require.Nil(t, err)
  4803  
  4804  	o2 := model.Channel{
  4805  		TeamId:      otherTeamId,
  4806  		DisplayName: "Channel2",
  4807  		Name:        "zz" + model.NewId() + "b",
  4808  		Type:        model.CHANNEL_OPEN,
  4809  	}
  4810  	_, nErr = ss.Channel().Save(&o2, -1)
  4811  	require.Nil(t, nErr)
  4812  
  4813  	m3 := model.ChannelMember{
  4814  		ChannelId:   o2.Id,
  4815  		UserId:      model.NewId(),
  4816  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  4817  	}
  4818  	_, err = ss.Channel().SaveMember(&m3)
  4819  	require.Nil(t, err)
  4820  
  4821  	o3 := model.Channel{
  4822  		TeamId:      teamId,
  4823  		DisplayName: "ChannelA",
  4824  		Name:        "zz" + model.NewId() + "b",
  4825  		Type:        model.CHANNEL_OPEN,
  4826  	}
  4827  	_, nErr = ss.Channel().Save(&o3, -1)
  4828  	require.Nil(t, nErr)
  4829  
  4830  	o4 := model.Channel{
  4831  		TeamId:      teamId,
  4832  		DisplayName: "ChannelB",
  4833  		Name:        "zz" + model.NewId() + "b",
  4834  		Type:        model.CHANNEL_PRIVATE,
  4835  	}
  4836  	_, nErr = ss.Channel().Save(&o4, -1)
  4837  	require.Nil(t, nErr)
  4838  
  4839  	o5 := model.Channel{
  4840  		TeamId:      teamId,
  4841  		DisplayName: "ChannelC",
  4842  		Name:        "zz" + model.NewId() + "b",
  4843  		Type:        model.CHANNEL_PRIVATE,
  4844  	}
  4845  	_, nErr = ss.Channel().Save(&o5, -1)
  4846  	require.Nil(t, nErr)
  4847  
  4848  	o6 := model.Channel{
  4849  		TeamId:      teamId,
  4850  		DisplayName: "Off-Topic",
  4851  		Name:        "off-topic",
  4852  		Type:        model.CHANNEL_OPEN,
  4853  	}
  4854  	_, nErr = ss.Channel().Save(&o6, -1)
  4855  	require.Nil(t, nErr)
  4856  
  4857  	o7 := model.Channel{
  4858  		TeamId:      teamId,
  4859  		DisplayName: "Off-Set",
  4860  		Name:        "off-set",
  4861  		Type:        model.CHANNEL_OPEN,
  4862  	}
  4863  	_, nErr = ss.Channel().Save(&o7, -1)
  4864  	require.Nil(t, nErr)
  4865  
  4866  	o8 := model.Channel{
  4867  		TeamId:      teamId,
  4868  		DisplayName: "Off-Limit",
  4869  		Name:        "off-limit",
  4870  		Type:        model.CHANNEL_PRIVATE,
  4871  	}
  4872  	_, nErr = ss.Channel().Save(&o8, -1)
  4873  	require.Nil(t, nErr)
  4874  
  4875  	o9 := model.Channel{
  4876  		TeamId:      teamId,
  4877  		DisplayName: "Channel With Purpose",
  4878  		Purpose:     "This can now be searchable!",
  4879  		Name:        "with-purpose",
  4880  		Type:        model.CHANNEL_OPEN,
  4881  	}
  4882  	_, nErr = ss.Channel().Save(&o9, -1)
  4883  	require.Nil(t, nErr)
  4884  
  4885  	o10 := model.Channel{
  4886  		TeamId:      teamId,
  4887  		DisplayName: "ChannelA",
  4888  		Name:        "channel-a-deleted",
  4889  		Type:        model.CHANNEL_OPEN,
  4890  	}
  4891  	_, nErr = ss.Channel().Save(&o10, -1)
  4892  	require.Nil(t, nErr)
  4893  
  4894  	o10.DeleteAt = model.GetMillis()
  4895  	o10.UpdateAt = o10.DeleteAt
  4896  	nErr = ss.Channel().Delete(o10.Id, o10.DeleteAt)
  4897  	require.Nil(t, nErr, "channel should have been deleted")
  4898  
  4899  	t.Run("three public channels matching 'ChannelA', but already a member of one and one deleted", func(t *testing.T) {
  4900  		channels, err := ss.Channel().SearchMore(m1.UserId, teamId, "ChannelA")
  4901  		require.Nil(t, err)
  4902  		require.Equal(t, &model.ChannelList{&o3}, channels)
  4903  	})
  4904  
  4905  	t.Run("one public channels, but already a member", func(t *testing.T) {
  4906  		channels, err := ss.Channel().SearchMore(m1.UserId, teamId, o4.Name)
  4907  		require.Nil(t, err)
  4908  		require.Equal(t, &model.ChannelList{}, channels)
  4909  	})
  4910  
  4911  	t.Run("three matching channels, but only two public", func(t *testing.T) {
  4912  		channels, err := ss.Channel().SearchMore(m1.UserId, teamId, "off-")
  4913  		require.Nil(t, err)
  4914  		require.Equal(t, &model.ChannelList{&o7, &o6}, channels)
  4915  	})
  4916  
  4917  	t.Run("one channel matching 'off-topic'", func(t *testing.T) {
  4918  		channels, err := ss.Channel().SearchMore(m1.UserId, teamId, "off-topic")
  4919  		require.Nil(t, err)
  4920  		require.Equal(t, &model.ChannelList{&o6}, channels)
  4921  	})
  4922  
  4923  	t.Run("search purpose", func(t *testing.T) {
  4924  		channels, err := ss.Channel().SearchMore(m1.UserId, teamId, "now searchable")
  4925  		require.Nil(t, err)
  4926  		require.Equal(t, &model.ChannelList{&o9}, channels)
  4927  	})
  4928  }
  4929  
  4930  type ByChannelDisplayName model.ChannelList
  4931  
  4932  func (s ByChannelDisplayName) Len() int { return len(s) }
  4933  func (s ByChannelDisplayName) Swap(i, j int) {
  4934  	s[i], s[j] = s[j], s[i]
  4935  }
  4936  func (s ByChannelDisplayName) Less(i, j int) bool {
  4937  	if s[i].DisplayName != s[j].DisplayName {
  4938  		return s[i].DisplayName < s[j].DisplayName
  4939  	}
  4940  
  4941  	return s[i].Id < s[j].Id
  4942  }
  4943  
  4944  func testChannelStoreSearchInTeam(t *testing.T, ss store.Store, s SqlSupplier) {
  4945  	teamId := model.NewId()
  4946  	otherTeamId := model.NewId()
  4947  
  4948  	o1 := model.Channel{
  4949  		TeamId:      teamId,
  4950  		DisplayName: "ChannelA",
  4951  		Name:        "zz" + model.NewId() + "b",
  4952  		Type:        model.CHANNEL_OPEN,
  4953  	}
  4954  	_, nErr := ss.Channel().Save(&o1, -1)
  4955  	require.Nil(t, nErr)
  4956  
  4957  	o2 := model.Channel{
  4958  		TeamId:      otherTeamId,
  4959  		DisplayName: "ChannelA",
  4960  		Name:        "zz" + model.NewId() + "b",
  4961  		Type:        model.CHANNEL_OPEN,
  4962  	}
  4963  	_, nErr = ss.Channel().Save(&o2, -1)
  4964  	require.Nil(t, nErr)
  4965  
  4966  	m1 := model.ChannelMember{
  4967  		ChannelId:   o1.Id,
  4968  		UserId:      model.NewId(),
  4969  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  4970  	}
  4971  	_, err := ss.Channel().SaveMember(&m1)
  4972  	require.Nil(t, err)
  4973  
  4974  	m2 := model.ChannelMember{
  4975  		ChannelId:   o1.Id,
  4976  		UserId:      model.NewId(),
  4977  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  4978  	}
  4979  	_, err = ss.Channel().SaveMember(&m2)
  4980  	require.Nil(t, err)
  4981  
  4982  	m3 := model.ChannelMember{
  4983  		ChannelId:   o2.Id,
  4984  		UserId:      model.NewId(),
  4985  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  4986  	}
  4987  	_, err = ss.Channel().SaveMember(&m3)
  4988  	require.Nil(t, err)
  4989  
  4990  	o3 := model.Channel{
  4991  		TeamId:      teamId,
  4992  		DisplayName: "ChannelA (alternate)",
  4993  		Name:        "zz" + model.NewId() + "b",
  4994  		Type:        model.CHANNEL_OPEN,
  4995  	}
  4996  	_, nErr = ss.Channel().Save(&o3, -1)
  4997  	require.Nil(t, nErr)
  4998  
  4999  	o4 := model.Channel{
  5000  		TeamId:      teamId,
  5001  		DisplayName: "Channel B",
  5002  		Name:        "zz" + model.NewId() + "b",
  5003  		Type:        model.CHANNEL_PRIVATE,
  5004  	}
  5005  	_, nErr = ss.Channel().Save(&o4, -1)
  5006  	require.Nil(t, nErr)
  5007  
  5008  	o5 := model.Channel{
  5009  		TeamId:      teamId,
  5010  		DisplayName: "Channel C",
  5011  		Name:        "zz" + model.NewId() + "b",
  5012  		Type:        model.CHANNEL_PRIVATE,
  5013  	}
  5014  	_, nErr = ss.Channel().Save(&o5, -1)
  5015  	require.Nil(t, nErr)
  5016  
  5017  	o6 := model.Channel{
  5018  		TeamId:      teamId,
  5019  		DisplayName: "Off-Topic",
  5020  		Name:        "off-topic",
  5021  		Type:        model.CHANNEL_OPEN,
  5022  	}
  5023  	_, nErr = ss.Channel().Save(&o6, -1)
  5024  	require.Nil(t, nErr)
  5025  
  5026  	o7 := model.Channel{
  5027  		TeamId:      teamId,
  5028  		DisplayName: "Off-Set",
  5029  		Name:        "off-set",
  5030  		Type:        model.CHANNEL_OPEN,
  5031  	}
  5032  	_, nErr = ss.Channel().Save(&o7, -1)
  5033  	require.Nil(t, nErr)
  5034  
  5035  	o8 := model.Channel{
  5036  		TeamId:      teamId,
  5037  		DisplayName: "Off-Limit",
  5038  		Name:        "off-limit",
  5039  		Type:        model.CHANNEL_PRIVATE,
  5040  	}
  5041  	_, nErr = ss.Channel().Save(&o8, -1)
  5042  	require.Nil(t, nErr)
  5043  
  5044  	o9 := model.Channel{
  5045  		TeamId:      teamId,
  5046  		DisplayName: "Town Square",
  5047  		Name:        "town-square",
  5048  		Type:        model.CHANNEL_OPEN,
  5049  	}
  5050  	_, nErr = ss.Channel().Save(&o9, -1)
  5051  	require.Nil(t, nErr)
  5052  
  5053  	o10 := model.Channel{
  5054  		TeamId:      teamId,
  5055  		DisplayName: "The",
  5056  		Name:        "thename",
  5057  		Type:        model.CHANNEL_OPEN,
  5058  	}
  5059  	_, nErr = ss.Channel().Save(&o10, -1)
  5060  	require.Nil(t, nErr)
  5061  
  5062  	o11 := model.Channel{
  5063  		TeamId:      teamId,
  5064  		DisplayName: "Native Mobile Apps",
  5065  		Name:        "native-mobile-apps",
  5066  		Type:        model.CHANNEL_OPEN,
  5067  	}
  5068  	_, nErr = ss.Channel().Save(&o11, -1)
  5069  	require.Nil(t, nErr)
  5070  
  5071  	o12 := model.Channel{
  5072  		TeamId:      teamId,
  5073  		DisplayName: "ChannelZ",
  5074  		Purpose:     "This can now be searchable!",
  5075  		Name:        "with-purpose",
  5076  		Type:        model.CHANNEL_OPEN,
  5077  	}
  5078  	_, nErr = ss.Channel().Save(&o12, -1)
  5079  	require.Nil(t, nErr)
  5080  
  5081  	o13 := model.Channel{
  5082  		TeamId:      teamId,
  5083  		DisplayName: "ChannelA (deleted)",
  5084  		Name:        model.NewId(),
  5085  		Type:        model.CHANNEL_OPEN,
  5086  	}
  5087  	_, nErr = ss.Channel().Save(&o13, -1)
  5088  	require.Nil(t, nErr)
  5089  	o13.DeleteAt = model.GetMillis()
  5090  	o13.UpdateAt = o13.DeleteAt
  5091  	nErr = ss.Channel().Delete(o13.Id, o13.DeleteAt)
  5092  	require.Nil(t, nErr, "channel should have been deleted")
  5093  
  5094  	testCases := []struct {
  5095  		Description     string
  5096  		TeamId          string
  5097  		Term            string
  5098  		IncludeDeleted  bool
  5099  		ExpectedResults *model.ChannelList
  5100  	}{
  5101  		{"ChannelA", teamId, "ChannelA", false, &model.ChannelList{&o1, &o3}},
  5102  		{"ChannelA, include deleted", teamId, "ChannelA", true, &model.ChannelList{&o1, &o3, &o13}},
  5103  		{"ChannelA, other team", otherTeamId, "ChannelA", false, &model.ChannelList{&o2}},
  5104  		{"empty string", teamId, "", false, &model.ChannelList{&o1, &o3, &o12, &o11, &o7, &o6, &o10, &o9}},
  5105  		{"no matches", teamId, "blargh", false, &model.ChannelList{}},
  5106  		{"prefix", teamId, "off-", false, &model.ChannelList{&o7, &o6}},
  5107  		{"full match with dash", teamId, "off-topic", false, &model.ChannelList{&o6}},
  5108  		{"town square", teamId, "town square", false, &model.ChannelList{&o9}},
  5109  		{"the in name", teamId, "thename", false, &model.ChannelList{&o10}},
  5110  		{"Mobile", teamId, "Mobile", false, &model.ChannelList{&o11}},
  5111  		{"search purpose", teamId, "now searchable", false, &model.ChannelList{&o12}},
  5112  		{"pipe ignored", teamId, "town square |", false, &model.ChannelList{&o9}},
  5113  	}
  5114  
  5115  	for name, search := range map[string]func(teamId string, term string, includeDeleted bool) (*model.ChannelList, *model.AppError){
  5116  		"AutocompleteInTeam": ss.Channel().AutocompleteInTeam,
  5117  		"SearchInTeam":       ss.Channel().SearchInTeam,
  5118  	} {
  5119  		for _, testCase := range testCases {
  5120  			t.Run(name+"/"+testCase.Description, func(t *testing.T) {
  5121  				if name == "AutocompleteInTeam" && testCase.Description == "empty string" && s.DriverName() == model.DATABASE_DRIVER_MYSQL {
  5122  					t.Skip("Skip test for MySQL. TODO: Understand why this test fails in mysql 5.6 in the CI")
  5123  				}
  5124  				channels, err := search(testCase.TeamId, testCase.Term, testCase.IncludeDeleted)
  5125  				require.Nil(t, err)
  5126  
  5127  				// AutoCompleteInTeam doesn't currently sort its output results.
  5128  				if name == "AutocompleteInTeam" {
  5129  					sort.Sort(ByChannelDisplayName(*channels))
  5130  				}
  5131  
  5132  				require.Equal(t, testCase.ExpectedResults, channels)
  5133  			})
  5134  		}
  5135  	}
  5136  }
  5137  
  5138  func testChannelStoreSearchForUserInTeam(t *testing.T, ss store.Store) {
  5139  	userId := model.NewId()
  5140  	teamId := model.NewId()
  5141  	otherTeamId := model.NewId()
  5142  
  5143  	// create 4 channels for the same team and one for other team
  5144  	o1 := model.Channel{
  5145  		TeamId:      teamId,
  5146  		DisplayName: "test-dev-1",
  5147  		Name:        "zz" + model.NewId() + "b",
  5148  		Type:        model.CHANNEL_OPEN,
  5149  	}
  5150  	_, nErr := ss.Channel().Save(&o1, -1)
  5151  	require.Nil(t, nErr)
  5152  
  5153  	o2 := model.Channel{
  5154  		TeamId:      teamId,
  5155  		DisplayName: "test-dev-2",
  5156  		Name:        "zz" + model.NewId() + "b",
  5157  		Type:        model.CHANNEL_OPEN,
  5158  	}
  5159  	_, nErr = ss.Channel().Save(&o2, -1)
  5160  	require.Nil(t, nErr)
  5161  
  5162  	o3 := model.Channel{
  5163  		TeamId:      teamId,
  5164  		DisplayName: "dev-3",
  5165  		Name:        "zz" + model.NewId() + "b",
  5166  		Type:        model.CHANNEL_OPEN,
  5167  	}
  5168  	_, nErr = ss.Channel().Save(&o3, -1)
  5169  	require.Nil(t, nErr)
  5170  
  5171  	o4 := model.Channel{
  5172  		TeamId:      teamId,
  5173  		DisplayName: "dev-4",
  5174  		Name:        "zz" + model.NewId() + "b",
  5175  		Type:        model.CHANNEL_OPEN,
  5176  	}
  5177  	_, nErr = ss.Channel().Save(&o4, -1)
  5178  	require.Nil(t, nErr)
  5179  
  5180  	o5 := model.Channel{
  5181  		TeamId:      otherTeamId,
  5182  		DisplayName: "other-team-dev-5",
  5183  		Name:        "zz" + model.NewId() + "b",
  5184  		Type:        model.CHANNEL_OPEN,
  5185  	}
  5186  	_, nErr = ss.Channel().Save(&o5, -1)
  5187  	require.Nil(t, nErr)
  5188  
  5189  	// add the user to the first 3 channels and the other team channel
  5190  	for _, c := range []model.Channel{o1, o2, o3, o5} {
  5191  		_, err := ss.Channel().SaveMember(&model.ChannelMember{
  5192  			ChannelId:   c.Id,
  5193  			UserId:      userId,
  5194  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  5195  		})
  5196  		require.Nil(t, err)
  5197  	}
  5198  
  5199  	searchAndCheck := func(t *testing.T, term string, includeDeleted bool, expectedDisplayNames []string) {
  5200  		res, searchErr := ss.Channel().SearchForUserInTeam(userId, teamId, term, includeDeleted)
  5201  		require.Nil(t, searchErr)
  5202  		require.Len(t, *res, len(expectedDisplayNames))
  5203  
  5204  		resultDisplayNames := []string{}
  5205  		for _, c := range *res {
  5206  			resultDisplayNames = append(resultDisplayNames, c.DisplayName)
  5207  		}
  5208  		require.ElementsMatch(t, expectedDisplayNames, resultDisplayNames)
  5209  	}
  5210  
  5211  	t.Run("Search for test, get channels 1 and 2", func(t *testing.T) {
  5212  		searchAndCheck(t, "test", false, []string{o1.DisplayName, o2.DisplayName})
  5213  	})
  5214  
  5215  	t.Run("Search for dev, get channels 1, 2 and 3", func(t *testing.T) {
  5216  		searchAndCheck(t, "dev", false, []string{o1.DisplayName, o2.DisplayName, o3.DisplayName})
  5217  	})
  5218  
  5219  	t.Run("After adding user to channel 4, search for dev, get channels 1, 2, 3 and 4", func(t *testing.T) {
  5220  		_, err := ss.Channel().SaveMember(&model.ChannelMember{
  5221  			ChannelId:   o4.Id,
  5222  			UserId:      userId,
  5223  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  5224  		})
  5225  		require.Nil(t, err)
  5226  
  5227  		searchAndCheck(t, "dev", false, []string{o1.DisplayName, o2.DisplayName, o3.DisplayName, o4.DisplayName})
  5228  	})
  5229  
  5230  	t.Run("Mark channel 1 as deleted, search for dev, get channels 2, 3 and 4", func(t *testing.T) {
  5231  		o1.DeleteAt = model.GetMillis()
  5232  		o1.UpdateAt = o1.DeleteAt
  5233  		err := ss.Channel().Delete(o1.Id, o1.DeleteAt)
  5234  		require.Nil(t, err)
  5235  
  5236  		searchAndCheck(t, "dev", false, []string{o2.DisplayName, o3.DisplayName, o4.DisplayName})
  5237  	})
  5238  
  5239  	t.Run("With includeDeleted, search for dev, get channels 1, 2, 3 and 4", func(t *testing.T) {
  5240  		searchAndCheck(t, "dev", true, []string{o1.DisplayName, o2.DisplayName, o3.DisplayName, o4.DisplayName})
  5241  	})
  5242  }
  5243  
  5244  func testChannelStoreSearchAllChannels(t *testing.T, ss store.Store) {
  5245  	cleanupChannels(t, ss)
  5246  
  5247  	t1 := model.Team{}
  5248  	t1.DisplayName = "Name"
  5249  	t1.Name = "zz" + model.NewId()
  5250  	t1.Email = MakeEmail()
  5251  	t1.Type = model.TEAM_OPEN
  5252  	_, err := ss.Team().Save(&t1)
  5253  	require.Nil(t, err)
  5254  
  5255  	t2 := model.Team{}
  5256  	t2.DisplayName = "Name2"
  5257  	t2.Name = "zz" + model.NewId()
  5258  	t2.Email = MakeEmail()
  5259  	t2.Type = model.TEAM_OPEN
  5260  	_, err = ss.Team().Save(&t2)
  5261  	require.Nil(t, err)
  5262  
  5263  	o1 := model.Channel{
  5264  		TeamId:      t1.Id,
  5265  		DisplayName: "A1 ChannelA",
  5266  		Name:        "zz" + model.NewId() + "b",
  5267  		Type:        model.CHANNEL_OPEN,
  5268  	}
  5269  	_, nErr := ss.Channel().Save(&o1, -1)
  5270  	require.Nil(t, nErr)
  5271  
  5272  	o2 := model.Channel{
  5273  		TeamId:      t2.Id,
  5274  		DisplayName: "A2 ChannelA",
  5275  		Name:        "zz" + model.NewId() + "b",
  5276  		Type:        model.CHANNEL_OPEN,
  5277  	}
  5278  	_, nErr = ss.Channel().Save(&o2, -1)
  5279  	require.Nil(t, nErr)
  5280  
  5281  	m1 := model.ChannelMember{
  5282  		ChannelId:   o1.Id,
  5283  		UserId:      model.NewId(),
  5284  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  5285  	}
  5286  	_, err = ss.Channel().SaveMember(&m1)
  5287  	require.Nil(t, err)
  5288  
  5289  	m2 := model.ChannelMember{
  5290  		ChannelId:   o1.Id,
  5291  		UserId:      model.NewId(),
  5292  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  5293  	}
  5294  	_, err = ss.Channel().SaveMember(&m2)
  5295  	require.Nil(t, err)
  5296  
  5297  	m3 := model.ChannelMember{
  5298  		ChannelId:   o2.Id,
  5299  		UserId:      model.NewId(),
  5300  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  5301  	}
  5302  	_, err = ss.Channel().SaveMember(&m3)
  5303  	require.Nil(t, err)
  5304  
  5305  	o3 := model.Channel{
  5306  		TeamId:      t1.Id,
  5307  		DisplayName: "A3 ChannelA (alternate)",
  5308  		Name:        "zz" + model.NewId() + "b",
  5309  		Type:        model.CHANNEL_OPEN,
  5310  	}
  5311  	_, nErr = ss.Channel().Save(&o3, -1)
  5312  	require.Nil(t, nErr)
  5313  
  5314  	o4 := model.Channel{
  5315  		TeamId:      t1.Id,
  5316  		DisplayName: "A4 ChannelB",
  5317  		Name:        "zz" + model.NewId() + "b",
  5318  		Type:        model.CHANNEL_PRIVATE,
  5319  	}
  5320  	_, nErr = ss.Channel().Save(&o4, -1)
  5321  	require.Nil(t, nErr)
  5322  
  5323  	o5 := model.Channel{
  5324  		TeamId:           t1.Id,
  5325  		DisplayName:      "A5 ChannelC",
  5326  		Name:             "zz" + model.NewId() + "b",
  5327  		Type:             model.CHANNEL_PRIVATE,
  5328  		GroupConstrained: model.NewBool(true),
  5329  	}
  5330  	_, nErr = ss.Channel().Save(&o5, -1)
  5331  	require.Nil(t, nErr)
  5332  
  5333  	o6 := model.Channel{
  5334  		TeamId:      t1.Id,
  5335  		DisplayName: "A6 Off-Topic",
  5336  		Name:        "off-topic",
  5337  		Type:        model.CHANNEL_OPEN,
  5338  	}
  5339  	_, nErr = ss.Channel().Save(&o6, -1)
  5340  	require.Nil(t, nErr)
  5341  
  5342  	o7 := model.Channel{
  5343  		TeamId:      t1.Id,
  5344  		DisplayName: "A7 Off-Set",
  5345  		Name:        "off-set",
  5346  		Type:        model.CHANNEL_OPEN,
  5347  	}
  5348  	_, nErr = ss.Channel().Save(&o7, -1)
  5349  	require.Nil(t, nErr)
  5350  
  5351  	group := &model.Group{
  5352  		Name:        model.NewString(model.NewId()),
  5353  		DisplayName: model.NewId(),
  5354  		Source:      model.GroupSourceLdap,
  5355  		RemoteId:    model.NewId(),
  5356  	}
  5357  	_, err = ss.Group().Create(group)
  5358  	require.Nil(t, err)
  5359  
  5360  	_, err = ss.Group().CreateGroupSyncable(model.NewGroupChannel(group.Id, o7.Id, true))
  5361  	require.Nil(t, err)
  5362  
  5363  	o8 := model.Channel{
  5364  		TeamId:      t1.Id,
  5365  		DisplayName: "A8 Off-Limit",
  5366  		Name:        "off-limit",
  5367  		Type:        model.CHANNEL_PRIVATE,
  5368  	}
  5369  	_, nErr = ss.Channel().Save(&o8, -1)
  5370  	require.Nil(t, nErr)
  5371  
  5372  	o9 := model.Channel{
  5373  		TeamId:      t1.Id,
  5374  		DisplayName: "A9 Town Square",
  5375  		Name:        "town-square",
  5376  		Type:        model.CHANNEL_OPEN,
  5377  	}
  5378  	_, nErr = ss.Channel().Save(&o9, -1)
  5379  	require.Nil(t, nErr)
  5380  
  5381  	o10 := model.Channel{
  5382  		TeamId:      t1.Id,
  5383  		DisplayName: "B10 The",
  5384  		Name:        "the",
  5385  		Type:        model.CHANNEL_OPEN,
  5386  	}
  5387  	_, nErr = ss.Channel().Save(&o10, -1)
  5388  	require.Nil(t, nErr)
  5389  
  5390  	o11 := model.Channel{
  5391  		TeamId:      t1.Id,
  5392  		DisplayName: "B11 Native Mobile Apps",
  5393  		Name:        "native-mobile-apps",
  5394  		Type:        model.CHANNEL_OPEN,
  5395  	}
  5396  	_, nErr = ss.Channel().Save(&o11, -1)
  5397  	require.Nil(t, nErr)
  5398  
  5399  	o12 := model.Channel{
  5400  		TeamId:      t1.Id,
  5401  		DisplayName: "B12 ChannelZ",
  5402  		Purpose:     "This can now be searchable!",
  5403  		Name:        "with-purpose",
  5404  		Type:        model.CHANNEL_OPEN,
  5405  	}
  5406  	_, nErr = ss.Channel().Save(&o12, -1)
  5407  	require.Nil(t, nErr)
  5408  
  5409  	o13 := model.Channel{
  5410  		TeamId:      t1.Id,
  5411  		DisplayName: "B13 ChannelA (deleted)",
  5412  		Name:        model.NewId(),
  5413  		Type:        model.CHANNEL_OPEN,
  5414  	}
  5415  	_, nErr = ss.Channel().Save(&o13, -1)
  5416  	require.Nil(t, nErr)
  5417  
  5418  	o13.DeleteAt = model.GetMillis()
  5419  	o13.UpdateAt = o13.DeleteAt
  5420  	nErr = ss.Channel().Delete(o13.Id, o13.DeleteAt)
  5421  	require.Nil(t, nErr, "channel should have been deleted")
  5422  
  5423  	o14 := model.Channel{
  5424  		TeamId:      t2.Id,
  5425  		DisplayName: "B14 FOOBARDISPLAYNAME",
  5426  		Name:        "whatever",
  5427  		Type:        model.CHANNEL_OPEN,
  5428  	}
  5429  	_, nErr = ss.Channel().Save(&o14, -1)
  5430  	require.Nil(t, nErr)
  5431  	testCases := []struct {
  5432  		Description     string
  5433  		Term            string
  5434  		Opts            store.ChannelSearchOpts
  5435  		ExpectedResults *model.ChannelList
  5436  		TotalCount      int
  5437  	}{
  5438  		{"Search FooBar by display name", "bardisplay", store.ChannelSearchOpts{IncludeDeleted: false}, &model.ChannelList{&o14}, 1},
  5439  		{"Search FooBar by display name2", "foobar", store.ChannelSearchOpts{IncludeDeleted: false}, &model.ChannelList{&o14}, 1},
  5440  		{"Search FooBar by display name3", "displayname", store.ChannelSearchOpts{IncludeDeleted: false}, &model.ChannelList{&o14}, 1},
  5441  		{"Search FooBar by name", "what", store.ChannelSearchOpts{IncludeDeleted: false}, &model.ChannelList{&o14}, 1},
  5442  		{"Search FooBar by name2", "ever", store.ChannelSearchOpts{IncludeDeleted: false}, &model.ChannelList{&o14}, 1},
  5443  		{"ChannelA", "ChannelA", store.ChannelSearchOpts{IncludeDeleted: false}, &model.ChannelList{&o1, &o2, &o3}, 0},
  5444  		{"ChannelA, include deleted", "ChannelA", store.ChannelSearchOpts{IncludeDeleted: true}, &model.ChannelList{&o1, &o2, &o3, &o13}, 0},
  5445  		{"empty string", "", store.ChannelSearchOpts{IncludeDeleted: false}, &model.ChannelList{&o1, &o2, &o3, &o4, &o5, &o6, &o7, &o8, &o9, &o10, &o11, &o12, &o14}, 0},
  5446  		{"no matches", "blargh", store.ChannelSearchOpts{IncludeDeleted: false}, &model.ChannelList{}, 0},
  5447  		{"prefix", "off-", store.ChannelSearchOpts{IncludeDeleted: false}, &model.ChannelList{&o6, &o7, &o8}, 0},
  5448  		{"full match with dash", "off-topic", store.ChannelSearchOpts{IncludeDeleted: false}, &model.ChannelList{&o6}, 0},
  5449  		{"town square", "town square", store.ChannelSearchOpts{IncludeDeleted: false}, &model.ChannelList{&o9}, 0},
  5450  		{"the in name", "the", store.ChannelSearchOpts{IncludeDeleted: false}, &model.ChannelList{&o10}, 0},
  5451  		{"Mobile", "Mobile", store.ChannelSearchOpts{IncludeDeleted: false}, &model.ChannelList{&o11}, 0},
  5452  		{"search purpose", "now searchable", store.ChannelSearchOpts{IncludeDeleted: false}, &model.ChannelList{&o12}, 0},
  5453  		{"pipe ignored", "town square |", store.ChannelSearchOpts{IncludeDeleted: false}, &model.ChannelList{&o9}, 0},
  5454  		{"exclude defaults search 'off'", "off-", store.ChannelSearchOpts{IncludeDeleted: false, ExcludeChannelNames: []string{"off-topic"}}, &model.ChannelList{&o7, &o8}, 0},
  5455  		{"exclude defaults search 'town'", "town", store.ChannelSearchOpts{IncludeDeleted: false, ExcludeChannelNames: []string{"town-square"}}, &model.ChannelList{}, 0},
  5456  		{"exclude by group association", "off-", store.ChannelSearchOpts{IncludeDeleted: false, NotAssociatedToGroup: group.Id}, &model.ChannelList{&o6, &o8}, 0},
  5457  		{"paginate includes count", "off-", store.ChannelSearchOpts{IncludeDeleted: false, PerPage: model.NewInt(100)}, &model.ChannelList{&o6, &o7, &o8}, 3},
  5458  		{"paginate, page 2 correct entries and count", "off-", store.ChannelSearchOpts{IncludeDeleted: false, PerPage: model.NewInt(2), Page: model.NewInt(1)}, &model.ChannelList{&o8}, 3},
  5459  		{"Filter private", "", store.ChannelSearchOpts{IncludeDeleted: false, Private: true}, &model.ChannelList{&o4, &o5, &o8}, 3},
  5460  		{"Filter public", "", store.ChannelSearchOpts{IncludeDeleted: false, Public: true, Page: model.NewInt(0), PerPage: model.NewInt(5)}, &model.ChannelList{&o1, &o2, &o3, &o6, &o7}, 10},
  5461  		{"Filter public and private", "", store.ChannelSearchOpts{IncludeDeleted: false, Public: true, Private: true, Page: model.NewInt(0), PerPage: model.NewInt(5)}, &model.ChannelList{&o1, &o2, &o3, &o4, &o5}, 13},
  5462  		{"Filter public and private and include deleted", "", store.ChannelSearchOpts{IncludeDeleted: true, Public: true, Private: true, Page: model.NewInt(0), PerPage: model.NewInt(5)}, &model.ChannelList{&o1, &o2, &o3, &o4, &o5}, 14},
  5463  		{"Filter group constrained", "", store.ChannelSearchOpts{IncludeDeleted: false, GroupConstrained: true, Page: model.NewInt(0), PerPage: model.NewInt(5)}, &model.ChannelList{&o5}, 1},
  5464  		{"Filter exclude group constrained and include deleted", "", store.ChannelSearchOpts{IncludeDeleted: true, ExcludeGroupConstrained: true, Page: model.NewInt(0), PerPage: model.NewInt(5)}, &model.ChannelList{&o1, &o2, &o3, &o4, &o6}, 13},
  5465  		{"Filter private and exclude group constrained", "", store.ChannelSearchOpts{IncludeDeleted: false, ExcludeGroupConstrained: true, Private: true, Page: model.NewInt(0), PerPage: model.NewInt(5)}, &model.ChannelList{&o4, &o8}, 2},
  5466  		{"Filter team 2", "", store.ChannelSearchOpts{IncludeDeleted: false, TeamIds: []string{t2.Id}, Page: model.NewInt(0), PerPage: model.NewInt(5)}, &model.ChannelList{&o2, &o14}, 2},
  5467  		{"Filter team 2, private", "", store.ChannelSearchOpts{IncludeDeleted: false, TeamIds: []string{t2.Id}, Private: true, Page: model.NewInt(0), PerPage: model.NewInt(5)}, &model.ChannelList{}, 0},
  5468  		{"Filter team 1 and team 2, private", "", store.ChannelSearchOpts{IncludeDeleted: false, TeamIds: []string{t1.Id, t2.Id}, Private: true, Page: model.NewInt(0), PerPage: model.NewInt(5)}, &model.ChannelList{&o4, &o5, &o8}, 3},
  5469  		{"Filter team 1 and team 2, public and private", "", store.ChannelSearchOpts{IncludeDeleted: false, TeamIds: []string{t1.Id, t2.Id}, Public: true, Private: true, Page: model.NewInt(0), PerPage: model.NewInt(5)}, &model.ChannelList{&o1, &o2, &o3, &o4, &o5}, 13},
  5470  		{"Filter team 1 and team 2, public and private and group constrained", "", store.ChannelSearchOpts{IncludeDeleted: false, TeamIds: []string{t1.Id, t2.Id}, Public: true, Private: true, GroupConstrained: true, Page: model.NewInt(0), PerPage: model.NewInt(5)}, &model.ChannelList{&o5}, 1},
  5471  		{"Filter team 1 and team 2, public and private and exclude group constrained", "", store.ChannelSearchOpts{IncludeDeleted: false, TeamIds: []string{t1.Id, t2.Id}, Public: true, Private: true, ExcludeGroupConstrained: true, Page: model.NewInt(0), PerPage: model.NewInt(5)}, &model.ChannelList{&o1, &o2, &o3, &o4, &o6}, 12},
  5472  		{"Filter deleted returns only deleted channels", "", store.ChannelSearchOpts{Deleted: true, Page: model.NewInt(0), PerPage: model.NewInt(5)}, &model.ChannelList{&o13}, 1},
  5473  	}
  5474  
  5475  	for _, testCase := range testCases {
  5476  		t.Run(testCase.Description, func(t *testing.T) {
  5477  			channels, count, err := ss.Channel().SearchAllChannels(testCase.Term, testCase.Opts)
  5478  			require.Nil(t, err)
  5479  			require.Equal(t, len(*testCase.ExpectedResults), len(*channels))
  5480  			for i, expected := range *testCase.ExpectedResults {
  5481  				require.Equal(t, expected.Id, (*channels)[i].Id)
  5482  			}
  5483  			if testCase.Opts.Page != nil || testCase.Opts.PerPage != nil {
  5484  				require.Equal(t, int64(testCase.TotalCount), count)
  5485  			}
  5486  		})
  5487  	}
  5488  }
  5489  
  5490  func testChannelStoreGetMembersByIds(t *testing.T, ss store.Store) {
  5491  	o1 := model.Channel{}
  5492  	o1.TeamId = model.NewId()
  5493  	o1.DisplayName = "ChannelA"
  5494  	o1.Name = "zz" + model.NewId() + "b"
  5495  	o1.Type = model.CHANNEL_OPEN
  5496  	_, nErr := ss.Channel().Save(&o1, -1)
  5497  	require.Nil(t, nErr)
  5498  
  5499  	m1 := &model.ChannelMember{ChannelId: o1.Id, UserId: model.NewId(), NotifyProps: model.GetDefaultChannelNotifyProps()}
  5500  	_, err := ss.Channel().SaveMember(m1)
  5501  	require.Nil(t, err)
  5502  
  5503  	var members *model.ChannelMembers
  5504  	members, err = ss.Channel().GetMembersByIds(m1.ChannelId, []string{m1.UserId})
  5505  	rm1 := (*members)[0]
  5506  
  5507  	require.Nil(t, err, err)
  5508  	require.Equal(t, m1.ChannelId, rm1.ChannelId, "bad team id")
  5509  	require.Equal(t, m1.UserId, rm1.UserId, "bad user id")
  5510  
  5511  	m2 := &model.ChannelMember{ChannelId: o1.Id, UserId: model.NewId(), NotifyProps: model.GetDefaultChannelNotifyProps()}
  5512  	_, err = ss.Channel().SaveMember(m2)
  5513  	require.Nil(t, err)
  5514  
  5515  	members, err = ss.Channel().GetMembersByIds(m1.ChannelId, []string{m1.UserId, m2.UserId, model.NewId()})
  5516  	require.Nil(t, err, err)
  5517  	require.Len(t, *members, 2, "return wrong number of results")
  5518  
  5519  	_, err = ss.Channel().GetMembersByIds(m1.ChannelId, []string{})
  5520  	require.NotNil(t, err, "empty user ids - should have failed")
  5521  }
  5522  
  5523  func testChannelStoreSearchGroupChannels(t *testing.T, ss store.Store) {
  5524  	// Users
  5525  	u1 := &model.User{}
  5526  	u1.Username = "user.one"
  5527  	u1.Email = MakeEmail()
  5528  	u1.Nickname = model.NewId()
  5529  	_, err := ss.User().Save(u1)
  5530  	require.Nil(t, err)
  5531  
  5532  	u2 := &model.User{}
  5533  	u2.Username = "user.two"
  5534  	u2.Email = MakeEmail()
  5535  	u2.Nickname = model.NewId()
  5536  	_, err = ss.User().Save(u2)
  5537  	require.Nil(t, err)
  5538  
  5539  	u3 := &model.User{}
  5540  	u3.Username = "user.three"
  5541  	u3.Email = MakeEmail()
  5542  	u3.Nickname = model.NewId()
  5543  	_, err = ss.User().Save(u3)
  5544  	require.Nil(t, err)
  5545  
  5546  	u4 := &model.User{}
  5547  	u4.Username = "user.four"
  5548  	u4.Email = MakeEmail()
  5549  	u4.Nickname = model.NewId()
  5550  	_, err = ss.User().Save(u4)
  5551  	require.Nil(t, err)
  5552  
  5553  	// Group channels
  5554  	userIds := []string{u1.Id, u2.Id, u3.Id}
  5555  	gc1 := model.Channel{}
  5556  	gc1.Name = model.GetGroupNameFromUserIds(userIds)
  5557  	gc1.DisplayName = "GroupChannel" + model.NewId()
  5558  	gc1.Type = model.CHANNEL_GROUP
  5559  	_, nErr := ss.Channel().Save(&gc1, -1)
  5560  	require.Nil(t, nErr)
  5561  
  5562  	for _, userId := range userIds {
  5563  		_, err = ss.Channel().SaveMember(&model.ChannelMember{
  5564  			ChannelId:   gc1.Id,
  5565  			UserId:      userId,
  5566  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  5567  		})
  5568  		require.Nil(t, err)
  5569  	}
  5570  
  5571  	userIds = []string{u1.Id, u4.Id}
  5572  	gc2 := model.Channel{}
  5573  	gc2.Name = model.GetGroupNameFromUserIds(userIds)
  5574  	gc2.DisplayName = "GroupChannel" + model.NewId()
  5575  	gc2.Type = model.CHANNEL_GROUP
  5576  	_, nErr = ss.Channel().Save(&gc2, -1)
  5577  	require.Nil(t, nErr)
  5578  
  5579  	for _, userId := range userIds {
  5580  		_, err := ss.Channel().SaveMember(&model.ChannelMember{
  5581  			ChannelId:   gc2.Id,
  5582  			UserId:      userId,
  5583  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  5584  		})
  5585  		require.Nil(t, err)
  5586  	}
  5587  
  5588  	userIds = []string{u1.Id, u2.Id, u3.Id, u4.Id}
  5589  	gc3 := model.Channel{}
  5590  	gc3.Name = model.GetGroupNameFromUserIds(userIds)
  5591  	gc3.DisplayName = "GroupChannel" + model.NewId()
  5592  	gc3.Type = model.CHANNEL_GROUP
  5593  	_, nErr = ss.Channel().Save(&gc3, -1)
  5594  	require.Nil(t, nErr)
  5595  
  5596  	for _, userId := range userIds {
  5597  		_, err := ss.Channel().SaveMember(&model.ChannelMember{
  5598  			ChannelId:   gc3.Id,
  5599  			UserId:      userId,
  5600  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  5601  		})
  5602  		require.Nil(t, err)
  5603  	}
  5604  
  5605  	defer func() {
  5606  		for _, gc := range []model.Channel{gc1, gc2, gc3} {
  5607  			ss.Channel().PermanentDeleteMembersByChannel(gc3.Id)
  5608  			ss.Channel().PermanentDelete(gc.Id)
  5609  		}
  5610  	}()
  5611  
  5612  	testCases := []struct {
  5613  		Name           string
  5614  		UserId         string
  5615  		Term           string
  5616  		ExpectedResult []string
  5617  	}{
  5618  		{
  5619  			Name:           "Get all group channels for user1",
  5620  			UserId:         u1.Id,
  5621  			Term:           "",
  5622  			ExpectedResult: []string{gc1.Id, gc2.Id, gc3.Id},
  5623  		},
  5624  		{
  5625  			Name:           "Get group channels for user1 and term 'three'",
  5626  			UserId:         u1.Id,
  5627  			Term:           "three",
  5628  			ExpectedResult: []string{gc1.Id, gc3.Id},
  5629  		},
  5630  		{
  5631  			Name:           "Get group channels for user1 and term 'four two'",
  5632  			UserId:         u1.Id,
  5633  			Term:           "four two",
  5634  			ExpectedResult: []string{gc3.Id},
  5635  		},
  5636  		{
  5637  			Name:           "Get all group channels for user2",
  5638  			UserId:         u2.Id,
  5639  			Term:           "",
  5640  			ExpectedResult: []string{gc1.Id, gc3.Id},
  5641  		},
  5642  		{
  5643  			Name:           "Get group channels for user2 and term 'four'",
  5644  			UserId:         u2.Id,
  5645  			Term:           "four",
  5646  			ExpectedResult: []string{gc3.Id},
  5647  		},
  5648  		{
  5649  			Name:           "Get all group channels for user4",
  5650  			UserId:         u4.Id,
  5651  			Term:           "",
  5652  			ExpectedResult: []string{gc2.Id, gc3.Id},
  5653  		},
  5654  		{
  5655  			Name:           "Get group channels for user4 and term 'one five'",
  5656  			UserId:         u4.Id,
  5657  			Term:           "one five",
  5658  			ExpectedResult: []string{},
  5659  		},
  5660  	}
  5661  
  5662  	for _, tc := range testCases {
  5663  		t.Run(tc.Name, func(t *testing.T) {
  5664  			result, err := ss.Channel().SearchGroupChannels(tc.UserId, tc.Term)
  5665  			require.Nil(t, err)
  5666  
  5667  			resultIds := []string{}
  5668  			for _, gc := range *result {
  5669  				resultIds = append(resultIds, gc.Id)
  5670  			}
  5671  
  5672  			require.ElementsMatch(t, tc.ExpectedResult, resultIds)
  5673  		})
  5674  	}
  5675  }
  5676  
  5677  func testChannelStoreAnalyticsDeletedTypeCount(t *testing.T, ss store.Store) {
  5678  	o1 := model.Channel{}
  5679  	o1.TeamId = model.NewId()
  5680  	o1.DisplayName = "ChannelA"
  5681  	o1.Name = "zz" + model.NewId() + "b"
  5682  	o1.Type = model.CHANNEL_OPEN
  5683  	_, nErr := ss.Channel().Save(&o1, -1)
  5684  	require.Nil(t, nErr)
  5685  
  5686  	o2 := model.Channel{}
  5687  	o2.TeamId = model.NewId()
  5688  	o2.DisplayName = "Channel2"
  5689  	o2.Name = "zz" + model.NewId() + "b"
  5690  	o2.Type = model.CHANNEL_OPEN
  5691  	_, nErr = ss.Channel().Save(&o2, -1)
  5692  	require.Nil(t, nErr)
  5693  
  5694  	p3 := model.Channel{}
  5695  	p3.TeamId = model.NewId()
  5696  	p3.DisplayName = "Channel3"
  5697  	p3.Name = "zz" + model.NewId() + "b"
  5698  	p3.Type = model.CHANNEL_PRIVATE
  5699  	_, nErr = ss.Channel().Save(&p3, -1)
  5700  	require.Nil(t, nErr)
  5701  
  5702  	u1 := &model.User{}
  5703  	u1.Email = MakeEmail()
  5704  	u1.Nickname = model.NewId()
  5705  	_, err := ss.User().Save(u1)
  5706  	require.Nil(t, err)
  5707  
  5708  	u2 := &model.User{}
  5709  	u2.Email = MakeEmail()
  5710  	u2.Nickname = model.NewId()
  5711  	_, err = ss.User().Save(u2)
  5712  	require.Nil(t, err)
  5713  
  5714  	d4, nErr := ss.Channel().CreateDirectChannel(u1, u2)
  5715  	require.Nil(t, nErr)
  5716  	defer func() {
  5717  		ss.Channel().PermanentDeleteMembersByChannel(d4.Id)
  5718  		ss.Channel().PermanentDelete(d4.Id)
  5719  	}()
  5720  
  5721  	var openStartCount int64
  5722  	openStartCount, err = ss.Channel().AnalyticsDeletedTypeCount("", "O")
  5723  	require.Nil(t, err, err)
  5724  
  5725  	var privateStartCount int64
  5726  	privateStartCount, err = ss.Channel().AnalyticsDeletedTypeCount("", "P")
  5727  	require.Nil(t, err, err)
  5728  
  5729  	var directStartCount int64
  5730  	directStartCount, err = ss.Channel().AnalyticsDeletedTypeCount("", "D")
  5731  	require.Nil(t, err, err)
  5732  
  5733  	nErr = ss.Channel().Delete(o1.Id, model.GetMillis())
  5734  	require.Nil(t, nErr, "channel should have been deleted")
  5735  	nErr = ss.Channel().Delete(o2.Id, model.GetMillis())
  5736  	require.Nil(t, nErr, "channel should have been deleted")
  5737  	nErr = ss.Channel().Delete(p3.Id, model.GetMillis())
  5738  	require.Nil(t, nErr, "channel should have been deleted")
  5739  	nErr = ss.Channel().Delete(d4.Id, model.GetMillis())
  5740  	require.Nil(t, nErr, "channel should have been deleted")
  5741  
  5742  	var count int64
  5743  
  5744  	count, err = ss.Channel().AnalyticsDeletedTypeCount("", "O")
  5745  	require.Nil(t, err, err)
  5746  	assert.Equal(t, openStartCount+2, count, "Wrong open channel deleted count.")
  5747  
  5748  	count, err = ss.Channel().AnalyticsDeletedTypeCount("", "P")
  5749  	require.Nil(t, err, err)
  5750  	assert.Equal(t, privateStartCount+1, count, "Wrong private channel deleted count.")
  5751  
  5752  	count, err = ss.Channel().AnalyticsDeletedTypeCount("", "D")
  5753  	require.Nil(t, err, err)
  5754  	assert.Equal(t, directStartCount+1, count, "Wrong direct channel deleted count.")
  5755  }
  5756  
  5757  func testChannelStoreGetPinnedPosts(t *testing.T, ss store.Store) {
  5758  	ch1 := &model.Channel{
  5759  		TeamId:      model.NewId(),
  5760  		DisplayName: "Name",
  5761  		Name:        "zz" + model.NewId() + "b",
  5762  		Type:        model.CHANNEL_OPEN,
  5763  	}
  5764  
  5765  	o1, nErr := ss.Channel().Save(ch1, -1)
  5766  	require.Nil(t, nErr)
  5767  
  5768  	p1, err := ss.Post().Save(&model.Post{
  5769  		UserId:    model.NewId(),
  5770  		ChannelId: o1.Id,
  5771  		Message:   "test",
  5772  		IsPinned:  true,
  5773  	})
  5774  	require.Nil(t, err)
  5775  
  5776  	pl, errGet := ss.Channel().GetPinnedPosts(o1.Id)
  5777  	require.Nil(t, errGet, errGet)
  5778  	require.NotNil(t, pl.Posts[p1.Id], "didn't return relevant pinned posts")
  5779  
  5780  	ch2 := &model.Channel{
  5781  		TeamId:      model.NewId(),
  5782  		DisplayName: "Name",
  5783  		Name:        "zz" + model.NewId() + "b",
  5784  		Type:        model.CHANNEL_OPEN,
  5785  	}
  5786  
  5787  	o2, nErr := ss.Channel().Save(ch2, -1)
  5788  	require.Nil(t, nErr)
  5789  
  5790  	_, err = ss.Post().Save(&model.Post{
  5791  		UserId:    model.NewId(),
  5792  		ChannelId: o2.Id,
  5793  		Message:   "test",
  5794  	})
  5795  	require.Nil(t, err)
  5796  
  5797  	pl, errGet = ss.Channel().GetPinnedPosts(o2.Id)
  5798  	require.Nil(t, errGet, errGet)
  5799  	require.Empty(t, pl.Posts, "wasn't supposed to return posts")
  5800  
  5801  	t.Run("with correct ReplyCount", func(t *testing.T) {
  5802  		channelId := model.NewId()
  5803  		userId := model.NewId()
  5804  
  5805  		post1, err := ss.Post().Save(&model.Post{
  5806  			ChannelId: channelId,
  5807  			UserId:    userId,
  5808  			Message:   "message",
  5809  			IsPinned:  true,
  5810  		})
  5811  		require.Nil(t, err)
  5812  		time.Sleep(time.Millisecond)
  5813  
  5814  		post2, err := ss.Post().Save(&model.Post{
  5815  			ChannelId: channelId,
  5816  			UserId:    userId,
  5817  			Message:   "message",
  5818  			IsPinned:  true,
  5819  		})
  5820  		require.Nil(t, err)
  5821  		time.Sleep(time.Millisecond)
  5822  
  5823  		post3, err := ss.Post().Save(&model.Post{
  5824  			ChannelId: channelId,
  5825  			UserId:    userId,
  5826  			ParentId:  post1.Id,
  5827  			RootId:    post1.Id,
  5828  			Message:   "message",
  5829  			IsPinned:  true,
  5830  		})
  5831  		require.Nil(t, err)
  5832  		time.Sleep(time.Millisecond)
  5833  
  5834  		posts, err := ss.Channel().GetPinnedPosts(channelId)
  5835  		require.Nil(t, err)
  5836  		require.Len(t, posts.Posts, 3)
  5837  		require.Equal(t, posts.Posts[post1.Id].ReplyCount, int64(1))
  5838  		require.Equal(t, posts.Posts[post2.Id].ReplyCount, int64(0))
  5839  		require.Equal(t, posts.Posts[post3.Id].ReplyCount, int64(1))
  5840  	})
  5841  }
  5842  
  5843  func testChannelStoreGetPinnedPostCount(t *testing.T, ss store.Store) {
  5844  	ch1 := &model.Channel{
  5845  		TeamId:      model.NewId(),
  5846  		DisplayName: "Name",
  5847  		Name:        "zz" + model.NewId() + "b",
  5848  		Type:        model.CHANNEL_OPEN,
  5849  	}
  5850  
  5851  	o1, nErr := ss.Channel().Save(ch1, -1)
  5852  	require.Nil(t, nErr)
  5853  
  5854  	_, err := ss.Post().Save(&model.Post{
  5855  		UserId:    model.NewId(),
  5856  		ChannelId: o1.Id,
  5857  		Message:   "test",
  5858  		IsPinned:  true,
  5859  	})
  5860  	require.Nil(t, err)
  5861  
  5862  	_, err = ss.Post().Save(&model.Post{
  5863  		UserId:    model.NewId(),
  5864  		ChannelId: o1.Id,
  5865  		Message:   "test",
  5866  		IsPinned:  true,
  5867  	})
  5868  	require.Nil(t, err)
  5869  
  5870  	count, errGet := ss.Channel().GetPinnedPostCount(o1.Id, true)
  5871  	require.Nil(t, errGet, errGet)
  5872  	require.EqualValues(t, 2, count, "didn't return right count")
  5873  
  5874  	ch2 := &model.Channel{
  5875  		TeamId:      model.NewId(),
  5876  		DisplayName: "Name",
  5877  		Name:        "zz" + model.NewId() + "b",
  5878  		Type:        model.CHANNEL_OPEN,
  5879  	}
  5880  
  5881  	o2, nErr := ss.Channel().Save(ch2, -1)
  5882  	require.Nil(t, nErr)
  5883  
  5884  	_, err = ss.Post().Save(&model.Post{
  5885  		UserId:    model.NewId(),
  5886  		ChannelId: o2.Id,
  5887  		Message:   "test",
  5888  	})
  5889  	require.Nil(t, err)
  5890  
  5891  	_, err = ss.Post().Save(&model.Post{
  5892  		UserId:    model.NewId(),
  5893  		ChannelId: o2.Id,
  5894  		Message:   "test",
  5895  	})
  5896  	require.Nil(t, err)
  5897  
  5898  	count, errGet = ss.Channel().GetPinnedPostCount(o2.Id, true)
  5899  	require.Nil(t, errGet, errGet)
  5900  	require.EqualValues(t, 0, count, "should return 0")
  5901  }
  5902  
  5903  func testChannelStoreMaxChannelsPerTeam(t *testing.T, ss store.Store) {
  5904  	channel := &model.Channel{
  5905  		TeamId:      model.NewId(),
  5906  		DisplayName: "Channel",
  5907  		Name:        model.NewId(),
  5908  		Type:        model.CHANNEL_OPEN,
  5909  	}
  5910  	_, nErr := ss.Channel().Save(channel, 0)
  5911  	assert.NotNil(t, nErr)
  5912  	var ltErr *store.ErrLimitExceeded
  5913  	assert.True(t, errors.As(nErr, &ltErr))
  5914  
  5915  	channel.Id = ""
  5916  	_, nErr = ss.Channel().Save(channel, 1)
  5917  	assert.Nil(t, nErr)
  5918  }
  5919  
  5920  func testChannelStoreGetChannelsByScheme(t *testing.T, ss store.Store) {
  5921  	// Create some schemes.
  5922  	s1 := &model.Scheme{
  5923  		DisplayName: model.NewId(),
  5924  		Name:        model.NewId(),
  5925  		Description: model.NewId(),
  5926  		Scope:       model.SCHEME_SCOPE_CHANNEL,
  5927  	}
  5928  
  5929  	s2 := &model.Scheme{
  5930  		DisplayName: model.NewId(),
  5931  		Name:        model.NewId(),
  5932  		Description: model.NewId(),
  5933  		Scope:       model.SCHEME_SCOPE_CHANNEL,
  5934  	}
  5935  
  5936  	s1, err := ss.Scheme().Save(s1)
  5937  	require.Nil(t, err)
  5938  	s2, err = ss.Scheme().Save(s2)
  5939  	require.Nil(t, err)
  5940  
  5941  	// Create and save some teams.
  5942  	c1 := &model.Channel{
  5943  		TeamId:      model.NewId(),
  5944  		DisplayName: "Name",
  5945  		Name:        model.NewId(),
  5946  		Type:        model.CHANNEL_OPEN,
  5947  		SchemeId:    &s1.Id,
  5948  	}
  5949  
  5950  	c2 := &model.Channel{
  5951  		TeamId:      model.NewId(),
  5952  		DisplayName: "Name",
  5953  		Name:        model.NewId(),
  5954  		Type:        model.CHANNEL_OPEN,
  5955  		SchemeId:    &s1.Id,
  5956  	}
  5957  
  5958  	c3 := &model.Channel{
  5959  		TeamId:      model.NewId(),
  5960  		DisplayName: "Name",
  5961  		Name:        model.NewId(),
  5962  		Type:        model.CHANNEL_OPEN,
  5963  	}
  5964  
  5965  	_, _ = ss.Channel().Save(c1, 100)
  5966  	_, _ = ss.Channel().Save(c2, 100)
  5967  	_, _ = ss.Channel().Save(c3, 100)
  5968  
  5969  	// Get the channels by a valid Scheme ID.
  5970  	d1, err := ss.Channel().GetChannelsByScheme(s1.Id, 0, 100)
  5971  	assert.Nil(t, err)
  5972  	assert.Len(t, d1, 2)
  5973  
  5974  	// Get the channels by a valid Scheme ID where there aren't any matching Channel.
  5975  	d2, err := ss.Channel().GetChannelsByScheme(s2.Id, 0, 100)
  5976  	assert.Nil(t, err)
  5977  	assert.Empty(t, d2)
  5978  
  5979  	// Get the channels by an invalid Scheme ID.
  5980  	d3, err := ss.Channel().GetChannelsByScheme(model.NewId(), 0, 100)
  5981  	assert.Nil(t, err)
  5982  	assert.Empty(t, d3)
  5983  }
  5984  
  5985  func testChannelStoreMigrateChannelMembers(t *testing.T, ss store.Store) {
  5986  	s1 := model.NewId()
  5987  	c1 := &model.Channel{
  5988  		TeamId:      model.NewId(),
  5989  		DisplayName: "Name",
  5990  		Name:        model.NewId(),
  5991  		Type:        model.CHANNEL_OPEN,
  5992  		SchemeId:    &s1,
  5993  	}
  5994  	c1, _ = ss.Channel().Save(c1, 100)
  5995  
  5996  	cm1 := &model.ChannelMember{
  5997  		ChannelId:     c1.Id,
  5998  		UserId:        model.NewId(),
  5999  		ExplicitRoles: "channel_admin channel_user",
  6000  		NotifyProps:   model.GetDefaultChannelNotifyProps(),
  6001  	}
  6002  	cm2 := &model.ChannelMember{
  6003  		ChannelId:     c1.Id,
  6004  		UserId:        model.NewId(),
  6005  		ExplicitRoles: "channel_user",
  6006  		NotifyProps:   model.GetDefaultChannelNotifyProps(),
  6007  	}
  6008  	cm3 := &model.ChannelMember{
  6009  		ChannelId:     c1.Id,
  6010  		UserId:        model.NewId(),
  6011  		ExplicitRoles: "something_else",
  6012  		NotifyProps:   model.GetDefaultChannelNotifyProps(),
  6013  	}
  6014  
  6015  	cm1, _ = ss.Channel().SaveMember(cm1)
  6016  	cm2, _ = ss.Channel().SaveMember(cm2)
  6017  	cm3, _ = ss.Channel().SaveMember(cm3)
  6018  
  6019  	lastDoneChannelId := strings.Repeat("0", 26)
  6020  	lastDoneUserId := strings.Repeat("0", 26)
  6021  
  6022  	for {
  6023  		data, err := ss.Channel().MigrateChannelMembers(lastDoneChannelId, lastDoneUserId)
  6024  		if assert.Nil(t, err) {
  6025  			if data == nil {
  6026  				break
  6027  			}
  6028  			lastDoneChannelId = data["ChannelId"]
  6029  			lastDoneUserId = data["UserId"]
  6030  		}
  6031  	}
  6032  
  6033  	ss.Channel().ClearCaches()
  6034  
  6035  	cm1b, err := ss.Channel().GetMember(cm1.ChannelId, cm1.UserId)
  6036  	assert.Nil(t, err)
  6037  	assert.Equal(t, "", cm1b.ExplicitRoles)
  6038  	assert.False(t, cm1b.SchemeGuest)
  6039  	assert.True(t, cm1b.SchemeUser)
  6040  	assert.True(t, cm1b.SchemeAdmin)
  6041  
  6042  	cm2b, err := ss.Channel().GetMember(cm2.ChannelId, cm2.UserId)
  6043  	assert.Nil(t, err)
  6044  	assert.Equal(t, "", cm2b.ExplicitRoles)
  6045  	assert.False(t, cm1b.SchemeGuest)
  6046  	assert.True(t, cm2b.SchemeUser)
  6047  	assert.False(t, cm2b.SchemeAdmin)
  6048  
  6049  	cm3b, err := ss.Channel().GetMember(cm3.ChannelId, cm3.UserId)
  6050  	assert.Nil(t, err)
  6051  	assert.Equal(t, "something_else", cm3b.ExplicitRoles)
  6052  	assert.False(t, cm1b.SchemeGuest)
  6053  	assert.False(t, cm3b.SchemeUser)
  6054  	assert.False(t, cm3b.SchemeAdmin)
  6055  }
  6056  
  6057  func testResetAllChannelSchemes(t *testing.T, ss store.Store) {
  6058  	s1 := &model.Scheme{
  6059  		Name:        model.NewId(),
  6060  		DisplayName: model.NewId(),
  6061  		Description: model.NewId(),
  6062  		Scope:       model.SCHEME_SCOPE_CHANNEL,
  6063  	}
  6064  	s1, err := ss.Scheme().Save(s1)
  6065  	require.Nil(t, err)
  6066  
  6067  	c1 := &model.Channel{
  6068  		TeamId:      model.NewId(),
  6069  		DisplayName: "Name",
  6070  		Name:        model.NewId(),
  6071  		Type:        model.CHANNEL_OPEN,
  6072  		SchemeId:    &s1.Id,
  6073  	}
  6074  
  6075  	c2 := &model.Channel{
  6076  		TeamId:      model.NewId(),
  6077  		DisplayName: "Name",
  6078  		Name:        model.NewId(),
  6079  		Type:        model.CHANNEL_OPEN,
  6080  		SchemeId:    &s1.Id,
  6081  	}
  6082  
  6083  	c1, _ = ss.Channel().Save(c1, 100)
  6084  	c2, _ = ss.Channel().Save(c2, 100)
  6085  
  6086  	assert.Equal(t, s1.Id, *c1.SchemeId)
  6087  	assert.Equal(t, s1.Id, *c2.SchemeId)
  6088  
  6089  	err = ss.Channel().ResetAllChannelSchemes()
  6090  	assert.Nil(t, err)
  6091  
  6092  	c1, _ = ss.Channel().Get(c1.Id, true)
  6093  	c2, _ = ss.Channel().Get(c2.Id, true)
  6094  
  6095  	assert.Equal(t, "", *c1.SchemeId)
  6096  	assert.Equal(t, "", *c2.SchemeId)
  6097  }
  6098  
  6099  func testChannelStoreClearAllCustomRoleAssignments(t *testing.T, ss store.Store) {
  6100  	c := &model.Channel{
  6101  		TeamId:      model.NewId(),
  6102  		DisplayName: "Name",
  6103  		Name:        model.NewId(),
  6104  		Type:        model.CHANNEL_OPEN,
  6105  	}
  6106  
  6107  	c, _ = ss.Channel().Save(c, 100)
  6108  
  6109  	m1 := &model.ChannelMember{
  6110  		ChannelId:     c.Id,
  6111  		UserId:        model.NewId(),
  6112  		NotifyProps:   model.GetDefaultChannelNotifyProps(),
  6113  		ExplicitRoles: "system_user_access_token channel_user channel_admin",
  6114  	}
  6115  	m2 := &model.ChannelMember{
  6116  		ChannelId:     c.Id,
  6117  		UserId:        model.NewId(),
  6118  		NotifyProps:   model.GetDefaultChannelNotifyProps(),
  6119  		ExplicitRoles: "channel_user custom_role channel_admin another_custom_role",
  6120  	}
  6121  	m3 := &model.ChannelMember{
  6122  		ChannelId:     c.Id,
  6123  		UserId:        model.NewId(),
  6124  		NotifyProps:   model.GetDefaultChannelNotifyProps(),
  6125  		ExplicitRoles: "channel_user",
  6126  	}
  6127  	m4 := &model.ChannelMember{
  6128  		ChannelId:     c.Id,
  6129  		UserId:        model.NewId(),
  6130  		NotifyProps:   model.GetDefaultChannelNotifyProps(),
  6131  		ExplicitRoles: "custom_only",
  6132  	}
  6133  
  6134  	_, err := ss.Channel().SaveMember(m1)
  6135  	require.Nil(t, err)
  6136  	_, err = ss.Channel().SaveMember(m2)
  6137  	require.Nil(t, err)
  6138  	_, err = ss.Channel().SaveMember(m3)
  6139  	require.Nil(t, err)
  6140  	_, err = ss.Channel().SaveMember(m4)
  6141  	require.Nil(t, err)
  6142  
  6143  	require.Nil(t, ss.Channel().ClearAllCustomRoleAssignments())
  6144  
  6145  	member, err := ss.Channel().GetMember(m1.ChannelId, m1.UserId)
  6146  	require.Nil(t, err)
  6147  	assert.Equal(t, m1.ExplicitRoles, member.Roles)
  6148  
  6149  	member, err = ss.Channel().GetMember(m2.ChannelId, m2.UserId)
  6150  	require.Nil(t, err)
  6151  	assert.Equal(t, "channel_user channel_admin", member.Roles)
  6152  
  6153  	member, err = ss.Channel().GetMember(m3.ChannelId, m3.UserId)
  6154  	require.Nil(t, err)
  6155  	assert.Equal(t, m3.ExplicitRoles, member.Roles)
  6156  
  6157  	member, err = ss.Channel().GetMember(m4.ChannelId, m4.UserId)
  6158  	require.Nil(t, err)
  6159  	assert.Equal(t, "", member.Roles)
  6160  }
  6161  
  6162  // testMaterializedPublicChannels tests edge cases involving the triggers and stored procedures
  6163  // that materialize the PublicChannels table.
  6164  func testMaterializedPublicChannels(t *testing.T, ss store.Store, s SqlSupplier) {
  6165  	teamId := model.NewId()
  6166  
  6167  	// o1 is a public channel on the team
  6168  	o1 := model.Channel{
  6169  		TeamId:      teamId,
  6170  		DisplayName: "Open Channel",
  6171  		Name:        model.NewId(),
  6172  		Type:        model.CHANNEL_OPEN,
  6173  	}
  6174  	_, nErr := ss.Channel().Save(&o1, -1)
  6175  	require.Nil(t, nErr)
  6176  
  6177  	// o2 is another public channel on the team
  6178  	o2 := model.Channel{
  6179  		TeamId:      teamId,
  6180  		DisplayName: "Open Channel 2",
  6181  		Name:        model.NewId(),
  6182  		Type:        model.CHANNEL_OPEN,
  6183  	}
  6184  	_, nErr = ss.Channel().Save(&o2, -1)
  6185  	require.Nil(t, nErr)
  6186  
  6187  	t.Run("o1 and o2 initially listed in public channels", func(t *testing.T) {
  6188  		channels, channelErr := ss.Channel().SearchInTeam(teamId, "", true)
  6189  		require.Nil(t, channelErr)
  6190  		require.Equal(t, &model.ChannelList{&o1, &o2}, channels)
  6191  	})
  6192  
  6193  	o1.DeleteAt = model.GetMillis()
  6194  	o1.UpdateAt = o1.DeleteAt
  6195  
  6196  	e := ss.Channel().Delete(o1.Id, o1.DeleteAt)
  6197  	require.Nil(t, e, "channel should have been deleted")
  6198  
  6199  	t.Run("o1 still listed in public channels when marked as deleted", func(t *testing.T) {
  6200  		channels, channelErr := ss.Channel().SearchInTeam(teamId, "", true)
  6201  		require.Nil(t, channelErr)
  6202  		require.Equal(t, &model.ChannelList{&o1, &o2}, channels)
  6203  	})
  6204  
  6205  	ss.Channel().PermanentDelete(o1.Id)
  6206  
  6207  	t.Run("o1 no longer listed in public channels when permanently deleted", func(t *testing.T) {
  6208  		channels, channelErr := ss.Channel().SearchInTeam(teamId, "", true)
  6209  		require.Nil(t, channelErr)
  6210  		require.Equal(t, &model.ChannelList{&o2}, channels)
  6211  	})
  6212  
  6213  	o2.Type = model.CHANNEL_PRIVATE
  6214  	_, appErr := ss.Channel().Update(&o2)
  6215  	require.Nil(t, appErr)
  6216  
  6217  	t.Run("o2 no longer listed since now private", func(t *testing.T) {
  6218  		channels, channelErr := ss.Channel().SearchInTeam(teamId, "", true)
  6219  		require.Nil(t, channelErr)
  6220  		require.Equal(t, &model.ChannelList{}, channels)
  6221  	})
  6222  
  6223  	o2.Type = model.CHANNEL_OPEN
  6224  	_, appErr = ss.Channel().Update(&o2)
  6225  	require.Nil(t, appErr)
  6226  
  6227  	t.Run("o2 listed once again since now public", func(t *testing.T) {
  6228  		channels, channelErr := ss.Channel().SearchInTeam(teamId, "", true)
  6229  		require.Nil(t, channelErr)
  6230  		require.Equal(t, &model.ChannelList{&o2}, channels)
  6231  	})
  6232  
  6233  	// o3 is a public channel on the team that already existed in the PublicChannels table.
  6234  	o3 := model.Channel{
  6235  		Id:          model.NewId(),
  6236  		TeamId:      teamId,
  6237  		DisplayName: "Open Channel 3",
  6238  		Name:        model.NewId(),
  6239  		Type:        model.CHANNEL_OPEN,
  6240  	}
  6241  
  6242  	_, execerr := s.GetMaster().ExecNoTimeout(`
  6243  		INSERT INTO
  6244  		    PublicChannels(Id, DeleteAt, TeamId, DisplayName, Name, Header, Purpose)
  6245  		VALUES
  6246  		    (:Id, :DeleteAt, :TeamId, :DisplayName, :Name, :Header, :Purpose);
  6247  	`, map[string]interface{}{
  6248  		"Id":          o3.Id,
  6249  		"DeleteAt":    o3.DeleteAt,
  6250  		"TeamId":      o3.TeamId,
  6251  		"DisplayName": o3.DisplayName,
  6252  		"Name":        o3.Name,
  6253  		"Header":      o3.Header,
  6254  		"Purpose":     o3.Purpose,
  6255  	})
  6256  	require.Nil(t, execerr)
  6257  
  6258  	o3.DisplayName = "Open Channel 3 - Modified"
  6259  
  6260  	_, execerr = s.GetMaster().ExecNoTimeout(`
  6261  		INSERT INTO
  6262  		    Channels(Id, CreateAt, UpdateAt, DeleteAt, TeamId, Type, DisplayName, Name, Header, Purpose, LastPostAt, TotalMsgCount, ExtraUpdateAt, CreatorId)
  6263  		VALUES
  6264  		    (:Id, :CreateAt, :UpdateAt, :DeleteAt, :TeamId, :Type, :DisplayName, :Name, :Header, :Purpose, :LastPostAt, :TotalMsgCount, :ExtraUpdateAt, :CreatorId);
  6265  	`, map[string]interface{}{
  6266  		"Id":            o3.Id,
  6267  		"CreateAt":      o3.CreateAt,
  6268  		"UpdateAt":      o3.UpdateAt,
  6269  		"DeleteAt":      o3.DeleteAt,
  6270  		"TeamId":        o3.TeamId,
  6271  		"Type":          o3.Type,
  6272  		"DisplayName":   o3.DisplayName,
  6273  		"Name":          o3.Name,
  6274  		"Header":        o3.Header,
  6275  		"Purpose":       o3.Purpose,
  6276  		"LastPostAt":    o3.LastPostAt,
  6277  		"TotalMsgCount": o3.TotalMsgCount,
  6278  		"ExtraUpdateAt": o3.ExtraUpdateAt,
  6279  		"CreatorId":     o3.CreatorId,
  6280  	})
  6281  	require.Nil(t, execerr)
  6282  
  6283  	t.Run("verify o3 INSERT converted to UPDATE", func(t *testing.T) {
  6284  		channels, channelErr := ss.Channel().SearchInTeam(teamId, "", true)
  6285  		require.Nil(t, channelErr)
  6286  		require.Equal(t, &model.ChannelList{&o2, &o3}, channels)
  6287  	})
  6288  
  6289  	// o4 is a public channel on the team that existed in the Channels table but was omitted from the PublicChannels table.
  6290  	o4 := model.Channel{
  6291  		TeamId:      teamId,
  6292  		DisplayName: "Open Channel 4",
  6293  		Name:        model.NewId(),
  6294  		Type:        model.CHANNEL_OPEN,
  6295  	}
  6296  
  6297  	_, nErr = ss.Channel().Save(&o4, -1)
  6298  	require.Nil(t, nErr)
  6299  
  6300  	_, execerr = s.GetMaster().ExecNoTimeout(`
  6301  		DELETE FROM
  6302  		    PublicChannels
  6303  		WHERE
  6304  		    Id = :Id
  6305  	`, map[string]interface{}{
  6306  		"Id": o4.Id,
  6307  	})
  6308  	require.Nil(t, execerr)
  6309  
  6310  	o4.DisplayName += " - Modified"
  6311  	_, appErr = ss.Channel().Update(&o4)
  6312  	require.Nil(t, appErr)
  6313  
  6314  	t.Run("verify o4 UPDATE converted to INSERT", func(t *testing.T) {
  6315  		channels, err := ss.Channel().SearchInTeam(teamId, "", true)
  6316  		require.Nil(t, err)
  6317  		require.Equal(t, &model.ChannelList{&o2, &o3, &o4}, channels)
  6318  	})
  6319  }
  6320  
  6321  func testChannelStoreGetAllChannelsForExportAfter(t *testing.T, ss store.Store) {
  6322  	t1 := model.Team{}
  6323  	t1.DisplayName = "Name"
  6324  	t1.Name = "zz" + model.NewId()
  6325  	t1.Email = MakeEmail()
  6326  	t1.Type = model.TEAM_OPEN
  6327  	_, err := ss.Team().Save(&t1)
  6328  	require.Nil(t, err)
  6329  
  6330  	c1 := model.Channel{}
  6331  	c1.TeamId = t1.Id
  6332  	c1.DisplayName = "Channel1"
  6333  	c1.Name = "zz" + model.NewId() + "b"
  6334  	c1.Type = model.CHANNEL_OPEN
  6335  	_, nErr := ss.Channel().Save(&c1, -1)
  6336  	require.Nil(t, nErr)
  6337  
  6338  	d1, err := ss.Channel().GetAllChannelsForExportAfter(10000, strings.Repeat("0", 26))
  6339  	assert.Nil(t, err)
  6340  
  6341  	found := false
  6342  	for _, c := range d1 {
  6343  		if c.Id == c1.Id {
  6344  			found = true
  6345  			assert.Equal(t, t1.Id, c.TeamId)
  6346  			assert.Nil(t, c.SchemeId)
  6347  			assert.Equal(t, t1.Name, c.TeamName)
  6348  		}
  6349  	}
  6350  	assert.True(t, found)
  6351  }
  6352  
  6353  func testChannelStoreGetChannelMembersForExport(t *testing.T, ss store.Store) {
  6354  	t1 := model.Team{}
  6355  	t1.DisplayName = "Name"
  6356  	t1.Name = "zz" + model.NewId()
  6357  	t1.Email = MakeEmail()
  6358  	t1.Type = model.TEAM_OPEN
  6359  	_, err := ss.Team().Save(&t1)
  6360  	require.Nil(t, err)
  6361  
  6362  	c1 := model.Channel{}
  6363  	c1.TeamId = t1.Id
  6364  	c1.DisplayName = "Channel1"
  6365  	c1.Name = "zz" + model.NewId() + "b"
  6366  	c1.Type = model.CHANNEL_OPEN
  6367  	_, nErr := ss.Channel().Save(&c1, -1)
  6368  	require.Nil(t, nErr)
  6369  
  6370  	c2 := model.Channel{}
  6371  	c2.TeamId = model.NewId()
  6372  	c2.DisplayName = "Channel2"
  6373  	c2.Name = "zz" + model.NewId() + "b"
  6374  	c2.Type = model.CHANNEL_OPEN
  6375  	_, nErr = ss.Channel().Save(&c2, -1)
  6376  	require.Nil(t, nErr)
  6377  
  6378  	u1 := model.User{}
  6379  	u1.Email = MakeEmail()
  6380  	u1.Nickname = model.NewId()
  6381  	_, err = ss.User().Save(&u1)
  6382  	require.Nil(t, err)
  6383  
  6384  	m1 := model.ChannelMember{}
  6385  	m1.ChannelId = c1.Id
  6386  	m1.UserId = u1.Id
  6387  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
  6388  	_, err = ss.Channel().SaveMember(&m1)
  6389  	require.Nil(t, err)
  6390  
  6391  	m2 := model.ChannelMember{}
  6392  	m2.ChannelId = c2.Id
  6393  	m2.UserId = u1.Id
  6394  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
  6395  	_, err = ss.Channel().SaveMember(&m2)
  6396  	require.Nil(t, err)
  6397  
  6398  	d1, err := ss.Channel().GetChannelMembersForExport(u1.Id, t1.Id)
  6399  	assert.Nil(t, err)
  6400  
  6401  	assert.Len(t, d1, 1)
  6402  
  6403  	cmfe1 := d1[0]
  6404  	assert.Equal(t, c1.Name, cmfe1.ChannelName)
  6405  	assert.Equal(t, c1.Id, cmfe1.ChannelId)
  6406  	assert.Equal(t, u1.Id, cmfe1.UserId)
  6407  }
  6408  
  6409  func testChannelStoreRemoveAllDeactivatedMembers(t *testing.T, ss store.Store, s SqlSupplier) {
  6410  	// Set up all the objects needed in the store.
  6411  	t1 := model.Team{}
  6412  	t1.DisplayName = "Name"
  6413  	t1.Name = "zz" + model.NewId()
  6414  	t1.Email = MakeEmail()
  6415  	t1.Type = model.TEAM_OPEN
  6416  	_, err := ss.Team().Save(&t1)
  6417  	require.Nil(t, err)
  6418  
  6419  	c1 := model.Channel{}
  6420  	c1.TeamId = t1.Id
  6421  	c1.DisplayName = "Channel1"
  6422  	c1.Name = "zz" + model.NewId() + "b"
  6423  	c1.Type = model.CHANNEL_OPEN
  6424  	_, nErr := ss.Channel().Save(&c1, -1)
  6425  	require.Nil(t, nErr)
  6426  
  6427  	u1 := model.User{}
  6428  	u1.Email = MakeEmail()
  6429  	u1.Nickname = model.NewId()
  6430  	_, err = ss.User().Save(&u1)
  6431  	require.Nil(t, err)
  6432  
  6433  	u2 := model.User{}
  6434  	u2.Email = MakeEmail()
  6435  	u2.Nickname = model.NewId()
  6436  	_, err = ss.User().Save(&u2)
  6437  	require.Nil(t, err)
  6438  
  6439  	u3 := model.User{}
  6440  	u3.Email = MakeEmail()
  6441  	u3.Nickname = model.NewId()
  6442  	_, err = ss.User().Save(&u3)
  6443  	require.Nil(t, err)
  6444  
  6445  	m1 := model.ChannelMember{}
  6446  	m1.ChannelId = c1.Id
  6447  	m1.UserId = u1.Id
  6448  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
  6449  	_, err = ss.Channel().SaveMember(&m1)
  6450  	require.Nil(t, err)
  6451  
  6452  	m2 := model.ChannelMember{}
  6453  	m2.ChannelId = c1.Id
  6454  	m2.UserId = u2.Id
  6455  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
  6456  	_, err = ss.Channel().SaveMember(&m2)
  6457  	require.Nil(t, err)
  6458  
  6459  	m3 := model.ChannelMember{}
  6460  	m3.ChannelId = c1.Id
  6461  	m3.UserId = u3.Id
  6462  	m3.NotifyProps = model.GetDefaultChannelNotifyProps()
  6463  	_, err = ss.Channel().SaveMember(&m3)
  6464  	require.Nil(t, err)
  6465  
  6466  	// Get all the channel members. Check there are 3.
  6467  	d1, err := ss.Channel().GetMembers(c1.Id, 0, 1000)
  6468  	assert.Nil(t, err)
  6469  	assert.Len(t, *d1, 3)
  6470  
  6471  	// Deactivate users 1 & 2.
  6472  	u1.DeleteAt = model.GetMillis()
  6473  	u2.DeleteAt = model.GetMillis()
  6474  	_, err = ss.User().Update(&u1, true)
  6475  	require.Nil(t, err)
  6476  	_, err = ss.User().Update(&u2, true)
  6477  	require.Nil(t, err)
  6478  
  6479  	// Remove all deactivated users from the channel.
  6480  	assert.Nil(t, ss.Channel().RemoveAllDeactivatedMembers(c1.Id))
  6481  
  6482  	// Get all the channel members. Check there is now only 1: m3.
  6483  	d2, err := ss.Channel().GetMembers(c1.Id, 0, 1000)
  6484  	assert.Nil(t, err)
  6485  	assert.Len(t, *d2, 1)
  6486  	assert.Equal(t, u3.Id, (*d2)[0].UserId)
  6487  
  6488  	// Manually truncate Channels table until testlib can handle cleanups
  6489  	s.GetMaster().Exec("TRUNCATE Channels")
  6490  }
  6491  
  6492  func testChannelStoreExportAllDirectChannels(t *testing.T, ss store.Store, s SqlSupplier) {
  6493  	teamId := model.NewId()
  6494  
  6495  	o1 := model.Channel{}
  6496  	o1.TeamId = teamId
  6497  	o1.DisplayName = "Name" + model.NewId()
  6498  	o1.Name = "zz" + model.NewId() + "b"
  6499  	o1.Type = model.CHANNEL_DIRECT
  6500  
  6501  	userIds := []string{model.NewId(), model.NewId(), model.NewId()}
  6502  
  6503  	o2 := model.Channel{}
  6504  	o2.Name = model.GetGroupNameFromUserIds(userIds)
  6505  	o2.DisplayName = "GroupChannel" + model.NewId()
  6506  	o2.Name = "zz" + model.NewId() + "b"
  6507  	o2.Type = model.CHANNEL_GROUP
  6508  	_, nErr := ss.Channel().Save(&o2, -1)
  6509  	require.Nil(t, nErr)
  6510  
  6511  	u1 := &model.User{}
  6512  	u1.Email = MakeEmail()
  6513  	u1.Nickname = model.NewId()
  6514  	_, err := ss.User().Save(u1)
  6515  	require.Nil(t, err)
  6516  	_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1)
  6517  	require.Nil(t, err)
  6518  
  6519  	u2 := &model.User{}
  6520  	u2.Email = MakeEmail()
  6521  	u2.Nickname = model.NewId()
  6522  	_, err = ss.User().Save(u2)
  6523  	require.Nil(t, err)
  6524  	_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}, -1)
  6525  	require.Nil(t, err)
  6526  
  6527  	m1 := model.ChannelMember{}
  6528  	m1.ChannelId = o1.Id
  6529  	m1.UserId = u1.Id
  6530  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
  6531  
  6532  	m2 := model.ChannelMember{}
  6533  	m2.ChannelId = o1.Id
  6534  	m2.UserId = u2.Id
  6535  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
  6536  
  6537  	ss.Channel().SaveDirectChannel(&o1, &m1, &m2)
  6538  
  6539  	d1, err := ss.Channel().GetAllDirectChannelsForExportAfter(10000, strings.Repeat("0", 26))
  6540  	assert.Nil(t, err)
  6541  
  6542  	assert.Len(t, d1, 2)
  6543  	assert.ElementsMatch(t, []string{o1.DisplayName, o2.DisplayName}, []string{d1[0].DisplayName, d1[1].DisplayName})
  6544  
  6545  	// Manually truncate Channels table until testlib can handle cleanups
  6546  	s.GetMaster().Exec("TRUNCATE Channels")
  6547  }
  6548  
  6549  func testChannelStoreExportAllDirectChannelsExcludePrivateAndPublic(t *testing.T, ss store.Store, s SqlSupplier) {
  6550  	teamId := model.NewId()
  6551  
  6552  	o1 := model.Channel{}
  6553  	o1.TeamId = teamId
  6554  	o1.DisplayName = "The Direct Channel" + model.NewId()
  6555  	o1.Name = "zz" + model.NewId() + "b"
  6556  	o1.Type = model.CHANNEL_DIRECT
  6557  
  6558  	o2 := model.Channel{}
  6559  	o2.TeamId = teamId
  6560  	o2.DisplayName = "Channel2" + model.NewId()
  6561  	o2.Name = "zz" + model.NewId() + "b"
  6562  	o2.Type = model.CHANNEL_OPEN
  6563  	_, nErr := ss.Channel().Save(&o2, -1)
  6564  	require.Nil(t, nErr)
  6565  
  6566  	o3 := model.Channel{}
  6567  	o3.TeamId = teamId
  6568  	o3.DisplayName = "Channel3" + model.NewId()
  6569  	o3.Name = "zz" + model.NewId() + "b"
  6570  	o3.Type = model.CHANNEL_PRIVATE
  6571  	_, nErr = ss.Channel().Save(&o3, -1)
  6572  	require.Nil(t, nErr)
  6573  
  6574  	u1 := &model.User{}
  6575  	u1.Email = MakeEmail()
  6576  	u1.Nickname = model.NewId()
  6577  	_, err := ss.User().Save(u1)
  6578  	require.Nil(t, err)
  6579  	_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1)
  6580  	require.Nil(t, err)
  6581  
  6582  	u2 := &model.User{}
  6583  	u2.Email = MakeEmail()
  6584  	u2.Nickname = model.NewId()
  6585  	_, err = ss.User().Save(u2)
  6586  	require.Nil(t, err)
  6587  	_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}, -1)
  6588  	require.Nil(t, err)
  6589  
  6590  	m1 := model.ChannelMember{}
  6591  	m1.ChannelId = o1.Id
  6592  	m1.UserId = u1.Id
  6593  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
  6594  
  6595  	m2 := model.ChannelMember{}
  6596  	m2.ChannelId = o1.Id
  6597  	m2.UserId = u2.Id
  6598  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
  6599  
  6600  	ss.Channel().SaveDirectChannel(&o1, &m1, &m2)
  6601  
  6602  	d1, err := ss.Channel().GetAllDirectChannelsForExportAfter(10000, strings.Repeat("0", 26))
  6603  	assert.Nil(t, err)
  6604  	assert.Len(t, d1, 1)
  6605  	assert.Equal(t, o1.DisplayName, d1[0].DisplayName)
  6606  
  6607  	// Manually truncate Channels table until testlib can handle cleanups
  6608  	s.GetMaster().Exec("TRUNCATE Channels")
  6609  }
  6610  
  6611  func testChannelStoreExportAllDirectChannelsDeletedChannel(t *testing.T, ss store.Store, s SqlSupplier) {
  6612  	teamId := model.NewId()
  6613  
  6614  	o1 := model.Channel{}
  6615  	o1.TeamId = teamId
  6616  	o1.DisplayName = "Different Name" + model.NewId()
  6617  	o1.Name = "zz" + model.NewId() + "b"
  6618  	o1.Type = model.CHANNEL_DIRECT
  6619  
  6620  	u1 := &model.User{}
  6621  	u1.Email = MakeEmail()
  6622  	u1.Nickname = model.NewId()
  6623  	_, err := ss.User().Save(u1)
  6624  	require.Nil(t, err)
  6625  	_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1)
  6626  	require.Nil(t, err)
  6627  
  6628  	u2 := &model.User{}
  6629  	u2.Email = MakeEmail()
  6630  	u2.Nickname = model.NewId()
  6631  	_, err = ss.User().Save(u2)
  6632  	require.Nil(t, err)
  6633  	_, err = ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}, -1)
  6634  	require.Nil(t, err)
  6635  
  6636  	m1 := model.ChannelMember{}
  6637  	m1.ChannelId = o1.Id
  6638  	m1.UserId = u1.Id
  6639  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
  6640  
  6641  	m2 := model.ChannelMember{}
  6642  	m2.ChannelId = o1.Id
  6643  	m2.UserId = u2.Id
  6644  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
  6645  
  6646  	ss.Channel().SaveDirectChannel(&o1, &m1, &m2)
  6647  
  6648  	o1.DeleteAt = 1
  6649  	nErr := ss.Channel().SetDeleteAt(o1.Id, 1, 1)
  6650  	require.Nil(t, nErr, "channel should have been deleted")
  6651  
  6652  	d1, err := ss.Channel().GetAllDirectChannelsForExportAfter(10000, strings.Repeat("0", 26))
  6653  	assert.Nil(t, err)
  6654  
  6655  	assert.Equal(t, 0, len(d1))
  6656  
  6657  	// Manually truncate Channels table until testlib can handle cleanups
  6658  	s.GetMaster().Exec("TRUNCATE Channels")
  6659  }
  6660  
  6661  func testChannelStoreGetChannelsBatchForIndexing(t *testing.T, ss store.Store) {
  6662  	// Set up all the objects needed
  6663  	c1 := &model.Channel{}
  6664  	c1.DisplayName = "Channel1"
  6665  	c1.Name = "zz" + model.NewId() + "b"
  6666  	c1.Type = model.CHANNEL_OPEN
  6667  	_, nErr := ss.Channel().Save(c1, -1)
  6668  	require.Nil(t, nErr)
  6669  
  6670  	time.Sleep(10 * time.Millisecond)
  6671  
  6672  	c2 := &model.Channel{}
  6673  	c2.DisplayName = "Channel2"
  6674  	c2.Name = "zz" + model.NewId() + "b"
  6675  	c2.Type = model.CHANNEL_OPEN
  6676  	_, nErr = ss.Channel().Save(c2, -1)
  6677  	require.Nil(t, nErr)
  6678  
  6679  	time.Sleep(10 * time.Millisecond)
  6680  	startTime := c2.CreateAt
  6681  
  6682  	c3 := &model.Channel{}
  6683  	c3.DisplayName = "Channel3"
  6684  	c3.Name = "zz" + model.NewId() + "b"
  6685  	c3.Type = model.CHANNEL_OPEN
  6686  	_, nErr = ss.Channel().Save(c3, -1)
  6687  	require.Nil(t, nErr)
  6688  
  6689  	c4 := &model.Channel{}
  6690  	c4.DisplayName = "Channel4"
  6691  	c4.Name = "zz" + model.NewId() + "b"
  6692  	c4.Type = model.CHANNEL_PRIVATE
  6693  	_, nErr = ss.Channel().Save(c4, -1)
  6694  	require.Nil(t, nErr)
  6695  
  6696  	c5 := &model.Channel{}
  6697  	c5.DisplayName = "Channel5"
  6698  	c5.Name = "zz" + model.NewId() + "b"
  6699  	c5.Type = model.CHANNEL_OPEN
  6700  	_, nErr = ss.Channel().Save(c5, -1)
  6701  	require.Nil(t, nErr)
  6702  
  6703  	time.Sleep(10 * time.Millisecond)
  6704  
  6705  	c6 := &model.Channel{}
  6706  	c6.DisplayName = "Channel6"
  6707  	c6.Name = "zz" + model.NewId() + "b"
  6708  	c6.Type = model.CHANNEL_OPEN
  6709  	_, nErr = ss.Channel().Save(c6, -1)
  6710  	require.Nil(t, nErr)
  6711  
  6712  	endTime := c6.CreateAt
  6713  
  6714  	// First and last channel should be outside the range
  6715  	channels, err := ss.Channel().GetChannelsBatchForIndexing(startTime, endTime, 1000)
  6716  	assert.Nil(t, err)
  6717  	assert.ElementsMatch(t, []*model.Channel{c2, c3, c5}, channels)
  6718  
  6719  	// Update the endTime, last channel should be in
  6720  	endTime = model.GetMillis()
  6721  	channels, err = ss.Channel().GetChannelsBatchForIndexing(startTime, endTime, 1000)
  6722  	assert.Nil(t, err)
  6723  	assert.ElementsMatch(t, []*model.Channel{c2, c3, c5, c6}, channels)
  6724  
  6725  	// Testing the limit
  6726  	channels, err = ss.Channel().GetChannelsBatchForIndexing(startTime, endTime, 2)
  6727  	assert.Nil(t, err)
  6728  	assert.ElementsMatch(t, []*model.Channel{c2, c3}, channels)
  6729  }
  6730  
  6731  func testGroupSyncedChannelCount(t *testing.T, ss store.Store) {
  6732  	channel1, nErr := ss.Channel().Save(&model.Channel{
  6733  		DisplayName:      model.NewId(),
  6734  		Name:             model.NewId(),
  6735  		Type:             model.CHANNEL_PRIVATE,
  6736  		GroupConstrained: model.NewBool(true),
  6737  	}, 999)
  6738  	require.Nil(t, nErr)
  6739  	require.True(t, channel1.IsGroupConstrained())
  6740  	defer ss.Channel().PermanentDelete(channel1.Id)
  6741  
  6742  	channel2, nErr := ss.Channel().Save(&model.Channel{
  6743  		DisplayName: model.NewId(),
  6744  		Name:        model.NewId(),
  6745  		Type:        model.CHANNEL_PRIVATE,
  6746  	}, 999)
  6747  	require.Nil(t, nErr)
  6748  	require.False(t, channel2.IsGroupConstrained())
  6749  	defer ss.Channel().PermanentDelete(channel2.Id)
  6750  
  6751  	count, appErr := ss.Channel().GroupSyncedChannelCount()
  6752  	require.Nil(t, appErr)
  6753  	require.GreaterOrEqual(t, count, int64(1))
  6754  
  6755  	channel2.GroupConstrained = model.NewBool(true)
  6756  	channel2, err := ss.Channel().Update(channel2)
  6757  	require.Nil(t, err)
  6758  	require.True(t, channel2.IsGroupConstrained())
  6759  
  6760  	countAfter, appErr := ss.Channel().GroupSyncedChannelCount()
  6761  	require.Nil(t, appErr)
  6762  	require.GreaterOrEqual(t, countAfter, count+1)
  6763  }
  6764  
  6765  func testGetSidebarCategory(t *testing.T, ss store.Store, s SqlSupplier) {
  6766  	t.Run("should return a custom category with its Channels field set", func(t *testing.T) {
  6767  		userId := model.NewId()
  6768  		teamId := model.NewId()
  6769  
  6770  		channelId1 := model.NewId()
  6771  		channelId2 := model.NewId()
  6772  		channelId3 := model.NewId()
  6773  
  6774  		nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  6775  		require.Nil(t, nErr)
  6776  
  6777  		// Create a category and assign some channels to it
  6778  		created, err := ss.Channel().CreateSidebarCategory(userId, teamId, &model.SidebarCategoryWithChannels{
  6779  			SidebarCategory: model.SidebarCategory{
  6780  				UserId:      userId,
  6781  				TeamId:      teamId,
  6782  				DisplayName: model.NewId(),
  6783  			},
  6784  			Channels: []string{channelId1, channelId2, channelId3},
  6785  		})
  6786  		require.Nil(t, err)
  6787  		require.NotNil(t, created)
  6788  
  6789  		// Ensure that they're returned in order
  6790  		res, err := ss.Channel().GetSidebarCategory(created.Id)
  6791  		assert.Nil(t, err)
  6792  		assert.Equal(t, created.Id, res.Id)
  6793  		assert.Equal(t, model.SidebarCategoryCustom, res.Type)
  6794  		assert.Equal(t, created.DisplayName, res.DisplayName)
  6795  		assert.Equal(t, []string{channelId1, channelId2, channelId3}, res.Channels)
  6796  	})
  6797  
  6798  	t.Run("should return any orphaned channels with the Channels category", func(t *testing.T) {
  6799  		userId := model.NewId()
  6800  		teamId := model.NewId()
  6801  
  6802  		// Create the initial categories and find the channels category
  6803  		nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  6804  		require.Nil(t, nErr)
  6805  
  6806  		categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
  6807  		require.Nil(t, err)
  6808  
  6809  		channelsCategory := categories.Categories[1]
  6810  		require.Equal(t, model.SidebarCategoryChannels, channelsCategory.Type)
  6811  
  6812  		// Join some channels
  6813  		channel1, nErr := ss.Channel().Save(&model.Channel{
  6814  			Name:        "channel1",
  6815  			DisplayName: "DEF",
  6816  			TeamId:      teamId,
  6817  			Type:        model.CHANNEL_PRIVATE,
  6818  		}, 10)
  6819  		require.Nil(t, nErr)
  6820  		_, err = ss.Channel().SaveMember(&model.ChannelMember{
  6821  			UserId:      userId,
  6822  			ChannelId:   channel1.Id,
  6823  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  6824  		})
  6825  		require.Nil(t, err)
  6826  
  6827  		channel2, nErr := ss.Channel().Save(&model.Channel{
  6828  			Name:        "channel2",
  6829  			DisplayName: "ABC",
  6830  			TeamId:      teamId,
  6831  			Type:        model.CHANNEL_OPEN,
  6832  		}, 10)
  6833  		require.Nil(t, nErr)
  6834  		_, err = ss.Channel().SaveMember(&model.ChannelMember{
  6835  			UserId:      userId,
  6836  			ChannelId:   channel2.Id,
  6837  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  6838  		})
  6839  		require.Nil(t, err)
  6840  
  6841  		// Confirm that they're not in the Channels category in the DB
  6842  		count, countErr := s.GetMaster().SelectInt(`
  6843  			SELECT
  6844  				COUNT(*)
  6845  			FROM
  6846  				SidebarChannels
  6847  			WHERE
  6848  				CategoryId = :CategoryId`, map[string]interface{}{"CategoryId": channelsCategory.Id})
  6849  		require.Nil(t, countErr)
  6850  		assert.Equal(t, int64(0), count)
  6851  
  6852  		// Ensure that the Channels are returned in alphabetical order
  6853  		res, err := ss.Channel().GetSidebarCategory(channelsCategory.Id)
  6854  		assert.Nil(t, err)
  6855  		assert.Equal(t, channelsCategory.Id, res.Id)
  6856  		assert.Equal(t, model.SidebarCategoryChannels, channelsCategory.Type)
  6857  		assert.Equal(t, []string{channel2.Id, channel1.Id}, res.Channels)
  6858  	})
  6859  
  6860  	t.Run("shouldn't return orphaned channels on another team with the Channels category", func(t *testing.T) {
  6861  		userId := model.NewId()
  6862  		teamId := model.NewId()
  6863  
  6864  		// Create the initial categories and find the channels category
  6865  		nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  6866  		require.Nil(t, nErr)
  6867  
  6868  		categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
  6869  		require.Nil(t, err)
  6870  		require.Equal(t, model.SidebarCategoryChannels, categories.Categories[1].Type)
  6871  
  6872  		channelsCategory := categories.Categories[1]
  6873  
  6874  		// Join a channel on another team
  6875  		channel1, nErr := ss.Channel().Save(&model.Channel{
  6876  			Name:   "abc",
  6877  			TeamId: model.NewId(),
  6878  			Type:   model.CHANNEL_OPEN,
  6879  		}, 10)
  6880  		require.Nil(t, nErr)
  6881  
  6882  		_, err = ss.Channel().SaveMember(&model.ChannelMember{
  6883  			UserId:      userId,
  6884  			ChannelId:   channel1.Id,
  6885  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  6886  		})
  6887  		require.Nil(t, err)
  6888  
  6889  		// Ensure that no channels are returned
  6890  		res, err := ss.Channel().GetSidebarCategory(channelsCategory.Id)
  6891  		assert.Nil(t, err)
  6892  		assert.Equal(t, channelsCategory.Id, res.Id)
  6893  		assert.Equal(t, model.SidebarCategoryChannels, channelsCategory.Type)
  6894  		assert.Len(t, res.Channels, 0)
  6895  	})
  6896  
  6897  	t.Run("shouldn't return non-orphaned channels with the Channels category", func(t *testing.T) {
  6898  		userId := model.NewId()
  6899  		teamId := model.NewId()
  6900  
  6901  		// Create the initial categories and find the channels category
  6902  		nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  6903  		require.Nil(t, nErr)
  6904  
  6905  		categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
  6906  		require.Nil(t, err)
  6907  
  6908  		favoritesCategory := categories.Categories[0]
  6909  		require.Equal(t, model.SidebarCategoryFavorites, favoritesCategory.Type)
  6910  		channelsCategory := categories.Categories[1]
  6911  		require.Equal(t, model.SidebarCategoryChannels, channelsCategory.Type)
  6912  
  6913  		// Join some channels
  6914  		channel1, nErr := ss.Channel().Save(&model.Channel{
  6915  			Name:        "channel1",
  6916  			DisplayName: "DEF",
  6917  			TeamId:      teamId,
  6918  			Type:        model.CHANNEL_PRIVATE,
  6919  		}, 10)
  6920  		require.Nil(t, nErr)
  6921  		_, err = ss.Channel().SaveMember(&model.ChannelMember{
  6922  			UserId:      userId,
  6923  			ChannelId:   channel1.Id,
  6924  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  6925  		})
  6926  		require.Nil(t, err)
  6927  
  6928  		channel2, nErr := ss.Channel().Save(&model.Channel{
  6929  			Name:        "channel2",
  6930  			DisplayName: "ABC",
  6931  			TeamId:      teamId,
  6932  			Type:        model.CHANNEL_OPEN,
  6933  		}, 10)
  6934  		require.Nil(t, nErr)
  6935  		_, err = ss.Channel().SaveMember(&model.ChannelMember{
  6936  			UserId:      userId,
  6937  			ChannelId:   channel2.Id,
  6938  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  6939  		})
  6940  		require.Nil(t, err)
  6941  
  6942  		// And assign one to another category
  6943  		_, err = ss.Channel().UpdateSidebarCategories(userId, teamId, []*model.SidebarCategoryWithChannels{
  6944  			{
  6945  				SidebarCategory: favoritesCategory.SidebarCategory,
  6946  				Channels:        []string{channel2.Id},
  6947  			},
  6948  		})
  6949  		require.Nil(t, err)
  6950  
  6951  		// Ensure that the correct channel is returned in the Channels category
  6952  		res, err := ss.Channel().GetSidebarCategory(channelsCategory.Id)
  6953  		assert.Nil(t, err)
  6954  		assert.Equal(t, channelsCategory.Id, res.Id)
  6955  		assert.Equal(t, model.SidebarCategoryChannels, channelsCategory.Type)
  6956  		assert.Equal(t, []string{channel1.Id}, res.Channels)
  6957  	})
  6958  
  6959  	t.Run("should return any orphaned DM channels with the Direct Messages category", func(t *testing.T) {
  6960  		userId := model.NewId()
  6961  		teamId := model.NewId()
  6962  
  6963  		// Create the initial categories and find the DMs category
  6964  		nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  6965  		require.Nil(t, nErr)
  6966  
  6967  		categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
  6968  		require.Nil(t, err)
  6969  		require.Equal(t, model.SidebarCategoryDirectMessages, categories.Categories[2].Type)
  6970  
  6971  		dmsCategory := categories.Categories[2]
  6972  
  6973  		// Create a DM
  6974  		otherUserId := model.NewId()
  6975  		dmChannel, nErr := ss.Channel().SaveDirectChannel(
  6976  			&model.Channel{
  6977  				Name: model.GetDMNameFromIds(userId, otherUserId),
  6978  				Type: model.CHANNEL_DIRECT,
  6979  			},
  6980  			&model.ChannelMember{
  6981  				UserId:      userId,
  6982  				NotifyProps: model.GetDefaultChannelNotifyProps(),
  6983  			},
  6984  			&model.ChannelMember{
  6985  				UserId:      otherUserId,
  6986  				NotifyProps: model.GetDefaultChannelNotifyProps(),
  6987  			},
  6988  		)
  6989  		require.Nil(t, nErr)
  6990  
  6991  		// Ensure that the DM is returned
  6992  		res, err := ss.Channel().GetSidebarCategory(dmsCategory.Id)
  6993  		assert.Nil(t, err)
  6994  		assert.Equal(t, dmsCategory.Id, res.Id)
  6995  		assert.Equal(t, model.SidebarCategoryDirectMessages, res.Type)
  6996  		assert.Equal(t, []string{dmChannel.Id}, res.Channels)
  6997  	})
  6998  
  6999  	t.Run("should return any orphaned GM channels with the Direct Messages category", func(t *testing.T) {
  7000  		userId := model.NewId()
  7001  		teamId := model.NewId()
  7002  
  7003  		// Create the initial categories and find the DMs category
  7004  		nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  7005  		require.Nil(t, nErr)
  7006  
  7007  		categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
  7008  		require.Nil(t, err)
  7009  		require.Equal(t, model.SidebarCategoryDirectMessages, categories.Categories[2].Type)
  7010  
  7011  		dmsCategory := categories.Categories[2]
  7012  
  7013  		// Create a GM
  7014  		gmChannel, nErr := ss.Channel().Save(&model.Channel{
  7015  			Name:   "abc",
  7016  			TeamId: "",
  7017  			Type:   model.CHANNEL_GROUP,
  7018  		}, 10)
  7019  		require.Nil(t, nErr)
  7020  		_, err = ss.Channel().SaveMember(&model.ChannelMember{
  7021  			UserId:      userId,
  7022  			ChannelId:   gmChannel.Id,
  7023  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  7024  		})
  7025  		require.Nil(t, err)
  7026  
  7027  		// Ensure that the DM is returned
  7028  		res, err := ss.Channel().GetSidebarCategory(dmsCategory.Id)
  7029  		assert.Nil(t, err)
  7030  		assert.Equal(t, dmsCategory.Id, res.Id)
  7031  		assert.Equal(t, model.SidebarCategoryDirectMessages, res.Type)
  7032  		assert.Equal(t, []string{gmChannel.Id}, res.Channels)
  7033  	})
  7034  
  7035  	t.Run("should return orphaned DM channels in the DMs categorywhich are in a custom category on another team", func(t *testing.T) {
  7036  		userId := model.NewId()
  7037  		teamId := model.NewId()
  7038  
  7039  		// Create the initial categories and find the DMs category
  7040  		nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  7041  		require.Nil(t, nErr)
  7042  
  7043  		categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
  7044  		require.Nil(t, err)
  7045  		require.Equal(t, model.SidebarCategoryDirectMessages, categories.Categories[2].Type)
  7046  
  7047  		dmsCategory := categories.Categories[2]
  7048  
  7049  		// Create a DM
  7050  		otherUserId := model.NewId()
  7051  		dmChannel, nErr := ss.Channel().SaveDirectChannel(
  7052  			&model.Channel{
  7053  				Name: model.GetDMNameFromIds(userId, otherUserId),
  7054  				Type: model.CHANNEL_DIRECT,
  7055  			},
  7056  			&model.ChannelMember{
  7057  				UserId:      userId,
  7058  				NotifyProps: model.GetDefaultChannelNotifyProps(),
  7059  			},
  7060  			&model.ChannelMember{
  7061  				UserId:      otherUserId,
  7062  				NotifyProps: model.GetDefaultChannelNotifyProps(),
  7063  			},
  7064  		)
  7065  		require.Nil(t, nErr)
  7066  
  7067  		// Create another team and assign the DM to a custom category on that team
  7068  		otherTeamId := model.NewId()
  7069  
  7070  		nErr = ss.Channel().CreateInitialSidebarCategories(userId, otherTeamId)
  7071  		require.Nil(t, nErr)
  7072  
  7073  		_, err = ss.Channel().CreateSidebarCategory(userId, otherTeamId, &model.SidebarCategoryWithChannels{
  7074  			SidebarCategory: model.SidebarCategory{
  7075  				UserId: userId,
  7076  				TeamId: teamId,
  7077  			},
  7078  			Channels: []string{dmChannel.Id},
  7079  		})
  7080  		require.Nil(t, err)
  7081  
  7082  		// Ensure that the DM is returned with the DMs category on the original team
  7083  		res, err := ss.Channel().GetSidebarCategory(dmsCategory.Id)
  7084  		assert.Nil(t, err)
  7085  		assert.Equal(t, dmsCategory.Id, res.Id)
  7086  		assert.Equal(t, model.SidebarCategoryDirectMessages, res.Type)
  7087  		assert.Equal(t, []string{dmChannel.Id}, res.Channels)
  7088  	})
  7089  }
  7090  
  7091  func testGetSidebarCategories(t *testing.T, ss store.Store) {
  7092  	t.Run("should return channels in the same order between different ways of getting categories", func(t *testing.T) {
  7093  		userId := model.NewId()
  7094  		teamId := model.NewId()
  7095  
  7096  		nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  7097  		require.Nil(t, nErr)
  7098  
  7099  		channelIds := []string{
  7100  			model.NewId(),
  7101  			model.NewId(),
  7102  			model.NewId(),
  7103  		}
  7104  
  7105  		newCategory, err := ss.Channel().CreateSidebarCategory(userId, teamId, &model.SidebarCategoryWithChannels{
  7106  			Channels: channelIds,
  7107  		})
  7108  		require.Nil(t, err)
  7109  		require.NotNil(t, newCategory)
  7110  
  7111  		gotCategory, err := ss.Channel().GetSidebarCategory(newCategory.Id)
  7112  		require.Nil(t, err)
  7113  
  7114  		res, err := ss.Channel().GetSidebarCategories(userId, teamId)
  7115  		require.Nil(t, err)
  7116  		require.Len(t, res.Categories, 4)
  7117  
  7118  		require.Equal(t, model.SidebarCategoryCustom, res.Categories[1].Type)
  7119  
  7120  		// This looks unnecessary, but I was getting different results from some of these before
  7121  		assert.Equal(t, newCategory.Channels, res.Categories[1].Channels)
  7122  		assert.Equal(t, gotCategory.Channels, res.Categories[1].Channels)
  7123  		assert.Equal(t, channelIds, res.Categories[1].Channels)
  7124  	})
  7125  }
  7126  
  7127  func testUpdateSidebarCategories(t *testing.T, ss store.Store, s SqlSupplier) {
  7128  	t.Run("ensure the query to update SidebarCategories hasn't been polluted by UpdateSidebarCategoryOrder", func(t *testing.T) {
  7129  		userId := model.NewId()
  7130  		teamId := model.NewId()
  7131  
  7132  		// Create the initial categories
  7133  		err := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  7134  		require.Nil(t, err)
  7135  
  7136  		initialCategories, err := ss.Channel().GetSidebarCategories(userId, teamId)
  7137  		require.Nil(t, err)
  7138  
  7139  		favoritesCategory := initialCategories.Categories[0]
  7140  		channelsCategory := initialCategories.Categories[1]
  7141  		dmsCategory := initialCategories.Categories[2]
  7142  
  7143  		// And then update one of them
  7144  		updated, err := ss.Channel().UpdateSidebarCategories(userId, teamId, []*model.SidebarCategoryWithChannels{
  7145  			channelsCategory,
  7146  		})
  7147  		require.Nil(t, err)
  7148  		assert.Equal(t, channelsCategory, updated[0])
  7149  		assert.Equal(t, "Channels", updated[0].DisplayName)
  7150  
  7151  		// And then reorder the categories
  7152  		err = ss.Channel().UpdateSidebarCategoryOrder(userId, teamId, []string{dmsCategory.Id, favoritesCategory.Id, channelsCategory.Id})
  7153  		require.Nil(t, err)
  7154  
  7155  		// Which somehow blanks out stuff because ???
  7156  		got, err := ss.Channel().GetSidebarCategory(favoritesCategory.Id)
  7157  		require.Nil(t, err)
  7158  		assert.Equal(t, "Favorites", got.DisplayName)
  7159  	})
  7160  
  7161  	t.Run("categories should be returned in their original order", func(t *testing.T) {
  7162  		userId := model.NewId()
  7163  		teamId := model.NewId()
  7164  
  7165  		// Create the initial categories
  7166  		err := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  7167  		require.Nil(t, err)
  7168  
  7169  		initialCategories, err := ss.Channel().GetSidebarCategories(userId, teamId)
  7170  		require.Nil(t, err)
  7171  
  7172  		favoritesCategory := initialCategories.Categories[0]
  7173  		channelsCategory := initialCategories.Categories[1]
  7174  		dmsCategory := initialCategories.Categories[2]
  7175  
  7176  		// And then update them
  7177  		updatedCategories, err := ss.Channel().UpdateSidebarCategories(userId, teamId, []*model.SidebarCategoryWithChannels{
  7178  			favoritesCategory,
  7179  			channelsCategory,
  7180  			dmsCategory,
  7181  		})
  7182  		assert.Nil(t, err)
  7183  		assert.Equal(t, favoritesCategory.Id, updatedCategories[0].Id)
  7184  		assert.Equal(t, channelsCategory.Id, updatedCategories[1].Id)
  7185  		assert.Equal(t, dmsCategory.Id, updatedCategories[2].Id)
  7186  	})
  7187  
  7188  	t.Run("should silently fail to update read only fields", func(t *testing.T) {
  7189  		userId := model.NewId()
  7190  		teamId := model.NewId()
  7191  
  7192  		nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  7193  		require.Nil(t, nErr)
  7194  
  7195  		initialCategories, err := ss.Channel().GetSidebarCategories(userId, teamId)
  7196  		require.Nil(t, err)
  7197  
  7198  		favoritesCategory := initialCategories.Categories[0]
  7199  		channelsCategory := initialCategories.Categories[1]
  7200  		dmsCategory := initialCategories.Categories[2]
  7201  
  7202  		customCategory, err := ss.Channel().CreateSidebarCategory(userId, teamId, &model.SidebarCategoryWithChannels{})
  7203  		require.Nil(t, err)
  7204  
  7205  		categoriesToUpdate := []*model.SidebarCategoryWithChannels{
  7206  			// Try to change the type of Favorites
  7207  			{
  7208  				SidebarCategory: model.SidebarCategory{
  7209  					Id:          favoritesCategory.Id,
  7210  					DisplayName: "something else",
  7211  				},
  7212  				Channels: favoritesCategory.Channels,
  7213  			},
  7214  			// Try to change the type of Channels
  7215  			{
  7216  				SidebarCategory: model.SidebarCategory{
  7217  					Id:   channelsCategory.Id,
  7218  					Type: model.SidebarCategoryDirectMessages,
  7219  				},
  7220  				Channels: channelsCategory.Channels,
  7221  			},
  7222  			// Try to change the Channels of DMs
  7223  			{
  7224  				SidebarCategory: dmsCategory.SidebarCategory,
  7225  				Channels:        []string{"fakechannel"},
  7226  			},
  7227  			// Try to change the UserId/TeamId of a custom category
  7228  			{
  7229  				SidebarCategory: model.SidebarCategory{
  7230  					Id:          customCategory.Id,
  7231  					UserId:      model.NewId(),
  7232  					TeamId:      model.NewId(),
  7233  					Sorting:     customCategory.Sorting,
  7234  					DisplayName: customCategory.DisplayName,
  7235  				},
  7236  				Channels: customCategory.Channels,
  7237  			},
  7238  		}
  7239  
  7240  		updatedCategories, err := ss.Channel().UpdateSidebarCategories(userId, teamId, categoriesToUpdate)
  7241  		assert.Nil(t, err)
  7242  
  7243  		assert.NotEqual(t, "Favorites", categoriesToUpdate[0].DisplayName)
  7244  		assert.Equal(t, "Favorites", updatedCategories[0].DisplayName)
  7245  		assert.NotEqual(t, model.SidebarCategoryChannels, categoriesToUpdate[1].Type)
  7246  		assert.Equal(t, model.SidebarCategoryChannels, updatedCategories[1].Type)
  7247  		assert.NotEqual(t, []string{}, categoriesToUpdate[2].Channels)
  7248  		assert.Equal(t, []string{}, updatedCategories[2].Channels)
  7249  		assert.NotEqual(t, userId, categoriesToUpdate[3].UserId)
  7250  		assert.Equal(t, userId, updatedCategories[3].UserId)
  7251  	})
  7252  
  7253  	t.Run("should add and remove favorites preferences based on the Favorites category", func(t *testing.T) {
  7254  		userId := model.NewId()
  7255  		teamId := model.NewId()
  7256  
  7257  		// Create the initial categories and find the favorites category
  7258  		nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  7259  		require.Nil(t, nErr)
  7260  
  7261  		categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
  7262  		require.Nil(t, err)
  7263  
  7264  		favoritesCategory := categories.Categories[0]
  7265  		require.Equal(t, model.SidebarCategoryFavorites, favoritesCategory.Type)
  7266  
  7267  		// Join a channel
  7268  		channel, nErr := ss.Channel().Save(&model.Channel{
  7269  			Name:   "channel",
  7270  			Type:   model.CHANNEL_OPEN,
  7271  			TeamId: teamId,
  7272  		}, 10)
  7273  		require.Nil(t, nErr)
  7274  		_, err = ss.Channel().SaveMember(&model.ChannelMember{
  7275  			UserId:      userId,
  7276  			ChannelId:   channel.Id,
  7277  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  7278  		})
  7279  		require.Nil(t, err)
  7280  
  7281  		// Assign it to favorites
  7282  		_, err = ss.Channel().UpdateSidebarCategories(userId, teamId, []*model.SidebarCategoryWithChannels{
  7283  			{
  7284  				SidebarCategory: favoritesCategory.SidebarCategory,
  7285  				Channels:        []string{channel.Id},
  7286  			},
  7287  		})
  7288  		assert.Nil(t, err)
  7289  
  7290  		res, nErr := ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id)
  7291  		assert.Nil(t, nErr)
  7292  		assert.NotNil(t, res)
  7293  		assert.Equal(t, "true", res.Value)
  7294  
  7295  		// And then remove it
  7296  		channelsCategory := categories.Categories[1]
  7297  		require.Equal(t, model.SidebarCategoryChannels, channelsCategory.Type)
  7298  
  7299  		_, err = ss.Channel().UpdateSidebarCategories(userId, teamId, []*model.SidebarCategoryWithChannels{
  7300  			{
  7301  				SidebarCategory: channelsCategory.SidebarCategory,
  7302  				Channels:        []string{channel.Id},
  7303  			},
  7304  		})
  7305  		assert.Nil(t, err)
  7306  
  7307  		res, nErr = ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id)
  7308  		assert.NotNil(t, nErr)
  7309  		assert.True(t, errors.Is(nErr, sql.ErrNoRows))
  7310  		assert.Nil(t, res)
  7311  	})
  7312  
  7313  	t.Run("should add and remove favorites preferences for DMs", func(t *testing.T) {
  7314  		userId := model.NewId()
  7315  		teamId := model.NewId()
  7316  
  7317  		// Create the initial categories and find the favorites category
  7318  		nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  7319  		require.Nil(t, nErr)
  7320  
  7321  		categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
  7322  		require.Nil(t, err)
  7323  
  7324  		favoritesCategory := categories.Categories[0]
  7325  		require.Equal(t, model.SidebarCategoryFavorites, favoritesCategory.Type)
  7326  
  7327  		// Create a direct channel
  7328  		otherUserId := model.NewId()
  7329  
  7330  		dmChannel, nErr := ss.Channel().SaveDirectChannel(
  7331  			&model.Channel{
  7332  				Name: model.GetDMNameFromIds(userId, otherUserId),
  7333  				Type: model.CHANNEL_DIRECT,
  7334  			},
  7335  			&model.ChannelMember{
  7336  				UserId:      userId,
  7337  				NotifyProps: model.GetDefaultChannelNotifyProps(),
  7338  			},
  7339  			&model.ChannelMember{
  7340  				UserId:      otherUserId,
  7341  				NotifyProps: model.GetDefaultChannelNotifyProps(),
  7342  			},
  7343  		)
  7344  		assert.Nil(t, nErr)
  7345  
  7346  		// Assign it to favorites
  7347  		_, err = ss.Channel().UpdateSidebarCategories(userId, teamId, []*model.SidebarCategoryWithChannels{
  7348  			{
  7349  				SidebarCategory: favoritesCategory.SidebarCategory,
  7350  				Channels:        []string{dmChannel.Id},
  7351  			},
  7352  		})
  7353  		assert.Nil(t, err)
  7354  
  7355  		res, nErr := ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, dmChannel.Id)
  7356  		assert.Nil(t, nErr)
  7357  		assert.NotNil(t, res)
  7358  		assert.Equal(t, "true", res.Value)
  7359  
  7360  		// And then remove it
  7361  		dmsCategory := categories.Categories[2]
  7362  		require.Equal(t, model.SidebarCategoryDirectMessages, dmsCategory.Type)
  7363  
  7364  		_, err = ss.Channel().UpdateSidebarCategories(userId, teamId, []*model.SidebarCategoryWithChannels{
  7365  			{
  7366  				SidebarCategory: dmsCategory.SidebarCategory,
  7367  				Channels:        []string{dmChannel.Id},
  7368  			},
  7369  		})
  7370  		assert.Nil(t, err)
  7371  
  7372  		res, nErr = ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, dmChannel.Id)
  7373  		assert.NotNil(t, nErr)
  7374  		assert.True(t, errors.Is(nErr, sql.ErrNoRows))
  7375  		assert.Nil(t, res)
  7376  	})
  7377  
  7378  	t.Run("should add and remove favorites preferences, even if the channel is already favorited in preferences", func(t *testing.T) {
  7379  		userId := model.NewId()
  7380  		teamId := model.NewId()
  7381  		teamId2 := model.NewId()
  7382  
  7383  		// Create the initial categories and find the favorites categories in each team
  7384  		nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  7385  		require.Nil(t, nErr)
  7386  
  7387  		categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
  7388  		require.Nil(t, err)
  7389  
  7390  		favoritesCategory := categories.Categories[0]
  7391  		require.Equal(t, model.SidebarCategoryFavorites, favoritesCategory.Type)
  7392  
  7393  		nErr = ss.Channel().CreateInitialSidebarCategories(userId, teamId2)
  7394  		require.Nil(t, nErr)
  7395  
  7396  		categories2, err := ss.Channel().GetSidebarCategories(userId, teamId2)
  7397  		require.Nil(t, err)
  7398  
  7399  		favoritesCategory2 := categories2.Categories[0]
  7400  		require.Equal(t, model.SidebarCategoryFavorites, favoritesCategory2.Type)
  7401  
  7402  		// Create a direct channel
  7403  		otherUserId := model.NewId()
  7404  
  7405  		dmChannel, nErr := ss.Channel().SaveDirectChannel(
  7406  			&model.Channel{
  7407  				Name: model.GetDMNameFromIds(userId, otherUserId),
  7408  				Type: model.CHANNEL_DIRECT,
  7409  			},
  7410  			&model.ChannelMember{
  7411  				UserId:      userId,
  7412  				NotifyProps: model.GetDefaultChannelNotifyProps(),
  7413  			},
  7414  			&model.ChannelMember{
  7415  				UserId:      otherUserId,
  7416  				NotifyProps: model.GetDefaultChannelNotifyProps(),
  7417  			},
  7418  		)
  7419  		assert.Nil(t, nErr)
  7420  
  7421  		// Assign it to favorites on the first team. The favorites preference gets set for all teams.
  7422  		_, err = ss.Channel().UpdateSidebarCategories(userId, teamId, []*model.SidebarCategoryWithChannels{
  7423  			{
  7424  				SidebarCategory: favoritesCategory.SidebarCategory,
  7425  				Channels:        []string{dmChannel.Id},
  7426  			},
  7427  		})
  7428  		assert.Nil(t, err)
  7429  
  7430  		res, nErr := ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, dmChannel.Id)
  7431  		assert.Nil(t, nErr)
  7432  		assert.NotNil(t, res)
  7433  		assert.Equal(t, "true", res.Value)
  7434  
  7435  		// Assign it to favorites on the second team. The favorites preference is already set.
  7436  		updated, err := ss.Channel().UpdateSidebarCategories(userId, teamId, []*model.SidebarCategoryWithChannels{
  7437  			{
  7438  				SidebarCategory: favoritesCategory2.SidebarCategory,
  7439  				Channels:        []string{dmChannel.Id},
  7440  			},
  7441  		})
  7442  		assert.Nil(t, err)
  7443  		assert.Equal(t, []string{dmChannel.Id}, updated[0].Channels)
  7444  
  7445  		res, nErr = ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, dmChannel.Id)
  7446  		assert.NoError(t, nErr)
  7447  		assert.NotNil(t, res)
  7448  		assert.Equal(t, "true", res.Value)
  7449  
  7450  		// Remove it from favorites on the first team. This clears the favorites preference for all teams.
  7451  		_, err = ss.Channel().UpdateSidebarCategories(userId, teamId, []*model.SidebarCategoryWithChannels{
  7452  			{
  7453  				SidebarCategory: favoritesCategory.SidebarCategory,
  7454  				Channels:        []string{},
  7455  			},
  7456  		})
  7457  		assert.Nil(t, err)
  7458  
  7459  		res, nErr = ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, dmChannel.Id)
  7460  		require.Error(t, nErr)
  7461  		assert.Nil(t, res)
  7462  
  7463  		// Remove it from favorites on the second team. The favorites preference was already deleted.
  7464  		_, err = ss.Channel().UpdateSidebarCategories(userId, teamId2, []*model.SidebarCategoryWithChannels{
  7465  			{
  7466  				SidebarCategory: favoritesCategory2.SidebarCategory,
  7467  				Channels:        []string{},
  7468  			},
  7469  		})
  7470  		assert.Nil(t, err)
  7471  
  7472  		res, nErr = ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, dmChannel.Id)
  7473  		require.Error(t, nErr)
  7474  		assert.Nil(t, res)
  7475  	})
  7476  
  7477  	t.Run("should not affect other users' favorites preferences", func(t *testing.T) {
  7478  		userId := model.NewId()
  7479  		teamId := model.NewId()
  7480  
  7481  		// Create the initial categories and find the favorites category
  7482  		nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  7483  		require.Nil(t, nErr)
  7484  
  7485  		categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
  7486  		require.Nil(t, err)
  7487  
  7488  		favoritesCategory := categories.Categories[0]
  7489  		require.Equal(t, model.SidebarCategoryFavorites, favoritesCategory.Type)
  7490  		channelsCategory := categories.Categories[1]
  7491  		require.Equal(t, model.SidebarCategoryChannels, channelsCategory.Type)
  7492  
  7493  		// Create the other users' categories
  7494  		userId2 := model.NewId()
  7495  
  7496  		nErr = ss.Channel().CreateInitialSidebarCategories(userId2, teamId)
  7497  		require.Nil(t, nErr)
  7498  
  7499  		categories2, err := ss.Channel().GetSidebarCategories(userId2, teamId)
  7500  		require.Nil(t, err)
  7501  
  7502  		favoritesCategory2 := categories2.Categories[0]
  7503  		require.Equal(t, model.SidebarCategoryFavorites, favoritesCategory2.Type)
  7504  		channelsCategory2 := categories2.Categories[1]
  7505  		require.Equal(t, model.SidebarCategoryChannels, channelsCategory2.Type)
  7506  
  7507  		// Have both users join a channel
  7508  		channel, nErr := ss.Channel().Save(&model.Channel{
  7509  			Name:   "channel",
  7510  			Type:   model.CHANNEL_OPEN,
  7511  			TeamId: teamId,
  7512  		}, 10)
  7513  		require.Nil(t, nErr)
  7514  		_, err = ss.Channel().SaveMember(&model.ChannelMember{
  7515  			UserId:      userId,
  7516  			ChannelId:   channel.Id,
  7517  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  7518  		})
  7519  		require.Nil(t, err)
  7520  		_, err = ss.Channel().SaveMember(&model.ChannelMember{
  7521  			UserId:      userId2,
  7522  			ChannelId:   channel.Id,
  7523  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  7524  		})
  7525  		require.Nil(t, err)
  7526  
  7527  		// Have user1 favorite it
  7528  		_, err = ss.Channel().UpdateSidebarCategories(userId, teamId, []*model.SidebarCategoryWithChannels{
  7529  			{
  7530  				SidebarCategory: favoritesCategory.SidebarCategory,
  7531  				Channels:        []string{channel.Id},
  7532  			},
  7533  			{
  7534  				SidebarCategory: channelsCategory.SidebarCategory,
  7535  				Channels:        []string{},
  7536  			},
  7537  		})
  7538  		assert.Nil(t, err)
  7539  
  7540  		res, nErr := ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id)
  7541  		assert.Nil(t, nErr)
  7542  		assert.NotNil(t, res)
  7543  		assert.Equal(t, "true", res.Value)
  7544  
  7545  		res, nErr = ss.Preference().Get(userId2, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id)
  7546  		assert.True(t, errors.Is(nErr, sql.ErrNoRows))
  7547  		assert.Nil(t, res)
  7548  
  7549  		// And user2 favorite it
  7550  		_, err = ss.Channel().UpdateSidebarCategories(userId2, teamId, []*model.SidebarCategoryWithChannels{
  7551  			{
  7552  				SidebarCategory: favoritesCategory2.SidebarCategory,
  7553  				Channels:        []string{channel.Id},
  7554  			},
  7555  			{
  7556  				SidebarCategory: channelsCategory2.SidebarCategory,
  7557  				Channels:        []string{},
  7558  			},
  7559  		})
  7560  		assert.Nil(t, err)
  7561  
  7562  		res, nErr = ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id)
  7563  		assert.Nil(t, nErr)
  7564  		assert.NotNil(t, res)
  7565  		assert.Equal(t, "true", res.Value)
  7566  
  7567  		res, nErr = ss.Preference().Get(userId2, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id)
  7568  		assert.Nil(t, nErr)
  7569  		assert.NotNil(t, res)
  7570  		assert.Equal(t, "true", res.Value)
  7571  
  7572  		// And then user1 unfavorite it
  7573  		_, err = ss.Channel().UpdateSidebarCategories(userId, teamId, []*model.SidebarCategoryWithChannels{
  7574  			{
  7575  				SidebarCategory: channelsCategory.SidebarCategory,
  7576  				Channels:        []string{channel.Id},
  7577  			},
  7578  			{
  7579  				SidebarCategory: favoritesCategory.SidebarCategory,
  7580  				Channels:        []string{},
  7581  			},
  7582  		})
  7583  		assert.Nil(t, err)
  7584  
  7585  		res, nErr = ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id)
  7586  		assert.True(t, errors.Is(nErr, sql.ErrNoRows))
  7587  		assert.Nil(t, res)
  7588  
  7589  		res, nErr = ss.Preference().Get(userId2, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id)
  7590  		assert.Nil(t, nErr)
  7591  		assert.NotNil(t, res)
  7592  		assert.Equal(t, "true", res.Value)
  7593  
  7594  		// And finally user2 favorite it
  7595  		_, err = ss.Channel().UpdateSidebarCategories(userId2, teamId, []*model.SidebarCategoryWithChannels{
  7596  			{
  7597  				SidebarCategory: channelsCategory2.SidebarCategory,
  7598  				Channels:        []string{channel.Id},
  7599  			},
  7600  			{
  7601  				SidebarCategory: favoritesCategory2.SidebarCategory,
  7602  				Channels:        []string{},
  7603  			},
  7604  		})
  7605  		assert.Nil(t, err)
  7606  
  7607  		res, nErr = ss.Preference().Get(userId, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id)
  7608  		assert.True(t, errors.Is(nErr, sql.ErrNoRows))
  7609  		assert.Nil(t, res)
  7610  
  7611  		res, nErr = ss.Preference().Get(userId2, model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL, channel.Id)
  7612  		assert.True(t, errors.Is(nErr, sql.ErrNoRows))
  7613  		assert.Nil(t, res)
  7614  	})
  7615  
  7616  	t.Run("channels removed from Channels or DMs categories should be re-added", func(t *testing.T) {
  7617  		userId := model.NewId()
  7618  		teamId := model.NewId()
  7619  
  7620  		// Create some channels
  7621  		channel, nErr := ss.Channel().Save(&model.Channel{
  7622  			Name:   "channel",
  7623  			Type:   model.CHANNEL_OPEN,
  7624  			TeamId: teamId,
  7625  		}, 10)
  7626  		require.Nil(t, nErr)
  7627  		_, err := ss.Channel().SaveMember(&model.ChannelMember{
  7628  			UserId:      userId,
  7629  			ChannelId:   channel.Id,
  7630  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  7631  		})
  7632  		require.Nil(t, err)
  7633  
  7634  		otherUserId := model.NewId()
  7635  		dmChannel, nErr := ss.Channel().SaveDirectChannel(
  7636  			&model.Channel{
  7637  				Name: model.GetDMNameFromIds(userId, otherUserId),
  7638  				Type: model.CHANNEL_DIRECT,
  7639  			},
  7640  			&model.ChannelMember{
  7641  				UserId:      userId,
  7642  				NotifyProps: model.GetDefaultChannelNotifyProps(),
  7643  			},
  7644  			&model.ChannelMember{
  7645  				UserId:      otherUserId,
  7646  				NotifyProps: model.GetDefaultChannelNotifyProps(),
  7647  			},
  7648  		)
  7649  		require.Nil(t, nErr)
  7650  
  7651  		nErr = ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  7652  		require.Nil(t, nErr)
  7653  
  7654  		// And some categories
  7655  		initialCategories, err := ss.Channel().GetSidebarCategories(userId, teamId)
  7656  		require.Nil(t, err)
  7657  
  7658  		channelsCategory := initialCategories.Categories[1]
  7659  		dmsCategory := initialCategories.Categories[2]
  7660  
  7661  		require.Equal(t, []string{channel.Id}, channelsCategory.Channels)
  7662  		require.Equal(t, []string{dmChannel.Id}, dmsCategory.Channels)
  7663  
  7664  		// Try to save the categories with no channels in them
  7665  		categoriesToUpdate := []*model.SidebarCategoryWithChannels{
  7666  			{
  7667  				SidebarCategory: channelsCategory.SidebarCategory,
  7668  				Channels:        []string{},
  7669  			},
  7670  			{
  7671  				SidebarCategory: dmsCategory.SidebarCategory,
  7672  				Channels:        []string{},
  7673  			},
  7674  		}
  7675  
  7676  		updatedCategories, err := ss.Channel().UpdateSidebarCategories(userId, teamId, categoriesToUpdate)
  7677  		assert.Nil(t, err)
  7678  
  7679  		// The channels should still exist in the category because they would otherwise be orphaned
  7680  		assert.Equal(t, []string{channel.Id}, updatedCategories[0].Channels)
  7681  		assert.Equal(t, []string{dmChannel.Id}, updatedCategories[1].Channels)
  7682  	})
  7683  
  7684  	t.Run("should be able to move DMs into and out of custom categories", func(t *testing.T) {
  7685  		userId := model.NewId()
  7686  		teamId := model.NewId()
  7687  
  7688  		otherUserId := model.NewId()
  7689  		dmChannel, nErr := ss.Channel().SaveDirectChannel(
  7690  			&model.Channel{
  7691  				Name: model.GetDMNameFromIds(userId, otherUserId),
  7692  				Type: model.CHANNEL_DIRECT,
  7693  			},
  7694  			&model.ChannelMember{
  7695  				UserId:      userId,
  7696  				NotifyProps: model.GetDefaultChannelNotifyProps(),
  7697  			},
  7698  			&model.ChannelMember{
  7699  				UserId:      otherUserId,
  7700  				NotifyProps: model.GetDefaultChannelNotifyProps(),
  7701  			},
  7702  		)
  7703  		require.Nil(t, nErr)
  7704  
  7705  		nErr = ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  7706  		require.Nil(t, nErr)
  7707  
  7708  		// The DM should start in the DMs category
  7709  		initialCategories, err := ss.Channel().GetSidebarCategories(userId, teamId)
  7710  		require.Nil(t, err)
  7711  
  7712  		dmsCategory := initialCategories.Categories[2]
  7713  		require.Equal(t, []string{dmChannel.Id}, dmsCategory.Channels)
  7714  
  7715  		// Now move the DM into a custom category
  7716  		customCategory, err := ss.Channel().CreateSidebarCategory(userId, teamId, &model.SidebarCategoryWithChannels{})
  7717  		require.Nil(t, err)
  7718  
  7719  		categoriesToUpdate := []*model.SidebarCategoryWithChannels{
  7720  			{
  7721  				SidebarCategory: dmsCategory.SidebarCategory,
  7722  				Channels:        []string{},
  7723  			},
  7724  			{
  7725  				SidebarCategory: customCategory.SidebarCategory,
  7726  				Channels:        []string{dmChannel.Id},
  7727  			},
  7728  		}
  7729  
  7730  		updatedCategories, err := ss.Channel().UpdateSidebarCategories(userId, teamId, categoriesToUpdate)
  7731  		assert.Nil(t, err)
  7732  		assert.Equal(t, dmsCategory.Id, updatedCategories[0].Id)
  7733  		assert.Equal(t, []string{}, updatedCategories[0].Channels)
  7734  		assert.Equal(t, customCategory.Id, updatedCategories[1].Id)
  7735  		assert.Equal(t, []string{dmChannel.Id}, updatedCategories[1].Channels)
  7736  
  7737  		updatedDmsCategory, err := ss.Channel().GetSidebarCategory(dmsCategory.Id)
  7738  		require.Nil(t, err)
  7739  		assert.Equal(t, []string{}, updatedDmsCategory.Channels)
  7740  
  7741  		updatedCustomCategory, err := ss.Channel().GetSidebarCategory(customCategory.Id)
  7742  		require.Nil(t, err)
  7743  		assert.Equal(t, []string{dmChannel.Id}, updatedCustomCategory.Channels)
  7744  
  7745  		// And move it back out of the custom category
  7746  		categoriesToUpdate = []*model.SidebarCategoryWithChannels{
  7747  			{
  7748  				SidebarCategory: dmsCategory.SidebarCategory,
  7749  				Channels:        []string{dmChannel.Id},
  7750  			},
  7751  			{
  7752  				SidebarCategory: customCategory.SidebarCategory,
  7753  				Channels:        []string{},
  7754  			},
  7755  		}
  7756  
  7757  		updatedCategories, err = ss.Channel().UpdateSidebarCategories(userId, teamId, categoriesToUpdate)
  7758  		assert.Nil(t, err)
  7759  		assert.Equal(t, dmsCategory.Id, updatedCategories[0].Id)
  7760  		assert.Equal(t, []string{dmChannel.Id}, updatedCategories[0].Channels)
  7761  		assert.Equal(t, customCategory.Id, updatedCategories[1].Id)
  7762  		assert.Equal(t, []string{}, updatedCategories[1].Channels)
  7763  
  7764  		updatedDmsCategory, err = ss.Channel().GetSidebarCategory(dmsCategory.Id)
  7765  		require.Nil(t, err)
  7766  		assert.Equal(t, []string{dmChannel.Id}, updatedDmsCategory.Channels)
  7767  
  7768  		updatedCustomCategory, err = ss.Channel().GetSidebarCategory(customCategory.Id)
  7769  		require.Nil(t, err)
  7770  		assert.Equal(t, []string{}, updatedCustomCategory.Channels)
  7771  	})
  7772  
  7773  	t.Run("should successfully move channels between categories", func(t *testing.T) {
  7774  		userId := model.NewId()
  7775  		teamId := model.NewId()
  7776  
  7777  		// Join a channel
  7778  		channel, nErr := ss.Channel().Save(&model.Channel{
  7779  			Name:   "channel",
  7780  			Type:   model.CHANNEL_OPEN,
  7781  			TeamId: teamId,
  7782  		}, 10)
  7783  		require.Nil(t, nErr)
  7784  		_, err := ss.Channel().SaveMember(&model.ChannelMember{
  7785  			UserId:      userId,
  7786  			ChannelId:   channel.Id,
  7787  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  7788  		})
  7789  		require.Nil(t, err)
  7790  
  7791  		// And then create the initial categories so that it includes the channel
  7792  		nErr = ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  7793  		require.Nil(t, nErr)
  7794  
  7795  		initialCategories, err := ss.Channel().GetSidebarCategories(userId, teamId)
  7796  		require.Nil(t, err)
  7797  
  7798  		channelsCategory := initialCategories.Categories[1]
  7799  		require.Equal(t, []string{channel.Id}, channelsCategory.Channels)
  7800  
  7801  		customCategory, err := ss.Channel().CreateSidebarCategory(userId, teamId, &model.SidebarCategoryWithChannels{})
  7802  		require.Nil(t, err)
  7803  
  7804  		// Move the channel one way
  7805  		updatedCategories, err := ss.Channel().UpdateSidebarCategories(userId, teamId, []*model.SidebarCategoryWithChannels{
  7806  			{
  7807  				SidebarCategory: channelsCategory.SidebarCategory,
  7808  				Channels:        []string{},
  7809  			},
  7810  			{
  7811  				SidebarCategory: customCategory.SidebarCategory,
  7812  				Channels:        []string{channel.Id},
  7813  			},
  7814  		})
  7815  		assert.Nil(t, err)
  7816  
  7817  		assert.Equal(t, []string{}, updatedCategories[0].Channels)
  7818  		assert.Equal(t, []string{channel.Id}, updatedCategories[1].Channels)
  7819  
  7820  		// And then the other
  7821  		updatedCategories, err = ss.Channel().UpdateSidebarCategories(userId, teamId, []*model.SidebarCategoryWithChannels{
  7822  			{
  7823  				SidebarCategory: channelsCategory.SidebarCategory,
  7824  				Channels:        []string{channel.Id},
  7825  			},
  7826  			{
  7827  				SidebarCategory: customCategory.SidebarCategory,
  7828  				Channels:        []string{},
  7829  			},
  7830  		})
  7831  		assert.Nil(t, err)
  7832  		assert.Equal(t, []string{channel.Id}, updatedCategories[0].Channels)
  7833  		assert.Equal(t, []string{}, updatedCategories[1].Channels)
  7834  	})
  7835  }
  7836  
  7837  func testCreateInitialSidebarCategories(t *testing.T, ss store.Store) {
  7838  	t.Run("should create initial favorites/channels/DMs categories", func(t *testing.T) {
  7839  		userId := model.NewId()
  7840  		teamId := model.NewId()
  7841  
  7842  		nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  7843  		assert.Nil(t, nErr)
  7844  
  7845  		res, err := ss.Channel().GetSidebarCategories(userId, teamId)
  7846  		assert.Nil(t, err)
  7847  		assert.Len(t, res.Categories, 3)
  7848  		assert.Equal(t, model.SidebarCategoryFavorites, res.Categories[0].Type)
  7849  		assert.Equal(t, model.SidebarCategoryChannels, res.Categories[1].Type)
  7850  		assert.Equal(t, model.SidebarCategoryDirectMessages, res.Categories[2].Type)
  7851  	})
  7852  
  7853  	t.Run("should create initial favorites/channels/DMs categories for multiple users", func(t *testing.T) {
  7854  		userId := model.NewId()
  7855  		teamId := model.NewId()
  7856  
  7857  		nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  7858  		require.Nil(t, nErr)
  7859  
  7860  		userId2 := model.NewId()
  7861  
  7862  		nErr = ss.Channel().CreateInitialSidebarCategories(userId2, teamId)
  7863  		assert.Nil(t, nErr)
  7864  
  7865  		res, err := ss.Channel().GetSidebarCategories(userId2, teamId)
  7866  		assert.Nil(t, err)
  7867  		assert.Len(t, res.Categories, 3)
  7868  		assert.Equal(t, model.SidebarCategoryFavorites, res.Categories[0].Type)
  7869  		assert.Equal(t, model.SidebarCategoryChannels, res.Categories[1].Type)
  7870  		assert.Equal(t, model.SidebarCategoryDirectMessages, res.Categories[2].Type)
  7871  	})
  7872  
  7873  	t.Run("should create initial favorites/channels/DMs categories on different teams", func(t *testing.T) {
  7874  		userId := model.NewId()
  7875  		teamId := model.NewId()
  7876  
  7877  		nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  7878  		require.Nil(t, nErr)
  7879  
  7880  		teamId2 := model.NewId()
  7881  
  7882  		nErr = ss.Channel().CreateInitialSidebarCategories(userId, teamId2)
  7883  		assert.Nil(t, nErr)
  7884  
  7885  		res, err := ss.Channel().GetSidebarCategories(userId, teamId2)
  7886  		assert.Nil(t, err)
  7887  		assert.Len(t, res.Categories, 3)
  7888  		assert.Equal(t, model.SidebarCategoryFavorites, res.Categories[0].Type)
  7889  		assert.Equal(t, model.SidebarCategoryChannels, res.Categories[1].Type)
  7890  		assert.Equal(t, model.SidebarCategoryDirectMessages, res.Categories[2].Type)
  7891  	})
  7892  
  7893  	t.Run("shouldn't create additional categories when ones already exist", func(t *testing.T) {
  7894  		userId := model.NewId()
  7895  		teamId := model.NewId()
  7896  
  7897  		nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  7898  		require.Nil(t, nErr)
  7899  
  7900  		initialCategories, err := ss.Channel().GetSidebarCategories(userId, teamId)
  7901  		require.Nil(t, err)
  7902  
  7903  		// Calling CreateInitialSidebarCategories a second time shouldn't create any new categories
  7904  		nErr = ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  7905  		assert.Nil(t, nErr)
  7906  
  7907  		res, err := ss.Channel().GetSidebarCategories(userId, teamId)
  7908  		assert.Nil(t, err)
  7909  		assert.Equal(t, initialCategories.Categories, res.Categories)
  7910  	})
  7911  
  7912  	t.Run("should populate the Favorites category with regular channels", func(t *testing.T) {
  7913  		userId := model.NewId()
  7914  		teamId := model.NewId()
  7915  
  7916  		// Set up two channels, one favorited and one not
  7917  		channel1, nErr := ss.Channel().Save(&model.Channel{
  7918  			TeamId: teamId,
  7919  			Type:   model.CHANNEL_OPEN,
  7920  			Name:   "channel1",
  7921  		}, 1000)
  7922  		require.Nil(t, nErr)
  7923  		_, err := ss.Channel().SaveMember(&model.ChannelMember{
  7924  			ChannelId:   channel1.Id,
  7925  			UserId:      userId,
  7926  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  7927  		})
  7928  		require.Nil(t, err)
  7929  
  7930  		channel2, nErr := ss.Channel().Save(&model.Channel{
  7931  			TeamId: teamId,
  7932  			Type:   model.CHANNEL_OPEN,
  7933  			Name:   "channel2",
  7934  		}, 1000)
  7935  		require.Nil(t, nErr)
  7936  		_, err = ss.Channel().SaveMember(&model.ChannelMember{
  7937  			ChannelId:   channel2.Id,
  7938  			UserId:      userId,
  7939  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  7940  		})
  7941  		require.Nil(t, err)
  7942  
  7943  		nErr = ss.Preference().Save(&model.Preferences{
  7944  			{
  7945  				UserId:   userId,
  7946  				Category: model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL,
  7947  				Name:     channel1.Id,
  7948  				Value:    "true",
  7949  			},
  7950  		})
  7951  		require.Nil(t, nErr)
  7952  
  7953  		// Create the categories
  7954  		nErr = ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  7955  		require.Nil(t, nErr)
  7956  
  7957  		// Get and check the categories for channels
  7958  		categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
  7959  		require.Nil(t, err)
  7960  		require.Len(t, categories.Categories, 3)
  7961  		assert.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type)
  7962  		assert.Equal(t, []string{channel1.Id}, categories.Categories[0].Channels)
  7963  		assert.Equal(t, model.SidebarCategoryChannels, categories.Categories[1].Type)
  7964  		assert.Equal(t, []string{channel2.Id}, categories.Categories[1].Channels)
  7965  	})
  7966  
  7967  	t.Run("should populate the Favorites category in alphabetical order", func(t *testing.T) {
  7968  		userId := model.NewId()
  7969  		teamId := model.NewId()
  7970  
  7971  		// Set up two channels
  7972  		channel1, nErr := ss.Channel().Save(&model.Channel{
  7973  			TeamId:      teamId,
  7974  			Type:        model.CHANNEL_OPEN,
  7975  			Name:        "channel1",
  7976  			DisplayName: "zebra",
  7977  		}, 1000)
  7978  		require.Nil(t, nErr)
  7979  		_, err := ss.Channel().SaveMember(&model.ChannelMember{
  7980  			ChannelId:   channel1.Id,
  7981  			UserId:      userId,
  7982  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  7983  		})
  7984  		require.Nil(t, err)
  7985  
  7986  		channel2, nErr := ss.Channel().Save(&model.Channel{
  7987  			TeamId:      teamId,
  7988  			Type:        model.CHANNEL_OPEN,
  7989  			Name:        "channel2",
  7990  			DisplayName: "aardvark",
  7991  		}, 1000)
  7992  		require.Nil(t, nErr)
  7993  		_, err = ss.Channel().SaveMember(&model.ChannelMember{
  7994  			ChannelId:   channel2.Id,
  7995  			UserId:      userId,
  7996  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  7997  		})
  7998  		require.Nil(t, err)
  7999  
  8000  		nErr = ss.Preference().Save(&model.Preferences{
  8001  			{
  8002  				UserId:   userId,
  8003  				Category: model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL,
  8004  				Name:     channel1.Id,
  8005  				Value:    "true",
  8006  			},
  8007  			{
  8008  				UserId:   userId,
  8009  				Category: model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL,
  8010  				Name:     channel2.Id,
  8011  				Value:    "true",
  8012  			},
  8013  		})
  8014  		require.Nil(t, nErr)
  8015  
  8016  		// Create the categories
  8017  		nErr = ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  8018  		require.Nil(t, nErr)
  8019  
  8020  		// Get and check the categories for channels
  8021  		categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
  8022  		require.Nil(t, err)
  8023  		require.Len(t, categories.Categories, 3)
  8024  		assert.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type)
  8025  		assert.Equal(t, []string{channel2.Id, channel1.Id}, categories.Categories[0].Channels)
  8026  	})
  8027  
  8028  	t.Run("should populate the Favorites category with DMs and GMs", func(t *testing.T) {
  8029  		userId := model.NewId()
  8030  		teamId := model.NewId()
  8031  
  8032  		otherUserId1 := model.NewId()
  8033  		otherUserId2 := model.NewId()
  8034  
  8035  		// Set up two direct channels, one favorited and one not
  8036  		dmChannel1, err := ss.Channel().SaveDirectChannel(
  8037  			&model.Channel{
  8038  				Name: model.GetDMNameFromIds(userId, otherUserId1),
  8039  				Type: model.CHANNEL_DIRECT,
  8040  			},
  8041  			&model.ChannelMember{
  8042  				UserId:      userId,
  8043  				NotifyProps: model.GetDefaultChannelNotifyProps(),
  8044  			},
  8045  			&model.ChannelMember{
  8046  				UserId:      otherUserId1,
  8047  				NotifyProps: model.GetDefaultChannelNotifyProps(),
  8048  			},
  8049  		)
  8050  		require.Nil(t, err)
  8051  
  8052  		dmChannel2, err := ss.Channel().SaveDirectChannel(
  8053  			&model.Channel{
  8054  				Name: model.GetDMNameFromIds(userId, otherUserId2),
  8055  				Type: model.CHANNEL_DIRECT,
  8056  			},
  8057  			&model.ChannelMember{
  8058  				UserId:      userId,
  8059  				NotifyProps: model.GetDefaultChannelNotifyProps(),
  8060  			},
  8061  			&model.ChannelMember{
  8062  				UserId:      otherUserId2,
  8063  				NotifyProps: model.GetDefaultChannelNotifyProps(),
  8064  			},
  8065  		)
  8066  		require.Nil(t, err)
  8067  
  8068  		err = ss.Preference().Save(&model.Preferences{
  8069  			{
  8070  				UserId:   userId,
  8071  				Category: model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL,
  8072  				Name:     dmChannel1.Id,
  8073  				Value:    "true",
  8074  			},
  8075  		})
  8076  		require.Nil(t, err)
  8077  
  8078  		// Create the categories
  8079  		nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  8080  		require.Nil(t, nErr)
  8081  
  8082  		// Get and check the categories for channels
  8083  		categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
  8084  		require.Nil(t, err)
  8085  		require.Len(t, categories.Categories, 3)
  8086  		assert.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type)
  8087  		assert.Equal(t, []string{dmChannel1.Id}, categories.Categories[0].Channels)
  8088  		assert.Equal(t, model.SidebarCategoryDirectMessages, categories.Categories[2].Type)
  8089  		assert.Equal(t, []string{dmChannel2.Id}, categories.Categories[2].Channels)
  8090  	})
  8091  
  8092  	t.Run("should not populate the Favorites category with channels from other teams", func(t *testing.T) {
  8093  		userId := model.NewId()
  8094  		teamId := model.NewId()
  8095  		teamId2 := model.NewId()
  8096  
  8097  		// Set up a channel on another team and favorite it
  8098  		channel1, nErr := ss.Channel().Save(&model.Channel{
  8099  			TeamId: teamId2,
  8100  			Type:   model.CHANNEL_OPEN,
  8101  			Name:   "channel1",
  8102  		}, 1000)
  8103  		require.Nil(t, nErr)
  8104  		_, err := ss.Channel().SaveMember(&model.ChannelMember{
  8105  			ChannelId:   channel1.Id,
  8106  			UserId:      userId,
  8107  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  8108  		})
  8109  		require.Nil(t, err)
  8110  
  8111  		nErr = ss.Preference().Save(&model.Preferences{
  8112  			{
  8113  				UserId:   userId,
  8114  				Category: model.PREFERENCE_CATEGORY_FAVORITE_CHANNEL,
  8115  				Name:     channel1.Id,
  8116  				Value:    "true",
  8117  			},
  8118  		})
  8119  		require.Nil(t, nErr)
  8120  
  8121  		// Create the categories
  8122  		nErr = ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  8123  		require.Nil(t, nErr)
  8124  
  8125  		// Get and check the categories for channels
  8126  		categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
  8127  		require.Nil(t, err)
  8128  		require.Len(t, categories.Categories, 3)
  8129  		assert.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type)
  8130  		assert.Equal(t, []string{}, categories.Categories[0].Channels)
  8131  		assert.Equal(t, model.SidebarCategoryChannels, categories.Categories[1].Type)
  8132  		assert.Equal(t, []string{}, categories.Categories[1].Channels)
  8133  	})
  8134  }
  8135  
  8136  func testCreateSidebarCategory(t *testing.T, ss store.Store) {
  8137  	t.Run("should place the new category second if Favorites comes first", func(t *testing.T) {
  8138  		userId := model.NewId()
  8139  		teamId := model.NewId()
  8140  
  8141  		nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  8142  		require.Nil(t, nErr)
  8143  
  8144  		// Create the category
  8145  		created, err := ss.Channel().CreateSidebarCategory(userId, teamId, &model.SidebarCategoryWithChannels{
  8146  			SidebarCategory: model.SidebarCategory{
  8147  				DisplayName: model.NewId(),
  8148  			},
  8149  		})
  8150  		require.Nil(t, err)
  8151  
  8152  		// Confirm that it comes second
  8153  		res, err := ss.Channel().GetSidebarCategories(userId, teamId)
  8154  		require.Nil(t, err)
  8155  		require.Len(t, res.Categories, 4)
  8156  		assert.Equal(t, model.SidebarCategoryFavorites, res.Categories[0].Type)
  8157  		assert.Equal(t, model.SidebarCategoryCustom, res.Categories[1].Type)
  8158  		assert.Equal(t, created.Id, res.Categories[1].Id)
  8159  	})
  8160  
  8161  	t.Run("should place the new category first if Favorites is not first", func(t *testing.T) {
  8162  		userId := model.NewId()
  8163  		teamId := model.NewId()
  8164  
  8165  		nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  8166  		require.Nil(t, nErr)
  8167  
  8168  		// Re-arrange the categories so that Favorites comes last
  8169  		categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
  8170  		require.Nil(t, err)
  8171  		require.Len(t, categories.Categories, 3)
  8172  		require.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type)
  8173  
  8174  		err = ss.Channel().UpdateSidebarCategoryOrder(userId, teamId, []string{
  8175  			categories.Categories[1].Id,
  8176  			categories.Categories[2].Id,
  8177  			categories.Categories[0].Id,
  8178  		})
  8179  		require.Nil(t, err)
  8180  
  8181  		// Create the category
  8182  		created, err := ss.Channel().CreateSidebarCategory(userId, teamId, &model.SidebarCategoryWithChannels{
  8183  			SidebarCategory: model.SidebarCategory{
  8184  				DisplayName: model.NewId(),
  8185  			},
  8186  		})
  8187  		require.Nil(t, err)
  8188  
  8189  		// Confirm that it comes first
  8190  		res, err := ss.Channel().GetSidebarCategories(userId, teamId)
  8191  		require.Nil(t, err)
  8192  		require.Len(t, res.Categories, 4)
  8193  		assert.Equal(t, model.SidebarCategoryCustom, res.Categories[0].Type)
  8194  		assert.Equal(t, created.Id, res.Categories[0].Id)
  8195  	})
  8196  
  8197  	t.Run("should create the category with its channels", func(t *testing.T) {
  8198  		userId := model.NewId()
  8199  		teamId := model.NewId()
  8200  
  8201  		nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  8202  		require.Nil(t, nErr)
  8203  
  8204  		// Create some channels
  8205  		channel1, err := ss.Channel().Save(&model.Channel{
  8206  			Type:   model.CHANNEL_OPEN,
  8207  			TeamId: teamId,
  8208  			Name:   model.NewId(),
  8209  		}, 100)
  8210  		require.Nil(t, err)
  8211  		channel2, err := ss.Channel().Save(&model.Channel{
  8212  			Type:   model.CHANNEL_OPEN,
  8213  			TeamId: teamId,
  8214  			Name:   model.NewId(),
  8215  		}, 100)
  8216  		require.Nil(t, err)
  8217  
  8218  		// Create the category
  8219  		created, err := ss.Channel().CreateSidebarCategory(userId, teamId, &model.SidebarCategoryWithChannels{
  8220  			SidebarCategory: model.SidebarCategory{
  8221  				DisplayName: model.NewId(),
  8222  			},
  8223  			Channels: []string{channel2.Id, channel1.Id},
  8224  		})
  8225  		require.Nil(t, err)
  8226  		assert.Equal(t, []string{channel2.Id, channel1.Id}, created.Channels)
  8227  
  8228  		// Get the channel again to ensure that the SidebarChannels were saved correctly
  8229  		res, err := ss.Channel().GetSidebarCategory(created.Id)
  8230  		require.Nil(t, err)
  8231  		assert.Equal(t, []string{channel2.Id, channel1.Id}, res.Channels)
  8232  	})
  8233  
  8234  	t.Run("should remove any channels from their previous categories", func(t *testing.T) {
  8235  		userId := model.NewId()
  8236  		teamId := model.NewId()
  8237  
  8238  		nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  8239  		require.Nil(t, nErr)
  8240  
  8241  		categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
  8242  		require.Nil(t, err)
  8243  		require.Len(t, categories.Categories, 3)
  8244  
  8245  		favoritesCategory := categories.Categories[0]
  8246  		require.Equal(t, model.SidebarCategoryFavorites, favoritesCategory.Type)
  8247  		channelsCategory := categories.Categories[1]
  8248  		require.Equal(t, model.SidebarCategoryChannels, channelsCategory.Type)
  8249  
  8250  		// Create some channels
  8251  		channel1, nErr := ss.Channel().Save(&model.Channel{
  8252  			Type:   model.CHANNEL_OPEN,
  8253  			TeamId: teamId,
  8254  			Name:   model.NewId(),
  8255  		}, 100)
  8256  		require.Nil(t, nErr)
  8257  		channel2, nErr := ss.Channel().Save(&model.Channel{
  8258  			Type:   model.CHANNEL_OPEN,
  8259  			TeamId: teamId,
  8260  			Name:   model.NewId(),
  8261  		}, 100)
  8262  		require.Nil(t, nErr)
  8263  
  8264  		// Assign them to categories
  8265  		favoritesCategory.Channels = []string{channel1.Id}
  8266  		channelsCategory.Channels = []string{channel2.Id}
  8267  		_, err = ss.Channel().UpdateSidebarCategories(userId, teamId, []*model.SidebarCategoryWithChannels{
  8268  			favoritesCategory,
  8269  			channelsCategory,
  8270  		})
  8271  		require.Nil(t, err)
  8272  
  8273  		// Create the category
  8274  		created, err := ss.Channel().CreateSidebarCategory(userId, teamId, &model.SidebarCategoryWithChannels{
  8275  			SidebarCategory: model.SidebarCategory{
  8276  				DisplayName: model.NewId(),
  8277  			},
  8278  			Channels: []string{channel2.Id, channel1.Id},
  8279  		})
  8280  		require.Nil(t, err)
  8281  		assert.Equal(t, []string{channel2.Id, channel1.Id}, created.Channels)
  8282  
  8283  		// Confirm that the channels were removed from their original categories
  8284  		res, err := ss.Channel().GetSidebarCategory(favoritesCategory.Id)
  8285  		require.Nil(t, err)
  8286  		assert.Equal(t, []string{}, res.Channels)
  8287  
  8288  		res, err = ss.Channel().GetSidebarCategory(channelsCategory.Id)
  8289  		require.Nil(t, err)
  8290  		assert.Equal(t, []string{}, res.Channels)
  8291  	})
  8292  }
  8293  
  8294  func testDeleteSidebarCategory(t *testing.T, ss store.Store, s SqlSupplier) {
  8295  	setupInitialSidebarCategories := func(t *testing.T, ss store.Store) (string, string) {
  8296  		userId := model.NewId()
  8297  		teamId := model.NewId()
  8298  
  8299  		nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
  8300  		require.Nil(t, nErr)
  8301  
  8302  		res, err := ss.Channel().GetSidebarCategories(userId, teamId)
  8303  		require.Nil(t, err)
  8304  		require.Len(t, res.Categories, 3)
  8305  
  8306  		return userId, teamId
  8307  	}
  8308  
  8309  	t.Run("should correctly remove an empty category", func(t *testing.T) {
  8310  		userId, teamId := setupInitialSidebarCategories(t, ss)
  8311  		defer ss.User().PermanentDelete(userId)
  8312  
  8313  		newCategory, err := ss.Channel().CreateSidebarCategory(userId, teamId, &model.SidebarCategoryWithChannels{})
  8314  		require.Nil(t, err)
  8315  		require.NotNil(t, newCategory)
  8316  
  8317  		// Ensure that the category was created properly
  8318  		res, err := ss.Channel().GetSidebarCategories(userId, teamId)
  8319  		require.Nil(t, err)
  8320  		require.Len(t, res.Categories, 4)
  8321  
  8322  		// Then delete it and confirm that was done correctly
  8323  		err = ss.Channel().DeleteSidebarCategory(newCategory.Id)
  8324  		assert.Nil(t, err)
  8325  
  8326  		res, err = ss.Channel().GetSidebarCategories(userId, teamId)
  8327  		require.Nil(t, err)
  8328  		require.Len(t, res.Categories, 3)
  8329  	})
  8330  
  8331  	t.Run("should correctly remove a category and its channels", func(t *testing.T) {
  8332  		userId, teamId := setupInitialSidebarCategories(t, ss)
  8333  		defer ss.User().PermanentDelete(userId)
  8334  
  8335  		user := &model.User{
  8336  			Id: userId,
  8337  		}
  8338  
  8339  		// Create some channels
  8340  		channel1, nErr := ss.Channel().Save(&model.Channel{
  8341  			Name:   model.NewId(),
  8342  			TeamId: teamId,
  8343  			Type:   model.CHANNEL_OPEN,
  8344  		}, 1000)
  8345  		require.Nil(t, nErr)
  8346  		defer ss.Channel().PermanentDelete(channel1.Id)
  8347  
  8348  		channel2, nErr := ss.Channel().Save(&model.Channel{
  8349  			Name:   model.NewId(),
  8350  			TeamId: teamId,
  8351  			Type:   model.CHANNEL_PRIVATE,
  8352  		}, 1000)
  8353  		require.Nil(t, nErr)
  8354  		defer ss.Channel().PermanentDelete(channel2.Id)
  8355  
  8356  		dmChannel1, nErr := ss.Channel().CreateDirectChannel(user, &model.User{
  8357  			Id: model.NewId(),
  8358  		})
  8359  		require.Nil(t, nErr)
  8360  		defer ss.Channel().PermanentDelete(dmChannel1.Id)
  8361  
  8362  		// Assign some of those channels to a custom category
  8363  		newCategory, err := ss.Channel().CreateSidebarCategory(userId, teamId, &model.SidebarCategoryWithChannels{
  8364  			Channels: []string{channel1.Id, channel2.Id, dmChannel1.Id},
  8365  		})
  8366  		require.Nil(t, err)
  8367  		require.NotNil(t, newCategory)
  8368  
  8369  		// Ensure that the categories are set up correctly
  8370  		res, err := ss.Channel().GetSidebarCategories(userId, teamId)
  8371  		require.Nil(t, err)
  8372  		require.Len(t, res.Categories, 4)
  8373  
  8374  		require.Equal(t, model.SidebarCategoryCustom, res.Categories[1].Type)
  8375  		require.Equal(t, []string{channel1.Id, channel2.Id, dmChannel1.Id}, res.Categories[1].Channels)
  8376  
  8377  		// Actually delete the channel
  8378  		err = ss.Channel().DeleteSidebarCategory(newCategory.Id)
  8379  		assert.Nil(t, err)
  8380  
  8381  		// Confirm that the category was deleted...
  8382  		res, err = ss.Channel().GetSidebarCategories(userId, teamId)
  8383  		assert.Nil(t, err)
  8384  		assert.Len(t, res.Categories, 3)
  8385  
  8386  		// ...and that the corresponding SidebarChannel entries were deleted
  8387  		count, countErr := s.GetMaster().SelectInt(`
  8388  			SELECT
  8389  				COUNT(*)
  8390  			FROM
  8391  				SidebarChannels
  8392  			WHERE
  8393  				CategoryId = :CategoryId`, map[string]interface{}{"CategoryId": newCategory.Id})
  8394  		require.Nil(t, countErr)
  8395  		assert.Equal(t, int64(0), count)
  8396  	})
  8397  
  8398  	t.Run("should not allow you to remove non-custom categories", func(t *testing.T) {
  8399  		userId, teamId := setupInitialSidebarCategories(t, ss)
  8400  		defer ss.User().PermanentDelete(userId)
  8401  		res, err := ss.Channel().GetSidebarCategories(userId, teamId)
  8402  		require.Nil(t, err)
  8403  		require.Len(t, res.Categories, 3)
  8404  		require.Equal(t, model.SidebarCategoryFavorites, res.Categories[0].Type)
  8405  		require.Equal(t, model.SidebarCategoryChannels, res.Categories[1].Type)
  8406  		require.Equal(t, model.SidebarCategoryDirectMessages, res.Categories[2].Type)
  8407  
  8408  		err = ss.Channel().DeleteSidebarCategory(res.Categories[0].Id)
  8409  		assert.NotNil(t, err)
  8410  
  8411  		err = ss.Channel().DeleteSidebarCategory(res.Categories[1].Id)
  8412  		assert.NotNil(t, err)
  8413  
  8414  		err = ss.Channel().DeleteSidebarCategory(res.Categories[2].Id)
  8415  		assert.NotNil(t, err)
  8416  	})
  8417  }