github.com/gigforks/mattermost-server@v4.9.1-0.20180619094218-800d97fa55d0+incompatible/store/storetest/team_store.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package storetest 5 6 import ( 7 "testing" 8 "time" 9 10 "github.com/mattermost/mattermost-server/model" 11 "github.com/mattermost/mattermost-server/store" 12 ) 13 14 func TestTeamStore(t *testing.T, ss store.Store) { 15 t.Run("Save", func(t *testing.T) { testTeamStoreSave(t, ss) }) 16 t.Run("Update", func(t *testing.T) { testTeamStoreUpdate(t, ss) }) 17 t.Run("UpdateDisplayName", func(t *testing.T) { testTeamStoreUpdateDisplayName(t, ss) }) 18 t.Run("Get", func(t *testing.T) { testTeamStoreGet(t, ss) }) 19 t.Run("GetByName", func(t *testing.T) { testTeamStoreGetByName(t, ss) }) 20 t.Run("SearchByName", func(t *testing.T) { testTeamStoreSearchByName(t, ss) }) 21 t.Run("SearchAll", func(t *testing.T) { testTeamStoreSearchAll(t, ss) }) 22 t.Run("SearchOpen", func(t *testing.T) { testTeamStoreSearchOpen(t, ss) }) 23 t.Run("GetByIniviteId", func(t *testing.T) { testTeamStoreGetByIniviteId(t, ss) }) 24 t.Run("ByUserId", func(t *testing.T) { testTeamStoreByUserId(t, ss) }) 25 t.Run("GetAllTeamListing", func(t *testing.T) { testGetAllTeamListing(t, ss) }) 26 t.Run("GetAllTeamPageListing", func(t *testing.T) { testGetAllTeamPageListing(t, ss) }) 27 t.Run("Delete", func(t *testing.T) { testDelete(t, ss) }) 28 t.Run("TeamCount", func(t *testing.T) { testTeamCount(t, ss) }) 29 t.Run("TeamMembers", func(t *testing.T) { testTeamMembers(t, ss) }) 30 t.Run("SaveTeamMemberMaxMembers", func(t *testing.T) { testSaveTeamMemberMaxMembers(t, ss) }) 31 t.Run("GetTeamMember", func(t *testing.T) { testGetTeamMember(t, ss) }) 32 t.Run("GetTeamMembersByIds", func(t *testing.T) { testGetTeamMembersByIds(t, ss) }) 33 t.Run("MemberCount", func(t *testing.T) { testTeamStoreMemberCount(t, ss) }) 34 t.Run("GetChannelUnreadsForAllTeams", func(t *testing.T) { testGetChannelUnreadsForAllTeams(t, ss) }) 35 t.Run("GetChannelUnreadsForTeam", func(t *testing.T) { testGetChannelUnreadsForTeam(t, ss) }) 36 t.Run("UpdateLastTeamIconUpdate", func(t *testing.T) { testUpdateLastTeamIconUpdate(t, ss) }) 37 } 38 39 func testTeamStoreSave(t *testing.T, ss store.Store) { 40 o1 := model.Team{} 41 o1.DisplayName = "DisplayName" 42 o1.Name = "z-z-z" + model.NewId() + "b" 43 o1.Email = model.NewId() + "@nowhere.com" 44 o1.Type = model.TEAM_OPEN 45 46 if err := (<-ss.Team().Save(&o1)).Err; err != nil { 47 t.Fatal("couldn't save item", err) 48 } 49 50 if err := (<-ss.Team().Save(&o1)).Err; err == nil { 51 t.Fatal("shouldn't be able to update from save") 52 } 53 54 o1.Id = "" 55 if err := (<-ss.Team().Save(&o1)).Err; err == nil { 56 t.Fatal("should be unique domain") 57 } 58 } 59 60 func testTeamStoreUpdate(t *testing.T, ss store.Store) { 61 o1 := model.Team{} 62 o1.DisplayName = "DisplayName" 63 o1.Name = "z-z-z" + model.NewId() + "b" 64 o1.Email = model.NewId() + "@nowhere.com" 65 o1.Type = model.TEAM_OPEN 66 if err := (<-ss.Team().Save(&o1)).Err; err != nil { 67 t.Fatal(err) 68 } 69 70 time.Sleep(100 * time.Millisecond) 71 72 if err := (<-ss.Team().Update(&o1)).Err; err != nil { 73 t.Fatal(err) 74 } 75 76 o1.Id = "missing" 77 if err := (<-ss.Team().Update(&o1)).Err; err == nil { 78 t.Fatal("Update should have failed because of missing key") 79 } 80 81 o1.Id = model.NewId() 82 if err := (<-ss.Team().Update(&o1)).Err; err == nil { 83 t.Fatal("Update should have faile because id change") 84 } 85 } 86 87 func testTeamStoreUpdateDisplayName(t *testing.T, ss store.Store) { 88 o1 := &model.Team{} 89 o1.DisplayName = "Display Name" 90 o1.Name = "z-z-z" + model.NewId() + "b" 91 o1.Email = model.NewId() + "@nowhere.com" 92 o1.Type = model.TEAM_OPEN 93 o1 = (<-ss.Team().Save(o1)).Data.(*model.Team) 94 95 newDisplayName := "NewDisplayName" 96 97 if err := (<-ss.Team().UpdateDisplayName(newDisplayName, o1.Id)).Err; err != nil { 98 t.Fatal(err) 99 } 100 101 ro1 := (<-ss.Team().Get(o1.Id)).Data.(*model.Team) 102 if ro1.DisplayName != newDisplayName { 103 t.Fatal("DisplayName not updated") 104 } 105 } 106 107 func testTeamStoreGet(t *testing.T, ss store.Store) { 108 o1 := model.Team{} 109 o1.DisplayName = "DisplayName" 110 o1.Name = "z-z-z" + model.NewId() + "b" 111 o1.Email = model.NewId() + "@nowhere.com" 112 o1.Type = model.TEAM_OPEN 113 store.Must(ss.Team().Save(&o1)) 114 115 if r1 := <-ss.Team().Get(o1.Id); r1.Err != nil { 116 t.Fatal(r1.Err) 117 } else { 118 if r1.Data.(*model.Team).ToJson() != o1.ToJson() { 119 t.Fatal("invalid returned team") 120 } 121 } 122 123 if err := (<-ss.Team().Get("")).Err; err == nil { 124 t.Fatal("Missing id should have failed") 125 } 126 } 127 128 func testTeamStoreGetByName(t *testing.T, ss store.Store) { 129 o1 := model.Team{} 130 o1.DisplayName = "DisplayName" 131 o1.Name = "z-z-z" + model.NewId() + "b" 132 o1.Email = model.NewId() + "@nowhere.com" 133 o1.Type = model.TEAM_OPEN 134 135 if err := (<-ss.Team().Save(&o1)).Err; err != nil { 136 t.Fatal(err) 137 } 138 139 if r1 := <-ss.Team().GetByName(o1.Name); r1.Err != nil { 140 t.Fatal(r1.Err) 141 } else { 142 if r1.Data.(*model.Team).ToJson() != o1.ToJson() { 143 t.Fatal("invalid returned team") 144 } 145 } 146 147 if err := (<-ss.Team().GetByName("")).Err; err == nil { 148 t.Fatal("Missing id should have failed") 149 } 150 } 151 152 func testTeamStoreSearchByName(t *testing.T, ss store.Store) { 153 o1 := model.Team{} 154 o1.DisplayName = "DisplayName" 155 var name = "zzz" + model.NewId() 156 o1.Name = name + "b" 157 o1.Email = model.NewId() + "@nowhere.com" 158 o1.Type = model.TEAM_OPEN 159 160 if err := (<-ss.Team().Save(&o1)).Err; err != nil { 161 t.Fatal(err) 162 } 163 164 if r1 := <-ss.Team().SearchByName(name); r1.Err != nil { 165 t.Fatal(r1.Err) 166 } else { 167 if r1.Data.([]*model.Team)[0].ToJson() != o1.ToJson() { 168 t.Fatal("invalid returned team") 169 } 170 } 171 } 172 173 func testTeamStoreSearchAll(t *testing.T, ss store.Store) { 174 o1 := model.Team{} 175 o1.DisplayName = "ADisplayName" + model.NewId() 176 o1.Name = "zz" + model.NewId() + "a" 177 o1.Email = model.NewId() + "@nowhere.com" 178 o1.Type = model.TEAM_OPEN 179 180 if err := (<-ss.Team().Save(&o1)).Err; err != nil { 181 t.Fatal(err) 182 } 183 184 p2 := model.Team{} 185 p2.DisplayName = "BDisplayName" + model.NewId() 186 p2.Name = "b" + model.NewId() + "b" 187 p2.Email = model.NewId() + "@nowhere.com" 188 p2.Type = model.TEAM_INVITE 189 190 if err := (<-ss.Team().Save(&p2)).Err; err != nil { 191 t.Fatal(err) 192 } 193 194 r1 := <-ss.Team().SearchAll(o1.Name) 195 if r1.Err != nil { 196 t.Fatal(r1.Err) 197 } 198 if len(r1.Data.([]*model.Team)) != 1 { 199 t.Fatal("should have returned 1 team") 200 } 201 if r1.Data.([]*model.Team)[0].ToJson() != o1.ToJson() { 202 t.Fatal("invalid returned team") 203 } 204 205 r1 = <-ss.Team().SearchAll(p2.DisplayName) 206 if r1.Err != nil { 207 t.Fatal(r1.Err) 208 } 209 if len(r1.Data.([]*model.Team)) != 1 { 210 t.Fatal("should have returned 1 team") 211 } 212 if r1.Data.([]*model.Team)[0].ToJson() != p2.ToJson() { 213 t.Fatal("invalid returned team") 214 } 215 216 r1 = <-ss.Team().SearchAll("junk") 217 if r1.Err != nil { 218 t.Fatal(r1.Err) 219 } 220 if len(r1.Data.([]*model.Team)) != 0 { 221 t.Fatal("should have not returned a team") 222 } 223 } 224 225 func testTeamStoreSearchOpen(t *testing.T, ss store.Store) { 226 o1 := model.Team{} 227 o1.DisplayName = "ADisplayName" + model.NewId() 228 o1.Name = "zz" + model.NewId() + "a" 229 o1.Email = model.NewId() + "@nowhere.com" 230 o1.Type = model.TEAM_OPEN 231 o1.AllowOpenInvite = true 232 233 if err := (<-ss.Team().Save(&o1)).Err; err != nil { 234 t.Fatal(err) 235 } 236 237 o2 := model.Team{} 238 o2.DisplayName = "ADisplayName" + model.NewId() 239 o2.Name = "zz" + model.NewId() + "a" 240 o2.Email = model.NewId() + "@nowhere.com" 241 o2.Type = model.TEAM_OPEN 242 o2.AllowOpenInvite = false 243 244 if err := (<-ss.Team().Save(&o2)).Err; err != nil { 245 t.Fatal(err) 246 } 247 248 p2 := model.Team{} 249 p2.DisplayName = "BDisplayName" + model.NewId() 250 p2.Name = "b" + model.NewId() + "b" 251 p2.Email = model.NewId() + "@nowhere.com" 252 p2.Type = model.TEAM_INVITE 253 p2.AllowOpenInvite = true 254 255 if err := (<-ss.Team().Save(&p2)).Err; err != nil { 256 t.Fatal(err) 257 } 258 259 r1 := <-ss.Team().SearchOpen(o1.Name) 260 if r1.Err != nil { 261 t.Fatal(r1.Err) 262 } 263 if len(r1.Data.([]*model.Team)) != 1 { 264 t.Fatal("should have returned 1 team") 265 } 266 if r1.Data.([]*model.Team)[0].ToJson() != o1.ToJson() { 267 t.Fatal("invalid returned team") 268 } 269 270 r1 = <-ss.Team().SearchOpen(o1.DisplayName) 271 if r1.Err != nil { 272 t.Fatal(r1.Err) 273 } 274 if len(r1.Data.([]*model.Team)) != 1 { 275 t.Fatal("should have returned 1 team") 276 } 277 if r1.Data.([]*model.Team)[0].ToJson() != o1.ToJson() { 278 t.Fatal("invalid returned team") 279 } 280 281 r1 = <-ss.Team().SearchOpen(p2.Name) 282 if r1.Err != nil { 283 t.Fatal(r1.Err) 284 } 285 if len(r1.Data.([]*model.Team)) != 0 { 286 t.Fatal("should have not returned a team") 287 } 288 289 r1 = <-ss.Team().SearchOpen(p2.DisplayName) 290 if r1.Err != nil { 291 t.Fatal(r1.Err) 292 } 293 if len(r1.Data.([]*model.Team)) != 0 { 294 t.Fatal("should have not returned a team") 295 } 296 297 r1 = <-ss.Team().SearchOpen("junk") 298 if r1.Err != nil { 299 t.Fatal(r1.Err) 300 } 301 if len(r1.Data.([]*model.Team)) != 0 { 302 t.Fatal("should have not returned a team") 303 } 304 305 r1 = <-ss.Team().SearchOpen(o2.DisplayName) 306 if r1.Err != nil { 307 t.Fatal(r1.Err) 308 } 309 if len(r1.Data.([]*model.Team)) != 0 { 310 t.Fatal("should have not returned a team") 311 } 312 } 313 314 func testTeamStoreGetByIniviteId(t *testing.T, ss store.Store) { 315 o1 := model.Team{} 316 o1.DisplayName = "DisplayName" 317 o1.Name = "z-z-z" + model.NewId() + "b" 318 o1.Email = model.NewId() + "@nowhere.com" 319 o1.Type = model.TEAM_OPEN 320 o1.InviteId = model.NewId() 321 322 if err := (<-ss.Team().Save(&o1)).Err; err != nil { 323 t.Fatal(err) 324 } 325 326 o2 := model.Team{} 327 o2.DisplayName = "DisplayName" 328 o2.Name = "zz" + model.NewId() + "b" 329 o2.Email = model.NewId() + "@nowhere.com" 330 o2.Type = model.TEAM_OPEN 331 332 if err := (<-ss.Team().Save(&o2)).Err; err != nil { 333 t.Fatal(err) 334 } 335 336 if r1 := <-ss.Team().GetByInviteId(o1.InviteId); r1.Err != nil { 337 t.Fatal(r1.Err) 338 } else { 339 if r1.Data.(*model.Team).ToJson() != o1.ToJson() { 340 t.Fatal("invalid returned team") 341 } 342 } 343 344 o2.InviteId = "" 345 <-ss.Team().Update(&o2) 346 347 if r1 := <-ss.Team().GetByInviteId(o2.Id); r1.Err != nil { 348 t.Fatal(r1.Err) 349 } else { 350 if r1.Data.(*model.Team).Id != o2.Id { 351 t.Fatal("invalid returned team") 352 } 353 } 354 355 if err := (<-ss.Team().GetByInviteId("")).Err; err == nil { 356 t.Fatal("Missing id should have failed") 357 } 358 } 359 360 func testTeamStoreByUserId(t *testing.T, ss store.Store) { 361 o1 := &model.Team{} 362 o1.DisplayName = "DisplayName" 363 o1.Name = "z-z-z" + model.NewId() + "b" 364 o1.Email = model.NewId() + "@nowhere.com" 365 o1.Type = model.TEAM_OPEN 366 o1.InviteId = model.NewId() 367 o1 = store.Must(ss.Team().Save(o1)).(*model.Team) 368 369 m1 := &model.TeamMember{TeamId: o1.Id, UserId: model.NewId()} 370 store.Must(ss.Team().SaveMember(m1, -1)) 371 372 if r1 := <-ss.Team().GetTeamsByUserId(m1.UserId); r1.Err != nil { 373 t.Fatal(r1.Err) 374 } else { 375 teams := r1.Data.([]*model.Team) 376 if len(teams) == 0 { 377 t.Fatal("Should return a team") 378 } 379 380 if teams[0].Id != o1.Id { 381 t.Fatal("should be a member") 382 } 383 384 } 385 } 386 387 func testGetAllTeamListing(t *testing.T, ss store.Store) { 388 o1 := model.Team{} 389 o1.DisplayName = "DisplayName" 390 o1.Name = "z-z-z" + model.NewId() + "b" 391 o1.Email = model.NewId() + "@nowhere.com" 392 o1.Type = model.TEAM_OPEN 393 o1.AllowOpenInvite = true 394 store.Must(ss.Team().Save(&o1)) 395 396 o2 := model.Team{} 397 o2.DisplayName = "DisplayName" 398 o2.Name = "zz" + model.NewId() + "b" 399 o2.Email = model.NewId() + "@nowhere.com" 400 o2.Type = model.TEAM_OPEN 401 store.Must(ss.Team().Save(&o2)) 402 403 o3 := model.Team{} 404 o3.DisplayName = "DisplayName" 405 o3.Name = "z-z-z" + model.NewId() + "b" 406 o3.Email = model.NewId() + "@nowhere.com" 407 o3.Type = model.TEAM_INVITE 408 o3.AllowOpenInvite = true 409 store.Must(ss.Team().Save(&o3)) 410 411 o4 := model.Team{} 412 o4.DisplayName = "DisplayName" 413 o4.Name = "zz" + model.NewId() + "b" 414 o4.Email = model.NewId() + "@nowhere.com" 415 o4.Type = model.TEAM_INVITE 416 store.Must(ss.Team().Save(&o4)) 417 418 if r1 := <-ss.Team().GetAllTeamListing(); r1.Err != nil { 419 t.Fatal(r1.Err) 420 } else { 421 teams := r1.Data.([]*model.Team) 422 423 for _, team := range teams { 424 if !team.AllowOpenInvite { 425 t.Fatal("should have returned team with AllowOpenInvite as true") 426 } 427 } 428 429 if len(teams) == 0 { 430 t.Fatal("failed team listing") 431 } 432 } 433 } 434 435 func testGetAllTeamPageListing(t *testing.T, ss store.Store) { 436 o1 := model.Team{} 437 o1.DisplayName = "DisplayName" 438 o1.Name = "z-z-z" + model.NewId() + "b" 439 o1.Email = model.NewId() + "@nowhere.com" 440 o1.Type = model.TEAM_OPEN 441 o1.AllowOpenInvite = true 442 store.Must(ss.Team().Save(&o1)) 443 444 o2 := model.Team{} 445 o2.DisplayName = "DisplayName" 446 o2.Name = "zz" + model.NewId() + "b" 447 o2.Email = model.NewId() + "@nowhere.com" 448 o2.Type = model.TEAM_OPEN 449 o2.AllowOpenInvite = false 450 store.Must(ss.Team().Save(&o2)) 451 452 o3 := model.Team{} 453 o3.DisplayName = "DisplayName" 454 o3.Name = "z-z-z" + model.NewId() + "b" 455 o3.Email = model.NewId() + "@nowhere.com" 456 o3.Type = model.TEAM_INVITE 457 o3.AllowOpenInvite = true 458 store.Must(ss.Team().Save(&o3)) 459 460 o4 := model.Team{} 461 o4.DisplayName = "DisplayName" 462 o4.Name = "zz" + model.NewId() + "b" 463 o4.Email = model.NewId() + "@nowhere.com" 464 o4.Type = model.TEAM_INVITE 465 o4.AllowOpenInvite = false 466 store.Must(ss.Team().Save(&o4)) 467 468 if r1 := <-ss.Team().GetAllTeamPageListing(0, 10); r1.Err != nil { 469 t.Fatal(r1.Err) 470 } else { 471 teams := r1.Data.([]*model.Team) 472 473 for _, team := range teams { 474 if !team.AllowOpenInvite { 475 t.Fatal("should have returned team with AllowOpenInvite as true") 476 } 477 } 478 479 if len(teams) > 10 { 480 t.Fatal("should have returned max of 10 teams") 481 } 482 } 483 484 o5 := model.Team{} 485 o5.DisplayName = "DisplayName" 486 o5.Name = "z-z-z" + model.NewId() + "b" 487 o5.Email = model.NewId() + "@nowhere.com" 488 o5.Type = model.TEAM_OPEN 489 o5.AllowOpenInvite = true 490 store.Must(ss.Team().Save(&o5)) 491 492 if r1 := <-ss.Team().GetAllTeamPageListing(0, 4); r1.Err != nil { 493 t.Fatal(r1.Err) 494 } else { 495 teams := r1.Data.([]*model.Team) 496 497 for _, team := range teams { 498 if !team.AllowOpenInvite { 499 t.Fatal("should have returned team with AllowOpenInvite as true") 500 } 501 } 502 503 if len(teams) > 4 { 504 t.Fatal("should have returned max of 4 teams") 505 } 506 } 507 508 if r1 := <-ss.Team().GetAllTeamPageListing(1, 1); r1.Err != nil { 509 t.Fatal(r1.Err) 510 } else { 511 teams := r1.Data.([]*model.Team) 512 513 for _, team := range teams { 514 if !team.AllowOpenInvite { 515 t.Fatal("should have returned team with AllowOpenInvite as true") 516 } 517 } 518 519 if len(teams) > 1 { 520 t.Fatal("should have returned max of 1 team") 521 } 522 } 523 } 524 525 func testDelete(t *testing.T, ss store.Store) { 526 o1 := model.Team{} 527 o1.DisplayName = "DisplayName" 528 o1.Name = "z-z-z" + model.NewId() + "b" 529 o1.Email = model.NewId() + "@nowhere.com" 530 o1.Type = model.TEAM_OPEN 531 o1.AllowOpenInvite = true 532 store.Must(ss.Team().Save(&o1)) 533 534 o2 := model.Team{} 535 o2.DisplayName = "DisplayName" 536 o2.Name = "zz" + model.NewId() + "b" 537 o2.Email = model.NewId() + "@nowhere.com" 538 o2.Type = model.TEAM_OPEN 539 store.Must(ss.Team().Save(&o2)) 540 541 if r1 := <-ss.Team().PermanentDelete(o1.Id); r1.Err != nil { 542 t.Fatal(r1.Err) 543 } 544 } 545 546 func testTeamCount(t *testing.T, ss store.Store) { 547 o1 := model.Team{} 548 o1.DisplayName = "DisplayName" 549 o1.Name = "z-z-z" + model.NewId() + "b" 550 o1.Email = model.NewId() + "@nowhere.com" 551 o1.Type = model.TEAM_OPEN 552 o1.AllowOpenInvite = true 553 store.Must(ss.Team().Save(&o1)) 554 555 if r1 := <-ss.Team().AnalyticsTeamCount(); r1.Err != nil { 556 t.Fatal(r1.Err) 557 } else { 558 if r1.Data.(int64) == 0 { 559 t.Fatal("should be at least 1 team") 560 } 561 } 562 } 563 564 func testTeamMembers(t *testing.T, ss store.Store) { 565 teamId1 := model.NewId() 566 teamId2 := model.NewId() 567 568 m1 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()} 569 m2 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()} 570 m3 := &model.TeamMember{TeamId: teamId2, UserId: model.NewId()} 571 572 if r1 := <-ss.Team().SaveMember(m1, -1); r1.Err != nil { 573 t.Fatal(r1.Err) 574 } 575 576 store.Must(ss.Team().SaveMember(m2, -1)) 577 store.Must(ss.Team().SaveMember(m3, -1)) 578 579 if r1 := <-ss.Team().GetMembers(teamId1, 0, 100); r1.Err != nil { 580 t.Fatal(r1.Err) 581 } else { 582 ms := r1.Data.([]*model.TeamMember) 583 584 if len(ms) != 2 { 585 t.Fatal() 586 } 587 } 588 589 if r1 := <-ss.Team().GetMembers(teamId2, 0, 100); r1.Err != nil { 590 t.Fatal(r1.Err) 591 } else { 592 ms := r1.Data.([]*model.TeamMember) 593 594 if len(ms) != 1 { 595 t.Fatal() 596 } 597 598 if ms[0].UserId != m3.UserId { 599 t.Fatal() 600 601 } 602 } 603 604 if r1 := <-ss.Team().GetTeamsForUser(m1.UserId); r1.Err != nil { 605 t.Fatal(r1.Err) 606 } else { 607 ms := r1.Data.([]*model.TeamMember) 608 609 if len(ms) != 1 { 610 t.Fatal() 611 } 612 613 if ms[0].TeamId != m1.TeamId { 614 t.Fatal() 615 616 } 617 } 618 619 if r1 := <-ss.Team().RemoveMember(teamId1, m1.UserId); r1.Err != nil { 620 t.Fatal(r1.Err) 621 } 622 623 if r1 := <-ss.Team().GetMembers(teamId1, 0, 100); r1.Err != nil { 624 t.Fatal(r1.Err) 625 } else { 626 ms := r1.Data.([]*model.TeamMember) 627 628 if len(ms) != 1 { 629 t.Fatal() 630 } 631 632 if ms[0].UserId != m2.UserId { 633 t.Fatal() 634 635 } 636 } 637 638 store.Must(ss.Team().SaveMember(m1, -1)) 639 640 if r1 := <-ss.Team().RemoveAllMembersByTeam(teamId1); r1.Err != nil { 641 t.Fatal(r1.Err) 642 } 643 644 if r1 := <-ss.Team().GetMembers(teamId1, 0, 100); r1.Err != nil { 645 t.Fatal(r1.Err) 646 } else { 647 ms := r1.Data.([]*model.TeamMember) 648 649 if len(ms) != 0 { 650 t.Fatal() 651 } 652 } 653 654 uid := model.NewId() 655 m4 := &model.TeamMember{TeamId: teamId1, UserId: uid} 656 m5 := &model.TeamMember{TeamId: teamId2, UserId: uid} 657 store.Must(ss.Team().SaveMember(m4, -1)) 658 store.Must(ss.Team().SaveMember(m5, -1)) 659 660 if r1 := <-ss.Team().GetTeamsForUser(uid); r1.Err != nil { 661 t.Fatal(r1.Err) 662 } else { 663 ms := r1.Data.([]*model.TeamMember) 664 665 if len(ms) != 2 { 666 t.Fatal() 667 } 668 } 669 670 if r1 := <-ss.Team().RemoveAllMembersByUser(uid); r1.Err != nil { 671 t.Fatal(r1.Err) 672 } 673 674 if r1 := <-ss.Team().GetTeamsForUser(m1.UserId); r1.Err != nil { 675 t.Fatal(r1.Err) 676 } else { 677 ms := r1.Data.([]*model.TeamMember) 678 679 if len(ms) != 0 { 680 t.Fatal() 681 } 682 } 683 } 684 685 func testSaveTeamMemberMaxMembers(t *testing.T, ss store.Store) { 686 maxUsersPerTeam := 5 687 688 team := store.Must(ss.Team().Save(&model.Team{ 689 DisplayName: "DisplayName", 690 Name: "z-z-z" + model.NewId() + "b", 691 Type: model.TEAM_OPEN, 692 })).(*model.Team) 693 defer func() { 694 <-ss.Team().PermanentDelete(team.Id) 695 }() 696 697 userIds := make([]string, maxUsersPerTeam) 698 699 for i := 0; i < maxUsersPerTeam; i++ { 700 userIds[i] = store.Must(ss.User().Save(&model.User{ 701 Username: model.NewId(), 702 Email: model.NewId(), 703 })).(*model.User).Id 704 705 defer func(userId string) { 706 <-ss.User().PermanentDelete(userId) 707 }(userIds[i]) 708 709 store.Must(ss.Team().SaveMember(&model.TeamMember{ 710 TeamId: team.Id, 711 UserId: userIds[i], 712 }, maxUsersPerTeam)) 713 714 defer func(userId string) { 715 <-ss.Team().RemoveMember(team.Id, userId) 716 }(userIds[i]) 717 } 718 719 if result := <-ss.Team().GetTotalMemberCount(team.Id); result.Err != nil { 720 t.Fatal(result.Err) 721 } else if count := result.Data.(int64); int(count) != maxUsersPerTeam { 722 t.Fatalf("should start with 5 team members, had %v instead", count) 723 } 724 725 newUserId := store.Must(ss.User().Save(&model.User{ 726 Username: model.NewId(), 727 Email: model.NewId(), 728 })).(*model.User).Id 729 defer func() { 730 <-ss.User().PermanentDelete(newUserId) 731 }() 732 733 if result := <-ss.Team().SaveMember(&model.TeamMember{ 734 TeamId: team.Id, 735 UserId: newUserId, 736 }, maxUsersPerTeam); result.Err == nil { 737 t.Fatal("shouldn't be able to save member when at maximum members per team") 738 } 739 740 if result := <-ss.Team().GetTotalMemberCount(team.Id); result.Err != nil { 741 t.Fatal(result.Err) 742 } else if count := result.Data.(int64); int(count) != maxUsersPerTeam { 743 t.Fatalf("should still have 5 team members, had %v instead", count) 744 } 745 746 // Leaving the team from the UI sets DeleteAt instead of using TeamStore.RemoveMember 747 store.Must(ss.Team().UpdateMember(&model.TeamMember{ 748 TeamId: team.Id, 749 UserId: userIds[0], 750 DeleteAt: 1234, 751 })) 752 753 if result := <-ss.Team().GetTotalMemberCount(team.Id); result.Err != nil { 754 t.Fatal(result.Err) 755 } else if count := result.Data.(int64); int(count) != maxUsersPerTeam-1 { 756 t.Fatalf("should now only have 4 team members, had %v instead", count) 757 } 758 759 if result := <-ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: newUserId}, maxUsersPerTeam); result.Err != nil { 760 t.Fatal("should've been able to save new member after deleting one", result.Err) 761 } else { 762 defer func(userId string) { 763 <-ss.Team().RemoveMember(team.Id, userId) 764 }(newUserId) 765 } 766 767 if result := <-ss.Team().GetTotalMemberCount(team.Id); result.Err != nil { 768 t.Fatal(result.Err) 769 } else if count := result.Data.(int64); int(count) != maxUsersPerTeam { 770 t.Fatalf("should have 5 team members again, had %v instead", count) 771 } 772 773 // Deactivating a user should make them stop counting against max members 774 user2 := store.Must(ss.User().Get(userIds[1])).(*model.User) 775 user2.DeleteAt = 1234 776 store.Must(ss.User().Update(user2, true)) 777 778 newUserId2 := store.Must(ss.User().Save(&model.User{ 779 Username: model.NewId(), 780 Email: model.NewId(), 781 })).(*model.User).Id 782 if result := <-ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: newUserId2}, maxUsersPerTeam); result.Err != nil { 783 t.Fatal("should've been able to save new member after deleting one", result.Err) 784 } else { 785 defer func(userId string) { 786 <-ss.Team().RemoveMember(team.Id, userId) 787 }(newUserId2) 788 } 789 } 790 791 func testGetTeamMember(t *testing.T, ss store.Store) { 792 teamId1 := model.NewId() 793 794 m1 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()} 795 store.Must(ss.Team().SaveMember(m1, -1)) 796 797 if r := <-ss.Team().GetMember(m1.TeamId, m1.UserId); r.Err != nil { 798 t.Fatal(r.Err) 799 } else { 800 rm1 := r.Data.(*model.TeamMember) 801 802 if rm1.TeamId != m1.TeamId { 803 t.Fatal("bad team id") 804 } 805 806 if rm1.UserId != m1.UserId { 807 t.Fatal("bad user id") 808 } 809 } 810 811 if r := <-ss.Team().GetMember(m1.TeamId, ""); r.Err == nil { 812 t.Fatal("empty user id - should have failed") 813 } 814 815 if r := <-ss.Team().GetMember("", m1.UserId); r.Err == nil { 816 t.Fatal("empty team id - should have failed") 817 } 818 } 819 820 func testGetTeamMembersByIds(t *testing.T, ss store.Store) { 821 teamId1 := model.NewId() 822 823 m1 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()} 824 store.Must(ss.Team().SaveMember(m1, -1)) 825 826 if r := <-ss.Team().GetMembersByIds(m1.TeamId, []string{m1.UserId}); r.Err != nil { 827 t.Fatal(r.Err) 828 } else { 829 rm1 := r.Data.([]*model.TeamMember)[0] 830 831 if rm1.TeamId != m1.TeamId { 832 t.Fatal("bad team id") 833 } 834 835 if rm1.UserId != m1.UserId { 836 t.Fatal("bad user id") 837 } 838 } 839 840 m2 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()} 841 store.Must(ss.Team().SaveMember(m2, -1)) 842 843 if r := <-ss.Team().GetMembersByIds(m1.TeamId, []string{m1.UserId, m2.UserId, model.NewId()}); r.Err != nil { 844 t.Fatal(r.Err) 845 } else { 846 rm := r.Data.([]*model.TeamMember) 847 848 if len(rm) != 2 { 849 t.Fatal("return wrong number of results") 850 } 851 } 852 853 if r := <-ss.Team().GetMembersByIds(m1.TeamId, []string{}); r.Err == nil { 854 t.Fatal("empty user ids - should have failed") 855 } 856 } 857 858 func testTeamStoreMemberCount(t *testing.T, ss store.Store) { 859 u1 := &model.User{} 860 u1.Email = model.NewId() 861 store.Must(ss.User().Save(u1)) 862 863 u2 := &model.User{} 864 u2.Email = model.NewId() 865 u2.DeleteAt = 1 866 store.Must(ss.User().Save(u2)) 867 868 teamId1 := model.NewId() 869 m1 := &model.TeamMember{TeamId: teamId1, UserId: u1.Id} 870 store.Must(ss.Team().SaveMember(m1, -1)) 871 872 m2 := &model.TeamMember{TeamId: teamId1, UserId: u2.Id} 873 store.Must(ss.Team().SaveMember(m2, -1)) 874 875 if result := <-ss.Team().GetTotalMemberCount(teamId1); result.Err != nil { 876 t.Fatal(result.Err) 877 } else { 878 if result.Data.(int64) != 2 { 879 t.Fatal("wrong count") 880 } 881 } 882 883 if result := <-ss.Team().GetActiveMemberCount(teamId1); result.Err != nil { 884 t.Fatal(result.Err) 885 } else { 886 if result.Data.(int64) != 1 { 887 t.Fatal("wrong count") 888 } 889 } 890 891 m3 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()} 892 store.Must(ss.Team().SaveMember(m3, -1)) 893 894 if result := <-ss.Team().GetTotalMemberCount(teamId1); result.Err != nil { 895 t.Fatal(result.Err) 896 } else { 897 if result.Data.(int64) != 2 { 898 t.Fatal("wrong count") 899 } 900 } 901 902 if result := <-ss.Team().GetActiveMemberCount(teamId1); result.Err != nil { 903 t.Fatal(result.Err) 904 } else { 905 if result.Data.(int64) != 1 { 906 t.Fatal("wrong count") 907 } 908 } 909 } 910 911 func testGetChannelUnreadsForAllTeams(t *testing.T, ss store.Store) { 912 teamId1 := model.NewId() 913 teamId2 := model.NewId() 914 915 uid := model.NewId() 916 m1 := &model.TeamMember{TeamId: teamId1, UserId: uid} 917 m2 := &model.TeamMember{TeamId: teamId2, UserId: uid} 918 store.Must(ss.Team().SaveMember(m1, -1)) 919 store.Must(ss.Team().SaveMember(m2, -1)) 920 921 c1 := &model.Channel{TeamId: m1.TeamId, Name: model.NewId(), DisplayName: "Town Square", Type: model.CHANNEL_OPEN, TotalMsgCount: 100} 922 store.Must(ss.Channel().Save(c1, -1)) 923 c2 := &model.Channel{TeamId: m2.TeamId, Name: model.NewId(), DisplayName: "Town Square", Type: model.CHANNEL_OPEN, TotalMsgCount: 100} 924 store.Must(ss.Channel().Save(c2, -1)) 925 926 cm1 := &model.ChannelMember{ChannelId: c1.Id, UserId: m1.UserId, NotifyProps: model.GetDefaultChannelNotifyProps(), MsgCount: 90} 927 store.Must(ss.Channel().SaveMember(cm1)) 928 cm2 := &model.ChannelMember{ChannelId: c2.Id, UserId: m2.UserId, NotifyProps: model.GetDefaultChannelNotifyProps(), MsgCount: 90} 929 store.Must(ss.Channel().SaveMember(cm2)) 930 931 if r1 := <-ss.Team().GetChannelUnreadsForAllTeams("", uid); r1.Err != nil { 932 t.Fatal(r1.Err) 933 } else { 934 ms := r1.Data.([]*model.ChannelUnread) 935 membersMap := make(map[string]bool) 936 for i := range ms { 937 id := ms[i].TeamId 938 if _, ok := membersMap[id]; !ok { 939 membersMap[id] = true 940 } 941 } 942 if len(membersMap) != 2 { 943 t.Fatal("Should be the unreads for all the teams") 944 } 945 946 if ms[0].MsgCount != 10 { 947 t.Fatal("subtraction failed") 948 } 949 } 950 951 if r2 := <-ss.Team().GetChannelUnreadsForAllTeams(teamId1, uid); r2.Err != nil { 952 t.Fatal(r2.Err) 953 } else { 954 ms := r2.Data.([]*model.ChannelUnread) 955 membersMap := make(map[string]bool) 956 for i := range ms { 957 id := ms[i].TeamId 958 if _, ok := membersMap[id]; !ok { 959 membersMap[id] = true 960 } 961 } 962 963 if len(membersMap) != 1 { 964 t.Fatal("Should be the unreads for just one team") 965 } 966 967 if ms[0].MsgCount != 10 { 968 t.Fatal("subtraction failed") 969 } 970 } 971 972 if r1 := <-ss.Team().RemoveAllMembersByUser(uid); r1.Err != nil { 973 t.Fatal(r1.Err) 974 } 975 } 976 977 func testGetChannelUnreadsForTeam(t *testing.T, ss store.Store) { 978 teamId1 := model.NewId() 979 980 uid := model.NewId() 981 m1 := &model.TeamMember{TeamId: teamId1, UserId: uid} 982 store.Must(ss.Team().SaveMember(m1, -1)) 983 984 c1 := &model.Channel{TeamId: m1.TeamId, Name: model.NewId(), DisplayName: "Town Square", Type: model.CHANNEL_OPEN, TotalMsgCount: 100} 985 store.Must(ss.Channel().Save(c1, -1)) 986 c2 := &model.Channel{TeamId: m1.TeamId, Name: model.NewId(), DisplayName: "Town Square", Type: model.CHANNEL_OPEN, TotalMsgCount: 100} 987 store.Must(ss.Channel().Save(c2, -1)) 988 989 cm1 := &model.ChannelMember{ChannelId: c1.Id, UserId: m1.UserId, NotifyProps: model.GetDefaultChannelNotifyProps(), MsgCount: 90} 990 store.Must(ss.Channel().SaveMember(cm1)) 991 cm2 := &model.ChannelMember{ChannelId: c2.Id, UserId: m1.UserId, NotifyProps: model.GetDefaultChannelNotifyProps(), MsgCount: 90} 992 store.Must(ss.Channel().SaveMember(cm2)) 993 994 if r1 := <-ss.Team().GetChannelUnreadsForTeam(m1.TeamId, m1.UserId); r1.Err != nil { 995 t.Fatal(r1.Err) 996 } else { 997 ms := r1.Data.([]*model.ChannelUnread) 998 if len(ms) != 2 { 999 t.Fatal("wrong length") 1000 } 1001 1002 if ms[0].MsgCount != 10 { 1003 t.Fatal("subtraction failed") 1004 } 1005 } 1006 } 1007 1008 func testUpdateLastTeamIconUpdate(t *testing.T, ss store.Store) { 1009 1010 // team icon initially updated a second ago 1011 lastTeamIconUpdateInitial := model.GetMillis() - 1000 1012 1013 o1 := &model.Team{} 1014 o1.DisplayName = "Display Name" 1015 o1.Name = "z-z-z" + model.NewId() + "b" 1016 o1.Email = model.NewId() + "@nowhere.com" 1017 o1.Type = model.TEAM_OPEN 1018 o1.LastTeamIconUpdate = lastTeamIconUpdateInitial 1019 o1 = (<-ss.Team().Save(o1)).Data.(*model.Team) 1020 1021 curTime := model.GetMillis() 1022 1023 if err := (<-ss.Team().UpdateLastTeamIconUpdate(o1.Id, curTime)).Err; err != nil { 1024 t.Fatal(err) 1025 } 1026 1027 ro1 := (<-ss.Team().Get(o1.Id)).Data.(*model.Team) 1028 if ro1.LastTeamIconUpdate <= lastTeamIconUpdateInitial { 1029 t.Fatal("LastTeamIconUpdate not updated") 1030 } 1031 }