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