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