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