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