github.com/xzl8028/xenia-server@v0.0.0-20190809101854-18450a97da63/store/storetest/channel_store.go (about)

     1  // Copyright (c) 2015-present Xenia, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package storetest
     5  
     6  import (
     7  	"sort"
     8  	"strconv"
     9  	"strings"
    10  	"testing"
    11  	"time"
    12  
    13  	"github.com/stretchr/testify/assert"
    14  	"github.com/stretchr/testify/require"
    15  
    16  	"github.com/xzl8028/gorp"
    17  	"github.com/xzl8028/xenia-server/model"
    18  	"github.com/xzl8028/xenia-server/store"
    19  )
    20  
    21  type SqlSupplier interface {
    22  	GetMaster() *gorp.DbMap
    23  }
    24  
    25  func cleanupChannels(t *testing.T, ss store.Store) {
    26  	list, err := ss.Channel().GetAllChannels(0, 100000, store.ChannelSearchOpts{IncludeDeleted: true})
    27  	if err != nil {
    28  		t.Fatalf("error cleaning all channels: %v", err)
    29  	}
    30  	for _, channel := range *list {
    31  		ss.Channel().PermanentDelete(channel.Id)
    32  	}
    33  }
    34  
    35  func TestChannelStore(t *testing.T, ss store.Store, s SqlSupplier) {
    36  	createDefaultRoles(t, ss)
    37  
    38  	t.Run("Save", func(t *testing.T) { testChannelStoreSave(t, ss) })
    39  	t.Run("SaveDirectChannel", func(t *testing.T) { testChannelStoreSaveDirectChannel(t, ss, s) })
    40  	t.Run("CreateDirectChannel", func(t *testing.T) { testChannelStoreCreateDirectChannel(t, ss) })
    41  	t.Run("Update", func(t *testing.T) { testChannelStoreUpdate(t, ss) })
    42  	t.Run("GetChannelUnread", func(t *testing.T) { testGetChannelUnread(t, ss) })
    43  	t.Run("Get", func(t *testing.T) { testChannelStoreGet(t, ss, s) })
    44  	t.Run("GetChannelsByIds", func(t *testing.T) { testChannelStoreGetChannelsByIds(t, ss) })
    45  	t.Run("GetForPost", func(t *testing.T) { testChannelStoreGetForPost(t, ss) })
    46  	t.Run("Restore", func(t *testing.T) { testChannelStoreRestore(t, ss) })
    47  	t.Run("Delete", func(t *testing.T) { testChannelStoreDelete(t, ss) })
    48  	t.Run("GetByName", func(t *testing.T) { testChannelStoreGetByName(t, ss) })
    49  	t.Run("GetByNames", func(t *testing.T) { testChannelStoreGetByNames(t, ss) })
    50  	t.Run("GetDeletedByName", func(t *testing.T) { testChannelStoreGetDeletedByName(t, ss) })
    51  	t.Run("GetDeleted", func(t *testing.T) { testChannelStoreGetDeleted(t, ss) })
    52  	t.Run("ChannelMemberStore", func(t *testing.T) { testChannelMemberStore(t, ss) })
    53  	t.Run("ChannelDeleteMemberStore", func(t *testing.T) { testChannelDeleteMemberStore(t, ss) })
    54  	t.Run("GetChannels", func(t *testing.T) { testChannelStoreGetChannels(t, ss) })
    55  	t.Run("GetAllChannels", func(t *testing.T) { testChannelStoreGetAllChannels(t, ss, s) })
    56  	t.Run("GetMoreChannels", func(t *testing.T) { testChannelStoreGetMoreChannels(t, ss) })
    57  	t.Run("GetPublicChannelsForTeam", func(t *testing.T) { testChannelStoreGetPublicChannelsForTeam(t, ss) })
    58  	t.Run("GetPublicChannelsByIdsForTeam", func(t *testing.T) { testChannelStoreGetPublicChannelsByIdsForTeam(t, ss) })
    59  	t.Run("GetChannelCounts", func(t *testing.T) { testChannelStoreGetChannelCounts(t, ss) })
    60  	t.Run("GetMembersForUser", func(t *testing.T) { testChannelStoreGetMembersForUser(t, ss) })
    61  	t.Run("GetMembersForUserWithPagination", func(t *testing.T) { testChannelStoreGetMembersForUserWithPagination(t, ss) })
    62  	t.Run("UpdateLastViewedAt", func(t *testing.T) { testChannelStoreUpdateLastViewedAt(t, ss) })
    63  	t.Run("IncrementMentionCount", func(t *testing.T) { testChannelStoreIncrementMentionCount(t, ss) })
    64  	t.Run("UpdateChannelMember", func(t *testing.T) { testUpdateChannelMember(t, ss) })
    65  	t.Run("GetMember", func(t *testing.T) { testGetMember(t, ss) })
    66  	t.Run("GetMemberForPost", func(t *testing.T) { testChannelStoreGetMemberForPost(t, ss) })
    67  	t.Run("GetMemberCount", func(t *testing.T) { testGetMemberCount(t, ss) })
    68  	t.Run("SearchMore", func(t *testing.T) { testChannelStoreSearchMore(t, ss) })
    69  	t.Run("SearchInTeam", func(t *testing.T) { testChannelStoreSearchInTeam(t, ss) })
    70  	t.Run("SearchAllChannels", func(t *testing.T) { testChannelStoreSearchAllChannels(t, ss) })
    71  	t.Run("AutocompleteInTeamForSearch", func(t *testing.T) { testChannelStoreAutocompleteInTeamForSearch(t, ss, s) })
    72  	t.Run("GetMembersByIds", func(t *testing.T) { testChannelStoreGetMembersByIds(t, ss) })
    73  	t.Run("SearchGroupChannels", func(t *testing.T) { testChannelStoreSearchGroupChannels(t, ss) })
    74  	t.Run("AnalyticsDeletedTypeCount", func(t *testing.T) { testChannelStoreAnalyticsDeletedTypeCount(t, ss) })
    75  	t.Run("GetPinnedPosts", func(t *testing.T) { testChannelStoreGetPinnedPosts(t, ss) })
    76  	t.Run("MaxChannelsPerTeam", func(t *testing.T) { testChannelStoreMaxChannelsPerTeam(t, ss) })
    77  	t.Run("GetChannelsByScheme", func(t *testing.T) { testChannelStoreGetChannelsByScheme(t, ss) })
    78  	t.Run("MigrateChannelMembers", func(t *testing.T) { testChannelStoreMigrateChannelMembers(t, ss) })
    79  	t.Run("ResetAllChannelSchemes", func(t *testing.T) { testResetAllChannelSchemes(t, ss) })
    80  	t.Run("ClearAllCustomRoleAssignments", func(t *testing.T) { testChannelStoreClearAllCustomRoleAssignments(t, ss) })
    81  	t.Run("MaterializedPublicChannels", func(t *testing.T) { testMaterializedPublicChannels(t, ss, s) })
    82  	t.Run("GetAllChannelsForExportAfter", func(t *testing.T) { testChannelStoreGetAllChannelsForExportAfter(t, ss) })
    83  	t.Run("GetChannelMembersForExport", func(t *testing.T) { testChannelStoreGetChannelMembersForExport(t, ss) })
    84  	t.Run("RemoveAllDeactivatedMembers", func(t *testing.T) { testChannelStoreRemoveAllDeactivatedMembers(t, ss) })
    85  	t.Run("ExportAllDirectChannels", func(t *testing.T) { testChannelStoreExportAllDirectChannels(t, ss, s) })
    86  	t.Run("ExportAllDirectChannelsExcludePrivateAndPublic", func(t *testing.T) { testChannelStoreExportAllDirectChannelsExcludePrivateAndPublic(t, ss, s) })
    87  	t.Run("ExportAllDirectChannelsDeletedChannel", func(t *testing.T) { testChannelStoreExportAllDirectChannelsDeletedChannel(t, ss, s) })
    88  	t.Run("GetChannelsBatchForIndexing", func(t *testing.T) { testChannelStoreGetChannelsBatchForIndexing(t, ss) })
    89  }
    90  
    91  func testChannelStoreSave(t *testing.T, ss store.Store) {
    92  	teamId := model.NewId()
    93  
    94  	o1 := model.Channel{}
    95  	o1.TeamId = teamId
    96  	o1.DisplayName = "Name"
    97  	o1.Name = "zz" + model.NewId() + "b"
    98  	o1.Type = model.CHANNEL_OPEN
    99  
   100  	if _, err := ss.Channel().Save(&o1, -1); err != nil {
   101  		t.Fatal("couldn't save item", err)
   102  	}
   103  
   104  	if _, err := ss.Channel().Save(&o1, -1); err == nil {
   105  		t.Fatal("shouldn't be able to update from save")
   106  	}
   107  
   108  	o1.Id = ""
   109  	if _, err := ss.Channel().Save(&o1, -1); err == nil {
   110  		t.Fatal("should be unique name")
   111  	}
   112  
   113  	o1.Id = ""
   114  	o1.Name = "zz" + model.NewId() + "b"
   115  	o1.Type = model.CHANNEL_DIRECT
   116  	if _, err := ss.Channel().Save(&o1, -1); err == nil {
   117  		t.Fatal("Should not be able to save direct channel")
   118  	}
   119  }
   120  
   121  func testChannelStoreSaveDirectChannel(t *testing.T, ss store.Store, s SqlSupplier) {
   122  	teamId := model.NewId()
   123  
   124  	o1 := model.Channel{}
   125  	o1.TeamId = teamId
   126  	o1.DisplayName = "Name"
   127  	o1.Name = "zz" + model.NewId() + "b"
   128  	o1.Type = model.CHANNEL_DIRECT
   129  
   130  	u1 := &model.User{}
   131  	u1.Email = MakeEmail()
   132  	u1.Nickname = model.NewId()
   133  	store.Must(ss.User().Save(u1))
   134  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1))
   135  
   136  	u2 := &model.User{}
   137  	u2.Email = MakeEmail()
   138  	u2.Nickname = model.NewId()
   139  	store.Must(ss.User().Save(u2))
   140  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}, -1))
   141  
   142  	m1 := model.ChannelMember{}
   143  	m1.ChannelId = o1.Id
   144  	m1.UserId = u1.Id
   145  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
   146  
   147  	m2 := model.ChannelMember{}
   148  	m2.ChannelId = o1.Id
   149  	m2.UserId = u2.Id
   150  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
   151  
   152  	if _, err := ss.Channel().SaveDirectChannel(&o1, &m1, &m2); err != nil {
   153  		t.Fatal("couldn't save direct channel", err)
   154  	}
   155  
   156  	members, err := ss.Channel().GetMembers(o1.Id, 0, 100)
   157  	require.Nil(t, err)
   158  	if len(*members) != 2 {
   159  		t.Fatal("should have saved 2 members")
   160  	}
   161  
   162  	if _, err = ss.Channel().SaveDirectChannel(&o1, &m1, &m2); err == nil {
   163  		t.Fatal("shouldn't be able to update from save")
   164  	}
   165  
   166  	// Attempt to save a direct channel that already exists
   167  	o1a := model.Channel{
   168  		TeamId:      o1.TeamId,
   169  		DisplayName: o1.DisplayName,
   170  		Name:        o1.Name,
   171  		Type:        o1.Type,
   172  	}
   173  
   174  	returnedChannel, err := ss.Channel().SaveDirectChannel(&o1a, &m1, &m2)
   175  	if err == nil {
   176  		t.Fatal("should've failed to save a duplicate direct channel")
   177  	} else if err.Id != store.CHANNEL_EXISTS_ERROR {
   178  		t.Fatal("should've returned CHANNEL_EXISTS_ERROR")
   179  	} else if returnedChannel.Id != o1.Id {
   180  		t.Fatal("should've returned original channel when saving a duplicate direct channel")
   181  	}
   182  
   183  	// Attempt to save a non-direct channel
   184  	o1.Id = ""
   185  	o1.Name = "zz" + model.NewId() + "b"
   186  	o1.Type = model.CHANNEL_OPEN
   187  	if _, err = ss.Channel().SaveDirectChannel(&o1, &m1, &m2); err == nil {
   188  		t.Fatal("Should not be able to save non-direct channel")
   189  	}
   190  
   191  	// Save yourself Direct Message
   192  	o1.Id = ""
   193  	o1.DisplayName = "Myself"
   194  	o1.Name = "zz" + model.NewId() + "b"
   195  	o1.Type = model.CHANNEL_DIRECT
   196  	if _, err = ss.Channel().SaveDirectChannel(&o1, &m1, &m1); err != nil {
   197  		t.Fatal("couldn't save direct channel", err)
   198  	}
   199  
   200  	members, err = ss.Channel().GetMembers(o1.Id, 0, 100)
   201  	require.Nil(t, err)
   202  	if len(*members) != 1 {
   203  		t.Fatal("should have saved just 1 member")
   204  	}
   205  
   206  	// Manually truncate Channels table until testlib can handle cleanups
   207  	s.GetMaster().Exec("TRUNCATE Channels")
   208  }
   209  
   210  func testChannelStoreCreateDirectChannel(t *testing.T, ss store.Store) {
   211  	u1 := &model.User{}
   212  	u1.Email = MakeEmail()
   213  	u1.Nickname = model.NewId()
   214  	store.Must(ss.User().Save(u1))
   215  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1))
   216  
   217  	u2 := &model.User{}
   218  	u2.Email = MakeEmail()
   219  	u2.Nickname = model.NewId()
   220  	store.Must(ss.User().Save(u2))
   221  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}, -1))
   222  
   223  	c1, err := ss.Channel().CreateDirectChannel(u1.Id, u2.Id)
   224  	if err != nil {
   225  		t.Fatal("couldn't create direct channel", err)
   226  	}
   227  	defer func() {
   228  		ss.Channel().PermanentDeleteMembersByChannel(c1.Id)
   229  		<-ss.Channel().PermanentDelete(c1.Id)
   230  	}()
   231  
   232  	members, err := ss.Channel().GetMembers(c1.Id, 0, 100)
   233  	require.Nil(t, err)
   234  	if len(*members) != 2 {
   235  		t.Fatal("should have saved 2 members")
   236  	}
   237  }
   238  
   239  func testChannelStoreUpdate(t *testing.T, ss store.Store) {
   240  	o1 := model.Channel{}
   241  	o1.TeamId = model.NewId()
   242  	o1.DisplayName = "Name"
   243  	o1.Name = "zz" + model.NewId() + "b"
   244  	o1.Type = model.CHANNEL_OPEN
   245  
   246  	_, err := ss.Channel().Save(&o1, -1)
   247  	require.Nil(t, err)
   248  
   249  	o2 := model.Channel{}
   250  	o2.TeamId = o1.TeamId
   251  	o2.DisplayName = "Name"
   252  	o2.Name = "zz" + model.NewId() + "b"
   253  	o2.Type = model.CHANNEL_OPEN
   254  
   255  	_, err = ss.Channel().Save(&o2, -1)
   256  	require.Nil(t, err)
   257  
   258  	time.Sleep(100 * time.Millisecond)
   259  
   260  	if _, err := ss.Channel().Update(&o1); err != nil {
   261  		t.Fatal(err)
   262  	}
   263  
   264  	o1.DeleteAt = 100
   265  	if _, err := ss.Channel().Update(&o1); err == nil {
   266  		t.Fatal("Update should have failed because channel is archived")
   267  	}
   268  
   269  	o1.DeleteAt = 0
   270  	o1.Id = "missing"
   271  	if _, err := ss.Channel().Update(&o1); err == nil {
   272  		t.Fatal("Update should have failed because of missing key")
   273  	}
   274  
   275  	o1.Id = model.NewId()
   276  	if _, err := ss.Channel().Update(&o1); err == nil {
   277  		t.Fatal("Update should have faile because id change")
   278  	}
   279  
   280  	o2.Name = o1.Name
   281  	if _, err := ss.Channel().Update(&o2); err == nil {
   282  		t.Fatal("Update should have failed because of existing name")
   283  	}
   284  }
   285  
   286  func testGetChannelUnread(t *testing.T, ss store.Store) {
   287  	teamId1 := model.NewId()
   288  	teamId2 := model.NewId()
   289  
   290  	uid := model.NewId()
   291  	m1 := &model.TeamMember{TeamId: teamId1, UserId: uid}
   292  	m2 := &model.TeamMember{TeamId: teamId2, UserId: uid}
   293  	store.Must(ss.Team().SaveMember(m1, -1))
   294  	store.Must(ss.Team().SaveMember(m2, -1))
   295  	notifyPropsModel := model.GetDefaultChannelNotifyProps()
   296  
   297  	// Setup Channel 1
   298  	c1 := &model.Channel{TeamId: m1.TeamId, Name: model.NewId(), DisplayName: "Downtown", Type: model.CHANNEL_OPEN, TotalMsgCount: 100}
   299  	_, err := ss.Channel().Save(c1, -1)
   300  	require.Nil(t, err)
   301  
   302  	cm1 := &model.ChannelMember{ChannelId: c1.Id, UserId: m1.UserId, NotifyProps: notifyPropsModel, MsgCount: 90}
   303  	store.Must(ss.Channel().SaveMember(cm1))
   304  
   305  	// Setup Channel 2
   306  	c2 := &model.Channel{TeamId: m2.TeamId, Name: model.NewId(), DisplayName: "Cultural", Type: model.CHANNEL_OPEN, TotalMsgCount: 100}
   307  	_, err = ss.Channel().Save(c2, -1)
   308  	require.Nil(t, err)
   309  
   310  	cm2 := &model.ChannelMember{ChannelId: c2.Id, UserId: m2.UserId, NotifyProps: notifyPropsModel, MsgCount: 90, MentionCount: 5}
   311  	store.Must(ss.Channel().SaveMember(cm2))
   312  
   313  	// Check for Channel 1
   314  	if ch, err := ss.Channel().GetChannelUnread(c1.Id, uid); err != nil {
   315  		t.Fatal(err)
   316  	} else {
   317  		if c1.Id != ch.ChannelId {
   318  			t.Fatal("wrong channel id")
   319  		}
   320  
   321  		if teamId1 != ch.TeamId {
   322  			t.Fatal("wrong team id for channel 1")
   323  		}
   324  
   325  		if ch.NotifyProps == nil {
   326  			t.Fatal("wrong props for channel 1")
   327  		}
   328  
   329  		if ch.MentionCount != 0 {
   330  			t.Fatal("wrong MentionCount for channel 1")
   331  		}
   332  
   333  		if ch.MsgCount != 10 {
   334  			t.Fatal("wrong MsgCount for channel 1")
   335  		}
   336  	}
   337  
   338  	// Check for Channel 2
   339  	if ch2, err := ss.Channel().GetChannelUnread(c2.Id, uid); err != nil {
   340  		t.Fatal(err)
   341  	} else {
   342  		if c2.Id != ch2.ChannelId {
   343  			t.Fatal("wrong channel id")
   344  		}
   345  
   346  		if teamId2 != ch2.TeamId {
   347  			t.Fatal("wrong team id")
   348  		}
   349  
   350  		if ch2.MentionCount != 5 {
   351  			t.Fatal("wrong MentionCount for channel 2")
   352  		}
   353  
   354  		if ch2.MsgCount != 10 {
   355  			t.Fatal("wrong MsgCount for channel 2")
   356  		}
   357  	}
   358  }
   359  
   360  func testChannelStoreGet(t *testing.T, ss store.Store, s SqlSupplier) {
   361  	o1 := model.Channel{}
   362  	o1.TeamId = model.NewId()
   363  	o1.DisplayName = "Name"
   364  	o1.Name = "zz" + model.NewId() + "b"
   365  	o1.Type = model.CHANNEL_OPEN
   366  	_, err := ss.Channel().Save(&o1, -1)
   367  	require.Nil(t, err)
   368  
   369  	c1 := &model.Channel{}
   370  	if c1, err = ss.Channel().Get(o1.Id, false); err != nil {
   371  		t.Fatal(err)
   372  	} else {
   373  		if c1.ToJson() != o1.ToJson() {
   374  			t.Fatal("invalid returned channel")
   375  		}
   376  	}
   377  
   378  	if _, err = ss.Channel().Get("", false); err == nil {
   379  		t.Fatal("Missing id should have failed")
   380  	}
   381  
   382  	u1 := &model.User{}
   383  	u1.Email = MakeEmail()
   384  	u1.Nickname = model.NewId()
   385  	store.Must(ss.User().Save(u1))
   386  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1))
   387  
   388  	u2 := model.User{}
   389  	u2.Email = MakeEmail()
   390  	u2.Nickname = model.NewId()
   391  	store.Must(ss.User().Save(&u2))
   392  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}, -1))
   393  
   394  	o2 := model.Channel{}
   395  	o2.TeamId = model.NewId()
   396  	o2.DisplayName = "Direct Name"
   397  	o2.Name = "zz" + model.NewId() + "b"
   398  	o2.Type = model.CHANNEL_DIRECT
   399  
   400  	m1 := model.ChannelMember{}
   401  	m1.ChannelId = o2.Id
   402  	m1.UserId = u1.Id
   403  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
   404  
   405  	m2 := model.ChannelMember{}
   406  	m2.ChannelId = o2.Id
   407  	m2.UserId = u2.Id
   408  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
   409  
   410  	_, err = ss.Channel().SaveDirectChannel(&o2, &m1, &m2)
   411  	require.Nil(t, err)
   412  
   413  	if c2, err := ss.Channel().Get(o2.Id, false); err != nil {
   414  		t.Fatal(err)
   415  	} else {
   416  		if c2.ToJson() != o2.ToJson() {
   417  			t.Fatal("invalid returned channel")
   418  		}
   419  	}
   420  
   421  	if c4, err := ss.Channel().Get(o2.Id, true); err != nil {
   422  		t.Fatal(err)
   423  	} else {
   424  		if c4.ToJson() != o2.ToJson() {
   425  			t.Fatal("invalid returned channel")
   426  		}
   427  	}
   428  
   429  	if channels, chanErr := ss.Channel().GetAll(o1.TeamId); chanErr != nil {
   430  		t.Fatal(chanErr)
   431  	} else {
   432  		if len(channels) == 0 {
   433  			t.Fatal("too little")
   434  		}
   435  	}
   436  
   437  	if channels, err := ss.Channel().GetTeamChannels(o1.TeamId); err != nil {
   438  		t.Fatal(err)
   439  	} else {
   440  		if len(*channels) == 0 {
   441  			t.Fatal("too little")
   442  		}
   443  	}
   444  	// Manually truncate Channels table until testlib can handle cleanups
   445  	s.GetMaster().Exec("TRUNCATE Channels")
   446  }
   447  
   448  func testChannelStoreGetChannelsByIds(t *testing.T, ss store.Store) {
   449  	o1 := model.Channel{}
   450  	o1.TeamId = model.NewId()
   451  	o1.DisplayName = "Name"
   452  	o1.Name = "aa" + model.NewId() + "b"
   453  	o1.Type = model.CHANNEL_OPEN
   454  	_, err := ss.Channel().Save(&o1, -1)
   455  	require.Nil(t, err)
   456  
   457  	u1 := &model.User{}
   458  	u1.Email = MakeEmail()
   459  	u1.Nickname = model.NewId()
   460  	store.Must(ss.User().Save(u1))
   461  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1))
   462  
   463  	u2 := model.User{}
   464  	u2.Email = MakeEmail()
   465  	u2.Nickname = model.NewId()
   466  	store.Must(ss.User().Save(&u2))
   467  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}, -1))
   468  
   469  	o2 := model.Channel{}
   470  	o2.TeamId = model.NewId()
   471  	o2.DisplayName = "Direct Name"
   472  	o2.Name = "bb" + model.NewId() + "b"
   473  	o2.Type = model.CHANNEL_DIRECT
   474  
   475  	m1 := model.ChannelMember{}
   476  	m1.ChannelId = o2.Id
   477  	m1.UserId = u1.Id
   478  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
   479  
   480  	m2 := model.ChannelMember{}
   481  	m2.ChannelId = o2.Id
   482  	m2.UserId = u2.Id
   483  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
   484  
   485  	_, err = ss.Channel().SaveDirectChannel(&o2, &m1, &m2)
   486  	require.Nil(t, err)
   487  
   488  	if r1, err := ss.Channel().GetChannelsByIds([]string{o1.Id, o2.Id}); err != nil {
   489  		t.Fatal(err)
   490  	} else {
   491  		if len(r1) != 2 {
   492  			t.Fatal("invalid returned channels, expected 2 and got " + strconv.Itoa(len(r1)))
   493  		}
   494  		if r1[0].ToJson() != o1.ToJson() {
   495  			t.Fatal("invalid returned channel")
   496  		}
   497  		if r1[1].ToJson() != o2.ToJson() {
   498  			t.Fatal("invalid returned channel")
   499  		}
   500  	}
   501  
   502  	nonexistentId := "abcd1234"
   503  	if r2, err := ss.Channel().GetChannelsByIds([]string{o1.Id, nonexistentId}); err != nil {
   504  		t.Fatal(err)
   505  	} else {
   506  		if len(r2) != 1 {
   507  			t.Fatal("invalid returned channels, expected 1 and got " + strconv.Itoa(len(r2)))
   508  		}
   509  		if r2[0].ToJson() != o1.ToJson() {
   510  			t.Fatal("invalid returned channel")
   511  		}
   512  	}
   513  }
   514  
   515  func testChannelStoreGetForPost(t *testing.T, ss store.Store) {
   516  
   517  	ch := &model.Channel{
   518  		TeamId:      model.NewId(),
   519  		DisplayName: "Name",
   520  		Name:        "zz" + model.NewId() + "b",
   521  		Type:        model.CHANNEL_OPEN,
   522  	}
   523  	o1, err := ss.Channel().Save(ch, -1)
   524  	require.Nil(t, err)
   525  
   526  	p1, err := ss.Post().Save(&model.Post{
   527  		UserId:    model.NewId(),
   528  		ChannelId: o1.Id,
   529  		Message:   "test",
   530  	})
   531  	require.Nil(t, err)
   532  
   533  	if channel, chanErr := ss.Channel().GetForPost(p1.Id); chanErr != nil {
   534  		t.Fatal(chanErr)
   535  	} else if channel.Id != o1.Id {
   536  		t.Fatal("incorrect channel returned")
   537  	}
   538  }
   539  
   540  func testChannelStoreRestore(t *testing.T, ss store.Store) {
   541  	o1 := model.Channel{}
   542  	o1.TeamId = model.NewId()
   543  	o1.DisplayName = "Channel1"
   544  	o1.Name = "zz" + model.NewId() + "b"
   545  	o1.Type = model.CHANNEL_OPEN
   546  	_, err := ss.Channel().Save(&o1, -1)
   547  	require.Nil(t, err)
   548  
   549  	if err := ss.Channel().Delete(o1.Id, model.GetMillis()); err != nil {
   550  		t.Fatal(err)
   551  	}
   552  
   553  	if c, _ := ss.Channel().Get(o1.Id, false); c.DeleteAt == 0 {
   554  		t.Fatal("should have been deleted")
   555  	}
   556  
   557  	if err := ss.Channel().Restore(o1.Id, model.GetMillis()); err != nil {
   558  		t.Fatal(err)
   559  	}
   560  
   561  	if c, _ := ss.Channel().Get(o1.Id, false); c.DeleteAt != 0 {
   562  		t.Fatal("should have been restored")
   563  	}
   564  
   565  }
   566  
   567  func testChannelStoreDelete(t *testing.T, ss store.Store) {
   568  	o1 := model.Channel{}
   569  	o1.TeamId = model.NewId()
   570  	o1.DisplayName = "Channel1"
   571  	o1.Name = "zz" + model.NewId() + "b"
   572  	o1.Type = model.CHANNEL_OPEN
   573  	_, err := ss.Channel().Save(&o1, -1)
   574  	require.Nil(t, err)
   575  
   576  	o2 := model.Channel{}
   577  	o2.TeamId = o1.TeamId
   578  	o2.DisplayName = "Channel2"
   579  	o2.Name = "zz" + model.NewId() + "b"
   580  	o2.Type = model.CHANNEL_OPEN
   581  	_, err = ss.Channel().Save(&o2, -1)
   582  	require.Nil(t, err)
   583  
   584  	o3 := model.Channel{}
   585  	o3.TeamId = o1.TeamId
   586  	o3.DisplayName = "Channel3"
   587  	o3.Name = "zz" + model.NewId() + "b"
   588  	o3.Type = model.CHANNEL_OPEN
   589  	_, err = ss.Channel().Save(&o3, -1)
   590  	require.Nil(t, err)
   591  
   592  	o4 := model.Channel{}
   593  	o4.TeamId = o1.TeamId
   594  	o4.DisplayName = "Channel4"
   595  	o4.Name = "zz" + model.NewId() + "b"
   596  	o4.Type = model.CHANNEL_OPEN
   597  	_, err = ss.Channel().Save(&o4, -1)
   598  	require.Nil(t, err)
   599  
   600  	m1 := model.ChannelMember{}
   601  	m1.ChannelId = o1.Id
   602  	m1.UserId = model.NewId()
   603  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
   604  	store.Must(ss.Channel().SaveMember(&m1))
   605  
   606  	m2 := model.ChannelMember{}
   607  	m2.ChannelId = o2.Id
   608  	m2.UserId = m1.UserId
   609  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
   610  	store.Must(ss.Channel().SaveMember(&m2))
   611  
   612  	if err = ss.Channel().Delete(o1.Id, model.GetMillis()); err != nil {
   613  		t.Fatal(err)
   614  	}
   615  
   616  	if c, _ := ss.Channel().Get(o1.Id, false); c.DeleteAt == 0 {
   617  		t.Fatal("should have been deleted")
   618  	}
   619  
   620  	if err = ss.Channel().Delete(o3.Id, model.GetMillis()); err != nil {
   621  		t.Fatal(err)
   622  	}
   623  
   624  	list, err := ss.Channel().GetChannels(o1.TeamId, m1.UserId, false)
   625  	require.Nil(t, err)
   626  
   627  	if len(*list) != 1 {
   628  		t.Fatal("invalid number of channels")
   629  	}
   630  
   631  	list, err = ss.Channel().GetMoreChannels(o1.TeamId, m1.UserId, 0, 100)
   632  	require.Nil(t, err)
   633  
   634  	if len(*list) != 1 {
   635  		t.Fatal("invalid number of channels")
   636  	}
   637  
   638  	cresult := <-ss.Channel().PermanentDelete(o2.Id)
   639  	require.Nil(t, cresult.Err)
   640  
   641  	list, err = ss.Channel().GetChannels(o1.TeamId, m1.UserId, false)
   642  	if assert.NotNil(t, err) {
   643  		require.Equal(t, "store.sql_channel.get_channels.not_found.app_error", err.Id)
   644  	} else {
   645  		require.Equal(t, &model.ChannelList{}, list)
   646  	}
   647  
   648  	if r := <-ss.Channel().PermanentDeleteByTeam(o1.TeamId); r.Err != nil {
   649  		t.Fatal(r.Err)
   650  	}
   651  }
   652  
   653  func testChannelStoreGetByName(t *testing.T, ss store.Store) {
   654  	o1 := model.Channel{}
   655  	o1.TeamId = model.NewId()
   656  	o1.DisplayName = "Name"
   657  	o1.Name = "zz" + model.NewId() + "b"
   658  	o1.Type = model.CHANNEL_OPEN
   659  	_, err := ss.Channel().Save(&o1, -1)
   660  	require.Nil(t, err)
   661  
   662  	result, err := ss.Channel().GetByName(o1.TeamId, o1.Name, true)
   663  	require.Nil(t, err)
   664  	require.Equal(t, o1.ToJson(), result.ToJson(), "invalid returned channel")
   665  
   666  	channelID := result.Id
   667  
   668  	result, err = ss.Channel().GetByName(o1.TeamId, "", true)
   669  	require.NotNil(t, err, "Missing id should have failed")
   670  
   671  	result, err = ss.Channel().GetByName(o1.TeamId, o1.Name, false)
   672  	require.Nil(t, err)
   673  	require.Equal(t, o1.ToJson(), result.ToJson(), "invalid returned channel")
   674  
   675  	result, err = ss.Channel().GetByName(o1.TeamId, "", false)
   676  	require.NotNil(t, err, "Missing id should have failed")
   677  
   678  	err = ss.Channel().Delete(channelID, model.GetMillis())
   679  	require.Nil(t, err, "channel should have been deleted")
   680  
   681  	result, err = ss.Channel().GetByName(o1.TeamId, o1.Name, false)
   682  	require.NotNil(t, err, "Deleted channel should not be returned by GetByName()")
   683  }
   684  
   685  func testChannelStoreGetByNames(t *testing.T, ss store.Store) {
   686  	o1 := model.Channel{
   687  		TeamId:      model.NewId(),
   688  		DisplayName: "Name",
   689  		Name:        "zz" + model.NewId() + "b",
   690  		Type:        model.CHANNEL_OPEN,
   691  	}
   692  	_, err := ss.Channel().Save(&o1, -1)
   693  	require.Nil(t, err)
   694  
   695  	o2 := model.Channel{
   696  		TeamId:      o1.TeamId,
   697  		DisplayName: "Name",
   698  		Name:        "zz" + model.NewId() + "b",
   699  		Type:        model.CHANNEL_OPEN,
   700  	}
   701  	_, err = ss.Channel().Save(&o2, -1)
   702  	require.Nil(t, err)
   703  
   704  	for index, tc := range []struct {
   705  		TeamId      string
   706  		Names       []string
   707  		ExpectedIds []string
   708  	}{
   709  		{o1.TeamId, []string{o1.Name}, []string{o1.Id}},
   710  		{o1.TeamId, []string{o1.Name, o2.Name}, []string{o1.Id, o2.Id}},
   711  		{o1.TeamId, nil, nil},
   712  		{o1.TeamId, []string{"foo"}, nil},
   713  		{o1.TeamId, []string{o1.Name, "foo", o2.Name, o2.Name}, []string{o1.Id, o2.Id}},
   714  		{"", []string{o1.Name, "foo", o2.Name, o2.Name}, []string{o1.Id, o2.Id}},
   715  		{"asd", []string{o1.Name, "foo", o2.Name, o2.Name}, nil},
   716  	} {
   717  		var channels []*model.Channel
   718  		channels, err = ss.Channel().GetByNames(tc.TeamId, tc.Names, true)
   719  		require.Nil(t, err)
   720  		var ids []string
   721  		for _, channel := range channels {
   722  			ids = append(ids, channel.Id)
   723  		}
   724  		sort.Strings(ids)
   725  		sort.Strings(tc.ExpectedIds)
   726  		assert.Equal(t, tc.ExpectedIds, ids, "tc %v", index)
   727  	}
   728  
   729  	err = ss.Channel().Delete(o1.Id, model.GetMillis())
   730  	require.Nil(t, err, "channel should have been deleted")
   731  
   732  	err = ss.Channel().Delete(o2.Id, model.GetMillis())
   733  	require.Nil(t, err, "channel should have been deleted")
   734  
   735  	channels, err := ss.Channel().GetByNames(o1.TeamId, []string{o1.Name}, false)
   736  	require.Nil(t, err)
   737  	assert.Len(t, channels, 0)
   738  }
   739  
   740  func testChannelStoreGetDeletedByName(t *testing.T, ss store.Store) {
   741  	o1 := model.Channel{}
   742  	o1.TeamId = model.NewId()
   743  	o1.DisplayName = "Name"
   744  	o1.Name = "zz" + model.NewId() + "b"
   745  	o1.Type = model.CHANNEL_OPEN
   746  	_, err := ss.Channel().Save(&o1, -1)
   747  	require.Nil(t, err)
   748  
   749  	now := model.GetMillis()
   750  	err = ss.Channel().Delete(o1.Id, model.GetMillis())
   751  	require.Nil(t, err, "channel should have been deleted")
   752  	o1.DeleteAt = now
   753  	o1.UpdateAt = now
   754  
   755  	if r1, err := ss.Channel().GetDeletedByName(o1.TeamId, o1.Name); err != nil {
   756  		t.Fatal(err)
   757  	} else {
   758  		if r1.ToJson() != o1.ToJson() {
   759  			t.Fatal("invalid returned channel")
   760  		}
   761  	}
   762  
   763  	if _, err := ss.Channel().GetDeletedByName(o1.TeamId, ""); err == nil {
   764  		t.Fatal("Missing id should have failed")
   765  	}
   766  }
   767  
   768  func testChannelStoreGetDeleted(t *testing.T, ss store.Store) {
   769  	o1 := model.Channel{}
   770  	o1.TeamId = model.NewId()
   771  	o1.DisplayName = "Channel1"
   772  	o1.Name = "zz" + model.NewId() + "b"
   773  	o1.Type = model.CHANNEL_OPEN
   774  
   775  	_, err := ss.Channel().Save(&o1, -1)
   776  	require.Nil(t, err)
   777  
   778  	err = ss.Channel().Delete(o1.Id, model.GetMillis())
   779  	require.Nil(t, err, "channel should have been deleted")
   780  
   781  	list, err := ss.Channel().GetDeleted(o1.TeamId, 0, 100)
   782  	if err != nil {
   783  		t.Fatal(err)
   784  	}
   785  
   786  	if len(*list) != 1 {
   787  		t.Fatal("wrong list")
   788  	}
   789  
   790  	if (*list)[0].Name != o1.Name {
   791  		t.Fatal("missing channel")
   792  	}
   793  
   794  	o2 := model.Channel{}
   795  	o2.TeamId = o1.TeamId
   796  	o2.DisplayName = "Channel2"
   797  	o2.Name = "zz" + model.NewId() + "b"
   798  	o2.Type = model.CHANNEL_OPEN
   799  	_, err = ss.Channel().Save(&o2, -1)
   800  	require.Nil(t, err)
   801  
   802  	list, err = ss.Channel().GetDeleted(o1.TeamId, 0, 100)
   803  	if err != nil {
   804  		t.Fatal(err)
   805  	}
   806  
   807  	if len(*list) != 1 {
   808  		t.Fatal("wrong list")
   809  	}
   810  
   811  	o3 := model.Channel{}
   812  	o3.TeamId = o1.TeamId
   813  	o3.DisplayName = "Channel3"
   814  	o3.Name = "zz" + model.NewId() + "b"
   815  	o3.Type = model.CHANNEL_OPEN
   816  
   817  	_, err = ss.Channel().Save(&o3, -1)
   818  	require.Nil(t, err)
   819  
   820  	err = ss.Channel().Delete(o3.Id, model.GetMillis())
   821  	require.Nil(t, err, "channel should have been deleted")
   822  
   823  	list, err = ss.Channel().GetDeleted(o1.TeamId, 0, 100)
   824  	if err != nil {
   825  		t.Fatal(err)
   826  	}
   827  
   828  	if len(*list) != 2 {
   829  		t.Fatal("wrong list length")
   830  	}
   831  
   832  	list, err = ss.Channel().GetDeleted(o1.TeamId, 0, 1)
   833  	if err != nil {
   834  		t.Fatal(err)
   835  	}
   836  
   837  	if len(*list) != 1 {
   838  		t.Fatal("wrong list length")
   839  	}
   840  
   841  	list, err = ss.Channel().GetDeleted(o1.TeamId, 1, 1)
   842  	if err != nil {
   843  		t.Fatal(err)
   844  	}
   845  
   846  	if len(*list) != 1 {
   847  		t.Fatal("wrong list length")
   848  	}
   849  
   850  }
   851  
   852  func testChannelMemberStore(t *testing.T, ss store.Store) {
   853  	c1 := &model.Channel{}
   854  	c1.TeamId = model.NewId()
   855  	c1.DisplayName = "NameName"
   856  	c1.Name = "zz" + model.NewId() + "b"
   857  	c1.Type = model.CHANNEL_OPEN
   858  	c1, err := ss.Channel().Save(c1, -1)
   859  	require.Nil(t, err)
   860  
   861  	c1t1, _ := ss.Channel().Get(c1.Id, false)
   862  	assert.EqualValues(t, 0, c1t1.ExtraUpdateAt, "ExtraUpdateAt should be 0")
   863  
   864  	u1 := model.User{}
   865  	u1.Email = MakeEmail()
   866  	u1.Nickname = model.NewId()
   867  	store.Must(ss.User().Save(&u1))
   868  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1))
   869  
   870  	u2 := model.User{}
   871  	u2.Email = MakeEmail()
   872  	u2.Nickname = model.NewId()
   873  	store.Must(ss.User().Save(&u2))
   874  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}, -1))
   875  
   876  	o1 := model.ChannelMember{}
   877  	o1.ChannelId = c1.Id
   878  	o1.UserId = u1.Id
   879  	o1.NotifyProps = model.GetDefaultChannelNotifyProps()
   880  	store.Must(ss.Channel().SaveMember(&o1))
   881  
   882  	o2 := model.ChannelMember{}
   883  	o2.ChannelId = c1.Id
   884  	o2.UserId = u2.Id
   885  	o2.NotifyProps = model.GetDefaultChannelNotifyProps()
   886  	store.Must(ss.Channel().SaveMember(&o2))
   887  
   888  	c1t2, _ := ss.Channel().Get(c1.Id, false)
   889  	assert.EqualValues(t, 0, c1t2.ExtraUpdateAt, "ExtraUpdateAt should be 0")
   890  
   891  	count, err := ss.Channel().GetMemberCount(o1.ChannelId, true)
   892  	require.Nil(t, err)
   893  	if count != 2 {
   894  		t.Fatal("should have saved 2 members")
   895  	}
   896  
   897  	count, err = ss.Channel().GetMemberCount(o1.ChannelId, true)
   898  	require.Nil(t, err)
   899  	if count != 2 {
   900  		t.Fatal("should have saved 2 members")
   901  	}
   902  
   903  	if ss.Channel().GetMemberCountFromCache(o1.ChannelId) != 2 {
   904  		t.Fatal("should have saved 2 members")
   905  	}
   906  
   907  	if ss.Channel().GetMemberCountFromCache("junk") != 0 {
   908  		t.Fatal("should have saved 0 members")
   909  	}
   910  
   911  	count, err = ss.Channel().GetMemberCount(o1.ChannelId, false)
   912  	require.Nil(t, err)
   913  	if count != 2 {
   914  		t.Fatal("should have saved 2 members")
   915  	}
   916  
   917  	err = ss.Channel().RemoveMember(o2.ChannelId, o2.UserId)
   918  	require.Nil(t, err)
   919  
   920  	count, err = ss.Channel().GetMemberCount(o1.ChannelId, false)
   921  	require.Nil(t, err)
   922  	if count != 1 {
   923  		t.Fatal("should have removed 1 member")
   924  	}
   925  
   926  	c1t3, _ := ss.Channel().Get(c1.Id, false)
   927  	assert.EqualValues(t, 0, c1t3.ExtraUpdateAt, "ExtraUpdateAt should be 0")
   928  
   929  	member, _ := ss.Channel().GetMember(o1.ChannelId, o1.UserId)
   930  	if member.ChannelId != o1.ChannelId {
   931  		t.Fatal("should have go member")
   932  	}
   933  
   934  	if err := (<-ss.Channel().SaveMember(&o1)).Err; err == nil {
   935  		t.Fatal("Should have been a duplicate")
   936  	}
   937  
   938  	c1t4, _ := ss.Channel().Get(c1.Id, false)
   939  	assert.EqualValues(t, 0, c1t4.ExtraUpdateAt, "ExtraUpdateAt should be 0")
   940  }
   941  
   942  func testChannelDeleteMemberStore(t *testing.T, ss store.Store) {
   943  	c1 := &model.Channel{}
   944  	c1.TeamId = model.NewId()
   945  	c1.DisplayName = "NameName"
   946  	c1.Name = "zz" + model.NewId() + "b"
   947  	c1.Type = model.CHANNEL_OPEN
   948  	c1, err := ss.Channel().Save(c1, -1)
   949  	require.Nil(t, err)
   950  
   951  	c1t1, _ := ss.Channel().Get(c1.Id, false)
   952  	assert.EqualValues(t, 0, c1t1.ExtraUpdateAt, "ExtraUpdateAt should be 0")
   953  
   954  	u1 := model.User{}
   955  	u1.Email = MakeEmail()
   956  	u1.Nickname = model.NewId()
   957  	store.Must(ss.User().Save(&u1))
   958  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1))
   959  
   960  	u2 := model.User{}
   961  	u2.Email = MakeEmail()
   962  	u2.Nickname = model.NewId()
   963  	store.Must(ss.User().Save(&u2))
   964  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}, -1))
   965  
   966  	o1 := model.ChannelMember{}
   967  	o1.ChannelId = c1.Id
   968  	o1.UserId = u1.Id
   969  	o1.NotifyProps = model.GetDefaultChannelNotifyProps()
   970  	store.Must(ss.Channel().SaveMember(&o1))
   971  
   972  	o2 := model.ChannelMember{}
   973  	o2.ChannelId = c1.Id
   974  	o2.UserId = u2.Id
   975  	o2.NotifyProps = model.GetDefaultChannelNotifyProps()
   976  	store.Must(ss.Channel().SaveMember(&o2))
   977  
   978  	c1t2, _ := ss.Channel().Get(c1.Id, false)
   979  	assert.EqualValues(t, 0, c1t2.ExtraUpdateAt, "ExtraUpdateAt should be 0")
   980  
   981  	count, err := ss.Channel().GetMemberCount(o1.ChannelId, false)
   982  	require.Nil(t, err)
   983  	if count != 2 {
   984  		t.Fatal("should have saved 2 members")
   985  	}
   986  
   987  	err = ss.Channel().PermanentDeleteMembersByUser(o2.UserId)
   988  	require.Nil(t, err)
   989  
   990  	count, err = ss.Channel().GetMemberCount(o1.ChannelId, false)
   991  	require.Nil(t, err)
   992  	if count != 1 {
   993  		t.Fatal("should have removed 1 member")
   994  	}
   995  
   996  	if err = ss.Channel().PermanentDeleteMembersByChannel(o1.ChannelId); err != nil {
   997  		t.Fatal(err)
   998  	}
   999  
  1000  	count, err = ss.Channel().GetMemberCount(o1.ChannelId, false)
  1001  	require.Nil(t, err)
  1002  	if count != 0 {
  1003  		t.Fatal("should have removed all members")
  1004  	}
  1005  }
  1006  
  1007  func testChannelStoreGetChannels(t *testing.T, ss store.Store) {
  1008  	o2 := model.Channel{}
  1009  	o2.TeamId = model.NewId()
  1010  	o2.DisplayName = "Channel2"
  1011  	o2.Name = "zz" + model.NewId() + "b"
  1012  	o2.Type = model.CHANNEL_OPEN
  1013  	_, err := ss.Channel().Save(&o2, -1)
  1014  	require.Nil(t, err)
  1015  
  1016  	o1 := model.Channel{}
  1017  	o1.TeamId = model.NewId()
  1018  	o1.DisplayName = "Channel1"
  1019  	o1.Name = "zz" + model.NewId() + "b"
  1020  	o1.Type = model.CHANNEL_OPEN
  1021  	_, err = ss.Channel().Save(&o1, -1)
  1022  	require.Nil(t, err)
  1023  
  1024  	m1 := model.ChannelMember{}
  1025  	m1.ChannelId = o1.Id
  1026  	m1.UserId = model.NewId()
  1027  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
  1028  	store.Must(ss.Channel().SaveMember(&m1))
  1029  
  1030  	m2 := model.ChannelMember{}
  1031  	m2.ChannelId = o1.Id
  1032  	m2.UserId = model.NewId()
  1033  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
  1034  	store.Must(ss.Channel().SaveMember(&m2))
  1035  
  1036  	m3 := model.ChannelMember{}
  1037  	m3.ChannelId = o2.Id
  1038  	m3.UserId = model.NewId()
  1039  	m3.NotifyProps = model.GetDefaultChannelNotifyProps()
  1040  	store.Must(ss.Channel().SaveMember(&m3))
  1041  
  1042  	list, err := ss.Channel().GetChannels(o1.TeamId, m1.UserId, false)
  1043  	require.Nil(t, err)
  1044  
  1045  	if (*list)[0].Id != o1.Id {
  1046  		t.Fatal("missing channel")
  1047  	}
  1048  
  1049  	ids, _ := ss.Channel().GetAllChannelMembersForUser(m1.UserId, false, false)
  1050  	if _, ok := ids[o1.Id]; !ok {
  1051  		t.Fatal("missing channel")
  1052  	}
  1053  
  1054  	ids2, _ := ss.Channel().GetAllChannelMembersForUser(m1.UserId, true, false)
  1055  	if _, ok := ids2[o1.Id]; !ok {
  1056  		t.Fatal("missing channel")
  1057  	}
  1058  
  1059  	ids3, _ := ss.Channel().GetAllChannelMembersForUser(m1.UserId, true, false)
  1060  	if _, ok := ids3[o1.Id]; !ok {
  1061  		t.Fatal("missing channel")
  1062  	}
  1063  
  1064  	if !ss.Channel().IsUserInChannelUseCache(m1.UserId, o1.Id) {
  1065  		t.Fatal("missing channel")
  1066  	}
  1067  
  1068  	if ss.Channel().IsUserInChannelUseCache(m1.UserId, o2.Id) {
  1069  		t.Fatal("missing channel")
  1070  	}
  1071  
  1072  	if ss.Channel().IsUserInChannelUseCache(m1.UserId, "blahblah") {
  1073  		t.Fatal("missing channel")
  1074  	}
  1075  
  1076  	if ss.Channel().IsUserInChannelUseCache("blahblah", "blahblah") {
  1077  		t.Fatal("missing channel")
  1078  	}
  1079  
  1080  	ss.Channel().InvalidateAllChannelMembersForUser(m1.UserId)
  1081  }
  1082  
  1083  func testChannelStoreGetAllChannels(t *testing.T, ss store.Store, s SqlSupplier) {
  1084  	cleanupChannels(t, ss)
  1085  
  1086  	t1 := model.Team{}
  1087  	t1.DisplayName = "Name"
  1088  	t1.Name = model.NewId()
  1089  	t1.Email = MakeEmail()
  1090  	t1.Type = model.TEAM_OPEN
  1091  	_, err := ss.Team().Save(&t1)
  1092  	require.Nil(t, err)
  1093  
  1094  	t2 := model.Team{}
  1095  	t2.DisplayName = "Name2"
  1096  	t2.Name = model.NewId()
  1097  	t2.Email = MakeEmail()
  1098  	t2.Type = model.TEAM_OPEN
  1099  	_, err = ss.Team().Save(&t2)
  1100  	require.Nil(t, err)
  1101  
  1102  	c1 := model.Channel{}
  1103  	c1.TeamId = t1.Id
  1104  	c1.DisplayName = "Channel1" + model.NewId()
  1105  	c1.Name = "zz" + model.NewId() + "b"
  1106  	c1.Type = model.CHANNEL_OPEN
  1107  	_, err = ss.Channel().Save(&c1, -1)
  1108  	require.Nil(t, err)
  1109  
  1110  	group := &model.Group{
  1111  		Name:        model.NewId(),
  1112  		DisplayName: model.NewId(),
  1113  		Source:      model.GroupSourceLdap,
  1114  		RemoteId:    model.NewId(),
  1115  	}
  1116  	store.Must(ss.Group().Create(group))
  1117  	_, err = ss.Group().CreateGroupSyncable(model.NewGroupChannel(group.Id, c1.Id, true))
  1118  	require.Nil(t, err)
  1119  
  1120  	c2 := model.Channel{}
  1121  	c2.TeamId = t1.Id
  1122  	c2.DisplayName = "Channel2" + model.NewId()
  1123  	c2.Name = "zz" + model.NewId() + "b"
  1124  	c2.Type = model.CHANNEL_OPEN
  1125  	_, err = ss.Channel().Save(&c2, -1)
  1126  	require.Nil(t, err)
  1127  	c2.DeleteAt = model.GetMillis()
  1128  	c2.UpdateAt = c2.DeleteAt
  1129  	err = ss.Channel().Delete(c2.Id, c2.DeleteAt)
  1130  	require.Nil(t, err, "channel should have been deleted")
  1131  
  1132  	c3 := model.Channel{}
  1133  	c3.TeamId = t2.Id
  1134  	c3.DisplayName = "Channel3" + model.NewId()
  1135  	c3.Name = "zz" + model.NewId() + "b"
  1136  	c3.Type = model.CHANNEL_PRIVATE
  1137  	_, err = ss.Channel().Save(&c3, -1)
  1138  	require.Nil(t, err)
  1139  
  1140  	_, err = ss.Channel().CreateDirectChannel(model.NewId(), model.NewId())
  1141  	require.Nil(t, err)
  1142  
  1143  	userIds := []string{model.NewId(), model.NewId(), model.NewId()}
  1144  
  1145  	c5 := model.Channel{}
  1146  	c5.Name = model.GetGroupNameFromUserIds(userIds)
  1147  	c5.DisplayName = "GroupChannel" + model.NewId()
  1148  	c5.Name = "zz" + model.NewId() + "b"
  1149  	c5.Type = model.CHANNEL_GROUP
  1150  	_, err = ss.Channel().Save(&c5, -1)
  1151  	require.Nil(t, err)
  1152  
  1153  	list, err := ss.Channel().GetAllChannels(0, 10, store.ChannelSearchOpts{})
  1154  	require.Nil(t, err)
  1155  	assert.Len(t, *list, 2)
  1156  	assert.Equal(t, (*list)[0].Id, c1.Id)
  1157  	assert.Equal(t, (*list)[0].TeamDisplayName, "Name")
  1158  	assert.Equal(t, (*list)[1].Id, c3.Id)
  1159  	assert.Equal(t, (*list)[1].TeamDisplayName, "Name2")
  1160  
  1161  	count1, err := ss.Channel().GetAllChannelsCount(store.ChannelSearchOpts{})
  1162  	require.Nil(t, err)
  1163  
  1164  	list, err = ss.Channel().GetAllChannels(0, 10, store.ChannelSearchOpts{IncludeDeleted: true})
  1165  	require.Nil(t, err)
  1166  	assert.Len(t, *list, 3)
  1167  	assert.Equal(t, (*list)[0].Id, c1.Id)
  1168  	assert.Equal(t, (*list)[0].TeamDisplayName, "Name")
  1169  	assert.Equal(t, (*list)[1].Id, c2.Id)
  1170  	assert.Equal(t, (*list)[2].Id, c3.Id)
  1171  
  1172  	count2, err := ss.Channel().GetAllChannelsCount(store.ChannelSearchOpts{IncludeDeleted: true})
  1173  	require.Nil(t, err)
  1174  	require.True(t, func() bool {
  1175  		return count2 > count1
  1176  	}())
  1177  
  1178  	list, err = ss.Channel().GetAllChannels(0, 1, store.ChannelSearchOpts{IncludeDeleted: true})
  1179  	require.Nil(t, err)
  1180  	assert.Len(t, *list, 1)
  1181  	assert.Equal(t, (*list)[0].Id, c1.Id)
  1182  	assert.Equal(t, (*list)[0].TeamDisplayName, "Name")
  1183  
  1184  	// Not associated to group
  1185  	list, err = ss.Channel().GetAllChannels(0, 10, store.ChannelSearchOpts{NotAssociatedToGroup: group.Id})
  1186  	require.Nil(t, err)
  1187  	assert.Len(t, *list, 1)
  1188  
  1189  	// Exclude channel names
  1190  	list, err = ss.Channel().GetAllChannels(0, 10, store.ChannelSearchOpts{ExcludeChannelNames: []string{c1.Name}})
  1191  	require.Nil(t, err)
  1192  	assert.Len(t, *list, 1)
  1193  
  1194  	// Manually truncate Channels table until testlib can handle cleanups
  1195  	s.GetMaster().Exec("TRUNCATE Channels")
  1196  }
  1197  
  1198  func testChannelStoreGetMoreChannels(t *testing.T, ss store.Store) {
  1199  	teamId := model.NewId()
  1200  	otherTeamId := model.NewId()
  1201  	userId := model.NewId()
  1202  	otherUserId1 := model.NewId()
  1203  	otherUserId2 := model.NewId()
  1204  
  1205  	// o1 is a channel on the team to which the user (and the other user 1) belongs
  1206  	o1 := model.Channel{
  1207  		TeamId:      teamId,
  1208  		DisplayName: "Channel1",
  1209  		Name:        "zz" + model.NewId() + "b",
  1210  		Type:        model.CHANNEL_OPEN,
  1211  	}
  1212  	_, err := ss.Channel().Save(&o1, -1)
  1213  	require.Nil(t, err)
  1214  
  1215  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
  1216  		ChannelId:   o1.Id,
  1217  		UserId:      userId,
  1218  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  1219  	}))
  1220  
  1221  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
  1222  		ChannelId:   o1.Id,
  1223  		UserId:      otherUserId1,
  1224  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  1225  	}))
  1226  
  1227  	// o2 is a channel on the other team to which the user belongs
  1228  	o2 := model.Channel{
  1229  		TeamId:      otherTeamId,
  1230  		DisplayName: "Channel2",
  1231  		Name:        "zz" + model.NewId() + "b",
  1232  		Type:        model.CHANNEL_OPEN,
  1233  	}
  1234  	_, err = ss.Channel().Save(&o2, -1)
  1235  	require.Nil(t, err)
  1236  
  1237  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
  1238  		ChannelId:   o2.Id,
  1239  		UserId:      otherUserId2,
  1240  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  1241  	}))
  1242  
  1243  	// o3 is a channel on the team to which the user does not belong, and thus should show up
  1244  	// in "more channels"
  1245  	o3 := model.Channel{
  1246  		TeamId:      teamId,
  1247  		DisplayName: "ChannelA",
  1248  		Name:        "zz" + model.NewId() + "b",
  1249  		Type:        model.CHANNEL_OPEN,
  1250  	}
  1251  	_, err = ss.Channel().Save(&o3, -1)
  1252  	require.Nil(t, err)
  1253  
  1254  	// o4 is a private channel on the team to which the user does not belong
  1255  	o4 := model.Channel{
  1256  		TeamId:      teamId,
  1257  		DisplayName: "ChannelB",
  1258  		Name:        "zz" + model.NewId() + "b",
  1259  		Type:        model.CHANNEL_PRIVATE,
  1260  	}
  1261  	_, err = ss.Channel().Save(&o4, -1)
  1262  	require.Nil(t, err)
  1263  
  1264  	// o5 is another private channel on the team to which the user does belong
  1265  	o5 := model.Channel{
  1266  		TeamId:      teamId,
  1267  		DisplayName: "ChannelC",
  1268  		Name:        "zz" + model.NewId() + "b",
  1269  		Type:        model.CHANNEL_PRIVATE,
  1270  	}
  1271  	_, err = ss.Channel().Save(&o5, -1)
  1272  	require.Nil(t, err)
  1273  
  1274  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
  1275  		ChannelId:   o5.Id,
  1276  		UserId:      userId,
  1277  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  1278  	}))
  1279  
  1280  	t.Run("only o3 listed in more channels", func(t *testing.T) {
  1281  		list, channelErr := ss.Channel().GetMoreChannels(teamId, userId, 0, 100)
  1282  		require.Nil(t, channelErr)
  1283  		require.Equal(t, &model.ChannelList{&o3}, list)
  1284  	})
  1285  
  1286  	// o6 is another channel on the team to which the user does not belong, and would thus
  1287  	// start showing up in "more channels".
  1288  	o6 := model.Channel{
  1289  		TeamId:      teamId,
  1290  		DisplayName: "ChannelD",
  1291  		Name:        "zz" + model.NewId() + "b",
  1292  		Type:        model.CHANNEL_OPEN,
  1293  	}
  1294  	_, err = ss.Channel().Save(&o6, -1)
  1295  	require.Nil(t, err)
  1296  
  1297  	// o7 is another channel on the team to which the user does not belong, but is deleted,
  1298  	// and thus would not start showing up in "more channels"
  1299  	o7 := model.Channel{
  1300  		TeamId:      teamId,
  1301  		DisplayName: "ChannelD",
  1302  		Name:        "zz" + model.NewId() + "b",
  1303  		Type:        model.CHANNEL_OPEN,
  1304  	}
  1305  	_, err = ss.Channel().Save(&o7, -1)
  1306  	require.Nil(t, err)
  1307  
  1308  	err = ss.Channel().Delete(o7.Id, model.GetMillis())
  1309  	require.Nil(t, err, "channel should have been deleted")
  1310  
  1311  	t.Run("both o3 and o6 listed in more channels", func(t *testing.T) {
  1312  		list, err := ss.Channel().GetMoreChannels(teamId, userId, 0, 100)
  1313  		require.Nil(t, err)
  1314  		require.Equal(t, &model.ChannelList{&o3, &o6}, list)
  1315  	})
  1316  
  1317  	t.Run("only o3 listed in more channels with offset 0, limit 1", func(t *testing.T) {
  1318  		list, err := ss.Channel().GetMoreChannels(teamId, userId, 0, 1)
  1319  		require.Nil(t, err)
  1320  		require.Equal(t, &model.ChannelList{&o3}, list)
  1321  	})
  1322  
  1323  	t.Run("only o6 listed in more channels with offset 1, limit 1", func(t *testing.T) {
  1324  		list, err := ss.Channel().GetMoreChannels(teamId, userId, 1, 1)
  1325  		require.Nil(t, err)
  1326  		require.Equal(t, &model.ChannelList{&o6}, list)
  1327  	})
  1328  
  1329  	t.Run("verify analytics for open channels", func(t *testing.T) {
  1330  		count, err := ss.Channel().AnalyticsTypeCount(teamId, model.CHANNEL_OPEN)
  1331  		require.Nil(t, err)
  1332  		require.EqualValues(t, 4, count)
  1333  	})
  1334  
  1335  	t.Run("verify analytics for private channels", func(t *testing.T) {
  1336  		count, err := ss.Channel().AnalyticsTypeCount(teamId, model.CHANNEL_PRIVATE)
  1337  		require.Nil(t, err)
  1338  		require.EqualValues(t, 2, count)
  1339  	})
  1340  }
  1341  
  1342  func testChannelStoreGetPublicChannelsForTeam(t *testing.T, ss store.Store) {
  1343  	teamId := model.NewId()
  1344  
  1345  	// o1 is a public channel on the team
  1346  	o1 := model.Channel{
  1347  		TeamId:      teamId,
  1348  		DisplayName: "OpenChannel1Team1",
  1349  		Name:        "zz" + model.NewId() + "b",
  1350  		Type:        model.CHANNEL_OPEN,
  1351  	}
  1352  	_, err := ss.Channel().Save(&o1, -1)
  1353  	require.Nil(t, err)
  1354  
  1355  	// o2 is a public channel on another team
  1356  	o2 := model.Channel{
  1357  		TeamId:      model.NewId(),
  1358  		DisplayName: "OpenChannel1Team2",
  1359  		Name:        "zz" + model.NewId() + "b",
  1360  		Type:        model.CHANNEL_OPEN,
  1361  	}
  1362  	_, err = ss.Channel().Save(&o2, -1)
  1363  	require.Nil(t, err)
  1364  
  1365  	// o3 is a private channel on the team
  1366  	o3 := model.Channel{
  1367  		TeamId:      teamId,
  1368  		DisplayName: "PrivateChannel1Team1",
  1369  		Name:        "zz" + model.NewId() + "b",
  1370  		Type:        model.CHANNEL_PRIVATE,
  1371  	}
  1372  	_, err = ss.Channel().Save(&o3, -1)
  1373  	require.Nil(t, err)
  1374  
  1375  	t.Run("only o1 initially listed in public channels", func(t *testing.T) {
  1376  		list, channelErr := ss.Channel().GetPublicChannelsForTeam(teamId, 0, 100)
  1377  		require.Nil(t, channelErr)
  1378  		require.Equal(t, &model.ChannelList{&o1}, list)
  1379  	})
  1380  
  1381  	// o4 is another public channel on the team
  1382  	o4 := model.Channel{
  1383  		TeamId:      teamId,
  1384  		DisplayName: "OpenChannel2Team1",
  1385  		Name:        "zz" + model.NewId() + "b",
  1386  		Type:        model.CHANNEL_OPEN,
  1387  	}
  1388  	_, err = ss.Channel().Save(&o4, -1)
  1389  	require.Nil(t, err)
  1390  
  1391  	// o5 is another public, but deleted channel on the team
  1392  	o5 := model.Channel{
  1393  		TeamId:      teamId,
  1394  		DisplayName: "OpenChannel3Team1",
  1395  		Name:        "zz" + model.NewId() + "b",
  1396  		Type:        model.CHANNEL_OPEN,
  1397  	}
  1398  	_, err = ss.Channel().Save(&o5, -1)
  1399  	require.Nil(t, err)
  1400  	err = ss.Channel().Delete(o5.Id, model.GetMillis())
  1401  	require.Nil(t, err, "channel should have been deleted")
  1402  
  1403  	t.Run("both o1 and o4 listed in public channels", func(t *testing.T) {
  1404  		list, err := ss.Channel().GetPublicChannelsForTeam(teamId, 0, 100)
  1405  		require.Nil(t, err)
  1406  		require.Equal(t, &model.ChannelList{&o1, &o4}, list)
  1407  	})
  1408  
  1409  	t.Run("only o1 listed in public channels with offset 0, limit 1", func(t *testing.T) {
  1410  		list, err := ss.Channel().GetPublicChannelsForTeam(teamId, 0, 1)
  1411  		require.Nil(t, err)
  1412  		require.Equal(t, &model.ChannelList{&o1}, list)
  1413  	})
  1414  
  1415  	t.Run("only o4 listed in public channels with offset 1, limit 1", func(t *testing.T) {
  1416  		list, err := ss.Channel().GetPublicChannelsForTeam(teamId, 1, 1)
  1417  		require.Nil(t, err)
  1418  		require.Equal(t, &model.ChannelList{&o4}, list)
  1419  	})
  1420  
  1421  	t.Run("verify analytics for open channels", func(t *testing.T) {
  1422  		count, err := ss.Channel().AnalyticsTypeCount(teamId, model.CHANNEL_OPEN)
  1423  		require.Nil(t, err)
  1424  		require.EqualValues(t, 3, count)
  1425  	})
  1426  
  1427  	t.Run("verify analytics for private channels", func(t *testing.T) {
  1428  		count, err := ss.Channel().AnalyticsTypeCount(teamId, model.CHANNEL_PRIVATE)
  1429  		require.Nil(t, err)
  1430  		require.EqualValues(t, 1, count)
  1431  	})
  1432  }
  1433  
  1434  func testChannelStoreGetPublicChannelsByIdsForTeam(t *testing.T, ss store.Store) {
  1435  	teamId := model.NewId()
  1436  
  1437  	// oc1 is a public channel on the team
  1438  	oc1 := model.Channel{
  1439  		TeamId:      teamId,
  1440  		DisplayName: "OpenChannel1Team1",
  1441  		Name:        "zz" + model.NewId() + "b",
  1442  		Type:        model.CHANNEL_OPEN,
  1443  	}
  1444  	_, err := ss.Channel().Save(&oc1, -1)
  1445  	require.Nil(t, err)
  1446  
  1447  	// oc2 is a public channel on another team
  1448  	oc2 := model.Channel{
  1449  		TeamId:      model.NewId(),
  1450  		DisplayName: "OpenChannel2TeamOther",
  1451  		Name:        "zz" + model.NewId() + "b",
  1452  		Type:        model.CHANNEL_OPEN,
  1453  	}
  1454  	_, err = ss.Channel().Save(&oc2, -1)
  1455  	require.Nil(t, err)
  1456  
  1457  	// pc3 is a private channel on the team
  1458  	pc3 := model.Channel{
  1459  		TeamId:      teamId,
  1460  		DisplayName: "PrivateChannel3Team1",
  1461  		Name:        "zz" + model.NewId() + "b",
  1462  		Type:        model.CHANNEL_PRIVATE,
  1463  	}
  1464  	_, err = ss.Channel().Save(&pc3, -1)
  1465  	require.Nil(t, err)
  1466  
  1467  	t.Run("oc1 by itself should be found as a public channel in the team", func(t *testing.T) {
  1468  		list, channelErr := ss.Channel().GetPublicChannelsByIdsForTeam(teamId, []string{oc1.Id})
  1469  		require.Nil(t, channelErr)
  1470  		require.Equal(t, &model.ChannelList{&oc1}, list)
  1471  	})
  1472  
  1473  	t.Run("only oc1, among others, should be found as a public channel in the team", func(t *testing.T) {
  1474  		list, channelErr := ss.Channel().GetPublicChannelsByIdsForTeam(teamId, []string{oc1.Id, oc2.Id, model.NewId(), pc3.Id})
  1475  		require.Nil(t, channelErr)
  1476  		require.Equal(t, &model.ChannelList{&oc1}, list)
  1477  	})
  1478  
  1479  	// oc4 is another public channel on the team
  1480  	oc4 := model.Channel{
  1481  		TeamId:      teamId,
  1482  		DisplayName: "OpenChannel4Team1",
  1483  		Name:        "zz" + model.NewId() + "b",
  1484  		Type:        model.CHANNEL_OPEN,
  1485  	}
  1486  	_, err = ss.Channel().Save(&oc4, -1)
  1487  	require.Nil(t, err)
  1488  
  1489  	// oc4 is another public, but deleted channel on the team
  1490  	oc5 := model.Channel{
  1491  		TeamId:      teamId,
  1492  		DisplayName: "OpenChannel4Team1",
  1493  		Name:        "zz" + model.NewId() + "b",
  1494  		Type:        model.CHANNEL_OPEN,
  1495  	}
  1496  	_, err = ss.Channel().Save(&oc5, -1)
  1497  	require.Nil(t, err)
  1498  
  1499  	err = ss.Channel().Delete(oc5.Id, model.GetMillis())
  1500  	require.Nil(t, err, "channel should have been deleted")
  1501  
  1502  	t.Run("only oc1 and oc4, among others, should be found as a public channel in the team", func(t *testing.T) {
  1503  		list, err := ss.Channel().GetPublicChannelsByIdsForTeam(teamId, []string{oc1.Id, oc2.Id, model.NewId(), pc3.Id, oc4.Id})
  1504  		require.Nil(t, err)
  1505  		require.Equal(t, &model.ChannelList{&oc1, &oc4}, list)
  1506  	})
  1507  
  1508  	t.Run("random channel id should not be found as a public channel in the team", func(t *testing.T) {
  1509  		_, err := ss.Channel().GetPublicChannelsByIdsForTeam(teamId, []string{model.NewId()})
  1510  		require.NotNil(t, err)
  1511  		require.Equal(t, err.Id, "store.sql_channel.get_channels_by_ids.not_found.app_error")
  1512  	})
  1513  }
  1514  
  1515  func testChannelStoreGetChannelCounts(t *testing.T, ss store.Store) {
  1516  	o2 := model.Channel{}
  1517  	o2.TeamId = model.NewId()
  1518  	o2.DisplayName = "Channel2"
  1519  	o2.Name = "zz" + model.NewId() + "b"
  1520  	o2.Type = model.CHANNEL_OPEN
  1521  	_, err := ss.Channel().Save(&o2, -1)
  1522  	require.Nil(t, err)
  1523  
  1524  	o1 := model.Channel{}
  1525  	o1.TeamId = model.NewId()
  1526  	o1.DisplayName = "Channel1"
  1527  	o1.Name = "zz" + model.NewId() + "b"
  1528  	o1.Type = model.CHANNEL_OPEN
  1529  	_, err = ss.Channel().Save(&o1, -1)
  1530  	require.Nil(t, err)
  1531  
  1532  	m1 := model.ChannelMember{}
  1533  	m1.ChannelId = o1.Id
  1534  	m1.UserId = model.NewId()
  1535  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
  1536  	store.Must(ss.Channel().SaveMember(&m1))
  1537  
  1538  	m2 := model.ChannelMember{}
  1539  	m2.ChannelId = o1.Id
  1540  	m2.UserId = model.NewId()
  1541  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
  1542  	store.Must(ss.Channel().SaveMember(&m2))
  1543  
  1544  	m3 := model.ChannelMember{}
  1545  	m3.ChannelId = o2.Id
  1546  	m3.UserId = model.NewId()
  1547  	m3.NotifyProps = model.GetDefaultChannelNotifyProps()
  1548  	store.Must(ss.Channel().SaveMember(&m3))
  1549  
  1550  	counts, _ := ss.Channel().GetChannelCounts(o1.TeamId, m1.UserId)
  1551  
  1552  	if len(counts.Counts) != 1 {
  1553  		t.Fatal("wrong number of counts")
  1554  	}
  1555  
  1556  	if len(counts.UpdateTimes) != 1 {
  1557  		t.Fatal("wrong number of update times")
  1558  	}
  1559  }
  1560  
  1561  func testChannelStoreGetMembersForUser(t *testing.T, ss store.Store) {
  1562  	t1 := model.Team{}
  1563  	t1.DisplayName = "Name"
  1564  	t1.Name = model.NewId()
  1565  	t1.Email = MakeEmail()
  1566  	t1.Type = model.TEAM_OPEN
  1567  	_, err := ss.Team().Save(&t1)
  1568  	require.Nil(t, err)
  1569  
  1570  	o1 := model.Channel{}
  1571  	o1.TeamId = t1.Id
  1572  	o1.DisplayName = "Channel1"
  1573  	o1.Name = "zz" + model.NewId() + "b"
  1574  	o1.Type = model.CHANNEL_OPEN
  1575  	_, err = ss.Channel().Save(&o1, -1)
  1576  	require.Nil(t, err)
  1577  
  1578  	o2 := model.Channel{}
  1579  	o2.TeamId = o1.TeamId
  1580  	o2.DisplayName = "Channel2"
  1581  	o2.Name = "zz" + model.NewId() + "b"
  1582  	o2.Type = model.CHANNEL_OPEN
  1583  	_, err = ss.Channel().Save(&o2, -1)
  1584  	require.Nil(t, err)
  1585  
  1586  	m1 := model.ChannelMember{}
  1587  	m1.ChannelId = o1.Id
  1588  	m1.UserId = model.NewId()
  1589  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
  1590  	store.Must(ss.Channel().SaveMember(&m1))
  1591  
  1592  	m2 := model.ChannelMember{}
  1593  	m2.ChannelId = o2.Id
  1594  	m2.UserId = m1.UserId
  1595  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
  1596  	store.Must(ss.Channel().SaveMember(&m2))
  1597  
  1598  	members, err := ss.Channel().GetMembersForUser(o1.TeamId, m1.UserId)
  1599  	require.Nil(t, err)
  1600  
  1601  	// no unread messages
  1602  	if len(*members) != 2 {
  1603  		t.Fatal("wrong number of members")
  1604  	}
  1605  }
  1606  
  1607  func testChannelStoreGetMembersForUserWithPagination(t *testing.T, ss store.Store) {
  1608  	t1 := model.Team{}
  1609  	t1.DisplayName = "Name"
  1610  	t1.Name = model.NewId()
  1611  	t1.Email = MakeEmail()
  1612  	t1.Type = model.TEAM_OPEN
  1613  	_, err := ss.Team().Save(&t1)
  1614  	require.Nil(t, err)
  1615  
  1616  	o1 := model.Channel{}
  1617  	o1.TeamId = t1.Id
  1618  	o1.DisplayName = "Channel1"
  1619  	o1.Name = "zz" + model.NewId() + "b"
  1620  	o1.Type = model.CHANNEL_OPEN
  1621  	_, err = ss.Channel().Save(&o1, -1)
  1622  	require.Nil(t, err)
  1623  
  1624  	o2 := model.Channel{}
  1625  	o2.TeamId = o1.TeamId
  1626  	o2.DisplayName = "Channel2"
  1627  	o2.Name = "zz" + model.NewId() + "b"
  1628  	o2.Type = model.CHANNEL_OPEN
  1629  	_, err = ss.Channel().Save(&o2, -1)
  1630  	require.Nil(t, err)
  1631  
  1632  	m1 := model.ChannelMember{}
  1633  	m1.ChannelId = o1.Id
  1634  	m1.UserId = model.NewId()
  1635  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
  1636  	store.Must(ss.Channel().SaveMember(&m1))
  1637  
  1638  	m2 := model.ChannelMember{}
  1639  	m2.ChannelId = o2.Id
  1640  	m2.UserId = m1.UserId
  1641  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
  1642  	store.Must(ss.Channel().SaveMember(&m2))
  1643  
  1644  	members, err := ss.Channel().GetMembersForUserWithPagination(o1.TeamId, m1.UserId, 0, 1)
  1645  	require.Nil(t, err)
  1646  	assert.Len(t, *members, 1)
  1647  
  1648  	members, err = ss.Channel().GetMembersForUserWithPagination(o1.TeamId, m1.UserId, 1, 1)
  1649  	require.Nil(t, err)
  1650  	assert.Len(t, *members, 1)
  1651  }
  1652  
  1653  func testChannelStoreUpdateLastViewedAt(t *testing.T, ss store.Store) {
  1654  	o1 := model.Channel{}
  1655  	o1.TeamId = model.NewId()
  1656  	o1.DisplayName = "Channel1"
  1657  	o1.Name = "zz" + model.NewId() + "b"
  1658  	o1.Type = model.CHANNEL_OPEN
  1659  	o1.TotalMsgCount = 25
  1660  	o1.LastPostAt = 12345
  1661  	_, err := ss.Channel().Save(&o1, -1)
  1662  	require.Nil(t, err)
  1663  
  1664  	m1 := model.ChannelMember{}
  1665  	m1.ChannelId = o1.Id
  1666  	m1.UserId = model.NewId()
  1667  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
  1668  	store.Must(ss.Channel().SaveMember(&m1))
  1669  
  1670  	o2 := model.Channel{}
  1671  	o2.TeamId = model.NewId()
  1672  	o2.DisplayName = "Channel1"
  1673  	o2.Name = "zz" + model.NewId() + "c"
  1674  	o2.Type = model.CHANNEL_OPEN
  1675  	o2.TotalMsgCount = 26
  1676  	o2.LastPostAt = 123456
  1677  	_, err = ss.Channel().Save(&o2, -1)
  1678  	require.Nil(t, err)
  1679  
  1680  	m2 := model.ChannelMember{}
  1681  	m2.ChannelId = o2.Id
  1682  	m2.UserId = m1.UserId
  1683  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
  1684  	store.Must(ss.Channel().SaveMember(&m2))
  1685  
  1686  	var times map[string]int64
  1687  	if times, err = ss.Channel().UpdateLastViewedAt([]string{m1.ChannelId}, m1.UserId); err != nil {
  1688  		t.Fatal("failed to update", err)
  1689  	} else if times[o1.Id] != o1.LastPostAt {
  1690  		t.Fatal("last viewed at time incorrect")
  1691  	}
  1692  
  1693  	if times, err = ss.Channel().UpdateLastViewedAt([]string{m1.ChannelId, m2.ChannelId}, m1.UserId); err != nil {
  1694  		t.Fatal("failed to update", err)
  1695  	} else if times[o2.Id] != o2.LastPostAt {
  1696  		t.Fatal("last viewed at time incorrect")
  1697  	}
  1698  
  1699  	rm1, err := ss.Channel().GetMember(m1.ChannelId, m1.UserId)
  1700  	assert.Nil(t, err)
  1701  	assert.Equal(t, rm1.LastViewedAt, o1.LastPostAt)
  1702  	assert.Equal(t, rm1.LastUpdateAt, o1.LastPostAt)
  1703  	assert.Equal(t, rm1.MsgCount, o1.TotalMsgCount)
  1704  
  1705  	rm2, err := ss.Channel().GetMember(m2.ChannelId, m2.UserId)
  1706  	assert.Nil(t, err)
  1707  	assert.Equal(t, rm2.LastViewedAt, o2.LastPostAt)
  1708  	assert.Equal(t, rm2.LastUpdateAt, o2.LastPostAt)
  1709  	assert.Equal(t, rm2.MsgCount, o2.TotalMsgCount)
  1710  
  1711  	if _, err := ss.Channel().UpdateLastViewedAt([]string{m1.ChannelId}, "missing id"); err != nil {
  1712  		t.Fatal("failed to update")
  1713  	}
  1714  }
  1715  
  1716  func testChannelStoreIncrementMentionCount(t *testing.T, ss store.Store) {
  1717  	o1 := model.Channel{}
  1718  	o1.TeamId = model.NewId()
  1719  	o1.DisplayName = "Channel1"
  1720  	o1.Name = "zz" + model.NewId() + "b"
  1721  	o1.Type = model.CHANNEL_OPEN
  1722  	o1.TotalMsgCount = 25
  1723  	_, err := ss.Channel().Save(&o1, -1)
  1724  	require.Nil(t, err)
  1725  
  1726  	m1 := model.ChannelMember{}
  1727  	m1.ChannelId = o1.Id
  1728  	m1.UserId = model.NewId()
  1729  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
  1730  	store.Must(ss.Channel().SaveMember(&m1))
  1731  
  1732  	err = ss.Channel().IncrementMentionCount(m1.ChannelId, m1.UserId)
  1733  	if err != nil {
  1734  		t.Fatal("failed to update")
  1735  	}
  1736  
  1737  	err = ss.Channel().IncrementMentionCount(m1.ChannelId, "missing id")
  1738  	if err != nil {
  1739  		t.Fatal("failed to update")
  1740  	}
  1741  
  1742  	err = ss.Channel().IncrementMentionCount("missing id", m1.UserId)
  1743  	if err != nil {
  1744  		t.Fatal("failed to update")
  1745  	}
  1746  
  1747  	err = ss.Channel().IncrementMentionCount("missing id", "missing id")
  1748  	if err != nil {
  1749  		t.Fatal("failed to update")
  1750  	}
  1751  }
  1752  
  1753  func testUpdateChannelMember(t *testing.T, ss store.Store) {
  1754  	userId := model.NewId()
  1755  
  1756  	c1 := &model.Channel{
  1757  		TeamId:      model.NewId(),
  1758  		DisplayName: model.NewId(),
  1759  		Name:        model.NewId(),
  1760  		Type:        model.CHANNEL_OPEN,
  1761  	}
  1762  	_, err := ss.Channel().Save(c1, -1)
  1763  	require.Nil(t, err)
  1764  
  1765  	m1 := &model.ChannelMember{
  1766  		ChannelId:   c1.Id,
  1767  		UserId:      userId,
  1768  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  1769  	}
  1770  	store.Must(ss.Channel().SaveMember(m1))
  1771  
  1772  	m1.NotifyProps["test"] = "sometext"
  1773  	if _, err := ss.Channel().UpdateMember(m1); err != nil {
  1774  		t.Fatal(err)
  1775  	}
  1776  
  1777  	m1.UserId = ""
  1778  	if _, err := ss.Channel().UpdateMember(m1); err == nil {
  1779  		t.Fatal("bad user id - should fail")
  1780  	}
  1781  }
  1782  
  1783  func testGetMember(t *testing.T, ss store.Store) {
  1784  	userId := model.NewId()
  1785  
  1786  	c1 := &model.Channel{
  1787  		TeamId:      model.NewId(),
  1788  		DisplayName: model.NewId(),
  1789  		Name:        model.NewId(),
  1790  		Type:        model.CHANNEL_OPEN,
  1791  	}
  1792  	_, err := ss.Channel().Save(c1, -1)
  1793  	require.Nil(t, err)
  1794  
  1795  	c2 := &model.Channel{
  1796  		TeamId:      c1.TeamId,
  1797  		DisplayName: model.NewId(),
  1798  		Name:        model.NewId(),
  1799  		Type:        model.CHANNEL_OPEN,
  1800  	}
  1801  	_, err = ss.Channel().Save(c2, -1)
  1802  	require.Nil(t, err)
  1803  
  1804  	m1 := &model.ChannelMember{
  1805  		ChannelId:   c1.Id,
  1806  		UserId:      userId,
  1807  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  1808  	}
  1809  	store.Must(ss.Channel().SaveMember(m1))
  1810  
  1811  	m2 := &model.ChannelMember{
  1812  		ChannelId:   c2.Id,
  1813  		UserId:      userId,
  1814  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  1815  	}
  1816  	store.Must(ss.Channel().SaveMember(m2))
  1817  
  1818  	if _, err := ss.Channel().GetMember(model.NewId(), userId); err == nil {
  1819  		t.Fatal("should've failed to get member for non-existent channel")
  1820  	}
  1821  
  1822  	if _, err := ss.Channel().GetMember(c1.Id, model.NewId()); err == nil {
  1823  		t.Fatal("should've failed to get member for non-existent user")
  1824  	}
  1825  
  1826  	if member, err := ss.Channel().GetMember(c1.Id, userId); err != nil {
  1827  		t.Fatal("shouldn't have errored when getting member", err)
  1828  	} else if member.ChannelId != c1.Id {
  1829  		t.Fatal("should've gotten member of channel 1")
  1830  	} else if member.UserId != userId {
  1831  		t.Fatal("should've gotten member for user")
  1832  	}
  1833  
  1834  	if member, err := ss.Channel().GetMember(c2.Id, userId); err != nil {
  1835  		t.Fatal("shouldn't have errored when getting member", err)
  1836  	} else if member.ChannelId != c2.Id {
  1837  		t.Fatal("should've gotten member of channel 2")
  1838  	} else if member.UserId != userId {
  1839  		t.Fatal("should've gotten member for user")
  1840  	}
  1841  
  1842  	if props, err := ss.Channel().GetAllChannelMembersNotifyPropsForChannel(c2.Id, false); err != nil {
  1843  		t.Fatal(err)
  1844  	} else if len(props) == 0 {
  1845  		t.Fatal("should not be empty")
  1846  	}
  1847  
  1848  	if props, err := ss.Channel().GetAllChannelMembersNotifyPropsForChannel(c2.Id, true); err != nil {
  1849  		t.Fatal(err)
  1850  	} else if len(props) == 0 {
  1851  		t.Fatal("should not be empty")
  1852  
  1853  	}
  1854  
  1855  	ss.Channel().InvalidateCacheForChannelMembersNotifyProps(c2.Id)
  1856  }
  1857  
  1858  func testChannelStoreGetMemberForPost(t *testing.T, ss store.Store) {
  1859  	ch := &model.Channel{
  1860  		TeamId:      model.NewId(),
  1861  		DisplayName: "Name",
  1862  		Name:        "zz" + model.NewId() + "b",
  1863  		Type:        model.CHANNEL_OPEN,
  1864  	}
  1865  
  1866  	o1, err := ss.Channel().Save(ch, -1)
  1867  	require.Nil(t, err)
  1868  
  1869  	m1 := store.Must(ss.Channel().SaveMember(&model.ChannelMember{
  1870  		ChannelId:   o1.Id,
  1871  		UserId:      model.NewId(),
  1872  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  1873  	})).(*model.ChannelMember)
  1874  
  1875  	p1, err := ss.Post().Save(&model.Post{
  1876  		UserId:    model.NewId(),
  1877  		ChannelId: o1.Id,
  1878  		Message:   "test",
  1879  	})
  1880  	require.Nil(t, err)
  1881  
  1882  	if r1, err := ss.Channel().GetMemberForPost(p1.Id, m1.UserId); err != nil {
  1883  		t.Fatal(err)
  1884  	} else if r1.ToJson() != m1.ToJson() {
  1885  		t.Fatal("invalid returned channel member")
  1886  	}
  1887  
  1888  	if _, err := ss.Channel().GetMemberForPost(p1.Id, model.NewId()); err == nil {
  1889  		t.Fatal("shouldn't have returned a member")
  1890  	}
  1891  }
  1892  
  1893  func testGetMemberCount(t *testing.T, ss store.Store) {
  1894  	teamId := model.NewId()
  1895  
  1896  	c1 := model.Channel{
  1897  		TeamId:      teamId,
  1898  		DisplayName: "Channel1",
  1899  		Name:        "zz" + model.NewId() + "b",
  1900  		Type:        model.CHANNEL_OPEN,
  1901  	}
  1902  	_, err := ss.Channel().Save(&c1, -1)
  1903  	require.Nil(t, err)
  1904  
  1905  	c2 := model.Channel{
  1906  		TeamId:      teamId,
  1907  		DisplayName: "Channel2",
  1908  		Name:        "zz" + model.NewId() + "b",
  1909  		Type:        model.CHANNEL_OPEN,
  1910  	}
  1911  	_, err = ss.Channel().Save(&c2, -1)
  1912  	require.Nil(t, err)
  1913  
  1914  	u1 := &model.User{
  1915  		Email:    MakeEmail(),
  1916  		DeleteAt: 0,
  1917  	}
  1918  	store.Must(ss.User().Save(u1))
  1919  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
  1920  
  1921  	m1 := model.ChannelMember{
  1922  		ChannelId:   c1.Id,
  1923  		UserId:      u1.Id,
  1924  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  1925  	}
  1926  	store.Must(ss.Channel().SaveMember(&m1))
  1927  
  1928  	if count, err := ss.Channel().GetMemberCount(c1.Id, false); err != nil {
  1929  		t.Fatalf("failed to get member count: %v", err)
  1930  	} else if count != 1 {
  1931  		t.Fatalf("got incorrect member count %v", count)
  1932  	}
  1933  
  1934  	u2 := model.User{
  1935  		Email:    MakeEmail(),
  1936  		DeleteAt: 0,
  1937  	}
  1938  	store.Must(ss.User().Save(&u2))
  1939  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1))
  1940  
  1941  	m2 := model.ChannelMember{
  1942  		ChannelId:   c1.Id,
  1943  		UserId:      u2.Id,
  1944  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  1945  	}
  1946  	store.Must(ss.Channel().SaveMember(&m2))
  1947  
  1948  	if count, err := ss.Channel().GetMemberCount(c1.Id, false); err != nil {
  1949  		t.Fatalf("failed to get member count: %v", err)
  1950  	} else if count != 2 {
  1951  		t.Fatalf("got incorrect member count %v", count)
  1952  	}
  1953  
  1954  	// make sure members of other channels aren't counted
  1955  	u3 := model.User{
  1956  		Email:    MakeEmail(),
  1957  		DeleteAt: 0,
  1958  	}
  1959  	store.Must(ss.User().Save(&u3))
  1960  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1))
  1961  
  1962  	m3 := model.ChannelMember{
  1963  		ChannelId:   c2.Id,
  1964  		UserId:      u3.Id,
  1965  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  1966  	}
  1967  	store.Must(ss.Channel().SaveMember(&m3))
  1968  
  1969  	if count, err := ss.Channel().GetMemberCount(c1.Id, false); err != nil {
  1970  		t.Fatalf("failed to get member count: %v", err)
  1971  	} else if count != 2 {
  1972  		t.Fatalf("got incorrect member count %v", count)
  1973  	}
  1974  
  1975  	// make sure inactive users aren't counted
  1976  	u4 := &model.User{
  1977  		Email:    MakeEmail(),
  1978  		DeleteAt: 10000,
  1979  	}
  1980  	store.Must(ss.User().Save(u4))
  1981  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u4.Id}, -1))
  1982  
  1983  	m4 := model.ChannelMember{
  1984  		ChannelId:   c1.Id,
  1985  		UserId:      u4.Id,
  1986  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  1987  	}
  1988  	store.Must(ss.Channel().SaveMember(&m4))
  1989  
  1990  	if count, err := ss.Channel().GetMemberCount(c1.Id, false); err != nil {
  1991  		t.Fatalf("failed to get member count: %v", err)
  1992  	} else if count != 2 {
  1993  		t.Fatalf("got incorrect member count %v", count)
  1994  	}
  1995  }
  1996  
  1997  func testChannelStoreSearchMore(t *testing.T, ss store.Store) {
  1998  	teamId := model.NewId()
  1999  	otherTeamId := model.NewId()
  2000  
  2001  	o1 := model.Channel{
  2002  		TeamId:      teamId,
  2003  		DisplayName: "ChannelA",
  2004  		Name:        "zz" + model.NewId() + "b",
  2005  		Type:        model.CHANNEL_OPEN,
  2006  	}
  2007  	_, err := ss.Channel().Save(&o1, -1)
  2008  	require.Nil(t, err)
  2009  
  2010  	m1 := model.ChannelMember{
  2011  		ChannelId:   o1.Id,
  2012  		UserId:      model.NewId(),
  2013  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  2014  	}
  2015  	store.Must(ss.Channel().SaveMember(&m1))
  2016  
  2017  	m2 := model.ChannelMember{
  2018  		ChannelId:   o1.Id,
  2019  		UserId:      model.NewId(),
  2020  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  2021  	}
  2022  	store.Must(ss.Channel().SaveMember(&m2))
  2023  
  2024  	o2 := model.Channel{
  2025  		TeamId:      otherTeamId,
  2026  		DisplayName: "Channel2",
  2027  		Name:        "zz" + model.NewId() + "b",
  2028  		Type:        model.CHANNEL_OPEN,
  2029  	}
  2030  	_, err = ss.Channel().Save(&o2, -1)
  2031  	require.Nil(t, err)
  2032  
  2033  	m3 := model.ChannelMember{
  2034  		ChannelId:   o2.Id,
  2035  		UserId:      model.NewId(),
  2036  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  2037  	}
  2038  	store.Must(ss.Channel().SaveMember(&m3))
  2039  
  2040  	o3 := model.Channel{
  2041  		TeamId:      teamId,
  2042  		DisplayName: "ChannelA",
  2043  		Name:        "zz" + model.NewId() + "b",
  2044  		Type:        model.CHANNEL_OPEN,
  2045  	}
  2046  	_, err = ss.Channel().Save(&o3, -1)
  2047  	require.Nil(t, err)
  2048  
  2049  	o4 := model.Channel{
  2050  		TeamId:      teamId,
  2051  		DisplayName: "ChannelB",
  2052  		Name:        "zz" + model.NewId() + "b",
  2053  		Type:        model.CHANNEL_PRIVATE,
  2054  	}
  2055  	_, err = ss.Channel().Save(&o4, -1)
  2056  	require.Nil(t, err)
  2057  
  2058  	o5 := model.Channel{
  2059  		TeamId:      teamId,
  2060  		DisplayName: "ChannelC",
  2061  		Name:        "zz" + model.NewId() + "b",
  2062  		Type:        model.CHANNEL_PRIVATE,
  2063  	}
  2064  	_, err = ss.Channel().Save(&o5, -1)
  2065  	require.Nil(t, err)
  2066  
  2067  	o6 := model.Channel{
  2068  		TeamId:      teamId,
  2069  		DisplayName: "Off-Topic",
  2070  		Name:        "off-topic",
  2071  		Type:        model.CHANNEL_OPEN,
  2072  	}
  2073  	_, err = ss.Channel().Save(&o6, -1)
  2074  	require.Nil(t, err)
  2075  
  2076  	o7 := model.Channel{
  2077  		TeamId:      teamId,
  2078  		DisplayName: "Off-Set",
  2079  		Name:        "off-set",
  2080  		Type:        model.CHANNEL_OPEN,
  2081  	}
  2082  	_, err = ss.Channel().Save(&o7, -1)
  2083  	require.Nil(t, err)
  2084  
  2085  	o8 := model.Channel{
  2086  		TeamId:      teamId,
  2087  		DisplayName: "Off-Limit",
  2088  		Name:        "off-limit",
  2089  		Type:        model.CHANNEL_PRIVATE,
  2090  	}
  2091  	_, err = ss.Channel().Save(&o8, -1)
  2092  	require.Nil(t, err)
  2093  
  2094  	o9 := model.Channel{
  2095  		TeamId:      teamId,
  2096  		DisplayName: "Channel With Purpose",
  2097  		Purpose:     "This can now be searchable!",
  2098  		Name:        "with-purpose",
  2099  		Type:        model.CHANNEL_OPEN,
  2100  	}
  2101  	_, err = ss.Channel().Save(&o9, -1)
  2102  	require.Nil(t, err)
  2103  
  2104  	o10 := model.Channel{
  2105  		TeamId:      teamId,
  2106  		DisplayName: "ChannelA",
  2107  		Name:        "channel-a-deleted",
  2108  		Type:        model.CHANNEL_OPEN,
  2109  	}
  2110  	_, err = ss.Channel().Save(&o10, -1)
  2111  	require.Nil(t, err)
  2112  
  2113  	o10.DeleteAt = model.GetMillis()
  2114  	o10.UpdateAt = o10.DeleteAt
  2115  	err = ss.Channel().Delete(o10.Id, model.GetMillis())
  2116  	require.Nil(t, err, "channel should have been deleted")
  2117  
  2118  	t.Run("three public channels matching 'ChannelA', but already a member of one and one deleted", func(t *testing.T) {
  2119  		channels, err := ss.Channel().SearchMore(m1.UserId, teamId, "ChannelA")
  2120  		require.Nil(t, err)
  2121  		require.Equal(t, &model.ChannelList{&o3}, channels)
  2122  	})
  2123  
  2124  	t.Run("one public channels, but already a member", func(t *testing.T) {
  2125  		channels, err := ss.Channel().SearchMore(m1.UserId, teamId, o4.Name)
  2126  		require.Nil(t, err)
  2127  		require.Equal(t, &model.ChannelList{}, channels)
  2128  	})
  2129  
  2130  	t.Run("three matching channels, but only two public", func(t *testing.T) {
  2131  		channels, err := ss.Channel().SearchMore(m1.UserId, teamId, "off-")
  2132  		require.Nil(t, err)
  2133  		require.Equal(t, &model.ChannelList{&o7, &o6}, channels)
  2134  	})
  2135  
  2136  	t.Run("one channel matching 'off-topic'", func(t *testing.T) {
  2137  		channels, err := ss.Channel().SearchMore(m1.UserId, teamId, "off-topic")
  2138  		require.Nil(t, err)
  2139  		require.Equal(t, &model.ChannelList{&o6}, channels)
  2140  	})
  2141  
  2142  	t.Run("search purpose", func(t *testing.T) {
  2143  		channels, err := ss.Channel().SearchMore(m1.UserId, teamId, "now searchable")
  2144  		require.Nil(t, err)
  2145  		require.Equal(t, &model.ChannelList{&o9}, channels)
  2146  	})
  2147  }
  2148  
  2149  type ByChannelDisplayName model.ChannelList
  2150  
  2151  func (s ByChannelDisplayName) Len() int { return len(s) }
  2152  func (s ByChannelDisplayName) Swap(i, j int) {
  2153  	s[i], s[j] = s[j], s[i]
  2154  }
  2155  func (s ByChannelDisplayName) Less(i, j int) bool {
  2156  	if s[i].DisplayName != s[j].DisplayName {
  2157  		return s[i].DisplayName < s[j].DisplayName
  2158  	}
  2159  
  2160  	return s[i].Id < s[j].Id
  2161  }
  2162  
  2163  func testChannelStoreSearchInTeam(t *testing.T, ss store.Store) {
  2164  	teamId := model.NewId()
  2165  	otherTeamId := model.NewId()
  2166  
  2167  	o1 := model.Channel{
  2168  		TeamId:      teamId,
  2169  		DisplayName: "ChannelA",
  2170  		Name:        "zz" + model.NewId() + "b",
  2171  		Type:        model.CHANNEL_OPEN,
  2172  	}
  2173  	_, err := ss.Channel().Save(&o1, -1)
  2174  	require.Nil(t, err)
  2175  
  2176  	o2 := model.Channel{
  2177  		TeamId:      otherTeamId,
  2178  		DisplayName: "ChannelA",
  2179  		Name:        "zz" + model.NewId() + "b",
  2180  		Type:        model.CHANNEL_OPEN,
  2181  	}
  2182  	_, err = ss.Channel().Save(&o2, -1)
  2183  	require.Nil(t, err)
  2184  
  2185  	m1 := model.ChannelMember{
  2186  		ChannelId:   o1.Id,
  2187  		UserId:      model.NewId(),
  2188  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  2189  	}
  2190  	store.Must(ss.Channel().SaveMember(&m1))
  2191  
  2192  	m2 := model.ChannelMember{
  2193  		ChannelId:   o1.Id,
  2194  		UserId:      model.NewId(),
  2195  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  2196  	}
  2197  	store.Must(ss.Channel().SaveMember(&m2))
  2198  
  2199  	m3 := model.ChannelMember{
  2200  		ChannelId:   o2.Id,
  2201  		UserId:      model.NewId(),
  2202  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  2203  	}
  2204  	store.Must(ss.Channel().SaveMember(&m3))
  2205  
  2206  	o3 := model.Channel{
  2207  		TeamId:      teamId,
  2208  		DisplayName: "ChannelA (alternate)",
  2209  		Name:        "zz" + model.NewId() + "b",
  2210  		Type:        model.CHANNEL_OPEN,
  2211  	}
  2212  	_, err = ss.Channel().Save(&o3, -1)
  2213  	require.Nil(t, err)
  2214  
  2215  	o4 := model.Channel{
  2216  		TeamId:      teamId,
  2217  		DisplayName: "Channel B",
  2218  		Name:        "zz" + model.NewId() + "b",
  2219  		Type:        model.CHANNEL_PRIVATE,
  2220  	}
  2221  	_, err = ss.Channel().Save(&o4, -1)
  2222  	require.Nil(t, err)
  2223  
  2224  	o5 := model.Channel{
  2225  		TeamId:      teamId,
  2226  		DisplayName: "Channel C",
  2227  		Name:        "zz" + model.NewId() + "b",
  2228  		Type:        model.CHANNEL_PRIVATE,
  2229  	}
  2230  	_, err = ss.Channel().Save(&o5, -1)
  2231  	require.Nil(t, err)
  2232  
  2233  	o6 := model.Channel{
  2234  		TeamId:      teamId,
  2235  		DisplayName: "Off-Topic",
  2236  		Name:        "off-topic",
  2237  		Type:        model.CHANNEL_OPEN,
  2238  	}
  2239  	_, err = ss.Channel().Save(&o6, -1)
  2240  	require.Nil(t, err)
  2241  
  2242  	o7 := model.Channel{
  2243  		TeamId:      teamId,
  2244  		DisplayName: "Off-Set",
  2245  		Name:        "off-set",
  2246  		Type:        model.CHANNEL_OPEN,
  2247  	}
  2248  	_, err = ss.Channel().Save(&o7, -1)
  2249  	require.Nil(t, err)
  2250  
  2251  	o8 := model.Channel{
  2252  		TeamId:      teamId,
  2253  		DisplayName: "Off-Limit",
  2254  		Name:        "off-limit",
  2255  		Type:        model.CHANNEL_PRIVATE,
  2256  	}
  2257  	_, err = ss.Channel().Save(&o8, -1)
  2258  	require.Nil(t, err)
  2259  
  2260  	o9 := model.Channel{
  2261  		TeamId:      teamId,
  2262  		DisplayName: "Town Square",
  2263  		Name:        "town-square",
  2264  		Type:        model.CHANNEL_OPEN,
  2265  	}
  2266  	_, err = ss.Channel().Save(&o9, -1)
  2267  	require.Nil(t, err)
  2268  
  2269  	o10 := model.Channel{
  2270  		TeamId:      teamId,
  2271  		DisplayName: "The",
  2272  		Name:        "the",
  2273  		Type:        model.CHANNEL_OPEN,
  2274  	}
  2275  	_, err = ss.Channel().Save(&o10, -1)
  2276  	require.Nil(t, err)
  2277  
  2278  	o11 := model.Channel{
  2279  		TeamId:      teamId,
  2280  		DisplayName: "Native Mobile Apps",
  2281  		Name:        "native-mobile-apps",
  2282  		Type:        model.CHANNEL_OPEN,
  2283  	}
  2284  	_, err = ss.Channel().Save(&o11, -1)
  2285  	require.Nil(t, err)
  2286  
  2287  	o12 := model.Channel{
  2288  		TeamId:      teamId,
  2289  		DisplayName: "ChannelZ",
  2290  		Purpose:     "This can now be searchable!",
  2291  		Name:        "with-purpose",
  2292  		Type:        model.CHANNEL_OPEN,
  2293  	}
  2294  	_, err = ss.Channel().Save(&o12, -1)
  2295  	require.Nil(t, err)
  2296  
  2297  	o13 := model.Channel{
  2298  		TeamId:      teamId,
  2299  		DisplayName: "ChannelA (deleted)",
  2300  		Name:        model.NewId(),
  2301  		Type:        model.CHANNEL_OPEN,
  2302  	}
  2303  	_, err = ss.Channel().Save(&o13, -1)
  2304  	require.Nil(t, err)
  2305  	o13.DeleteAt = model.GetMillis()
  2306  	o13.UpdateAt = o13.DeleteAt
  2307  	err = ss.Channel().Delete(o13.Id, model.GetMillis())
  2308  	require.Nil(t, err, "channel should have been deleted")
  2309  
  2310  	testCases := []struct {
  2311  		Description     string
  2312  		TeamId          string
  2313  		Term            string
  2314  		IncludeDeleted  bool
  2315  		ExpectedResults *model.ChannelList
  2316  	}{
  2317  		{"ChannelA", teamId, "ChannelA", false, &model.ChannelList{&o1, &o3}},
  2318  		{"ChannelA, include deleted", teamId, "ChannelA", true, &model.ChannelList{&o1, &o3, &o13}},
  2319  		{"ChannelA, other team", otherTeamId, "ChannelA", false, &model.ChannelList{&o2}},
  2320  		{"empty string", teamId, "", false, &model.ChannelList{&o1, &o3, &o12, &o11, &o7, &o6, &o10, &o9}},
  2321  		{"no matches", teamId, "blargh", false, &model.ChannelList{}},
  2322  		{"prefix", teamId, "off-", false, &model.ChannelList{&o7, &o6}},
  2323  		{"full match with dash", teamId, "off-topic", false, &model.ChannelList{&o6}},
  2324  		{"town square", teamId, "town square", false, &model.ChannelList{&o9}},
  2325  		{"the in name", teamId, "the", false, &model.ChannelList{&o10}},
  2326  		{"Mobile", teamId, "Mobile", false, &model.ChannelList{&o11}},
  2327  		{"search purpose", teamId, "now searchable", false, &model.ChannelList{&o12}},
  2328  		{"pipe ignored", teamId, "town square |", false, &model.ChannelList{&o9}},
  2329  	}
  2330  
  2331  	for name, search := range map[string]func(teamId string, term string, includeDeleted bool) (*model.ChannelList, *model.AppError){
  2332  		"AutocompleteInTeam": ss.Channel().AutocompleteInTeam,
  2333  		"SearchInTeam":       ss.Channel().SearchInTeam,
  2334  	} {
  2335  		for _, testCase := range testCases {
  2336  			t.Run(testCase.Description, func(t *testing.T) {
  2337  				channels, err := search(testCase.TeamId, testCase.Term, testCase.IncludeDeleted)
  2338  				require.Nil(t, err)
  2339  
  2340  				// AutoCompleteInTeam doesn't currently sort its output results.
  2341  				if name == "AutocompleteInTeam" {
  2342  					sort.Sort(ByChannelDisplayName(*channels))
  2343  				}
  2344  
  2345  				require.Equal(t, testCase.ExpectedResults, channels)
  2346  			})
  2347  		}
  2348  	}
  2349  }
  2350  
  2351  func testChannelStoreSearchAllChannels(t *testing.T, ss store.Store) {
  2352  	cleanupChannels(t, ss)
  2353  
  2354  	t1 := model.Team{}
  2355  	t1.DisplayName = "Name"
  2356  	t1.Name = model.NewId()
  2357  	t1.Email = MakeEmail()
  2358  	t1.Type = model.TEAM_OPEN
  2359  	_, err := ss.Team().Save(&t1)
  2360  	require.Nil(t, err)
  2361  
  2362  	t2 := model.Team{}
  2363  	t2.DisplayName = "Name2"
  2364  	t2.Name = model.NewId()
  2365  	t2.Email = MakeEmail()
  2366  	t2.Type = model.TEAM_OPEN
  2367  	_, err = ss.Team().Save(&t2)
  2368  	require.Nil(t, err)
  2369  
  2370  	o1 := model.Channel{
  2371  		TeamId:      t1.Id,
  2372  		DisplayName: "ChannelA",
  2373  		Name:        "zz" + model.NewId() + "b",
  2374  		Type:        model.CHANNEL_OPEN,
  2375  	}
  2376  	_, err = ss.Channel().Save(&o1, -1)
  2377  	require.Nil(t, err)
  2378  
  2379  	o2 := model.Channel{
  2380  		TeamId:      t2.Id,
  2381  		DisplayName: "ChannelA",
  2382  		Name:        "zz" + model.NewId() + "b",
  2383  		Type:        model.CHANNEL_OPEN,
  2384  	}
  2385  	_, err = ss.Channel().Save(&o2, -1)
  2386  	require.Nil(t, err)
  2387  
  2388  	m1 := model.ChannelMember{
  2389  		ChannelId:   o1.Id,
  2390  		UserId:      model.NewId(),
  2391  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  2392  	}
  2393  	store.Must(ss.Channel().SaveMember(&m1))
  2394  
  2395  	m2 := model.ChannelMember{
  2396  		ChannelId:   o1.Id,
  2397  		UserId:      model.NewId(),
  2398  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  2399  	}
  2400  	store.Must(ss.Channel().SaveMember(&m2))
  2401  
  2402  	m3 := model.ChannelMember{
  2403  		ChannelId:   o2.Id,
  2404  		UserId:      model.NewId(),
  2405  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  2406  	}
  2407  	store.Must(ss.Channel().SaveMember(&m3))
  2408  
  2409  	o3 := model.Channel{
  2410  		TeamId:      t1.Id,
  2411  		DisplayName: "ChannelA (alternate)",
  2412  		Name:        "zz" + model.NewId() + "b",
  2413  		Type:        model.CHANNEL_OPEN,
  2414  	}
  2415  	_, err = ss.Channel().Save(&o3, -1)
  2416  	require.Nil(t, err)
  2417  
  2418  	o4 := model.Channel{
  2419  		TeamId:      t1.Id,
  2420  		DisplayName: "ChannelB",
  2421  		Name:        "zz" + model.NewId() + "b",
  2422  		Type:        model.CHANNEL_PRIVATE,
  2423  	}
  2424  	_, err = ss.Channel().Save(&o4, -1)
  2425  	require.Nil(t, err)
  2426  
  2427  	o5 := model.Channel{
  2428  		TeamId:      t1.Id,
  2429  		DisplayName: "ChannelC",
  2430  		Name:        "zz" + model.NewId() + "b",
  2431  		Type:        model.CHANNEL_PRIVATE,
  2432  	}
  2433  	_, err = ss.Channel().Save(&o5, -1)
  2434  	require.Nil(t, err)
  2435  
  2436  	o6 := model.Channel{
  2437  		TeamId:      t1.Id,
  2438  		DisplayName: "Off-Topic",
  2439  		Name:        "off-topic",
  2440  		Type:        model.CHANNEL_OPEN,
  2441  	}
  2442  	_, err = ss.Channel().Save(&o6, -1)
  2443  	require.Nil(t, err)
  2444  
  2445  	o7 := model.Channel{
  2446  		TeamId:      t1.Id,
  2447  		DisplayName: "Off-Set",
  2448  		Name:        "off-set",
  2449  		Type:        model.CHANNEL_OPEN,
  2450  	}
  2451  	_, err = ss.Channel().Save(&o7, -1)
  2452  	require.Nil(t, err)
  2453  
  2454  	group := &model.Group{
  2455  		Name:        model.NewId(),
  2456  		DisplayName: model.NewId(),
  2457  		Source:      model.GroupSourceLdap,
  2458  		RemoteId:    model.NewId(),
  2459  	}
  2460  	store.Must(ss.Group().Create(group))
  2461  	_, err = ss.Group().CreateGroupSyncable(model.NewGroupChannel(group.Id, o7.Id, true))
  2462  	require.Nil(t, err)
  2463  
  2464  	o8 := model.Channel{
  2465  		TeamId:      t1.Id,
  2466  		DisplayName: "Off-Limit",
  2467  		Name:        "off-limit",
  2468  		Type:        model.CHANNEL_PRIVATE,
  2469  	}
  2470  	_, err = ss.Channel().Save(&o8, -1)
  2471  	require.Nil(t, err)
  2472  
  2473  	o9 := model.Channel{
  2474  		TeamId:      t1.Id,
  2475  		DisplayName: "Town Square",
  2476  		Name:        "town-square",
  2477  		Type:        model.CHANNEL_OPEN,
  2478  	}
  2479  	_, err = ss.Channel().Save(&o9, -1)
  2480  	require.Nil(t, err)
  2481  
  2482  	o10 := model.Channel{
  2483  		TeamId:      t1.Id,
  2484  		DisplayName: "The",
  2485  		Name:        "the",
  2486  		Type:        model.CHANNEL_OPEN,
  2487  	}
  2488  	_, err = ss.Channel().Save(&o10, -1)
  2489  	require.Nil(t, err)
  2490  
  2491  	o11 := model.Channel{
  2492  		TeamId:      t1.Id,
  2493  		DisplayName: "Native Mobile Apps",
  2494  		Name:        "native-mobile-apps",
  2495  		Type:        model.CHANNEL_OPEN,
  2496  	}
  2497  	_, err = ss.Channel().Save(&o11, -1)
  2498  	require.Nil(t, err)
  2499  
  2500  	o12 := model.Channel{
  2501  		TeamId:      t1.Id,
  2502  		DisplayName: "ChannelZ",
  2503  		Purpose:     "This can now be searchable!",
  2504  		Name:        "with-purpose",
  2505  		Type:        model.CHANNEL_OPEN,
  2506  	}
  2507  	_, err = ss.Channel().Save(&o12, -1)
  2508  	require.Nil(t, err)
  2509  
  2510  	o13 := model.Channel{
  2511  		TeamId:      t1.Id,
  2512  		DisplayName: "ChannelA (deleted)",
  2513  		Name:        model.NewId(),
  2514  		Type:        model.CHANNEL_OPEN,
  2515  	}
  2516  	_, err = ss.Channel().Save(&o13, -1)
  2517  	require.Nil(t, err)
  2518  
  2519  	o13.DeleteAt = model.GetMillis()
  2520  	o13.UpdateAt = o13.DeleteAt
  2521  	err = ss.Channel().Delete(o13.Id, o13.DeleteAt)
  2522  	require.Nil(t, err, "channel should have been deleted")
  2523  
  2524  	testCases := []struct {
  2525  		Description     string
  2526  		Term            string
  2527  		Opts            store.ChannelSearchOpts
  2528  		ExpectedResults *model.ChannelList
  2529  	}{
  2530  		{"ChannelA", "ChannelA", store.ChannelSearchOpts{IncludeDeleted: false}, &model.ChannelList{&o1, &o2, &o3}},
  2531  		{"ChannelA, include deleted", "ChannelA", store.ChannelSearchOpts{IncludeDeleted: true}, &model.ChannelList{&o1, &o2, &o3, &o13}},
  2532  		{"empty string", "", store.ChannelSearchOpts{IncludeDeleted: false}, &model.ChannelList{&o1, &o2, &o3, &o4, &o5, &o12, &o11, &o8, &o7, &o6, &o10, &o9}},
  2533  		{"no matches", "blargh", store.ChannelSearchOpts{IncludeDeleted: false}, &model.ChannelList{}},
  2534  		{"prefix", "off-", store.ChannelSearchOpts{IncludeDeleted: false}, &model.ChannelList{&o8, &o7, &o6}},
  2535  		{"full match with dash", "off-topic", store.ChannelSearchOpts{IncludeDeleted: false}, &model.ChannelList{&o6}},
  2536  		{"town square", "town square", store.ChannelSearchOpts{IncludeDeleted: false}, &model.ChannelList{&o9}},
  2537  		{"the in name", "the", store.ChannelSearchOpts{IncludeDeleted: false}, &model.ChannelList{&o10}},
  2538  		{"Mobile", "Mobile", store.ChannelSearchOpts{IncludeDeleted: false}, &model.ChannelList{&o11}},
  2539  		{"search purpose", "now searchable", store.ChannelSearchOpts{IncludeDeleted: false}, &model.ChannelList{&o12}},
  2540  		{"pipe ignored", "town square |", store.ChannelSearchOpts{IncludeDeleted: false}, &model.ChannelList{&o9}},
  2541  		{"exclude defaults search 'off'", "off-", store.ChannelSearchOpts{IncludeDeleted: false, ExcludeChannelNames: []string{"off-topic"}}, &model.ChannelList{&o8, &o7}},
  2542  		{"exclude defaults search 'town'", "town", store.ChannelSearchOpts{IncludeDeleted: false, ExcludeChannelNames: []string{"town-square"}}, &model.ChannelList{}},
  2543  		{"exclude by group association", "off", store.ChannelSearchOpts{IncludeDeleted: false, NotAssociatedToGroup: group.Id}, &model.ChannelList{&o8, &o6}},
  2544  	}
  2545  
  2546  	for _, testCase := range testCases {
  2547  		t.Run(testCase.Description, func(t *testing.T) {
  2548  			channels, err := ss.Channel().SearchAllChannels(testCase.Term, testCase.Opts)
  2549  			require.Nil(t, err)
  2550  			require.Equal(t, len(*testCase.ExpectedResults), len(*channels))
  2551  			for i, expected := range *testCase.ExpectedResults {
  2552  				require.Equal(t, (*channels)[i].Id, expected.Id)
  2553  			}
  2554  		})
  2555  	}
  2556  }
  2557  
  2558  func testChannelStoreAutocompleteInTeamForSearch(t *testing.T, ss store.Store, s SqlSupplier) {
  2559  	u1 := &model.User{}
  2560  	u1.Email = MakeEmail()
  2561  	u1.Username = "user1" + model.NewId()
  2562  	u1.Nickname = model.NewId()
  2563  	store.Must(ss.User().Save(u1))
  2564  
  2565  	u2 := &model.User{}
  2566  	u2.Email = MakeEmail()
  2567  	u2.Username = "user2" + model.NewId()
  2568  	u2.Nickname = model.NewId()
  2569  	store.Must(ss.User().Save(u2))
  2570  
  2571  	u3 := &model.User{}
  2572  	u3.Email = MakeEmail()
  2573  	u3.Username = "user3" + model.NewId()
  2574  	u3.Nickname = model.NewId()
  2575  	store.Must(ss.User().Save(u3))
  2576  
  2577  	u4 := &model.User{}
  2578  	u4.Email = MakeEmail()
  2579  	u4.Username = "user4" + model.NewId()
  2580  	u4.Nickname = model.NewId()
  2581  	store.Must(ss.User().Save(u4))
  2582  
  2583  	o1 := model.Channel{}
  2584  	o1.TeamId = model.NewId()
  2585  	o1.DisplayName = "ChannelA"
  2586  	o1.Name = "zz" + model.NewId() + "b"
  2587  	o1.Type = model.CHANNEL_OPEN
  2588  	_, err := ss.Channel().Save(&o1, -1)
  2589  	require.Nil(t, err)
  2590  
  2591  	m1 := model.ChannelMember{}
  2592  	m1.ChannelId = o1.Id
  2593  	m1.UserId = u1.Id
  2594  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
  2595  	store.Must(ss.Channel().SaveMember(&m1))
  2596  
  2597  	o2 := model.Channel{}
  2598  	o2.TeamId = model.NewId()
  2599  	o2.DisplayName = "Channel2"
  2600  	o2.Name = "zz" + model.NewId() + "b"
  2601  	o2.Type = model.CHANNEL_OPEN
  2602  	_, err = ss.Channel().Save(&o2, -1)
  2603  	require.Nil(t, err)
  2604  
  2605  	m2 := model.ChannelMember{}
  2606  	m2.ChannelId = o2.Id
  2607  	m2.UserId = m1.UserId
  2608  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
  2609  	store.Must(ss.Channel().SaveMember(&m2))
  2610  
  2611  	o3 := model.Channel{}
  2612  	o3.TeamId = o1.TeamId
  2613  	o3.DisplayName = "ChannelA"
  2614  	o3.Name = "zz" + model.NewId() + "b"
  2615  	o3.Type = model.CHANNEL_OPEN
  2616  	_, err = ss.Channel().Save(&o3, -1)
  2617  	require.Nil(t, err)
  2618  
  2619  	m3 := model.ChannelMember{}
  2620  	m3.ChannelId = o3.Id
  2621  	m3.UserId = m1.UserId
  2622  	m3.NotifyProps = model.GetDefaultChannelNotifyProps()
  2623  	store.Must(ss.Channel().SaveMember(&m3))
  2624  
  2625  	err = ss.Channel().SetDeleteAt(o3.Id, 100, 100)
  2626  	require.Nil(t, err, "channel should have been deleted")
  2627  
  2628  	o4 := model.Channel{}
  2629  	o4.TeamId = o1.TeamId
  2630  	o4.DisplayName = "ChannelA"
  2631  	o4.Name = "zz" + model.NewId() + "b"
  2632  	o4.Type = model.CHANNEL_PRIVATE
  2633  	_, err = ss.Channel().Save(&o4, -1)
  2634  	require.Nil(t, err)
  2635  
  2636  	m4 := model.ChannelMember{}
  2637  	m4.ChannelId = o4.Id
  2638  	m4.UserId = m1.UserId
  2639  	m4.NotifyProps = model.GetDefaultChannelNotifyProps()
  2640  	store.Must(ss.Channel().SaveMember(&m4))
  2641  
  2642  	o5 := model.Channel{}
  2643  	o5.TeamId = o1.TeamId
  2644  	o5.DisplayName = "ChannelC"
  2645  	o5.Name = "zz" + model.NewId() + "b"
  2646  	o5.Type = model.CHANNEL_PRIVATE
  2647  	_, err = ss.Channel().Save(&o5, -1)
  2648  	require.Nil(t, err)
  2649  
  2650  	_, err = ss.Channel().CreateDirectChannel(u1.Id, u2.Id)
  2651  	require.Nil(t, err)
  2652  	_, err = ss.Channel().CreateDirectChannel(u2.Id, u3.Id)
  2653  	require.Nil(t, err)
  2654  
  2655  	tt := []struct {
  2656  		name            string
  2657  		term            string
  2658  		includeDeleted  bool
  2659  		expectedMatches int
  2660  	}{
  2661  		{"Empty search (list all)", "", false, 4},
  2662  		{"Narrow search", "ChannelA", false, 2},
  2663  		{"Wide search", "Cha", false, 3},
  2664  		{"Direct messages", "user", false, 1},
  2665  		{"Wide search with archived channels", "Cha", true, 4},
  2666  		{"Narrow with archived channels", "ChannelA", true, 3},
  2667  		{"Direct messages with archived channels", "user", true, 1},
  2668  		{"Search without results", "blarg", true, 0},
  2669  	}
  2670  
  2671  	for _, tc := range tt {
  2672  		t.Run(tc.name, func(t *testing.T) {
  2673  			channels, err := ss.Channel().AutocompleteInTeamForSearch(o1.TeamId, m1.UserId, "ChannelA", false)
  2674  			require.Nil(t, err)
  2675  			require.Len(t, *channels, 2)
  2676  		})
  2677  	}
  2678  
  2679  	// Manually truncate Channels table until testlib can handle cleanups
  2680  	s.GetMaster().Exec("TRUNCATE Channels")
  2681  }
  2682  
  2683  func testChannelStoreGetMembersByIds(t *testing.T, ss store.Store) {
  2684  	o1 := model.Channel{}
  2685  	o1.TeamId = model.NewId()
  2686  	o1.DisplayName = "ChannelA"
  2687  	o1.Name = "zz" + model.NewId() + "b"
  2688  	o1.Type = model.CHANNEL_OPEN
  2689  	_, err := ss.Channel().Save(&o1, -1)
  2690  	require.Nil(t, err)
  2691  
  2692  	m1 := &model.ChannelMember{ChannelId: o1.Id, UserId: model.NewId(), NotifyProps: model.GetDefaultChannelNotifyProps()}
  2693  	store.Must(ss.Channel().SaveMember(m1))
  2694  
  2695  	if members, err := ss.Channel().GetMembersByIds(m1.ChannelId, []string{m1.UserId}); err != nil {
  2696  		t.Fatal(err)
  2697  	} else {
  2698  		rm1 := (*members)[0]
  2699  
  2700  		if rm1.ChannelId != m1.ChannelId {
  2701  			t.Fatal("bad team id")
  2702  		}
  2703  
  2704  		if rm1.UserId != m1.UserId {
  2705  			t.Fatal("bad user id")
  2706  		}
  2707  	}
  2708  
  2709  	m2 := &model.ChannelMember{ChannelId: o1.Id, UserId: model.NewId(), NotifyProps: model.GetDefaultChannelNotifyProps()}
  2710  	store.Must(ss.Channel().SaveMember(m2))
  2711  
  2712  	if members, err := ss.Channel().GetMembersByIds(m1.ChannelId, []string{m1.UserId, m2.UserId, model.NewId()}); err != nil {
  2713  		t.Fatal(err)
  2714  	} else {
  2715  		if len(*members) != 2 {
  2716  			t.Fatal("return wrong number of results")
  2717  		}
  2718  	}
  2719  
  2720  	if _, err := ss.Channel().GetMembersByIds(m1.ChannelId, []string{}); err == nil {
  2721  		t.Fatal("empty user ids - should have failed")
  2722  	}
  2723  }
  2724  
  2725  func testChannelStoreSearchGroupChannels(t *testing.T, ss store.Store) {
  2726  	// Users
  2727  	u1 := &model.User{}
  2728  	u1.Username = "user.one"
  2729  	u1.Email = MakeEmail()
  2730  	u1.Nickname = model.NewId()
  2731  	store.Must(ss.User().Save(u1))
  2732  
  2733  	u2 := &model.User{}
  2734  	u2.Username = "user.two"
  2735  	u2.Email = MakeEmail()
  2736  	u2.Nickname = model.NewId()
  2737  	store.Must(ss.User().Save(u2))
  2738  
  2739  	u3 := &model.User{}
  2740  	u3.Username = "user.three"
  2741  	u3.Email = MakeEmail()
  2742  	u3.Nickname = model.NewId()
  2743  	store.Must(ss.User().Save(u3))
  2744  
  2745  	u4 := &model.User{}
  2746  	u4.Username = "user.four"
  2747  	u4.Email = MakeEmail()
  2748  	u4.Nickname = model.NewId()
  2749  	store.Must(ss.User().Save(u4))
  2750  
  2751  	// Group channels
  2752  	userIds := []string{u1.Id, u2.Id, u3.Id}
  2753  	gc1 := model.Channel{}
  2754  	gc1.Name = model.GetGroupNameFromUserIds(userIds)
  2755  	gc1.DisplayName = "GroupChannel" + model.NewId()
  2756  	gc1.Type = model.CHANNEL_GROUP
  2757  	_, err := ss.Channel().Save(&gc1, -1)
  2758  	require.Nil(t, err)
  2759  
  2760  	for _, userId := range userIds {
  2761  		store.Must(ss.Channel().SaveMember(&model.ChannelMember{
  2762  			ChannelId:   gc1.Id,
  2763  			UserId:      userId,
  2764  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  2765  		}))
  2766  	}
  2767  
  2768  	userIds = []string{u1.Id, u4.Id}
  2769  	gc2 := model.Channel{}
  2770  	gc2.Name = model.GetGroupNameFromUserIds(userIds)
  2771  	gc2.DisplayName = "GroupChannel" + model.NewId()
  2772  	gc2.Type = model.CHANNEL_GROUP
  2773  	_, err = ss.Channel().Save(&gc2, -1)
  2774  	require.Nil(t, err)
  2775  
  2776  	for _, userId := range userIds {
  2777  		store.Must(ss.Channel().SaveMember(&model.ChannelMember{
  2778  			ChannelId:   gc2.Id,
  2779  			UserId:      userId,
  2780  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  2781  		}))
  2782  	}
  2783  
  2784  	userIds = []string{u1.Id, u2.Id, u3.Id, u4.Id}
  2785  	gc3 := model.Channel{}
  2786  	gc3.Name = model.GetGroupNameFromUserIds(userIds)
  2787  	gc3.DisplayName = "GroupChannel" + model.NewId()
  2788  	gc3.Type = model.CHANNEL_GROUP
  2789  	_, err = ss.Channel().Save(&gc3, -1)
  2790  	require.Nil(t, err)
  2791  
  2792  	for _, userId := range userIds {
  2793  		store.Must(ss.Channel().SaveMember(&model.ChannelMember{
  2794  			ChannelId:   gc3.Id,
  2795  			UserId:      userId,
  2796  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  2797  		}))
  2798  	}
  2799  
  2800  	defer func() {
  2801  		for _, gc := range []model.Channel{gc1, gc2, gc3} {
  2802  			ss.Channel().PermanentDeleteMembersByChannel(gc3.Id)
  2803  			<-ss.Channel().PermanentDelete(gc.Id)
  2804  		}
  2805  	}()
  2806  
  2807  	testCases := []struct {
  2808  		Name           string
  2809  		UserId         string
  2810  		Term           string
  2811  		ExpectedResult []string
  2812  	}{
  2813  		{
  2814  			Name:           "Get all group channels for user1",
  2815  			UserId:         u1.Id,
  2816  			Term:           "",
  2817  			ExpectedResult: []string{gc1.Id, gc2.Id, gc3.Id},
  2818  		},
  2819  		{
  2820  			Name:           "Get group channels for user1 and term 'three'",
  2821  			UserId:         u1.Id,
  2822  			Term:           "three",
  2823  			ExpectedResult: []string{gc1.Id, gc3.Id},
  2824  		},
  2825  		{
  2826  			Name:           "Get group channels for user1 and term 'four two'",
  2827  			UserId:         u1.Id,
  2828  			Term:           "four two",
  2829  			ExpectedResult: []string{gc3.Id},
  2830  		},
  2831  		{
  2832  			Name:           "Get all group channels for user2",
  2833  			UserId:         u2.Id,
  2834  			Term:           "",
  2835  			ExpectedResult: []string{gc1.Id, gc3.Id},
  2836  		},
  2837  		{
  2838  			Name:           "Get group channels for user2 and term 'four'",
  2839  			UserId:         u2.Id,
  2840  			Term:           "four",
  2841  			ExpectedResult: []string{gc3.Id},
  2842  		},
  2843  		{
  2844  			Name:           "Get all group channels for user4",
  2845  			UserId:         u4.Id,
  2846  			Term:           "",
  2847  			ExpectedResult: []string{gc2.Id, gc3.Id},
  2848  		},
  2849  		{
  2850  			Name:           "Get group channels for user4 and term 'one five'",
  2851  			UserId:         u4.Id,
  2852  			Term:           "one five",
  2853  			ExpectedResult: []string{},
  2854  		},
  2855  	}
  2856  
  2857  	for _, tc := range testCases {
  2858  		t.Run(tc.Name, func(t *testing.T) {
  2859  			result, err := ss.Channel().SearchGroupChannels(tc.UserId, tc.Term)
  2860  			require.Nil(t, err)
  2861  
  2862  			resultIds := []string{}
  2863  			for _, gc := range *result {
  2864  				resultIds = append(resultIds, gc.Id)
  2865  			}
  2866  
  2867  			require.ElementsMatch(t, tc.ExpectedResult, resultIds)
  2868  		})
  2869  	}
  2870  }
  2871  
  2872  func testChannelStoreAnalyticsDeletedTypeCount(t *testing.T, ss store.Store) {
  2873  	o1 := model.Channel{}
  2874  	o1.TeamId = model.NewId()
  2875  	o1.DisplayName = "ChannelA"
  2876  	o1.Name = "zz" + model.NewId() + "b"
  2877  	o1.Type = model.CHANNEL_OPEN
  2878  	_, err := ss.Channel().Save(&o1, -1)
  2879  	require.Nil(t, err)
  2880  
  2881  	o2 := model.Channel{}
  2882  	o2.TeamId = model.NewId()
  2883  	o2.DisplayName = "Channel2"
  2884  	o2.Name = "zz" + model.NewId() + "b"
  2885  	o2.Type = model.CHANNEL_OPEN
  2886  	_, err = ss.Channel().Save(&o2, -1)
  2887  	require.Nil(t, err)
  2888  
  2889  	p3 := model.Channel{}
  2890  	p3.TeamId = model.NewId()
  2891  	p3.DisplayName = "Channel3"
  2892  	p3.Name = "zz" + model.NewId() + "b"
  2893  	p3.Type = model.CHANNEL_PRIVATE
  2894  	_, err = ss.Channel().Save(&p3, -1)
  2895  	require.Nil(t, err)
  2896  
  2897  	u1 := &model.User{}
  2898  	u1.Email = MakeEmail()
  2899  	u1.Nickname = model.NewId()
  2900  	store.Must(ss.User().Save(u1))
  2901  
  2902  	u2 := &model.User{}
  2903  	u2.Email = MakeEmail()
  2904  	u2.Nickname = model.NewId()
  2905  	store.Must(ss.User().Save(u2))
  2906  
  2907  	d4, err := ss.Channel().CreateDirectChannel(u1.Id, u2.Id)
  2908  	if err != nil {
  2909  		t.Fatalf(err.Error())
  2910  	}
  2911  	defer func() {
  2912  		ss.Channel().PermanentDeleteMembersByChannel(d4.Id)
  2913  		<-ss.Channel().PermanentDelete(d4.Id)
  2914  	}()
  2915  
  2916  	var openStartCount int64
  2917  	if openStartCount, err = ss.Channel().AnalyticsDeletedTypeCount("", "O"); err != nil {
  2918  		t.Fatal(err)
  2919  	}
  2920  
  2921  	var privateStartCount int64
  2922  	if privateStartCount, err = ss.Channel().AnalyticsDeletedTypeCount("", "P"); err != nil {
  2923  		t.Fatal(err)
  2924  	}
  2925  
  2926  	var directStartCount int64
  2927  	if directStartCount, err = ss.Channel().AnalyticsDeletedTypeCount("", "D"); err != nil {
  2928  		t.Fatal(err)
  2929  	}
  2930  
  2931  	err = ss.Channel().Delete(o1.Id, model.GetMillis())
  2932  	require.Nil(t, err, "channel should have been deleted")
  2933  	err = ss.Channel().Delete(o2.Id, model.GetMillis())
  2934  	require.Nil(t, err, "channel should have been deleted")
  2935  	err = ss.Channel().Delete(p3.Id, model.GetMillis())
  2936  	require.Nil(t, err, "channel should have been deleted")
  2937  	err = ss.Channel().Delete(d4.Id, model.GetMillis())
  2938  	require.Nil(t, err, "channel should have been deleted")
  2939  
  2940  	var count int64
  2941  
  2942  	if count, err = ss.Channel().AnalyticsDeletedTypeCount("", "O"); err != nil {
  2943  		t.Fatal(err)
  2944  	}
  2945  	assert.Equal(t, openStartCount+2, count, "Wrong open channel deleted count.")
  2946  
  2947  	if count, err = ss.Channel().AnalyticsDeletedTypeCount("", "P"); err != nil {
  2948  		t.Fatal(err)
  2949  	}
  2950  	assert.Equal(t, privateStartCount+1, count, "Wrong private channel deleted count.")
  2951  
  2952  	if count, err = ss.Channel().AnalyticsDeletedTypeCount("", "D"); err != nil {
  2953  		t.Fatal(err)
  2954  	}
  2955  	assert.Equal(t, directStartCount+1, count, "Wrong direct channel deleted count.")
  2956  }
  2957  
  2958  func testChannelStoreGetPinnedPosts(t *testing.T, ss store.Store) {
  2959  	ch1 := &model.Channel{
  2960  		TeamId:      model.NewId(),
  2961  		DisplayName: "Name",
  2962  		Name:        "zz" + model.NewId() + "b",
  2963  		Type:        model.CHANNEL_OPEN,
  2964  	}
  2965  
  2966  	o1, err := ss.Channel().Save(ch1, -1)
  2967  	require.Nil(t, err)
  2968  
  2969  	p1, err := ss.Post().Save(&model.Post{
  2970  		UserId:    model.NewId(),
  2971  		ChannelId: o1.Id,
  2972  		Message:   "test",
  2973  		IsPinned:  true,
  2974  	})
  2975  
  2976  	if pl, errGet := ss.Channel().GetPinnedPosts(o1.Id); errGet != nil {
  2977  		t.Fatal(errGet)
  2978  	} else if pl.Posts[p1.Id] == nil {
  2979  		t.Fatal("didn't return relevant pinned posts")
  2980  	}
  2981  
  2982  	ch2 := &model.Channel{
  2983  		TeamId:      model.NewId(),
  2984  		DisplayName: "Name",
  2985  		Name:        "zz" + model.NewId() + "b",
  2986  		Type:        model.CHANNEL_OPEN,
  2987  	}
  2988  
  2989  	o2, err := ss.Channel().Save(ch2, -1)
  2990  	require.Nil(t, err)
  2991  
  2992  	_, err = ss.Post().Save(&model.Post{
  2993  		UserId:    model.NewId(),
  2994  		ChannelId: o2.Id,
  2995  		Message:   "test",
  2996  	})
  2997  	require.Nil(t, err)
  2998  
  2999  	if pl, errGet := ss.Channel().GetPinnedPosts(o2.Id); errGet != nil {
  3000  		t.Fatal(errGet)
  3001  	} else if len(pl.Posts) != 0 {
  3002  		t.Fatal("wasn't supposed to return posts")
  3003  	}
  3004  }
  3005  
  3006  func testChannelStoreMaxChannelsPerTeam(t *testing.T, ss store.Store) {
  3007  	channel := &model.Channel{
  3008  		TeamId:      model.NewId(),
  3009  		DisplayName: "Channel",
  3010  		Name:        model.NewId(),
  3011  		Type:        model.CHANNEL_OPEN,
  3012  	}
  3013  	_, err := ss.Channel().Save(channel, 0)
  3014  	assert.NotEqual(t, nil, err)
  3015  	assert.Equal(t, err.Id, "store.sql_channel.save_channel.limit.app_error")
  3016  
  3017  	channel.Id = ""
  3018  	_, err = ss.Channel().Save(channel, 1)
  3019  	assert.Nil(t, err)
  3020  }
  3021  
  3022  func testChannelStoreGetChannelsByScheme(t *testing.T, ss store.Store) {
  3023  	// Create some schemes.
  3024  	s1 := &model.Scheme{
  3025  		DisplayName: model.NewId(),
  3026  		Name:        model.NewId(),
  3027  		Description: model.NewId(),
  3028  		Scope:       model.SCHEME_SCOPE_CHANNEL,
  3029  	}
  3030  
  3031  	s2 := &model.Scheme{
  3032  		DisplayName: model.NewId(),
  3033  		Name:        model.NewId(),
  3034  		Description: model.NewId(),
  3035  		Scope:       model.SCHEME_SCOPE_CHANNEL,
  3036  	}
  3037  
  3038  	result := <-ss.Scheme().Save(s1)
  3039  	s1 = result.Data.(*model.Scheme)
  3040  	s1 = (<-ss.Scheme().Save(s1)).Data.(*model.Scheme)
  3041  	s2 = (<-ss.Scheme().Save(s2)).Data.(*model.Scheme)
  3042  
  3043  	// Create and save some teams.
  3044  	c1 := &model.Channel{
  3045  		TeamId:      model.NewId(),
  3046  		DisplayName: "Name",
  3047  		Name:        model.NewId(),
  3048  		Type:        model.CHANNEL_OPEN,
  3049  		SchemeId:    &s1.Id,
  3050  	}
  3051  
  3052  	c2 := &model.Channel{
  3053  		TeamId:      model.NewId(),
  3054  		DisplayName: "Name",
  3055  		Name:        model.NewId(),
  3056  		Type:        model.CHANNEL_OPEN,
  3057  		SchemeId:    &s1.Id,
  3058  	}
  3059  
  3060  	c3 := &model.Channel{
  3061  		TeamId:      model.NewId(),
  3062  		DisplayName: "Name",
  3063  		Name:        model.NewId(),
  3064  		Type:        model.CHANNEL_OPEN,
  3065  	}
  3066  
  3067  	_, _ = ss.Channel().Save(c1, 100)
  3068  	_, _ = ss.Channel().Save(c2, 100)
  3069  	_, _ = ss.Channel().Save(c3, 100)
  3070  
  3071  	// Get the channels by a valid Scheme ID.
  3072  	res1 := <-ss.Channel().GetChannelsByScheme(s1.Id, 0, 100)
  3073  	assert.Nil(t, res1.Err)
  3074  	d1 := res1.Data.(model.ChannelList)
  3075  	assert.Len(t, d1, 2)
  3076  
  3077  	// Get the channels by a valid Scheme ID where there aren't any matching Channel.
  3078  	res2 := <-ss.Channel().GetChannelsByScheme(s2.Id, 0, 100)
  3079  	assert.Nil(t, res2.Err)
  3080  	d2 := res2.Data.(model.ChannelList)
  3081  	assert.Len(t, d2, 0)
  3082  
  3083  	// Get the channels by an invalid Scheme ID.
  3084  	res3 := <-ss.Channel().GetChannelsByScheme(model.NewId(), 0, 100)
  3085  	assert.Nil(t, res3.Err)
  3086  	d3 := res3.Data.(model.ChannelList)
  3087  	assert.Len(t, d3, 0)
  3088  }
  3089  
  3090  func testChannelStoreMigrateChannelMembers(t *testing.T, ss store.Store) {
  3091  	s1 := model.NewId()
  3092  	c1 := &model.Channel{
  3093  		TeamId:      model.NewId(),
  3094  		DisplayName: "Name",
  3095  		Name:        model.NewId(),
  3096  		Type:        model.CHANNEL_OPEN,
  3097  		SchemeId:    &s1,
  3098  	}
  3099  	c1, _ = ss.Channel().Save(c1, 100)
  3100  
  3101  	cm1 := &model.ChannelMember{
  3102  		ChannelId:     c1.Id,
  3103  		UserId:        model.NewId(),
  3104  		ExplicitRoles: "channel_admin channel_user",
  3105  		NotifyProps:   model.GetDefaultChannelNotifyProps(),
  3106  	}
  3107  	cm2 := &model.ChannelMember{
  3108  		ChannelId:     c1.Id,
  3109  		UserId:        model.NewId(),
  3110  		ExplicitRoles: "channel_user",
  3111  		NotifyProps:   model.GetDefaultChannelNotifyProps(),
  3112  	}
  3113  	cm3 := &model.ChannelMember{
  3114  		ChannelId:     c1.Id,
  3115  		UserId:        model.NewId(),
  3116  		ExplicitRoles: "something_else",
  3117  		NotifyProps:   model.GetDefaultChannelNotifyProps(),
  3118  	}
  3119  
  3120  	cm1 = (<-ss.Channel().SaveMember(cm1)).Data.(*model.ChannelMember)
  3121  	cm2 = (<-ss.Channel().SaveMember(cm2)).Data.(*model.ChannelMember)
  3122  	cm3 = (<-ss.Channel().SaveMember(cm3)).Data.(*model.ChannelMember)
  3123  
  3124  	lastDoneChannelId := strings.Repeat("0", 26)
  3125  	lastDoneUserId := strings.Repeat("0", 26)
  3126  
  3127  	for {
  3128  		data, err := ss.Channel().MigrateChannelMembers(lastDoneChannelId, lastDoneUserId)
  3129  		if assert.Nil(t, err) {
  3130  			if data == nil {
  3131  				break
  3132  			}
  3133  			lastDoneChannelId = data["ChannelId"]
  3134  			lastDoneUserId = data["UserId"]
  3135  		}
  3136  	}
  3137  
  3138  	ss.Channel().ClearCaches()
  3139  
  3140  	cm1b, err := ss.Channel().GetMember(cm1.ChannelId, cm1.UserId)
  3141  	assert.Nil(t, err)
  3142  	assert.Equal(t, "", cm1b.ExplicitRoles)
  3143  	assert.False(t, cm1b.SchemeGuest)
  3144  	assert.True(t, cm1b.SchemeUser)
  3145  	assert.True(t, cm1b.SchemeAdmin)
  3146  
  3147  	cm2b, err := ss.Channel().GetMember(cm2.ChannelId, cm2.UserId)
  3148  	assert.Nil(t, err)
  3149  	assert.Equal(t, "", cm2b.ExplicitRoles)
  3150  	assert.False(t, cm1b.SchemeGuest)
  3151  	assert.True(t, cm2b.SchemeUser)
  3152  	assert.False(t, cm2b.SchemeAdmin)
  3153  
  3154  	cm3b, err := ss.Channel().GetMember(cm3.ChannelId, cm3.UserId)
  3155  	assert.Nil(t, err)
  3156  	assert.Equal(t, "something_else", cm3b.ExplicitRoles)
  3157  	assert.False(t, cm1b.SchemeGuest)
  3158  	assert.False(t, cm3b.SchemeUser)
  3159  	assert.False(t, cm3b.SchemeAdmin)
  3160  }
  3161  
  3162  func testResetAllChannelSchemes(t *testing.T, ss store.Store) {
  3163  	s1 := &model.Scheme{
  3164  		Name:        model.NewId(),
  3165  		DisplayName: model.NewId(),
  3166  		Description: model.NewId(),
  3167  		Scope:       model.SCHEME_SCOPE_CHANNEL,
  3168  	}
  3169  	s1 = (<-ss.Scheme().Save(s1)).Data.(*model.Scheme)
  3170  
  3171  	c1 := &model.Channel{
  3172  		TeamId:      model.NewId(),
  3173  		DisplayName: "Name",
  3174  		Name:        model.NewId(),
  3175  		Type:        model.CHANNEL_OPEN,
  3176  		SchemeId:    &s1.Id,
  3177  	}
  3178  
  3179  	c2 := &model.Channel{
  3180  		TeamId:      model.NewId(),
  3181  		DisplayName: "Name",
  3182  		Name:        model.NewId(),
  3183  		Type:        model.CHANNEL_OPEN,
  3184  		SchemeId:    &s1.Id,
  3185  	}
  3186  
  3187  	c1, _ = ss.Channel().Save(c1, 100)
  3188  	c2, _ = ss.Channel().Save(c2, 100)
  3189  
  3190  	assert.Equal(t, s1.Id, *c1.SchemeId)
  3191  	assert.Equal(t, s1.Id, *c2.SchemeId)
  3192  
  3193  	err := ss.Channel().ResetAllChannelSchemes()
  3194  	assert.Nil(t, err)
  3195  
  3196  	c1, _ = ss.Channel().Get(c1.Id, true)
  3197  	c2, _ = ss.Channel().Get(c2.Id, true)
  3198  
  3199  	assert.Equal(t, "", *c1.SchemeId)
  3200  	assert.Equal(t, "", *c2.SchemeId)
  3201  }
  3202  
  3203  func testChannelStoreClearAllCustomRoleAssignments(t *testing.T, ss store.Store) {
  3204  	c := &model.Channel{
  3205  		TeamId:      model.NewId(),
  3206  		DisplayName: "Name",
  3207  		Name:        model.NewId(),
  3208  		Type:        model.CHANNEL_OPEN,
  3209  	}
  3210  
  3211  	c, _ = ss.Channel().Save(c, 100)
  3212  
  3213  	m1 := &model.ChannelMember{
  3214  		ChannelId:     c.Id,
  3215  		UserId:        model.NewId(),
  3216  		NotifyProps:   model.GetDefaultChannelNotifyProps(),
  3217  		ExplicitRoles: "channel_user channel_admin system_user_access_token",
  3218  	}
  3219  	m2 := &model.ChannelMember{
  3220  		ChannelId:     c.Id,
  3221  		UserId:        model.NewId(),
  3222  		NotifyProps:   model.GetDefaultChannelNotifyProps(),
  3223  		ExplicitRoles: "channel_user custom_role channel_admin another_custom_role",
  3224  	}
  3225  	m3 := &model.ChannelMember{
  3226  		ChannelId:     c.Id,
  3227  		UserId:        model.NewId(),
  3228  		NotifyProps:   model.GetDefaultChannelNotifyProps(),
  3229  		ExplicitRoles: "channel_user",
  3230  	}
  3231  	m4 := &model.ChannelMember{
  3232  		ChannelId:     c.Id,
  3233  		UserId:        model.NewId(),
  3234  		NotifyProps:   model.GetDefaultChannelNotifyProps(),
  3235  		ExplicitRoles: "custom_only",
  3236  	}
  3237  
  3238  	store.Must(ss.Channel().SaveMember(m1))
  3239  	store.Must(ss.Channel().SaveMember(m2))
  3240  	store.Must(ss.Channel().SaveMember(m3))
  3241  	store.Must(ss.Channel().SaveMember(m4))
  3242  
  3243  	require.Nil(t, ss.Channel().ClearAllCustomRoleAssignments())
  3244  
  3245  	member, err := ss.Channel().GetMember(m1.ChannelId, m1.UserId)
  3246  	require.Nil(t, err)
  3247  	assert.Equal(t, m1.ExplicitRoles, member.Roles)
  3248  
  3249  	member, err = ss.Channel().GetMember(m2.ChannelId, m2.UserId)
  3250  	require.Nil(t, err)
  3251  	assert.Equal(t, "channel_user channel_admin", member.Roles)
  3252  
  3253  	member, err = ss.Channel().GetMember(m3.ChannelId, m3.UserId)
  3254  	require.Nil(t, err)
  3255  	assert.Equal(t, m3.ExplicitRoles, member.Roles)
  3256  
  3257  	member, err = ss.Channel().GetMember(m4.ChannelId, m4.UserId)
  3258  	require.Nil(t, err)
  3259  	assert.Equal(t, "", member.Roles)
  3260  }
  3261  
  3262  // testMaterializedPublicChannels tests edge cases involving the triggers and stored procedures
  3263  // that materialize the PublicChannels table.
  3264  func testMaterializedPublicChannels(t *testing.T, ss store.Store, s SqlSupplier) {
  3265  	teamId := model.NewId()
  3266  
  3267  	// o1 is a public channel on the team
  3268  	o1 := model.Channel{
  3269  		TeamId:      teamId,
  3270  		DisplayName: "Open Channel",
  3271  		Name:        model.NewId(),
  3272  		Type:        model.CHANNEL_OPEN,
  3273  	}
  3274  	_, err := ss.Channel().Save(&o1, -1)
  3275  	require.Nil(t, err)
  3276  
  3277  	// o2 is another public channel on the team
  3278  	o2 := model.Channel{
  3279  		TeamId:      teamId,
  3280  		DisplayName: "Open Channel 2",
  3281  		Name:        model.NewId(),
  3282  		Type:        model.CHANNEL_OPEN,
  3283  	}
  3284  	_, err = ss.Channel().Save(&o2, -1)
  3285  	require.Nil(t, err)
  3286  
  3287  	t.Run("o1 and o2 initially listed in public channels", func(t *testing.T) {
  3288  		channels, channelErr := ss.Channel().SearchInTeam(teamId, "", true)
  3289  		require.Nil(t, channelErr)
  3290  		require.Equal(t, &model.ChannelList{&o1, &o2}, channels)
  3291  	})
  3292  
  3293  	o1.DeleteAt = model.GetMillis()
  3294  	o1.UpdateAt = model.GetMillis()
  3295  
  3296  	e := ss.Channel().Delete(o1.Id, o1.DeleteAt)
  3297  	require.Nil(t, e, "channel should have been deleted")
  3298  
  3299  	t.Run("o1 still listed in public channels when marked as deleted", func(t *testing.T) {
  3300  		channels, channelErr := ss.Channel().SearchInTeam(teamId, "", true)
  3301  		require.Nil(t, channelErr)
  3302  		require.Equal(t, &model.ChannelList{&o1, &o2}, channels)
  3303  	})
  3304  
  3305  	<-ss.Channel().PermanentDelete(o1.Id)
  3306  
  3307  	t.Run("o1 no longer listed in public channels when permanently deleted", func(t *testing.T) {
  3308  		channels, channelErr := ss.Channel().SearchInTeam(teamId, "", true)
  3309  		require.Nil(t, channelErr)
  3310  		require.Equal(t, &model.ChannelList{&o2}, channels)
  3311  	})
  3312  
  3313  	o2.Type = model.CHANNEL_PRIVATE
  3314  	_, appErr := ss.Channel().Update(&o2)
  3315  	require.Nil(t, appErr)
  3316  
  3317  	t.Run("o2 no longer listed since now private", func(t *testing.T) {
  3318  		channels, channelErr := ss.Channel().SearchInTeam(teamId, "", true)
  3319  		require.Nil(t, channelErr)
  3320  		require.Equal(t, &model.ChannelList{}, channels)
  3321  	})
  3322  
  3323  	o2.Type = model.CHANNEL_OPEN
  3324  	_, appErr = ss.Channel().Update(&o2)
  3325  	require.Nil(t, appErr)
  3326  
  3327  	t.Run("o2 listed once again since now public", func(t *testing.T) {
  3328  		channels, channelErr := ss.Channel().SearchInTeam(teamId, "", true)
  3329  		require.Nil(t, channelErr)
  3330  		require.Equal(t, &model.ChannelList{&o2}, channels)
  3331  	})
  3332  
  3333  	// o3 is a public channel on the team that already existed in the PublicChannels table.
  3334  	o3 := model.Channel{
  3335  		Id:          model.NewId(),
  3336  		TeamId:      teamId,
  3337  		DisplayName: "Open Channel 3",
  3338  		Name:        model.NewId(),
  3339  		Type:        model.CHANNEL_OPEN,
  3340  	}
  3341  
  3342  	_, execerr := s.GetMaster().ExecNoTimeout(`
  3343  		INSERT INTO
  3344  		    PublicChannels(Id, DeleteAt, TeamId, DisplayName, Name, Header, Purpose)
  3345  		VALUES
  3346  		    (:Id, :DeleteAt, :TeamId, :DisplayName, :Name, :Header, :Purpose);
  3347  	`, map[string]interface{}{
  3348  		"Id":          o3.Id,
  3349  		"DeleteAt":    o3.DeleteAt,
  3350  		"TeamId":      o3.TeamId,
  3351  		"DisplayName": o3.DisplayName,
  3352  		"Name":        o3.Name,
  3353  		"Header":      o3.Header,
  3354  		"Purpose":     o3.Purpose,
  3355  	})
  3356  	require.Nil(t, execerr)
  3357  
  3358  	o3.DisplayName = "Open Channel 3 - Modified"
  3359  
  3360  	_, execerr = s.GetMaster().ExecNoTimeout(`
  3361  		INSERT INTO
  3362  		    Channels(Id, CreateAt, UpdateAt, DeleteAt, TeamId, Type, DisplayName, Name, Header, Purpose, LastPostAt, TotalMsgCount, ExtraUpdateAt, CreatorId)
  3363  		VALUES
  3364  		    (:Id, :CreateAt, :UpdateAt, :DeleteAt, :TeamId, :Type, :DisplayName, :Name, :Header, :Purpose, :LastPostAt, :TotalMsgCount, :ExtraUpdateAt, :CreatorId);
  3365  	`, map[string]interface{}{
  3366  		"Id":            o3.Id,
  3367  		"CreateAt":      o3.CreateAt,
  3368  		"UpdateAt":      o3.UpdateAt,
  3369  		"DeleteAt":      o3.DeleteAt,
  3370  		"TeamId":        o3.TeamId,
  3371  		"Type":          o3.Type,
  3372  		"DisplayName":   o3.DisplayName,
  3373  		"Name":          o3.Name,
  3374  		"Header":        o3.Header,
  3375  		"Purpose":       o3.Purpose,
  3376  		"LastPostAt":    o3.LastPostAt,
  3377  		"TotalMsgCount": o3.TotalMsgCount,
  3378  		"ExtraUpdateAt": o3.ExtraUpdateAt,
  3379  		"CreatorId":     o3.CreatorId,
  3380  	})
  3381  	require.Nil(t, execerr)
  3382  
  3383  	t.Run("verify o3 INSERT converted to UPDATE", func(t *testing.T) {
  3384  		channels, channelErr := ss.Channel().SearchInTeam(teamId, "", true)
  3385  		require.Nil(t, channelErr)
  3386  		require.Equal(t, &model.ChannelList{&o2, &o3}, channels)
  3387  	})
  3388  
  3389  	// o4 is a public channel on the team that existed in the Channels table but was omitted from the PublicChannels table.
  3390  	o4 := model.Channel{
  3391  		TeamId:      teamId,
  3392  		DisplayName: "Open Channel 4",
  3393  		Name:        model.NewId(),
  3394  		Type:        model.CHANNEL_OPEN,
  3395  	}
  3396  
  3397  	_, err = ss.Channel().Save(&o4, -1)
  3398  	require.Nil(t, err)
  3399  
  3400  	_, execerr = s.GetMaster().ExecNoTimeout(`
  3401  		DELETE FROM
  3402  		    PublicChannels
  3403  		WHERE
  3404  		    Id = :Id
  3405  	`, map[string]interface{}{
  3406  		"Id": o4.Id,
  3407  	})
  3408  	require.Nil(t, execerr)
  3409  
  3410  	o4.DisplayName += " - Modified"
  3411  	_, appErr = ss.Channel().Update(&o4)
  3412  	require.Nil(t, appErr)
  3413  
  3414  	t.Run("verify o4 UPDATE converted to INSERT", func(t *testing.T) {
  3415  		channels, err := ss.Channel().SearchInTeam(teamId, "", true)
  3416  		require.Nil(t, err)
  3417  		require.Equal(t, &model.ChannelList{&o2, &o3, &o4}, channels)
  3418  	})
  3419  }
  3420  
  3421  func testChannelStoreGetAllChannelsForExportAfter(t *testing.T, ss store.Store) {
  3422  	t1 := model.Team{}
  3423  	t1.DisplayName = "Name"
  3424  	t1.Name = model.NewId()
  3425  	t1.Email = MakeEmail()
  3426  	t1.Type = model.TEAM_OPEN
  3427  	_, err := ss.Team().Save(&t1)
  3428  	require.Nil(t, err)
  3429  
  3430  	c1 := model.Channel{}
  3431  	c1.TeamId = t1.Id
  3432  	c1.DisplayName = "Channel1"
  3433  	c1.Name = "zz" + model.NewId() + "b"
  3434  	c1.Type = model.CHANNEL_OPEN
  3435  	_, err = ss.Channel().Save(&c1, -1)
  3436  	require.Nil(t, err)
  3437  
  3438  	d1, err := ss.Channel().GetAllChannelsForExportAfter(10000, strings.Repeat("0", 26))
  3439  	assert.Nil(t, err)
  3440  
  3441  	found := false
  3442  	for _, c := range d1 {
  3443  		if c.Id == c1.Id {
  3444  			found = true
  3445  			assert.Equal(t, t1.Id, c.TeamId)
  3446  			assert.Nil(t, c.SchemeId)
  3447  			assert.Equal(t, t1.Name, c.TeamName)
  3448  		}
  3449  	}
  3450  	assert.True(t, found)
  3451  }
  3452  
  3453  func testChannelStoreGetChannelMembersForExport(t *testing.T, ss store.Store) {
  3454  	t1 := model.Team{}
  3455  	t1.DisplayName = "Name"
  3456  	t1.Name = model.NewId()
  3457  	t1.Email = MakeEmail()
  3458  	t1.Type = model.TEAM_OPEN
  3459  	_, err := ss.Team().Save(&t1)
  3460  	require.Nil(t, err)
  3461  
  3462  	c1 := model.Channel{}
  3463  	c1.TeamId = t1.Id
  3464  	c1.DisplayName = "Channel1"
  3465  	c1.Name = "zz" + model.NewId() + "b"
  3466  	c1.Type = model.CHANNEL_OPEN
  3467  	_, err = ss.Channel().Save(&c1, -1)
  3468  	require.Nil(t, err)
  3469  
  3470  	c2 := model.Channel{}
  3471  	c2.TeamId = model.NewId()
  3472  	c2.DisplayName = "Channel2"
  3473  	c2.Name = "zz" + model.NewId() + "b"
  3474  	c2.Type = model.CHANNEL_OPEN
  3475  	_, err = ss.Channel().Save(&c2, -1)
  3476  	require.Nil(t, err)
  3477  
  3478  	u1 := model.User{}
  3479  	u1.Email = MakeEmail()
  3480  	u1.Nickname = model.NewId()
  3481  	store.Must(ss.User().Save(&u1))
  3482  
  3483  	m1 := model.ChannelMember{}
  3484  	m1.ChannelId = c1.Id
  3485  	m1.UserId = u1.Id
  3486  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
  3487  	store.Must(ss.Channel().SaveMember(&m1))
  3488  
  3489  	m2 := model.ChannelMember{}
  3490  	m2.ChannelId = c2.Id
  3491  	m2.UserId = u1.Id
  3492  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
  3493  	store.Must(ss.Channel().SaveMember(&m2))
  3494  
  3495  	d1, err := ss.Channel().GetChannelMembersForExport(u1.Id, t1.Id)
  3496  	assert.Nil(t, err)
  3497  
  3498  	assert.Len(t, d1, 1)
  3499  
  3500  	cmfe1 := d1[0]
  3501  	assert.Equal(t, c1.Name, cmfe1.ChannelName)
  3502  	assert.Equal(t, c1.Id, cmfe1.ChannelId)
  3503  	assert.Equal(t, u1.Id, cmfe1.UserId)
  3504  }
  3505  
  3506  func testChannelStoreRemoveAllDeactivatedMembers(t *testing.T, ss store.Store) {
  3507  	// Set up all the objects needed in the store.
  3508  	t1 := model.Team{}
  3509  	t1.DisplayName = "Name"
  3510  	t1.Name = model.NewId()
  3511  	t1.Email = MakeEmail()
  3512  	t1.Type = model.TEAM_OPEN
  3513  	_, err := ss.Team().Save(&t1)
  3514  	require.Nil(t, err)
  3515  
  3516  	c1 := model.Channel{}
  3517  	c1.TeamId = t1.Id
  3518  	c1.DisplayName = "Channel1"
  3519  	c1.Name = "zz" + model.NewId() + "b"
  3520  	c1.Type = model.CHANNEL_OPEN
  3521  	_, err = ss.Channel().Save(&c1, -1)
  3522  	require.Nil(t, err)
  3523  
  3524  	u1 := model.User{}
  3525  	u1.Email = MakeEmail()
  3526  	u1.Nickname = model.NewId()
  3527  	store.Must(ss.User().Save(&u1))
  3528  
  3529  	u2 := model.User{}
  3530  	u2.Email = MakeEmail()
  3531  	u2.Nickname = model.NewId()
  3532  	store.Must(ss.User().Save(&u2))
  3533  
  3534  	u3 := model.User{}
  3535  	u3.Email = MakeEmail()
  3536  	u3.Nickname = model.NewId()
  3537  	store.Must(ss.User().Save(&u3))
  3538  
  3539  	m1 := model.ChannelMember{}
  3540  	m1.ChannelId = c1.Id
  3541  	m1.UserId = u1.Id
  3542  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
  3543  	store.Must(ss.Channel().SaveMember(&m1))
  3544  
  3545  	m2 := model.ChannelMember{}
  3546  	m2.ChannelId = c1.Id
  3547  	m2.UserId = u2.Id
  3548  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
  3549  	store.Must(ss.Channel().SaveMember(&m2))
  3550  
  3551  	m3 := model.ChannelMember{}
  3552  	m3.ChannelId = c1.Id
  3553  	m3.UserId = u3.Id
  3554  	m3.NotifyProps = model.GetDefaultChannelNotifyProps()
  3555  	store.Must(ss.Channel().SaveMember(&m3))
  3556  
  3557  	// Get all the channel members. Check there are 3.
  3558  	d1, err := ss.Channel().GetMembers(c1.Id, 0, 1000)
  3559  	assert.Nil(t, err)
  3560  	assert.Len(t, *d1, 3)
  3561  
  3562  	// Deactivate users 1 & 2.
  3563  	u1.DeleteAt = model.GetMillis()
  3564  	u2.DeleteAt = model.GetMillis()
  3565  	_, err = ss.User().Update(&u1, true)
  3566  	require.Nil(t, err)
  3567  	_, err = ss.User().Update(&u2, true)
  3568  	require.Nil(t, err)
  3569  
  3570  	// Remove all deactivated users from the channel.
  3571  	assert.Nil(t, ss.Channel().RemoveAllDeactivatedMembers(c1.Id))
  3572  
  3573  	// Get all the channel members. Check there is now only 1: m3.
  3574  	d2, err := ss.Channel().GetMembers(c1.Id, 0, 1000)
  3575  	assert.Nil(t, err)
  3576  	assert.Len(t, *d2, 1)
  3577  	assert.Equal(t, (*d2)[0].UserId, u3.Id)
  3578  }
  3579  
  3580  func testChannelStoreExportAllDirectChannels(t *testing.T, ss store.Store, s SqlSupplier) {
  3581  	teamId := model.NewId()
  3582  
  3583  	o1 := model.Channel{}
  3584  	o1.TeamId = teamId
  3585  	o1.DisplayName = "Name" + model.NewId()
  3586  	o1.Name = "zz" + model.NewId() + "b"
  3587  	o1.Type = model.CHANNEL_DIRECT
  3588  
  3589  	userIds := []string{model.NewId(), model.NewId(), model.NewId()}
  3590  
  3591  	o2 := model.Channel{}
  3592  	o2.Name = model.GetGroupNameFromUserIds(userIds)
  3593  	o2.DisplayName = "GroupChannel" + model.NewId()
  3594  	o2.Name = "zz" + model.NewId() + "b"
  3595  	o2.Type = model.CHANNEL_GROUP
  3596  	_, err := ss.Channel().Save(&o2, -1)
  3597  	require.Nil(t, err)
  3598  
  3599  	u1 := &model.User{}
  3600  	u1.Email = MakeEmail()
  3601  	u1.Nickname = model.NewId()
  3602  	store.Must(ss.User().Save(u1))
  3603  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1))
  3604  
  3605  	u2 := &model.User{}
  3606  	u2.Email = MakeEmail()
  3607  	u2.Nickname = model.NewId()
  3608  	store.Must(ss.User().Save(u2))
  3609  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}, -1))
  3610  
  3611  	m1 := model.ChannelMember{}
  3612  	m1.ChannelId = o1.Id
  3613  	m1.UserId = u1.Id
  3614  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
  3615  
  3616  	m2 := model.ChannelMember{}
  3617  	m2.ChannelId = o1.Id
  3618  	m2.UserId = u2.Id
  3619  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
  3620  
  3621  	ss.Channel().SaveDirectChannel(&o1, &m1, &m2)
  3622  
  3623  	d1, err := ss.Channel().GetAllDirectChannelsForExportAfter(10000, strings.Repeat("0", 26))
  3624  	assert.Nil(t, err)
  3625  
  3626  	assert.Equal(t, 2, len(d1))
  3627  	assert.ElementsMatch(t, []string{o1.DisplayName, o2.DisplayName}, []string{d1[0].DisplayName, d1[1].DisplayName})
  3628  
  3629  	// Manually truncate Channels table until testlib can handle cleanups
  3630  	s.GetMaster().Exec("TRUNCATE Channels")
  3631  }
  3632  
  3633  func testChannelStoreExportAllDirectChannelsExcludePrivateAndPublic(t *testing.T, ss store.Store, s SqlSupplier) {
  3634  	teamId := model.NewId()
  3635  
  3636  	o1 := model.Channel{}
  3637  	o1.TeamId = teamId
  3638  	o1.DisplayName = "The Direct Channel" + model.NewId()
  3639  	o1.Name = "zz" + model.NewId() + "b"
  3640  	o1.Type = model.CHANNEL_DIRECT
  3641  
  3642  	o2 := model.Channel{}
  3643  	o2.TeamId = teamId
  3644  	o2.DisplayName = "Channel2" + model.NewId()
  3645  	o2.Name = "zz" + model.NewId() + "b"
  3646  	o2.Type = model.CHANNEL_OPEN
  3647  	_, err := ss.Channel().Save(&o2, -1)
  3648  	require.Nil(t, err)
  3649  
  3650  	o3 := model.Channel{}
  3651  	o3.TeamId = teamId
  3652  	o3.DisplayName = "Channel3" + model.NewId()
  3653  	o3.Name = "zz" + model.NewId() + "b"
  3654  	o3.Type = model.CHANNEL_PRIVATE
  3655  	_, err = ss.Channel().Save(&o3, -1)
  3656  	require.Nil(t, err)
  3657  
  3658  	u1 := &model.User{}
  3659  	u1.Email = MakeEmail()
  3660  	u1.Nickname = model.NewId()
  3661  	store.Must(ss.User().Save(u1))
  3662  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1))
  3663  
  3664  	u2 := &model.User{}
  3665  	u2.Email = MakeEmail()
  3666  	u2.Nickname = model.NewId()
  3667  	store.Must(ss.User().Save(u2))
  3668  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}, -1))
  3669  
  3670  	m1 := model.ChannelMember{}
  3671  	m1.ChannelId = o1.Id
  3672  	m1.UserId = u1.Id
  3673  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
  3674  
  3675  	m2 := model.ChannelMember{}
  3676  	m2.ChannelId = o1.Id
  3677  	m2.UserId = u2.Id
  3678  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
  3679  
  3680  	ss.Channel().SaveDirectChannel(&o1, &m1, &m2)
  3681  
  3682  	d1, err := ss.Channel().GetAllDirectChannelsForExportAfter(10000, strings.Repeat("0", 26))
  3683  	assert.Nil(t, err)
  3684  	assert.Equal(t, 1, len(d1))
  3685  	assert.Equal(t, o1.DisplayName, d1[0].DisplayName)
  3686  
  3687  	// Manually truncate Channels table until testlib can handle cleanups
  3688  	s.GetMaster().Exec("TRUNCATE Channels")
  3689  }
  3690  
  3691  func testChannelStoreExportAllDirectChannelsDeletedChannel(t *testing.T, ss store.Store, s SqlSupplier) {
  3692  	teamId := model.NewId()
  3693  
  3694  	o1 := model.Channel{}
  3695  	o1.TeamId = teamId
  3696  	o1.DisplayName = "Different Name" + model.NewId()
  3697  	o1.Name = "zz" + model.NewId() + "b"
  3698  	o1.Type = model.CHANNEL_DIRECT
  3699  
  3700  	u1 := &model.User{}
  3701  	u1.Email = MakeEmail()
  3702  	u1.Nickname = model.NewId()
  3703  	store.Must(ss.User().Save(u1))
  3704  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1))
  3705  
  3706  	u2 := &model.User{}
  3707  	u2.Email = MakeEmail()
  3708  	u2.Nickname = model.NewId()
  3709  	store.Must(ss.User().Save(u2))
  3710  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}, -1))
  3711  
  3712  	m1 := model.ChannelMember{}
  3713  	m1.ChannelId = o1.Id
  3714  	m1.UserId = u1.Id
  3715  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
  3716  
  3717  	m2 := model.ChannelMember{}
  3718  	m2.ChannelId = o1.Id
  3719  	m2.UserId = u2.Id
  3720  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
  3721  
  3722  	ss.Channel().SaveDirectChannel(&o1, &m1, &m2)
  3723  
  3724  	o1.DeleteAt = 1
  3725  	err := ss.Channel().SetDeleteAt(o1.Id, 1, 1)
  3726  	require.Nil(t, err, "channel should have been deleted")
  3727  
  3728  	d1, err := ss.Channel().GetAllDirectChannelsForExportAfter(10000, strings.Repeat("0", 26))
  3729  	assert.Nil(t, err)
  3730  
  3731  	assert.Equal(t, 0, len(d1))
  3732  
  3733  	// Manually truncate Channels table until testlib can handle cleanups
  3734  	s.GetMaster().Exec("TRUNCATE Channels")
  3735  }
  3736  
  3737  func testChannelStoreGetChannelsBatchForIndexing(t *testing.T, ss store.Store) {
  3738  	// Set up all the objects needed
  3739  	c1 := &model.Channel{}
  3740  	c1.DisplayName = "Channel1"
  3741  	c1.Name = "zz" + model.NewId() + "b"
  3742  	c1.Type = model.CHANNEL_OPEN
  3743  	_, err := ss.Channel().Save(c1, -1)
  3744  	require.Nil(t, err)
  3745  
  3746  	time.Sleep(10 * time.Millisecond)
  3747  
  3748  	c2 := &model.Channel{}
  3749  	c2.DisplayName = "Channel2"
  3750  	c2.Name = "zz" + model.NewId() + "b"
  3751  	c2.Type = model.CHANNEL_OPEN
  3752  	_, err = ss.Channel().Save(c2, -1)
  3753  	require.Nil(t, err)
  3754  
  3755  	time.Sleep(10 * time.Millisecond)
  3756  	startTime := c2.CreateAt
  3757  
  3758  	c3 := &model.Channel{}
  3759  	c3.DisplayName = "Channel3"
  3760  	c3.Name = "zz" + model.NewId() + "b"
  3761  	c3.Type = model.CHANNEL_OPEN
  3762  	_, err = ss.Channel().Save(c3, -1)
  3763  	require.Nil(t, err)
  3764  
  3765  	c4 := &model.Channel{}
  3766  	c4.DisplayName = "Channel4"
  3767  	c4.Name = "zz" + model.NewId() + "b"
  3768  	c4.Type = model.CHANNEL_PRIVATE
  3769  	_, err = ss.Channel().Save(c4, -1)
  3770  	require.Nil(t, err)
  3771  
  3772  	c5 := &model.Channel{}
  3773  	c5.DisplayName = "Channel5"
  3774  	c5.Name = "zz" + model.NewId() + "b"
  3775  	c5.Type = model.CHANNEL_OPEN
  3776  	_, err = ss.Channel().Save(c5, -1)
  3777  	require.Nil(t, err)
  3778  
  3779  	time.Sleep(10 * time.Millisecond)
  3780  
  3781  	c6 := &model.Channel{}
  3782  	c6.DisplayName = "Channel6"
  3783  	c6.Name = "zz" + model.NewId() + "b"
  3784  	c6.Type = model.CHANNEL_OPEN
  3785  	_, err = ss.Channel().Save(c6, -1)
  3786  	require.Nil(t, err)
  3787  
  3788  	endTime := c6.CreateAt
  3789  
  3790  	// First and last channel should be outside the range
  3791  	channels, err := ss.Channel().GetChannelsBatchForIndexing(startTime, endTime, 1000)
  3792  	assert.Nil(t, err)
  3793  	assert.ElementsMatch(t, []*model.Channel{c2, c3, c5}, channels)
  3794  
  3795  	// Update the endTime, last channel should be in
  3796  	endTime = model.GetMillis()
  3797  	channels, err = ss.Channel().GetChannelsBatchForIndexing(startTime, endTime, 1000)
  3798  	assert.Nil(t, err)
  3799  	assert.ElementsMatch(t, []*model.Channel{c2, c3, c5, c6}, channels)
  3800  
  3801  	// Testing the limit
  3802  	channels, err = ss.Channel().GetChannelsBatchForIndexing(startTime, endTime, 2)
  3803  	assert.Nil(t, err)
  3804  	assert.ElementsMatch(t, []*model.Channel{c2, c3}, channels)
  3805  }