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