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