github.com/haalcala/mattermost-server-change-repo@v0.0.0-20210713015153-16753fbeee5f/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 "context" 8 "errors" 9 "strings" 10 "testing" 11 "time" 12 13 "github.com/stretchr/testify/assert" 14 "github.com/stretchr/testify/require" 15 16 "github.com/mattermost/mattermost-server/v5/model" 17 "github.com/mattermost/mattermost-server/v5/store" 18 ) 19 20 func cleanupTeamStore(t *testing.T, ss store.Store) { 21 allTeams, err := ss.Team().GetAll() 22 for _, team := range allTeams { 23 ss.Team().PermanentDelete(team.Id) 24 } 25 assert.NoError(t, err) 26 } 27 28 func TestTeamStore(t *testing.T, ss store.Store) { 29 createDefaultRoles(ss) 30 31 t.Run("Save", func(t *testing.T) { testTeamStoreSave(t, ss) }) 32 t.Run("Update", func(t *testing.T) { testTeamStoreUpdate(t, ss) }) 33 t.Run("Get", func(t *testing.T) { testTeamStoreGet(t, ss) }) 34 t.Run("GetByName", func(t *testing.T) { testTeamStoreGetByName(t, ss) }) 35 t.Run("GetByNames", func(t *testing.T) { testTeamStoreGetByNames(t, ss) }) 36 t.Run("SearchAll", func(t *testing.T) { testTeamStoreSearchAll(t, ss) }) 37 t.Run("SearchOpen", func(t *testing.T) { testTeamStoreSearchOpen(t, ss) }) 38 t.Run("SearchPrivate", func(t *testing.T) { testTeamStoreSearchPrivate(t, ss) }) 39 t.Run("GetByInviteId", func(t *testing.T) { testTeamStoreGetByInviteId(t, ss) }) 40 t.Run("ByUserId", func(t *testing.T) { testTeamStoreByUserId(t, ss) }) 41 t.Run("GetAllTeamListing", func(t *testing.T) { testGetAllTeamListing(t, ss) }) 42 t.Run("GetAllTeamPageListing", func(t *testing.T) { testGetAllTeamPageListing(t, ss) }) 43 t.Run("GetAllPrivateTeamListing", func(t *testing.T) { testGetAllPrivateTeamListing(t, ss) }) 44 t.Run("GetAllPrivateTeamPageListing", func(t *testing.T) { testGetAllPrivateTeamPageListing(t, ss) }) 45 t.Run("GetAllPublicTeamPageListing", func(t *testing.T) { testGetAllPublicTeamPageListing(t, ss) }) 46 t.Run("Delete", func(t *testing.T) { testDelete(t, ss) }) 47 t.Run("TeamCount", func(t *testing.T) { testTeamCount(t, ss) }) 48 t.Run("TeamPublicCount", func(t *testing.T) { testPublicTeamCount(t, ss) }) 49 t.Run("TeamPrivateCount", func(t *testing.T) { testPrivateTeamCount(t, ss) }) 50 t.Run("TeamMembers", func(t *testing.T) { testTeamMembers(t, ss) }) 51 t.Run("TestGetMembers", func(t *testing.T) { testGetMembers(t, ss) }) 52 t.Run("SaveMember", func(t *testing.T) { testTeamSaveMember(t, ss) }) 53 t.Run("SaveMultipleMembers", func(t *testing.T) { testTeamSaveMultipleMembers(t, ss) }) 54 t.Run("UpdateMember", func(t *testing.T) { testTeamUpdateMember(t, ss) }) 55 t.Run("UpdateMultipleMembers", func(t *testing.T) { testTeamUpdateMultipleMembers(t, ss) }) 56 t.Run("RemoveMember", func(t *testing.T) { testTeamRemoveMember(t, ss) }) 57 t.Run("RemoveMembers", func(t *testing.T) { testTeamRemoveMembers(t, ss) }) 58 t.Run("SaveTeamMemberMaxMembers", func(t *testing.T) { testSaveTeamMemberMaxMembers(t, ss) }) 59 t.Run("GetTeamMember", func(t *testing.T) { testGetTeamMember(t, ss) }) 60 t.Run("GetTeamMembersByIds", func(t *testing.T) { testGetTeamMembersByIds(t, ss) }) 61 t.Run("MemberCount", func(t *testing.T) { testTeamStoreMemberCount(t, ss) }) 62 t.Run("GetChannelUnreadsForAllTeams", func(t *testing.T) { testGetChannelUnreadsForAllTeams(t, ss) }) 63 t.Run("GetChannelUnreadsForTeam", func(t *testing.T) { testGetChannelUnreadsForTeam(t, ss) }) 64 t.Run("UpdateLastTeamIconUpdate", func(t *testing.T) { testUpdateLastTeamIconUpdate(t, ss) }) 65 t.Run("GetTeamsByScheme", func(t *testing.T) { testGetTeamsByScheme(t, ss) }) 66 t.Run("MigrateTeamMembers", func(t *testing.T) { testTeamStoreMigrateTeamMembers(t, ss) }) 67 t.Run("ResetAllTeamSchemes", func(t *testing.T) { testResetAllTeamSchemes(t, ss) }) 68 t.Run("ClearAllCustomRoleAssignments", func(t *testing.T) { testTeamStoreClearAllCustomRoleAssignments(t, ss) }) 69 t.Run("AnalyticsGetTeamCountForScheme", func(t *testing.T) { testTeamStoreAnalyticsGetTeamCountForScheme(t, ss) }) 70 t.Run("GetAllForExportAfter", func(t *testing.T) { testTeamStoreGetAllForExportAfter(t, ss) }) 71 t.Run("GetTeamMembersForExport", func(t *testing.T) { testTeamStoreGetTeamMembersForExport(t, ss) }) 72 t.Run("GetTeamsForUserWithPagination", func(t *testing.T) { testTeamMembersWithPagination(t, ss) }) 73 t.Run("GroupSyncedTeamCount", func(t *testing.T) { testGroupSyncedTeamCount(t, ss) }) 74 } 75 76 func testTeamStoreSave(t *testing.T, ss store.Store) { 77 o1 := model.Team{} 78 o1.DisplayName = "DisplayName" 79 o1.Name = "z-z-z" + model.NewId() + "b" 80 o1.Email = MakeEmail() 81 o1.Type = model.TEAM_OPEN 82 83 _, err := ss.Team().Save(&o1) 84 require.NoError(t, err, "couldn't save item") 85 86 _, err = ss.Team().Save(&o1) 87 require.Error(t, err, "shouldn't be able to update from save") 88 89 o1.Id = "" 90 _, err = ss.Team().Save(&o1) 91 require.Error(t, err, "should be unique domain") 92 } 93 94 func testTeamStoreUpdate(t *testing.T, ss store.Store) { 95 o1 := model.Team{} 96 o1.DisplayName = "DisplayName" 97 o1.Name = "z-z-z" + model.NewId() + "b" 98 o1.Email = MakeEmail() 99 o1.Type = model.TEAM_OPEN 100 _, err := ss.Team().Save(&o1) 101 require.NoError(t, err) 102 103 time.Sleep(100 * time.Millisecond) 104 105 _, err = ss.Team().Update(&o1) 106 require.NoError(t, err) 107 108 o1.Id = "missing" 109 _, err = ss.Team().Update(&o1) 110 require.Error(t, err, "Update should have failed because of missing key") 111 112 o1.Id = model.NewId() 113 _, err = ss.Team().Update(&o1) 114 require.Error(t, err, "Update should have faile because id change") 115 } 116 117 func testTeamStoreGet(t *testing.T, ss store.Store) { 118 o1 := model.Team{} 119 o1.DisplayName = "DisplayName" 120 o1.Name = "z-z-z" + model.NewId() + "b" 121 o1.Email = MakeEmail() 122 o1.Type = model.TEAM_OPEN 123 _, err := ss.Team().Save(&o1) 124 require.NoError(t, err) 125 126 r1, err := ss.Team().Get(o1.Id) 127 require.NoError(t, err) 128 require.Equal(t, r1.ToJson(), o1.ToJson()) 129 130 _, err = ss.Team().Get("") 131 require.Error(t, err, "Missing id should have failed") 132 } 133 134 func testTeamStoreGetByNames(t *testing.T, ss store.Store) { 135 o1 := model.Team{} 136 o1.DisplayName = "DisplayName" 137 o1.Name = "z-z-z" + model.NewId() + "b" 138 o1.Email = MakeEmail() 139 o1.Type = model.TEAM_OPEN 140 141 _, err := ss.Team().Save(&o1) 142 require.NoError(t, err) 143 144 o2 := model.Team{} 145 o2.DisplayName = "DisplayName2" 146 o2.Name = "z-z-z" + model.NewId() + "b" 147 o2.Email = MakeEmail() 148 o2.Type = model.TEAM_OPEN 149 150 _, err = ss.Team().Save(&o2) 151 require.NoError(t, err) 152 153 t.Run("Get empty list", func(t *testing.T) { 154 var teams []*model.Team 155 teams, err = ss.Team().GetByNames([]string{}) 156 require.NoError(t, err) 157 require.Empty(t, teams) 158 }) 159 160 t.Run("Get existing teams", func(t *testing.T) { 161 var teams []*model.Team 162 teams, err = ss.Team().GetByNames([]string{o1.Name, o2.Name}) 163 require.NoError(t, err) 164 teamsIds := []string{} 165 for _, team := range teams { 166 teamsIds = append(teamsIds, team.Id) 167 } 168 assert.Contains(t, teamsIds, o1.Id, "invalid returned team") 169 assert.Contains(t, teamsIds, o2.Id, "invalid returned team") 170 }) 171 172 t.Run("Get existing team and one invalid team name", func(t *testing.T) { 173 _, err = ss.Team().GetByNames([]string{o1.Name, ""}) 174 require.Error(t, err) 175 }) 176 177 t.Run("Get existing team and not existing team", func(t *testing.T) { 178 _, err = ss.Team().GetByNames([]string{o1.Name, "not-existing-team-name"}) 179 require.Error(t, err) 180 }) 181 t.Run("Get not existing teams", func(t *testing.T) { 182 _, err = ss.Team().GetByNames([]string{"not-existing-team-name", "not-existing-team-name-2"}) 183 require.Error(t, err) 184 }) 185 } 186 187 func testTeamStoreGetByName(t *testing.T, ss store.Store) { 188 o1 := model.Team{} 189 o1.DisplayName = "DisplayName" 190 o1.Name = "z-z-z" + model.NewId() + "b" 191 o1.Email = MakeEmail() 192 o1.Type = model.TEAM_OPEN 193 194 _, err := ss.Team().Save(&o1) 195 require.NoError(t, err) 196 197 t.Run("Get existing team", func(t *testing.T) { 198 var team *model.Team 199 team, err = ss.Team().GetByName(o1.Name) 200 require.NoError(t, err) 201 require.Equal(t, *team, o1, "invalid returned team") 202 }) 203 204 t.Run("Get invalid team name", func(t *testing.T) { 205 _, err = ss.Team().GetByName("") 206 require.Error(t, err, "Missing id should have failed") 207 }) 208 209 t.Run("Get not existing team", func(t *testing.T) { 210 _, err = ss.Team().GetByName("not-existing-team-name") 211 require.Error(t, err, "Missing id should have failed") 212 }) 213 } 214 215 func testTeamStoreSearchAll(t *testing.T, ss store.Store) { 216 o := model.Team{} 217 o.DisplayName = "ADisplayName" + model.NewId() 218 o.Name = "zzzzzz-" + model.NewId() + "a" 219 o.Email = MakeEmail() 220 o.Type = model.TEAM_OPEN 221 o.AllowOpenInvite = true 222 223 _, err := ss.Team().Save(&o) 224 require.NoError(t, err) 225 226 p := model.Team{} 227 p.DisplayName = "BDisplayName" + model.NewId() 228 p.Name = "zzzzzz-" + model.NewId() + "a" 229 p.Email = MakeEmail() 230 p.Type = model.TEAM_OPEN 231 p.AllowOpenInvite = false 232 233 _, err = ss.Team().Save(&p) 234 require.NoError(t, err) 235 236 g := model.Team{} 237 g.DisplayName = "CDisplayName" + model.NewId() 238 g.Name = "zzzzzz-" + model.NewId() + "a" 239 g.Email = MakeEmail() 240 g.Type = model.TEAM_OPEN 241 g.AllowOpenInvite = false 242 g.GroupConstrained = model.NewBool(true) 243 244 _, err = ss.Team().Save(&g) 245 require.NoError(t, err) 246 247 q := model.Team{} 248 q.DisplayName = "CHOCOLATE" 249 q.Name = "ilovecake" 250 q.Email = MakeEmail() 251 q.Type = model.TEAM_OPEN 252 q.AllowOpenInvite = false 253 254 _, err = ss.Team().Save(&q) 255 require.NoError(t, err) 256 257 testCases := []struct { 258 Name string 259 Opts *model.TeamSearch 260 ExpectedLenth int 261 ExpectedTeamIds []string 262 }{ 263 { 264 "Search chocolate by display name", 265 &model.TeamSearch{Term: "ocola"}, 266 1, 267 []string{q.Id}, 268 }, 269 { 270 "Search chocolate by display name", 271 &model.TeamSearch{Term: "choc"}, 272 1, 273 []string{q.Id}, 274 }, 275 { 276 "Search chocolate by display name", 277 &model.TeamSearch{Term: "late"}, 278 1, 279 []string{q.Id}, 280 }, 281 { 282 "Search chocolate by name", 283 &model.TeamSearch{Term: "ilov"}, 284 1, 285 []string{q.Id}, 286 }, 287 { 288 "Search chocolate by name", 289 &model.TeamSearch{Term: "ecake"}, 290 1, 291 []string{q.Id}, 292 }, 293 { 294 "Search for open team name", 295 &model.TeamSearch{Term: o.Name}, 296 1, 297 []string{o.Id}, 298 }, 299 { 300 "Search for open team displayName", 301 &model.TeamSearch{Term: o.DisplayName}, 302 1, 303 []string{o.Id}, 304 }, 305 { 306 "Search for open team without results", 307 &model.TeamSearch{Term: "notexists"}, 308 0, 309 []string{}, 310 }, 311 { 312 "Search for private team", 313 &model.TeamSearch{Term: p.DisplayName}, 314 1, 315 []string{p.Id}, 316 }, 317 { 318 "Search for all 3 z teams", 319 &model.TeamSearch{Term: "zzzzzz"}, 320 3, 321 []string{o.Id, p.Id, g.Id}, 322 }, 323 { 324 "Search for all 3 teams filter by allow open invite", 325 &model.TeamSearch{Term: "zzzzzz", AllowOpenInvite: model.NewBool(true)}, 326 1, 327 []string{o.Id}, 328 }, 329 { 330 "Search for all 3 teams filter by allow open invite = false", 331 &model.TeamSearch{Term: "zzzzzz", AllowOpenInvite: model.NewBool(false)}, 332 1, 333 []string{p.Id}, 334 }, 335 { 336 "Search for all 3 teams filter by group constrained", 337 &model.TeamSearch{Term: "zzzzzz", GroupConstrained: model.NewBool(true)}, 338 1, 339 []string{g.Id}, 340 }, 341 { 342 "Search for all 3 teams filter by group constrained = false", 343 &model.TeamSearch{Term: "zzzzzz", GroupConstrained: model.NewBool(false)}, 344 2, 345 []string{o.Id, p.Id}, 346 }, 347 { 348 "Search for all 3 teams filter by allow open invite and include group constrained", 349 &model.TeamSearch{Term: "zzzzzz", AllowOpenInvite: model.NewBool(true), GroupConstrained: model.NewBool(true)}, 350 2, 351 []string{o.Id, g.Id}, 352 }, 353 { 354 "Search for all 3 teams filter by group constrained and not open invite", 355 &model.TeamSearch{Term: "zzzzzz", GroupConstrained: model.NewBool(true), AllowOpenInvite: model.NewBool(false)}, 356 2, 357 []string{g.Id, p.Id}, 358 }, 359 { 360 "Search for all 3 teams filter by group constrained false and open invite", 361 &model.TeamSearch{Term: "zzzzzz", GroupConstrained: model.NewBool(false), AllowOpenInvite: model.NewBool(true)}, 362 2, 363 []string{o.Id, p.Id}, 364 }, 365 { 366 "Search for all 3 teams filter by group constrained false and open invite false", 367 &model.TeamSearch{Term: "zzzzzz", GroupConstrained: model.NewBool(false), AllowOpenInvite: model.NewBool(false)}, 368 2, 369 []string{p.Id, o.Id}, 370 }, 371 } 372 373 for _, tc := range testCases { 374 t.Run(tc.Name, func(t *testing.T) { 375 response, err := ss.Team().SearchAll(tc.Opts.Term, tc.Opts) 376 require.NoError(t, err) 377 require.Equal(t, tc.ExpectedLenth, len(response)) 378 responseTeamIds := []string{} 379 for _, team := range response { 380 responseTeamIds = append(responseTeamIds, team.Id) 381 } 382 require.ElementsMatch(t, tc.ExpectedTeamIds, responseTeamIds) 383 }) 384 } 385 } 386 387 func testTeamStoreSearchOpen(t *testing.T, ss store.Store) { 388 o := model.Team{} 389 o.DisplayName = "ADisplayName" + model.NewId() 390 o.Name = "zz" + model.NewId() + "a" 391 o.Email = MakeEmail() 392 o.Type = model.TEAM_OPEN 393 o.AllowOpenInvite = true 394 395 _, err := ss.Team().Save(&o) 396 require.NoError(t, err) 397 398 p := model.Team{} 399 p.DisplayName = "ADisplayName" + model.NewId() 400 p.Name = "zz" + model.NewId() + "a" 401 p.Email = MakeEmail() 402 p.Type = model.TEAM_OPEN 403 p.AllowOpenInvite = false 404 405 _, err = ss.Team().Save(&p) 406 require.NoError(t, err) 407 408 q := model.Team{} 409 q.DisplayName = "PINEAPPLEPIE" 410 q.Name = "ihadsomepineapplepiewithstrawberry" 411 q.Email = MakeEmail() 412 q.Type = model.TEAM_OPEN 413 q.AllowOpenInvite = true 414 415 _, err = ss.Team().Save(&q) 416 require.NoError(t, err) 417 418 testCases := []struct { 419 Name string 420 Term string 421 ExpectedLength int 422 ExpectedFirstId string 423 }{ 424 { 425 "Search PINEAPPLEPIE by display name", 426 "neapplep", 427 1, 428 q.Id, 429 }, 430 { 431 "Search PINEAPPLEPIE by display name", 432 "pine", 433 1, 434 q.Id, 435 }, 436 { 437 "Search PINEAPPLEPIE by display name", 438 "epie", 439 1, 440 q.Id, 441 }, 442 { 443 "Search PINEAPPLEPIE by name", 444 "ihadsome", 445 1, 446 q.Id, 447 }, 448 { 449 "Search PINEAPPLEPIE by name", 450 "pineapplepiewithstrawberry", 451 1, 452 q.Id, 453 }, 454 { 455 "Search for open team name", 456 o.Name, 457 1, 458 o.Id, 459 }, 460 { 461 "Search for open team displayName", 462 o.DisplayName, 463 1, 464 o.Id, 465 }, 466 { 467 "Search for open team without results", 468 "notexists", 469 0, 470 "", 471 }, 472 { 473 "Search for a private team (expected no results)", 474 p.DisplayName, 475 0, 476 "", 477 }, 478 } 479 480 for _, tc := range testCases { 481 t.Run(tc.Name, func(t *testing.T) { 482 r1, err := ss.Team().SearchOpen(tc.Term) 483 require.NoError(t, err) 484 results := r1 485 require.Equal(t, tc.ExpectedLength, len(results)) 486 if tc.ExpectedFirstId != "" { 487 assert.Equal(t, tc.ExpectedFirstId, results[0].Id) 488 } 489 }) 490 } 491 } 492 493 func testTeamStoreSearchPrivate(t *testing.T, ss store.Store) { 494 o := model.Team{} 495 o.DisplayName = "ADisplayName" + model.NewId() 496 o.Name = "zz" + model.NewId() + "a" 497 o.Email = MakeEmail() 498 o.Type = model.TEAM_OPEN 499 o.AllowOpenInvite = true 500 501 _, err := ss.Team().Save(&o) 502 require.NoError(t, err) 503 504 p := model.Team{} 505 p.DisplayName = "ADisplayName" + model.NewId() 506 p.Name = "zz" + model.NewId() + "a" 507 p.Email = MakeEmail() 508 p.Type = model.TEAM_OPEN 509 p.AllowOpenInvite = false 510 511 _, err = ss.Team().Save(&p) 512 require.NoError(t, err) 513 514 q := model.Team{} 515 q.DisplayName = "FOOBARDISPLAYNAME" 516 q.Name = "averylongname" 517 q.Email = MakeEmail() 518 q.Type = model.TEAM_OPEN 519 q.AllowOpenInvite = false 520 521 _, err = ss.Team().Save(&q) 522 require.NoError(t, err) 523 524 testCases := []struct { 525 Name string 526 Term string 527 ExpectedLength int 528 ExpectedFirstId string 529 }{ 530 { 531 "Search FooBar by display name from text in the middle of display name", 532 "oobardisplay", 533 1, 534 q.Id, 535 }, 536 { 537 "Search FooBar by display name from text at the beginning of display name", 538 "foobar", 539 1, 540 q.Id, 541 }, 542 { 543 "Search FooBar by display name from text at the end of display name", 544 "bardisplayname", 545 1, 546 q.Id, 547 }, 548 { 549 "Search FooBar by name from text at the beginning name", 550 "averyl", 551 1, 552 q.Id, 553 }, 554 { 555 "Search FooBar by name from text at the end of name", 556 "ongname", 557 1, 558 q.Id, 559 }, 560 { 561 "Search for private team name", 562 p.Name, 563 1, 564 p.Id, 565 }, 566 { 567 "Search for private team displayName", 568 p.DisplayName, 569 1, 570 p.Id, 571 }, 572 { 573 "Search for private team without results", 574 "notexists", 575 0, 576 "", 577 }, 578 { 579 "Search for a open team (expected no results)", 580 o.DisplayName, 581 0, 582 "", 583 }, 584 } 585 586 for _, tc := range testCases { 587 t.Run(tc.Name, func(t *testing.T) { 588 r1, err := ss.Team().SearchPrivate(tc.Term) 589 require.NoError(t, err) 590 results := r1 591 require.Equal(t, tc.ExpectedLength, len(results)) 592 if tc.ExpectedFirstId != "" { 593 assert.Equal(t, tc.ExpectedFirstId, results[0].Id) 594 } 595 }) 596 } 597 } 598 599 func testTeamStoreGetByInviteId(t *testing.T, ss store.Store) { 600 o1 := model.Team{} 601 o1.DisplayName = "DisplayName" 602 o1.Name = "z-z-z" + model.NewId() + "b" 603 o1.Email = MakeEmail() 604 o1.Type = model.TEAM_OPEN 605 o1.InviteId = model.NewId() 606 607 save1, err := ss.Team().Save(&o1) 608 require.NoError(t, err) 609 610 o2 := model.Team{} 611 o2.DisplayName = "DisplayName" 612 o2.Name = "zz" + model.NewId() + "b" 613 o2.Email = MakeEmail() 614 o2.Type = model.TEAM_OPEN 615 616 r1, err := ss.Team().GetByInviteId(save1.InviteId) 617 require.NoError(t, err) 618 require.Equal(t, *r1, o1, "invalid returned team") 619 620 _, err = ss.Team().GetByInviteId("") 621 require.Error(t, err, "Missing id should have failed") 622 } 623 624 func testTeamStoreByUserId(t *testing.T, ss store.Store) { 625 o1 := &model.Team{} 626 o1.DisplayName = "DisplayName" 627 o1.Name = "z-z-z" + model.NewId() + "b" 628 o1.Email = MakeEmail() 629 o1.Type = model.TEAM_OPEN 630 o1.InviteId = model.NewId() 631 o1, err := ss.Team().Save(o1) 632 require.NoError(t, err) 633 634 m1 := &model.TeamMember{TeamId: o1.Id, UserId: model.NewId()} 635 _, nErr := ss.Team().SaveMember(m1, -1) 636 require.NoError(t, nErr) 637 638 teams, err := ss.Team().GetTeamsByUserId(m1.UserId) 639 require.NoError(t, err) 640 require.Len(t, teams, 1, "Should return a team") 641 require.Equal(t, teams[0].Id, o1.Id, "should be a member") 642 } 643 644 func testGetAllTeamListing(t *testing.T, ss store.Store) { 645 o1 := model.Team{} 646 o1.DisplayName = "DisplayName" 647 o1.Name = "z-z-z" + model.NewId() + "b" 648 o1.Email = MakeEmail() 649 o1.Type = model.TEAM_OPEN 650 o1.AllowOpenInvite = true 651 _, err := ss.Team().Save(&o1) 652 require.NoError(t, err) 653 654 o2 := model.Team{} 655 o2.DisplayName = "DisplayName" 656 o2.Name = "zz" + model.NewId() + "b" 657 o2.Email = MakeEmail() 658 o2.Type = model.TEAM_OPEN 659 _, err = ss.Team().Save(&o2) 660 require.NoError(t, err) 661 662 o3 := model.Team{} 663 o3.DisplayName = "DisplayName" 664 o3.Name = "z-z-z" + model.NewId() + "b" 665 o3.Email = MakeEmail() 666 o3.Type = model.TEAM_INVITE 667 o3.AllowOpenInvite = true 668 _, err = ss.Team().Save(&o3) 669 require.NoError(t, err) 670 671 o4 := model.Team{} 672 o4.DisplayName = "DisplayName" 673 o4.Name = "zz" + model.NewId() + "b" 674 o4.Email = MakeEmail() 675 o4.Type = model.TEAM_INVITE 676 _, err = ss.Team().Save(&o4) 677 require.NoError(t, err) 678 679 teams, err := ss.Team().GetAllTeamListing() 680 require.NoError(t, err) 681 for _, team := range teams { 682 require.True(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as true") 683 } 684 685 require.NotEmpty(t, teams, "failed team listing") 686 } 687 688 func testGetAllTeamPageListing(t *testing.T, ss store.Store) { 689 o1 := model.Team{} 690 o1.DisplayName = "DisplayName" 691 o1.Name = "z-z-z" + model.NewId() + "b" 692 o1.Email = MakeEmail() 693 o1.Type = model.TEAM_OPEN 694 o1.AllowOpenInvite = true 695 _, err := ss.Team().Save(&o1) 696 require.NoError(t, err) 697 698 o2 := model.Team{} 699 o2.DisplayName = "DisplayName" 700 o2.Name = "zz" + model.NewId() + "b" 701 o2.Email = MakeEmail() 702 o2.Type = model.TEAM_OPEN 703 o2.AllowOpenInvite = false 704 _, err = ss.Team().Save(&o2) 705 require.NoError(t, err) 706 707 o3 := model.Team{} 708 o3.DisplayName = "DisplayName" 709 o3.Name = "z-z-z" + model.NewId() + "b" 710 o3.Email = MakeEmail() 711 o3.Type = model.TEAM_INVITE 712 o3.AllowOpenInvite = true 713 _, err = ss.Team().Save(&o3) 714 require.NoError(t, err) 715 716 o4 := model.Team{} 717 o4.DisplayName = "DisplayName" 718 o4.Name = "zz" + model.NewId() + "b" 719 o4.Email = MakeEmail() 720 o4.Type = model.TEAM_INVITE 721 o4.AllowOpenInvite = false 722 _, err = ss.Team().Save(&o4) 723 require.NoError(t, err) 724 725 teams, err := ss.Team().GetAllTeamPageListing(0, 10) 726 require.NoError(t, err) 727 728 for _, team := range teams { 729 require.True(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as true") 730 } 731 732 require.LessOrEqual(t, len(teams), 10, "should have returned max of 10 teams") 733 734 o5 := model.Team{} 735 o5.DisplayName = "DisplayName" 736 o5.Name = "z-z-z" + model.NewId() + "b" 737 o5.Email = MakeEmail() 738 o5.Type = model.TEAM_OPEN 739 o5.AllowOpenInvite = true 740 _, err = ss.Team().Save(&o5) 741 require.NoError(t, err) 742 743 teams, err = ss.Team().GetAllTeamPageListing(0, 4) 744 require.NoError(t, err) 745 746 for _, team := range teams { 747 require.True(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as true") 748 } 749 750 require.LessOrEqual(t, len(teams), 4, "should have returned max of 4 teams") 751 752 teams, err = ss.Team().GetAllTeamPageListing(1, 1) 753 require.NoError(t, err) 754 755 for _, team := range teams { 756 require.True(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as true") 757 } 758 759 require.LessOrEqual(t, len(teams), 1, "should have returned max of 1 team") 760 } 761 762 func testGetAllPrivateTeamListing(t *testing.T, ss store.Store) { 763 o1 := model.Team{} 764 o1.DisplayName = "DisplayName" 765 o1.Name = "z-z-z" + model.NewId() + "b" 766 o1.Email = MakeEmail() 767 o1.Type = model.TEAM_OPEN 768 o1.AllowOpenInvite = true 769 _, err := ss.Team().Save(&o1) 770 require.NoError(t, err) 771 772 o2 := model.Team{} 773 o2.DisplayName = "DisplayName" 774 o2.Name = "zz" + model.NewId() + "b" 775 o2.Email = MakeEmail() 776 o2.Type = model.TEAM_OPEN 777 _, err = ss.Team().Save(&o2) 778 require.NoError(t, err) 779 780 o3 := model.Team{} 781 o3.DisplayName = "DisplayName" 782 o3.Name = "z-z-z" + model.NewId() + "b" 783 o3.Email = MakeEmail() 784 o3.Type = model.TEAM_INVITE 785 o3.AllowOpenInvite = true 786 _, err = ss.Team().Save(&o3) 787 require.NoError(t, err) 788 789 o4 := model.Team{} 790 o4.DisplayName = "DisplayName" 791 o4.Name = "zz" + model.NewId() + "b" 792 o4.Email = MakeEmail() 793 o4.Type = model.TEAM_INVITE 794 _, err = ss.Team().Save(&o4) 795 require.NoError(t, err) 796 797 teams, err := ss.Team().GetAllPrivateTeamListing() 798 require.NoError(t, err) 799 require.NotEmpty(t, teams, "failed team listing") 800 801 for _, team := range teams { 802 require.False(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as false") 803 } 804 } 805 806 func testGetAllPrivateTeamPageListing(t *testing.T, ss store.Store) { 807 o1 := model.Team{} 808 o1.DisplayName = "DisplayName" 809 o1.Name = "z-z-z" + model.NewId() + "b" 810 o1.Email = MakeEmail() 811 o1.Type = model.TEAM_OPEN 812 o1.AllowOpenInvite = true 813 _, err := ss.Team().Save(&o1) 814 require.NoError(t, err) 815 816 o2 := model.Team{} 817 o2.DisplayName = "DisplayName" 818 o2.Name = "zz" + model.NewId() + "b" 819 o2.Email = MakeEmail() 820 o2.Type = model.TEAM_OPEN 821 o2.AllowOpenInvite = false 822 _, err = ss.Team().Save(&o2) 823 require.NoError(t, err) 824 825 o3 := model.Team{} 826 o3.DisplayName = "DisplayName" 827 o3.Name = "z-z-z" + model.NewId() + "b" 828 o3.Email = MakeEmail() 829 o3.Type = model.TEAM_INVITE 830 o3.AllowOpenInvite = true 831 _, err = ss.Team().Save(&o3) 832 require.NoError(t, err) 833 834 o4 := model.Team{} 835 o4.DisplayName = "DisplayName" 836 o4.Name = "zz" + model.NewId() + "b" 837 o4.Email = MakeEmail() 838 o4.Type = model.TEAM_INVITE 839 o4.AllowOpenInvite = false 840 _, err = ss.Team().Save(&o4) 841 require.NoError(t, err) 842 843 teams, listErr := ss.Team().GetAllPrivateTeamPageListing(0, 10) 844 require.NoError(t, listErr) 845 for _, team := range teams { 846 require.False(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as false") 847 } 848 849 require.LessOrEqual(t, len(teams), 10, "should have returned max of 10 teams") 850 851 o5 := model.Team{} 852 o5.DisplayName = "DisplayName" 853 o5.Name = "z-z-z" + model.NewId() + "b" 854 o5.Email = MakeEmail() 855 o5.Type = model.TEAM_OPEN 856 o5.AllowOpenInvite = true 857 _, err = ss.Team().Save(&o5) 858 require.NoError(t, err) 859 860 teams, listErr = ss.Team().GetAllPrivateTeamPageListing(0, 4) 861 require.NoError(t, listErr) 862 for _, team := range teams { 863 require.False(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as false") 864 } 865 866 require.LessOrEqual(t, len(teams), 4, "should have returned max of 4 teams") 867 868 teams, listErr = ss.Team().GetAllPrivateTeamPageListing(1, 1) 869 require.NoError(t, listErr) 870 for _, team := range teams { 871 require.False(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as false") 872 } 873 874 require.LessOrEqual(t, len(teams), 1, "should have returned max of 1 team") 875 } 876 877 func testGetAllPublicTeamPageListing(t *testing.T, ss store.Store) { 878 cleanupTeamStore(t, ss) 879 880 o1 := model.Team{} 881 o1.DisplayName = "DisplayName1" 882 o1.Name = "z-z-z" + model.NewId() + "b" 883 o1.Email = MakeEmail() 884 o1.Type = model.TEAM_OPEN 885 o1.AllowOpenInvite = true 886 t1, err := ss.Team().Save(&o1) 887 require.NoError(t, err) 888 889 o2 := model.Team{} 890 o2.DisplayName = "DisplayName2" 891 o2.Name = "zz" + model.NewId() + "b" 892 o2.Email = MakeEmail() 893 o2.Type = model.TEAM_OPEN 894 o2.AllowOpenInvite = false 895 _, err = ss.Team().Save(&o2) 896 require.NoError(t, err) 897 898 o3 := model.Team{} 899 o3.DisplayName = "DisplayName3" 900 o3.Name = "z-z-z" + model.NewId() + "b" 901 o3.Email = MakeEmail() 902 o3.Type = model.TEAM_INVITE 903 o3.AllowOpenInvite = true 904 t3, err := ss.Team().Save(&o3) 905 require.NoError(t, err) 906 907 o4 := model.Team{} 908 o4.DisplayName = "DisplayName4" 909 o4.Name = "zz" + model.NewId() + "b" 910 o4.Email = MakeEmail() 911 o4.Type = model.TEAM_INVITE 912 o4.AllowOpenInvite = false 913 _, err = ss.Team().Save(&o4) 914 require.NoError(t, err) 915 916 teams, err := ss.Team().GetAllPublicTeamPageListing(0, 10) 917 assert.NoError(t, err) 918 assert.Equal(t, []*model.Team{t1, t3}, teams) 919 920 o5 := model.Team{} 921 o5.DisplayName = "DisplayName5" 922 o5.Name = "z-z-z" + model.NewId() + "b" 923 o5.Email = MakeEmail() 924 o5.Type = model.TEAM_OPEN 925 o5.AllowOpenInvite = true 926 t5, err := ss.Team().Save(&o5) 927 require.NoError(t, err) 928 929 teams, err = ss.Team().GetAllPublicTeamPageListing(0, 4) 930 assert.NoError(t, err) 931 assert.Equal(t, []*model.Team{t1, t3, t5}, teams) 932 933 _, err = ss.Team().GetAllPublicTeamPageListing(1, 1) 934 assert.NoError(t, err) 935 } 936 937 func testDelete(t *testing.T, ss store.Store) { 938 o1 := model.Team{} 939 o1.DisplayName = "DisplayName" 940 o1.Name = "z-z-z" + model.NewId() + "b" 941 o1.Email = MakeEmail() 942 o1.Type = model.TEAM_OPEN 943 o1.AllowOpenInvite = true 944 _, err := ss.Team().Save(&o1) 945 require.NoError(t, err) 946 947 o2 := model.Team{} 948 o2.DisplayName = "DisplayName" 949 o2.Name = "zz" + model.NewId() + "b" 950 o2.Email = MakeEmail() 951 o2.Type = model.TEAM_OPEN 952 _, err = ss.Team().Save(&o2) 953 require.NoError(t, err) 954 955 r1 := ss.Team().PermanentDelete(o1.Id) 956 require.NoError(t, r1) 957 } 958 959 func testPublicTeamCount(t *testing.T, ss store.Store) { 960 cleanupTeamStore(t, ss) 961 962 o1 := model.Team{} 963 o1.DisplayName = "DisplayName" 964 o1.Name = "z-z-z" + model.NewId() + "b" 965 o1.Email = MakeEmail() 966 o1.Type = model.TEAM_OPEN 967 o1.AllowOpenInvite = true 968 _, err := ss.Team().Save(&o1) 969 require.NoError(t, err) 970 971 o2 := model.Team{} 972 o2.DisplayName = "DisplayName" 973 o2.Name = "z-z-z" + model.NewId() + "b" 974 o2.Email = MakeEmail() 975 o2.Type = model.TEAM_OPEN 976 o2.AllowOpenInvite = false 977 _, err = ss.Team().Save(&o2) 978 require.NoError(t, err) 979 980 o3 := model.Team{} 981 o3.DisplayName = "DisplayName" 982 o3.Name = "z-z-z" + model.NewId() + "b" 983 o3.Email = MakeEmail() 984 o3.Type = model.TEAM_OPEN 985 o3.AllowOpenInvite = true 986 _, err = ss.Team().Save(&o3) 987 require.NoError(t, err) 988 989 teamCount, err := ss.Team().AnalyticsPublicTeamCount() 990 require.NoError(t, err) 991 require.Equal(t, int64(2), teamCount, "should only be 1 team") 992 } 993 994 func testPrivateTeamCount(t *testing.T, ss store.Store) { 995 cleanupTeamStore(t, ss) 996 997 o1 := model.Team{} 998 o1.DisplayName = "DisplayName" 999 o1.Name = "z-z-z" + model.NewId() + "b" 1000 o1.Email = MakeEmail() 1001 o1.Type = model.TEAM_OPEN 1002 o1.AllowOpenInvite = false 1003 _, err := ss.Team().Save(&o1) 1004 require.NoError(t, err) 1005 1006 o2 := model.Team{} 1007 o2.DisplayName = "DisplayName" 1008 o2.Name = "z-z-z" + model.NewId() + "b" 1009 o2.Email = MakeEmail() 1010 o2.Type = model.TEAM_OPEN 1011 o2.AllowOpenInvite = true 1012 _, err = ss.Team().Save(&o2) 1013 require.NoError(t, err) 1014 1015 o3 := model.Team{} 1016 o3.DisplayName = "DisplayName" 1017 o3.Name = "z-z-z" + model.NewId() + "b" 1018 o3.Email = MakeEmail() 1019 o3.Type = model.TEAM_OPEN 1020 o3.AllowOpenInvite = false 1021 _, err = ss.Team().Save(&o3) 1022 require.NoError(t, err) 1023 1024 teamCount, err := ss.Team().AnalyticsPrivateTeamCount() 1025 require.NoError(t, err) 1026 require.Equal(t, int64(2), teamCount, "should only be 1 team") 1027 } 1028 1029 func testTeamCount(t *testing.T, ss store.Store) { 1030 o1 := model.Team{} 1031 o1.DisplayName = "DisplayName" 1032 o1.Name = "z-z-z" + model.NewId() + "b" 1033 o1.Email = MakeEmail() 1034 o1.Type = model.TEAM_OPEN 1035 o1.AllowOpenInvite = true 1036 team, err := ss.Team().Save(&o1) 1037 require.NoError(t, err) 1038 1039 // not including deleted teams 1040 teamCount, err := ss.Team().AnalyticsTeamCount(false) 1041 require.NoError(t, err) 1042 require.NotEqual(t, 0, int(teamCount), "should be at least 1 team") 1043 1044 // delete the team for the next check 1045 team.DeleteAt = model.GetMillis() 1046 _, err = ss.Team().Update(team) 1047 require.NoError(t, err) 1048 1049 // get the count of teams not including deleted 1050 countNotIncludingDeleted, err := ss.Team().AnalyticsTeamCount(false) 1051 require.NoError(t, err) 1052 1053 // get the count of teams including deleted 1054 countIncludingDeleted, err := ss.Team().AnalyticsTeamCount(true) 1055 require.NoError(t, err) 1056 1057 // count including deleted should be one greater than not including deleted 1058 require.Equal(t, countNotIncludingDeleted+1, countIncludingDeleted) 1059 } 1060 1061 func testGetMembers(t *testing.T, ss store.Store) { 1062 // Each user should have a mention count of exactly 1 in the DB at this point. 1063 t.Run("Test GetMembers Order By UserID", func(t *testing.T) { 1064 teamId1 := model.NewId() 1065 teamId2 := model.NewId() 1066 1067 m1 := &model.TeamMember{TeamId: teamId1, UserId: "55555555555555555555555555"} 1068 m2 := &model.TeamMember{TeamId: teamId1, UserId: "11111111111111111111111111"} 1069 m3 := &model.TeamMember{TeamId: teamId1, UserId: "33333333333333333333333333"} 1070 m4 := &model.TeamMember{TeamId: teamId1, UserId: "22222222222222222222222222"} 1071 m5 := &model.TeamMember{TeamId: teamId1, UserId: "44444444444444444444444444"} 1072 m6 := &model.TeamMember{TeamId: teamId2, UserId: "00000000000000000000000000"} 1073 1074 _, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3, m4, m5, m6}, -1) 1075 require.NoError(t, nErr) 1076 1077 // Gets users ordered by UserId 1078 ms, err := ss.Team().GetMembers(teamId1, 0, 100, nil) 1079 require.NoError(t, err) 1080 assert.Len(t, ms, 5) 1081 assert.Equal(t, "11111111111111111111111111", ms[0].UserId) 1082 assert.Equal(t, "22222222222222222222222222", ms[1].UserId) 1083 assert.Equal(t, "33333333333333333333333333", ms[2].UserId) 1084 assert.Equal(t, "44444444444444444444444444", ms[3].UserId) 1085 assert.Equal(t, "55555555555555555555555555", ms[4].UserId) 1086 }) 1087 1088 t.Run("Test GetMembers Order By Username And Exclude Deleted Members", func(t *testing.T) { 1089 teamId1 := model.NewId() 1090 teamId2 := model.NewId() 1091 1092 u1 := &model.User{Username: "a", Email: MakeEmail(), DeleteAt: int64(1)} 1093 u2 := &model.User{Username: "c", Email: MakeEmail()} 1094 u3 := &model.User{Username: "b", Email: MakeEmail(), DeleteAt: int64(1)} 1095 u4 := &model.User{Username: "f", Email: MakeEmail()} 1096 u5 := &model.User{Username: "e", Email: MakeEmail(), DeleteAt: int64(1)} 1097 u6 := &model.User{Username: "d", Email: MakeEmail()} 1098 1099 u1, err := ss.User().Save(u1) 1100 require.NoError(t, err) 1101 u2, err = ss.User().Save(u2) 1102 require.NoError(t, err) 1103 u3, err = ss.User().Save(u3) 1104 require.NoError(t, err) 1105 u4, err = ss.User().Save(u4) 1106 require.NoError(t, err) 1107 u5, err = ss.User().Save(u5) 1108 require.NoError(t, err) 1109 u6, err = ss.User().Save(u6) 1110 require.NoError(t, err) 1111 1112 m1 := &model.TeamMember{TeamId: teamId1, UserId: u1.Id} 1113 m2 := &model.TeamMember{TeamId: teamId1, UserId: u2.Id} 1114 m3 := &model.TeamMember{TeamId: teamId1, UserId: u3.Id} 1115 m4 := &model.TeamMember{TeamId: teamId1, UserId: u4.Id} 1116 m5 := &model.TeamMember{TeamId: teamId1, UserId: u5.Id} 1117 m6 := &model.TeamMember{TeamId: teamId2, UserId: u6.Id} 1118 1119 _, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3, m4, m5, m6}, -1) 1120 require.NoError(t, nErr) 1121 1122 // Gets users ordered by UserName 1123 ms, nErr := ss.Team().GetMembers(teamId1, 0, 100, &model.TeamMembersGetOptions{Sort: model.USERNAME}) 1124 require.NoError(t, nErr) 1125 assert.Len(t, ms, 5) 1126 assert.Equal(t, u1.Id, ms[0].UserId) 1127 assert.Equal(t, u3.Id, ms[1].UserId) 1128 assert.Equal(t, u2.Id, ms[2].UserId) 1129 assert.Equal(t, u5.Id, ms[3].UserId) 1130 assert.Equal(t, u4.Id, ms[4].UserId) 1131 1132 // Gets users ordered by UserName and excludes deleted members 1133 ms, nErr = ss.Team().GetMembers(teamId1, 0, 100, &model.TeamMembersGetOptions{Sort: model.USERNAME, ExcludeDeletedUsers: true}) 1134 require.NoError(t, nErr) 1135 assert.Len(t, ms, 2) 1136 assert.Equal(t, u2.Id, ms[0].UserId) 1137 assert.Equal(t, u4.Id, ms[1].UserId) 1138 }) 1139 1140 t.Run("Test GetMembers Excluded Deleted Users", func(t *testing.T) { 1141 teamId1 := model.NewId() 1142 teamId2 := model.NewId() 1143 1144 u1 := &model.User{Email: MakeEmail()} 1145 u2 := &model.User{Email: MakeEmail(), DeleteAt: int64(1)} 1146 u3 := &model.User{Email: MakeEmail()} 1147 u4 := &model.User{Email: MakeEmail(), DeleteAt: int64(3)} 1148 u5 := &model.User{Email: MakeEmail()} 1149 u6 := &model.User{Email: MakeEmail(), DeleteAt: int64(5)} 1150 1151 u1, err := ss.User().Save(u1) 1152 require.NoError(t, err) 1153 u2, err = ss.User().Save(u2) 1154 require.NoError(t, err) 1155 u3, err = ss.User().Save(u3) 1156 require.NoError(t, err) 1157 u4, err = ss.User().Save(u4) 1158 require.NoError(t, err) 1159 u5, err = ss.User().Save(u5) 1160 require.NoError(t, err) 1161 u6, err = ss.User().Save(u6) 1162 require.NoError(t, err) 1163 1164 m1 := &model.TeamMember{TeamId: teamId1, UserId: u1.Id} 1165 m2 := &model.TeamMember{TeamId: teamId1, UserId: u2.Id} 1166 m3 := &model.TeamMember{TeamId: teamId1, UserId: u3.Id} 1167 m4 := &model.TeamMember{TeamId: teamId1, UserId: u4.Id} 1168 m5 := &model.TeamMember{TeamId: teamId1, UserId: u5.Id} 1169 m6 := &model.TeamMember{TeamId: teamId2, UserId: u6.Id} 1170 1171 t1, nErr := ss.Team().SaveMember(m1, -1) 1172 require.NoError(t, nErr) 1173 _, nErr = ss.Team().SaveMember(m2, -1) 1174 require.NoError(t, nErr) 1175 t3, nErr := ss.Team().SaveMember(m3, -1) 1176 require.NoError(t, nErr) 1177 _, nErr = ss.Team().SaveMember(m4, -1) 1178 require.NoError(t, nErr) 1179 t5, nErr := ss.Team().SaveMember(m5, -1) 1180 require.NoError(t, nErr) 1181 _, nErr = ss.Team().SaveMember(m6, -1) 1182 require.NoError(t, nErr) 1183 1184 // Gets users ordered by UserName 1185 ms, nErr := ss.Team().GetMembers(teamId1, 0, 100, &model.TeamMembersGetOptions{ExcludeDeletedUsers: true}) 1186 require.NoError(t, nErr) 1187 assert.Len(t, ms, 3) 1188 require.ElementsMatch(t, ms, [3]*model.TeamMember{t1, t3, t5}) 1189 }) 1190 } 1191 1192 func testTeamMembers(t *testing.T, ss store.Store) { 1193 teamId1 := model.NewId() 1194 teamId2 := model.NewId() 1195 1196 m1 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()} 1197 m2 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()} 1198 m3 := &model.TeamMember{TeamId: teamId2, UserId: model.NewId()} 1199 1200 _, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3}, -1) 1201 require.NoError(t, nErr) 1202 1203 ms, err := ss.Team().GetMembers(teamId1, 0, 100, nil) 1204 require.NoError(t, err) 1205 assert.Len(t, ms, 2) 1206 1207 ms, err = ss.Team().GetMembers(teamId2, 0, 100, nil) 1208 require.NoError(t, err) 1209 require.Len(t, ms, 1) 1210 require.Equal(t, m3.UserId, ms[0].UserId) 1211 1212 ctx := context.Background() 1213 ms, err = ss.Team().GetTeamsForUser(ctx, m1.UserId) 1214 require.NoError(t, err) 1215 require.Len(t, ms, 1) 1216 require.Equal(t, m1.TeamId, ms[0].TeamId) 1217 1218 err = ss.Team().RemoveMember(teamId1, m1.UserId) 1219 require.NoError(t, err) 1220 1221 ms, err = ss.Team().GetMembers(teamId1, 0, 100, nil) 1222 require.NoError(t, err) 1223 require.Len(t, ms, 1) 1224 require.Equal(t, m2.UserId, ms[0].UserId) 1225 1226 _, nErr = ss.Team().SaveMember(m1, -1) 1227 require.NoError(t, nErr) 1228 1229 err = ss.Team().RemoveAllMembersByTeam(teamId1) 1230 require.NoError(t, err) 1231 1232 ms, err = ss.Team().GetMembers(teamId1, 0, 100, nil) 1233 require.NoError(t, err) 1234 require.Empty(t, ms) 1235 1236 uid := model.NewId() 1237 m4 := &model.TeamMember{TeamId: teamId1, UserId: uid} 1238 m5 := &model.TeamMember{TeamId: teamId2, UserId: uid} 1239 _, nErr = ss.Team().SaveMultipleMembers([]*model.TeamMember{m4, m5}, -1) 1240 require.NoError(t, nErr) 1241 1242 ms, err = ss.Team().GetTeamsForUser(ctx, uid) 1243 require.NoError(t, err) 1244 require.Len(t, ms, 2) 1245 1246 nErr = ss.Team().RemoveAllMembersByUser(uid) 1247 require.NoError(t, nErr) 1248 1249 ms, err = ss.Team().GetTeamsForUser(ctx, m1.UserId) 1250 require.NoError(t, err) 1251 require.Empty(t, ms) 1252 } 1253 1254 func testTeamSaveMember(t *testing.T, ss store.Store) { 1255 u1, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()}) 1256 require.NoError(t, err) 1257 u2, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()}) 1258 require.NoError(t, err) 1259 1260 t.Run("not valid team member", func(t *testing.T) { 1261 member := &model.TeamMember{TeamId: "wrong", UserId: u1.Id} 1262 _, nErr := ss.Team().SaveMember(member, -1) 1263 require.Error(t, nErr) 1264 require.Equal(t, "TeamMember.IsValid: model.team_member.is_valid.team_id.app_error, ", nErr.Error()) 1265 }) 1266 1267 t.Run("too many members", func(t *testing.T) { 1268 member := &model.TeamMember{TeamId: model.NewId(), UserId: u1.Id} 1269 _, nErr := ss.Team().SaveMember(member, 0) 1270 require.Error(t, nErr) 1271 require.Equal(t, "limit exceeded: what: TeamMember count: 1 metadata: team members limit exceeded", nErr.Error()) 1272 }) 1273 1274 t.Run("too many members because previous existing members", func(t *testing.T) { 1275 teamID := model.NewId() 1276 1277 m1 := &model.TeamMember{TeamId: teamID, UserId: u1.Id} 1278 _, nErr := ss.Team().SaveMember(m1, 1) 1279 m2 := &model.TeamMember{TeamId: teamID, UserId: u2.Id} 1280 _, nErr = ss.Team().SaveMember(m2, 1) 1281 require.Error(t, nErr) 1282 require.Equal(t, "limit exceeded: what: TeamMember count: 2 metadata: team members limit exceeded", nErr.Error()) 1283 }) 1284 1285 t.Run("duplicated entries should fail", func(t *testing.T) { 1286 teamID1 := model.NewId() 1287 m1 := &model.TeamMember{TeamId: teamID1, UserId: u1.Id} 1288 _, nErr := ss.Team().SaveMember(m1, -1) 1289 require.NoError(t, nErr) 1290 m2 := &model.TeamMember{TeamId: teamID1, UserId: u1.Id} 1291 _, nErr = ss.Team().SaveMember(m2, -1) 1292 require.Error(t, nErr) 1293 require.IsType(t, &store.ErrConflict{}, nErr) 1294 }) 1295 1296 t.Run("insert member correctly (in team without scheme)", func(t *testing.T) { 1297 team := &model.Team{ 1298 DisplayName: "Name", 1299 Name: "zz" + model.NewId(), 1300 Email: MakeEmail(), 1301 Type: model.TEAM_OPEN, 1302 } 1303 1304 team, nErr := ss.Team().Save(team) 1305 require.NoError(t, nErr) 1306 1307 testCases := []struct { 1308 Name string 1309 SchemeGuest bool 1310 SchemeUser bool 1311 SchemeAdmin bool 1312 ExplicitRoles string 1313 ExpectedRoles string 1314 ExpectedExplicitRoles string 1315 ExpectedSchemeGuest bool 1316 ExpectedSchemeUser bool 1317 ExpectedSchemeAdmin bool 1318 }{ 1319 { 1320 Name: "team user implicit", 1321 SchemeUser: true, 1322 ExpectedRoles: "team_user", 1323 ExpectedSchemeUser: true, 1324 }, 1325 { 1326 Name: "team user explicit", 1327 ExplicitRoles: "team_user", 1328 ExpectedRoles: "team_user", 1329 ExpectedSchemeUser: true, 1330 }, 1331 { 1332 Name: "team guest implicit", 1333 SchemeGuest: true, 1334 ExpectedRoles: "team_guest", 1335 ExpectedSchemeGuest: true, 1336 }, 1337 { 1338 Name: "team guest explicit", 1339 ExplicitRoles: "team_guest", 1340 ExpectedRoles: "team_guest", 1341 ExpectedSchemeGuest: true, 1342 }, 1343 { 1344 Name: "team admin implicit", 1345 SchemeUser: true, 1346 SchemeAdmin: true, 1347 ExpectedRoles: "team_user team_admin", 1348 ExpectedSchemeUser: true, 1349 ExpectedSchemeAdmin: true, 1350 }, 1351 { 1352 Name: "team admin explicit", 1353 ExplicitRoles: "team_user team_admin", 1354 ExpectedRoles: "team_user team_admin", 1355 ExpectedSchemeUser: true, 1356 ExpectedSchemeAdmin: true, 1357 }, 1358 { 1359 Name: "team user implicit and explicit custom role", 1360 SchemeUser: true, 1361 ExplicitRoles: "test", 1362 ExpectedRoles: "test team_user", 1363 ExpectedExplicitRoles: "test", 1364 ExpectedSchemeUser: true, 1365 }, 1366 { 1367 Name: "team user explicit and explicit custom role", 1368 ExplicitRoles: "team_user test", 1369 ExpectedRoles: "test team_user", 1370 ExpectedExplicitRoles: "test", 1371 ExpectedSchemeUser: true, 1372 }, 1373 { 1374 Name: "team guest implicit and explicit custom role", 1375 SchemeGuest: true, 1376 ExplicitRoles: "test", 1377 ExpectedRoles: "test team_guest", 1378 ExpectedExplicitRoles: "test", 1379 ExpectedSchemeGuest: true, 1380 }, 1381 { 1382 Name: "team guest explicit and explicit custom role", 1383 ExplicitRoles: "team_guest test", 1384 ExpectedRoles: "test team_guest", 1385 ExpectedExplicitRoles: "test", 1386 ExpectedSchemeGuest: true, 1387 }, 1388 { 1389 Name: "team admin implicit and explicit custom role", 1390 SchemeUser: true, 1391 SchemeAdmin: true, 1392 ExplicitRoles: "test", 1393 ExpectedRoles: "test team_user team_admin", 1394 ExpectedExplicitRoles: "test", 1395 ExpectedSchemeUser: true, 1396 ExpectedSchemeAdmin: true, 1397 }, 1398 { 1399 Name: "team admin explicit and explicit custom role", 1400 ExplicitRoles: "team_user team_admin test", 1401 ExpectedRoles: "test team_user team_admin", 1402 ExpectedExplicitRoles: "test", 1403 ExpectedSchemeUser: true, 1404 ExpectedSchemeAdmin: true, 1405 }, 1406 { 1407 Name: "team member with only explicit custom roles", 1408 ExplicitRoles: "test test2", 1409 ExpectedRoles: "test test2", 1410 ExpectedExplicitRoles: "test test2", 1411 }, 1412 } 1413 1414 for _, tc := range testCases { 1415 t.Run(tc.Name, func(t *testing.T) { 1416 member := &model.TeamMember{ 1417 TeamId: team.Id, 1418 UserId: u1.Id, 1419 SchemeGuest: tc.SchemeGuest, 1420 SchemeUser: tc.SchemeUser, 1421 SchemeAdmin: tc.SchemeAdmin, 1422 ExplicitRoles: tc.ExplicitRoles, 1423 } 1424 member, nErr := ss.Team().SaveMember(member, -1) 1425 require.NoError(t, nErr) 1426 defer ss.Team().RemoveMember(team.Id, u1.Id) 1427 1428 assert.Equal(t, tc.ExpectedRoles, member.Roles) 1429 assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles) 1430 assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest) 1431 assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser) 1432 assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin) 1433 }) 1434 } 1435 }) 1436 1437 t.Run("insert member correctly (in team with scheme)", func(t *testing.T) { 1438 ts := &model.Scheme{ 1439 Name: model.NewId(), 1440 DisplayName: model.NewId(), 1441 Description: model.NewId(), 1442 Scope: model.SCHEME_SCOPE_TEAM, 1443 } 1444 ts, nErr := ss.Scheme().Save(ts) 1445 require.NoError(t, nErr) 1446 1447 team := &model.Team{ 1448 DisplayName: "Name", 1449 Name: "zz" + model.NewId(), 1450 Email: MakeEmail(), 1451 Type: model.TEAM_OPEN, 1452 SchemeId: &ts.Id, 1453 } 1454 1455 team, nErr = ss.Team().Save(team) 1456 require.NoError(t, nErr) 1457 1458 testCases := []struct { 1459 Name string 1460 SchemeGuest bool 1461 SchemeUser bool 1462 SchemeAdmin bool 1463 ExplicitRoles string 1464 ExpectedRoles string 1465 ExpectedExplicitRoles string 1466 ExpectedSchemeGuest bool 1467 ExpectedSchemeUser bool 1468 ExpectedSchemeAdmin bool 1469 }{ 1470 { 1471 Name: "team user implicit", 1472 SchemeUser: true, 1473 ExpectedRoles: ts.DefaultTeamUserRole, 1474 ExpectedSchemeUser: true, 1475 }, 1476 { 1477 Name: "team user explicit", 1478 ExplicitRoles: "team_user", 1479 ExpectedRoles: ts.DefaultTeamUserRole, 1480 ExpectedSchemeUser: true, 1481 }, 1482 { 1483 Name: "team guest implicit", 1484 SchemeGuest: true, 1485 ExpectedRoles: ts.DefaultTeamGuestRole, 1486 ExpectedSchemeGuest: true, 1487 }, 1488 { 1489 Name: "team guest explicit", 1490 ExplicitRoles: "team_guest", 1491 ExpectedRoles: ts.DefaultTeamGuestRole, 1492 ExpectedSchemeGuest: true, 1493 }, 1494 { 1495 Name: "team admin implicit", 1496 SchemeUser: true, 1497 SchemeAdmin: true, 1498 ExpectedRoles: ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole, 1499 ExpectedSchemeUser: true, 1500 ExpectedSchemeAdmin: true, 1501 }, 1502 { 1503 Name: "team admin explicit", 1504 ExplicitRoles: "team_user team_admin", 1505 ExpectedRoles: ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole, 1506 ExpectedSchemeUser: true, 1507 ExpectedSchemeAdmin: true, 1508 }, 1509 { 1510 Name: "team user implicit and explicit custom role", 1511 SchemeUser: true, 1512 ExplicitRoles: "test", 1513 ExpectedRoles: "test " + ts.DefaultTeamUserRole, 1514 ExpectedExplicitRoles: "test", 1515 ExpectedSchemeUser: true, 1516 }, 1517 { 1518 Name: "team user explicit and explicit custom role", 1519 ExplicitRoles: "team_user test", 1520 ExpectedRoles: "test " + ts.DefaultTeamUserRole, 1521 ExpectedExplicitRoles: "test", 1522 ExpectedSchemeUser: true, 1523 }, 1524 { 1525 Name: "team guest implicit and explicit custom role", 1526 SchemeGuest: true, 1527 ExplicitRoles: "test", 1528 ExpectedRoles: "test " + ts.DefaultTeamGuestRole, 1529 ExpectedExplicitRoles: "test", 1530 ExpectedSchemeGuest: true, 1531 }, 1532 { 1533 Name: "team guest explicit and explicit custom role", 1534 ExplicitRoles: "team_guest test", 1535 ExpectedRoles: "test " + ts.DefaultTeamGuestRole, 1536 ExpectedExplicitRoles: "test", 1537 ExpectedSchemeGuest: true, 1538 }, 1539 { 1540 Name: "team admin implicit and explicit custom role", 1541 SchemeUser: true, 1542 SchemeAdmin: true, 1543 ExplicitRoles: "test", 1544 ExpectedRoles: "test " + ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole, 1545 ExpectedExplicitRoles: "test", 1546 ExpectedSchemeUser: true, 1547 ExpectedSchemeAdmin: true, 1548 }, 1549 { 1550 Name: "team admin explicit and explicit custom role", 1551 ExplicitRoles: "team_user team_admin test", 1552 ExpectedRoles: "test " + ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole, 1553 ExpectedExplicitRoles: "test", 1554 ExpectedSchemeUser: true, 1555 ExpectedSchemeAdmin: true, 1556 }, 1557 { 1558 Name: "team member with only explicit custom roles", 1559 ExplicitRoles: "test test2", 1560 ExpectedRoles: "test test2", 1561 ExpectedExplicitRoles: "test test2", 1562 }, 1563 } 1564 1565 for _, tc := range testCases { 1566 t.Run(tc.Name, func(t *testing.T) { 1567 member := &model.TeamMember{ 1568 TeamId: team.Id, 1569 UserId: u1.Id, 1570 SchemeGuest: tc.SchemeGuest, 1571 SchemeUser: tc.SchemeUser, 1572 SchemeAdmin: tc.SchemeAdmin, 1573 ExplicitRoles: tc.ExplicitRoles, 1574 } 1575 member, nErr := ss.Team().SaveMember(member, -1) 1576 require.NoError(t, nErr) 1577 defer ss.Team().RemoveMember(team.Id, u1.Id) 1578 1579 assert.Equal(t, tc.ExpectedRoles, member.Roles) 1580 assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles) 1581 assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest) 1582 assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser) 1583 assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin) 1584 }) 1585 } 1586 }) 1587 } 1588 1589 func testTeamSaveMultipleMembers(t *testing.T, ss store.Store) { 1590 u1, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()}) 1591 require.NoError(t, err) 1592 u2, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()}) 1593 require.NoError(t, err) 1594 u3, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()}) 1595 require.NoError(t, err) 1596 u4, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()}) 1597 require.NoError(t, err) 1598 1599 t.Run("any not valid team member", func(t *testing.T) { 1600 m1 := &model.TeamMember{TeamId: "wrong", UserId: u1.Id} 1601 m2 := &model.TeamMember{TeamId: model.NewId(), UserId: u2.Id} 1602 _, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2}, -1) 1603 require.Error(t, nErr) 1604 require.Equal(t, "TeamMember.IsValid: model.team_member.is_valid.team_id.app_error, ", nErr.Error()) 1605 }) 1606 1607 t.Run("too many members in one team", func(t *testing.T) { 1608 teamID := model.NewId() 1609 m1 := &model.TeamMember{TeamId: teamID, UserId: u1.Id} 1610 m2 := &model.TeamMember{TeamId: teamID, UserId: u2.Id} 1611 _, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2}, 0) 1612 require.Error(t, nErr) 1613 require.Equal(t, "limit exceeded: what: TeamMember count: 2 metadata: team members limit exceeded", nErr.Error()) 1614 }) 1615 1616 t.Run("too many members in one team because previous existing members", func(t *testing.T) { 1617 teamID := model.NewId() 1618 m1 := &model.TeamMember{TeamId: teamID, UserId: u1.Id} 1619 m2 := &model.TeamMember{TeamId: teamID, UserId: u2.Id} 1620 m3 := &model.TeamMember{TeamId: teamID, UserId: u3.Id} 1621 m4 := &model.TeamMember{TeamId: teamID, UserId: u4.Id} 1622 _, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2}, 3) 1623 require.NoError(t, nErr) 1624 1625 _, nErr = ss.Team().SaveMultipleMembers([]*model.TeamMember{m3, m4}, 3) 1626 require.Error(t, nErr) 1627 require.Equal(t, "limit exceeded: what: TeamMember count: 4 metadata: team members limit exceeded", nErr.Error()) 1628 }) 1629 1630 t.Run("too many members, but in different teams", func(t *testing.T) { 1631 teamID1 := model.NewId() 1632 teamID2 := model.NewId() 1633 m1 := &model.TeamMember{TeamId: teamID1, UserId: u1.Id} 1634 m2 := &model.TeamMember{TeamId: teamID1, UserId: u2.Id} 1635 m3 := &model.TeamMember{TeamId: teamID1, UserId: u3.Id} 1636 m4 := &model.TeamMember{TeamId: teamID2, UserId: u1.Id} 1637 m5 := &model.TeamMember{TeamId: teamID2, UserId: u2.Id} 1638 _, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3, m4, m5}, 2) 1639 require.Error(t, nErr) 1640 require.Equal(t, "limit exceeded: what: TeamMember count: 3 metadata: team members limit exceeded", nErr.Error()) 1641 }) 1642 1643 t.Run("duplicated entries should fail", func(t *testing.T) { 1644 teamID1 := model.NewId() 1645 m1 := &model.TeamMember{TeamId: teamID1, UserId: u1.Id} 1646 m2 := &model.TeamMember{TeamId: teamID1, UserId: u1.Id} 1647 _, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2}, 10) 1648 require.Error(t, nErr) 1649 require.IsType(t, &store.ErrConflict{}, nErr) 1650 }) 1651 1652 t.Run("insert members correctly (in team without scheme)", func(t *testing.T) { 1653 team := &model.Team{ 1654 DisplayName: "Name", 1655 Name: "zz" + model.NewId(), 1656 Email: MakeEmail(), 1657 Type: model.TEAM_OPEN, 1658 } 1659 1660 team, nErr := ss.Team().Save(team) 1661 require.NoError(t, nErr) 1662 1663 testCases := []struct { 1664 Name string 1665 SchemeGuest bool 1666 SchemeUser bool 1667 SchemeAdmin bool 1668 ExplicitRoles string 1669 ExpectedRoles string 1670 ExpectedExplicitRoles string 1671 ExpectedSchemeGuest bool 1672 ExpectedSchemeUser bool 1673 ExpectedSchemeAdmin bool 1674 }{ 1675 { 1676 Name: "team user implicit", 1677 SchemeUser: true, 1678 ExpectedRoles: "team_user", 1679 ExpectedSchemeUser: true, 1680 }, 1681 { 1682 Name: "team user explicit", 1683 ExplicitRoles: "team_user", 1684 ExpectedRoles: "team_user", 1685 ExpectedSchemeUser: true, 1686 }, 1687 { 1688 Name: "team guest implicit", 1689 SchemeGuest: true, 1690 ExpectedRoles: "team_guest", 1691 ExpectedSchemeGuest: true, 1692 }, 1693 { 1694 Name: "team guest explicit", 1695 ExplicitRoles: "team_guest", 1696 ExpectedRoles: "team_guest", 1697 ExpectedSchemeGuest: true, 1698 }, 1699 { 1700 Name: "team admin implicit", 1701 SchemeUser: true, 1702 SchemeAdmin: true, 1703 ExpectedRoles: "team_user team_admin", 1704 ExpectedSchemeUser: true, 1705 ExpectedSchemeAdmin: true, 1706 }, 1707 { 1708 Name: "team admin explicit", 1709 ExplicitRoles: "team_user team_admin", 1710 ExpectedRoles: "team_user team_admin", 1711 ExpectedSchemeUser: true, 1712 ExpectedSchemeAdmin: true, 1713 }, 1714 { 1715 Name: "team user implicit and explicit custom role", 1716 SchemeUser: true, 1717 ExplicitRoles: "test", 1718 ExpectedRoles: "test team_user", 1719 ExpectedExplicitRoles: "test", 1720 ExpectedSchemeUser: true, 1721 }, 1722 { 1723 Name: "team user explicit and explicit custom role", 1724 ExplicitRoles: "team_user test", 1725 ExpectedRoles: "test team_user", 1726 ExpectedExplicitRoles: "test", 1727 ExpectedSchemeUser: true, 1728 }, 1729 { 1730 Name: "team guest implicit and explicit custom role", 1731 SchemeGuest: true, 1732 ExplicitRoles: "test", 1733 ExpectedRoles: "test team_guest", 1734 ExpectedExplicitRoles: "test", 1735 ExpectedSchemeGuest: true, 1736 }, 1737 { 1738 Name: "team guest explicit and explicit custom role", 1739 ExplicitRoles: "team_guest test", 1740 ExpectedRoles: "test team_guest", 1741 ExpectedExplicitRoles: "test", 1742 ExpectedSchemeGuest: true, 1743 }, 1744 { 1745 Name: "team admin implicit and explicit custom role", 1746 SchemeUser: true, 1747 SchemeAdmin: true, 1748 ExplicitRoles: "test", 1749 ExpectedRoles: "test team_user team_admin", 1750 ExpectedExplicitRoles: "test", 1751 ExpectedSchemeUser: true, 1752 ExpectedSchemeAdmin: true, 1753 }, 1754 { 1755 Name: "team admin explicit and explicit custom role", 1756 ExplicitRoles: "team_user team_admin test", 1757 ExpectedRoles: "test team_user team_admin", 1758 ExpectedExplicitRoles: "test", 1759 ExpectedSchemeUser: true, 1760 ExpectedSchemeAdmin: true, 1761 }, 1762 { 1763 Name: "team member with only explicit custom roles", 1764 ExplicitRoles: "test test2", 1765 ExpectedRoles: "test test2", 1766 ExpectedExplicitRoles: "test test2", 1767 }, 1768 } 1769 1770 for _, tc := range testCases { 1771 t.Run(tc.Name, func(t *testing.T) { 1772 member := &model.TeamMember{ 1773 TeamId: team.Id, 1774 UserId: u1.Id, 1775 SchemeGuest: tc.SchemeGuest, 1776 SchemeUser: tc.SchemeUser, 1777 SchemeAdmin: tc.SchemeAdmin, 1778 ExplicitRoles: tc.ExplicitRoles, 1779 } 1780 otherMember := &model.TeamMember{ 1781 TeamId: team.Id, 1782 UserId: u2.Id, 1783 SchemeGuest: tc.SchemeGuest, 1784 SchemeUser: tc.SchemeUser, 1785 SchemeAdmin: tc.SchemeAdmin, 1786 ExplicitRoles: tc.ExplicitRoles, 1787 } 1788 var members []*model.TeamMember 1789 members, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{member, otherMember}, -1) 1790 require.NoError(t, nErr) 1791 require.Len(t, members, 2) 1792 member = members[0] 1793 defer ss.Team().RemoveMember(team.Id, u1.Id) 1794 defer ss.Team().RemoveMember(team.Id, u2.Id) 1795 1796 assert.Equal(t, tc.ExpectedRoles, member.Roles) 1797 assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles) 1798 assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest) 1799 assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser) 1800 assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin) 1801 }) 1802 } 1803 }) 1804 1805 t.Run("insert members correctly (in team with scheme)", func(t *testing.T) { 1806 ts := &model.Scheme{ 1807 Name: model.NewId(), 1808 DisplayName: model.NewId(), 1809 Description: model.NewId(), 1810 Scope: model.SCHEME_SCOPE_TEAM, 1811 } 1812 ts, nErr := ss.Scheme().Save(ts) 1813 require.NoError(t, nErr) 1814 1815 team := &model.Team{ 1816 DisplayName: "Name", 1817 Name: "zz" + model.NewId(), 1818 Email: MakeEmail(), 1819 Type: model.TEAM_OPEN, 1820 SchemeId: &ts.Id, 1821 } 1822 1823 team, nErr = ss.Team().Save(team) 1824 require.NoError(t, nErr) 1825 1826 testCases := []struct { 1827 Name string 1828 SchemeGuest bool 1829 SchemeUser bool 1830 SchemeAdmin bool 1831 ExplicitRoles string 1832 ExpectedRoles string 1833 ExpectedExplicitRoles string 1834 ExpectedSchemeGuest bool 1835 ExpectedSchemeUser bool 1836 ExpectedSchemeAdmin bool 1837 }{ 1838 { 1839 Name: "team user implicit", 1840 SchemeUser: true, 1841 ExpectedRoles: ts.DefaultTeamUserRole, 1842 ExpectedSchemeUser: true, 1843 }, 1844 { 1845 Name: "team user explicit", 1846 ExplicitRoles: "team_user", 1847 ExpectedRoles: ts.DefaultTeamUserRole, 1848 ExpectedSchemeUser: true, 1849 }, 1850 { 1851 Name: "team guest implicit", 1852 SchemeGuest: true, 1853 ExpectedRoles: ts.DefaultTeamGuestRole, 1854 ExpectedSchemeGuest: true, 1855 }, 1856 { 1857 Name: "team guest explicit", 1858 ExplicitRoles: "team_guest", 1859 ExpectedRoles: ts.DefaultTeamGuestRole, 1860 ExpectedSchemeGuest: true, 1861 }, 1862 { 1863 Name: "team admin implicit", 1864 SchemeUser: true, 1865 SchemeAdmin: true, 1866 ExpectedRoles: ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole, 1867 ExpectedSchemeUser: true, 1868 ExpectedSchemeAdmin: true, 1869 }, 1870 { 1871 Name: "team admin explicit", 1872 ExplicitRoles: "team_user team_admin", 1873 ExpectedRoles: ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole, 1874 ExpectedSchemeUser: true, 1875 ExpectedSchemeAdmin: true, 1876 }, 1877 { 1878 Name: "team user implicit and explicit custom role", 1879 SchemeUser: true, 1880 ExplicitRoles: "test", 1881 ExpectedRoles: "test " + ts.DefaultTeamUserRole, 1882 ExpectedExplicitRoles: "test", 1883 ExpectedSchemeUser: true, 1884 }, 1885 { 1886 Name: "team user explicit and explicit custom role", 1887 ExplicitRoles: "team_user test", 1888 ExpectedRoles: "test " + ts.DefaultTeamUserRole, 1889 ExpectedExplicitRoles: "test", 1890 ExpectedSchemeUser: true, 1891 }, 1892 { 1893 Name: "team guest implicit and explicit custom role", 1894 SchemeGuest: true, 1895 ExplicitRoles: "test", 1896 ExpectedRoles: "test " + ts.DefaultTeamGuestRole, 1897 ExpectedExplicitRoles: "test", 1898 ExpectedSchemeGuest: true, 1899 }, 1900 { 1901 Name: "team guest explicit and explicit custom role", 1902 ExplicitRoles: "team_guest test", 1903 ExpectedRoles: "test " + ts.DefaultTeamGuestRole, 1904 ExpectedExplicitRoles: "test", 1905 ExpectedSchemeGuest: true, 1906 }, 1907 { 1908 Name: "team admin implicit and explicit custom role", 1909 SchemeUser: true, 1910 SchemeAdmin: true, 1911 ExplicitRoles: "test", 1912 ExpectedRoles: "test " + ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole, 1913 ExpectedExplicitRoles: "test", 1914 ExpectedSchemeUser: true, 1915 ExpectedSchemeAdmin: true, 1916 }, 1917 { 1918 Name: "team admin explicit and explicit custom role", 1919 ExplicitRoles: "team_user team_admin test", 1920 ExpectedRoles: "test " + ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole, 1921 ExpectedExplicitRoles: "test", 1922 ExpectedSchemeUser: true, 1923 ExpectedSchemeAdmin: true, 1924 }, 1925 { 1926 Name: "team member with only explicit custom roles", 1927 ExplicitRoles: "test test2", 1928 ExpectedRoles: "test test2", 1929 ExpectedExplicitRoles: "test test2", 1930 }, 1931 } 1932 1933 for _, tc := range testCases { 1934 t.Run(tc.Name, func(t *testing.T) { 1935 member := &model.TeamMember{ 1936 TeamId: team.Id, 1937 UserId: u1.Id, 1938 SchemeGuest: tc.SchemeGuest, 1939 SchemeUser: tc.SchemeUser, 1940 SchemeAdmin: tc.SchemeAdmin, 1941 ExplicitRoles: tc.ExplicitRoles, 1942 } 1943 otherMember := &model.TeamMember{ 1944 TeamId: team.Id, 1945 UserId: u2.Id, 1946 SchemeGuest: tc.SchemeGuest, 1947 SchemeUser: tc.SchemeUser, 1948 SchemeAdmin: tc.SchemeAdmin, 1949 ExplicitRoles: tc.ExplicitRoles, 1950 } 1951 members, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{member, otherMember}, -1) 1952 require.NoError(t, nErr) 1953 require.Len(t, members, 2) 1954 member = members[0] 1955 defer ss.Team().RemoveMember(team.Id, u1.Id) 1956 defer ss.Team().RemoveMember(team.Id, u2.Id) 1957 1958 assert.Equal(t, tc.ExpectedRoles, member.Roles) 1959 assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles) 1960 assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest) 1961 assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser) 1962 assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin) 1963 }) 1964 } 1965 }) 1966 } 1967 1968 func testTeamUpdateMember(t *testing.T, ss store.Store) { 1969 u1, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()}) 1970 require.NoError(t, err) 1971 1972 t.Run("not valid team member", func(t *testing.T) { 1973 member := &model.TeamMember{TeamId: "wrong", UserId: u1.Id} 1974 _, nErr := ss.Team().UpdateMember(member) 1975 require.Error(t, nErr) 1976 var appErr *model.AppError 1977 require.True(t, errors.As(nErr, &appErr)) 1978 require.Equal(t, "model.team_member.is_valid.team_id.app_error", appErr.Id) 1979 }) 1980 1981 t.Run("insert member correctly (in team without scheme)", func(t *testing.T) { 1982 team := &model.Team{ 1983 DisplayName: "Name", 1984 Name: "zz" + model.NewId(), 1985 Email: MakeEmail(), 1986 Type: model.TEAM_OPEN, 1987 } 1988 1989 team, nErr := ss.Team().Save(team) 1990 require.NoError(t, nErr) 1991 1992 member := &model.TeamMember{TeamId: team.Id, UserId: u1.Id} 1993 member, nErr = ss.Team().SaveMember(member, -1) 1994 require.NoError(t, nErr) 1995 1996 testCases := []struct { 1997 Name string 1998 SchemeGuest bool 1999 SchemeUser bool 2000 SchemeAdmin bool 2001 ExplicitRoles string 2002 ExpectedRoles string 2003 ExpectedExplicitRoles string 2004 ExpectedSchemeGuest bool 2005 ExpectedSchemeUser bool 2006 ExpectedSchemeAdmin bool 2007 }{ 2008 { 2009 Name: "team user implicit", 2010 SchemeUser: true, 2011 ExpectedRoles: "team_user", 2012 ExpectedSchemeUser: true, 2013 }, 2014 { 2015 Name: "team user explicit", 2016 ExplicitRoles: "team_user", 2017 ExpectedRoles: "team_user", 2018 ExpectedSchemeUser: true, 2019 }, 2020 { 2021 Name: "team guest implicit", 2022 SchemeGuest: true, 2023 ExpectedRoles: "team_guest", 2024 ExpectedSchemeGuest: true, 2025 }, 2026 { 2027 Name: "team guest explicit", 2028 ExplicitRoles: "team_guest", 2029 ExpectedRoles: "team_guest", 2030 ExpectedSchemeGuest: true, 2031 }, 2032 { 2033 Name: "team admin implicit", 2034 SchemeUser: true, 2035 SchemeAdmin: true, 2036 ExpectedRoles: "team_user team_admin", 2037 ExpectedSchemeUser: true, 2038 ExpectedSchemeAdmin: true, 2039 }, 2040 { 2041 Name: "team admin explicit", 2042 ExplicitRoles: "team_user team_admin", 2043 ExpectedRoles: "team_user team_admin", 2044 ExpectedSchemeUser: true, 2045 ExpectedSchemeAdmin: true, 2046 }, 2047 { 2048 Name: "team user implicit and explicit custom role", 2049 SchemeUser: true, 2050 ExplicitRoles: "test", 2051 ExpectedRoles: "test team_user", 2052 ExpectedExplicitRoles: "test", 2053 ExpectedSchemeUser: true, 2054 }, 2055 { 2056 Name: "team user explicit and explicit custom role", 2057 ExplicitRoles: "team_user test", 2058 ExpectedRoles: "test team_user", 2059 ExpectedExplicitRoles: "test", 2060 ExpectedSchemeUser: true, 2061 }, 2062 { 2063 Name: "team guest implicit and explicit custom role", 2064 SchemeGuest: true, 2065 ExplicitRoles: "test", 2066 ExpectedRoles: "test team_guest", 2067 ExpectedExplicitRoles: "test", 2068 ExpectedSchemeGuest: true, 2069 }, 2070 { 2071 Name: "team guest explicit and explicit custom role", 2072 ExplicitRoles: "team_guest test", 2073 ExpectedRoles: "test team_guest", 2074 ExpectedExplicitRoles: "test", 2075 ExpectedSchemeGuest: true, 2076 }, 2077 { 2078 Name: "team admin implicit and explicit custom role", 2079 SchemeUser: true, 2080 SchemeAdmin: true, 2081 ExplicitRoles: "test", 2082 ExpectedRoles: "test team_user team_admin", 2083 ExpectedExplicitRoles: "test", 2084 ExpectedSchemeUser: true, 2085 ExpectedSchemeAdmin: true, 2086 }, 2087 { 2088 Name: "team admin explicit and explicit custom role", 2089 ExplicitRoles: "team_user team_admin test", 2090 ExpectedRoles: "test team_user team_admin", 2091 ExpectedExplicitRoles: "test", 2092 ExpectedSchemeUser: true, 2093 ExpectedSchemeAdmin: true, 2094 }, 2095 { 2096 Name: "team member with only explicit custom roles", 2097 ExplicitRoles: "test test2", 2098 ExpectedRoles: "test test2", 2099 ExpectedExplicitRoles: "test test2", 2100 }, 2101 } 2102 2103 for _, tc := range testCases { 2104 t.Run(tc.Name, func(t *testing.T) { 2105 member.SchemeGuest = tc.SchemeGuest 2106 member.SchemeUser = tc.SchemeUser 2107 member.SchemeAdmin = tc.SchemeAdmin 2108 member.ExplicitRoles = tc.ExplicitRoles 2109 2110 member, nErr = ss.Team().UpdateMember(member) 2111 require.NoError(t, nErr) 2112 2113 assert.Equal(t, tc.ExpectedRoles, member.Roles) 2114 assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles) 2115 assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest) 2116 assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser) 2117 assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin) 2118 }) 2119 } 2120 }) 2121 2122 t.Run("insert member correctly (in team with scheme)", func(t *testing.T) { 2123 ts := &model.Scheme{ 2124 Name: model.NewId(), 2125 DisplayName: model.NewId(), 2126 Description: model.NewId(), 2127 Scope: model.SCHEME_SCOPE_TEAM, 2128 } 2129 ts, nErr := ss.Scheme().Save(ts) 2130 require.NoError(t, nErr) 2131 2132 team := &model.Team{ 2133 DisplayName: "Name", 2134 Name: "zz" + model.NewId(), 2135 Email: MakeEmail(), 2136 Type: model.TEAM_OPEN, 2137 SchemeId: &ts.Id, 2138 } 2139 2140 team, nErr = ss.Team().Save(team) 2141 require.NoError(t, nErr) 2142 2143 member := &model.TeamMember{TeamId: team.Id, UserId: u1.Id} 2144 member, nErr = ss.Team().SaveMember(member, -1) 2145 require.NoError(t, nErr) 2146 2147 testCases := []struct { 2148 Name string 2149 SchemeGuest bool 2150 SchemeUser bool 2151 SchemeAdmin bool 2152 ExplicitRoles string 2153 ExpectedRoles string 2154 ExpectedExplicitRoles string 2155 ExpectedSchemeGuest bool 2156 ExpectedSchemeUser bool 2157 ExpectedSchemeAdmin bool 2158 }{ 2159 { 2160 Name: "team user implicit", 2161 SchemeUser: true, 2162 ExpectedRoles: ts.DefaultTeamUserRole, 2163 ExpectedSchemeUser: true, 2164 }, 2165 { 2166 Name: "team user explicit", 2167 ExplicitRoles: "team_user", 2168 ExpectedRoles: ts.DefaultTeamUserRole, 2169 ExpectedSchemeUser: true, 2170 }, 2171 { 2172 Name: "team guest implicit", 2173 SchemeGuest: true, 2174 ExpectedRoles: ts.DefaultTeamGuestRole, 2175 ExpectedSchemeGuest: true, 2176 }, 2177 { 2178 Name: "team guest explicit", 2179 ExplicitRoles: "team_guest", 2180 ExpectedRoles: ts.DefaultTeamGuestRole, 2181 ExpectedSchemeGuest: true, 2182 }, 2183 { 2184 Name: "team admin implicit", 2185 SchemeUser: true, 2186 SchemeAdmin: true, 2187 ExpectedRoles: ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole, 2188 ExpectedSchemeUser: true, 2189 ExpectedSchemeAdmin: true, 2190 }, 2191 { 2192 Name: "team admin explicit", 2193 ExplicitRoles: "team_user team_admin", 2194 ExpectedRoles: ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole, 2195 ExpectedSchemeUser: true, 2196 ExpectedSchemeAdmin: true, 2197 }, 2198 { 2199 Name: "team user implicit and explicit custom role", 2200 SchemeUser: true, 2201 ExplicitRoles: "test", 2202 ExpectedRoles: "test " + ts.DefaultTeamUserRole, 2203 ExpectedExplicitRoles: "test", 2204 ExpectedSchemeUser: true, 2205 }, 2206 { 2207 Name: "team user explicit and explicit custom role", 2208 ExplicitRoles: "team_user test", 2209 ExpectedRoles: "test " + ts.DefaultTeamUserRole, 2210 ExpectedExplicitRoles: "test", 2211 ExpectedSchemeUser: true, 2212 }, 2213 { 2214 Name: "team guest implicit and explicit custom role", 2215 SchemeGuest: true, 2216 ExplicitRoles: "test", 2217 ExpectedRoles: "test " + ts.DefaultTeamGuestRole, 2218 ExpectedExplicitRoles: "test", 2219 ExpectedSchemeGuest: true, 2220 }, 2221 { 2222 Name: "team guest explicit and explicit custom role", 2223 ExplicitRoles: "team_guest test", 2224 ExpectedRoles: "test " + ts.DefaultTeamGuestRole, 2225 ExpectedExplicitRoles: "test", 2226 ExpectedSchemeGuest: true, 2227 }, 2228 { 2229 Name: "team admin implicit and explicit custom role", 2230 SchemeUser: true, 2231 SchemeAdmin: true, 2232 ExplicitRoles: "test", 2233 ExpectedRoles: "test " + ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole, 2234 ExpectedExplicitRoles: "test", 2235 ExpectedSchemeUser: true, 2236 ExpectedSchemeAdmin: true, 2237 }, 2238 { 2239 Name: "team admin explicit and explicit custom role", 2240 ExplicitRoles: "team_user team_admin test", 2241 ExpectedRoles: "test " + ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole, 2242 ExpectedExplicitRoles: "test", 2243 ExpectedSchemeUser: true, 2244 ExpectedSchemeAdmin: true, 2245 }, 2246 { 2247 Name: "team member with only explicit custom roles", 2248 ExplicitRoles: "test test2", 2249 ExpectedRoles: "test test2", 2250 ExpectedExplicitRoles: "test test2", 2251 }, 2252 } 2253 2254 for _, tc := range testCases { 2255 t.Run(tc.Name, func(t *testing.T) { 2256 member.SchemeGuest = tc.SchemeGuest 2257 member.SchemeUser = tc.SchemeUser 2258 member.SchemeAdmin = tc.SchemeAdmin 2259 member.ExplicitRoles = tc.ExplicitRoles 2260 2261 member, nErr = ss.Team().UpdateMember(member) 2262 require.NoError(t, nErr) 2263 2264 assert.Equal(t, tc.ExpectedRoles, member.Roles) 2265 assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles) 2266 assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest) 2267 assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser) 2268 assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin) 2269 }) 2270 } 2271 }) 2272 } 2273 2274 func testTeamUpdateMultipleMembers(t *testing.T, ss store.Store) { 2275 u1, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()}) 2276 require.NoError(t, err) 2277 u2, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()}) 2278 require.NoError(t, err) 2279 2280 t.Run("any not valid team member", func(t *testing.T) { 2281 m1 := &model.TeamMember{TeamId: "wrong", UserId: u1.Id} 2282 m2 := &model.TeamMember{TeamId: model.NewId(), UserId: u2.Id} 2283 _, nErr := ss.Team().UpdateMultipleMembers([]*model.TeamMember{m1, m2}) 2284 require.Error(t, nErr) 2285 var appErr *model.AppError 2286 require.True(t, errors.As(nErr, &appErr)) 2287 require.Equal(t, "model.team_member.is_valid.team_id.app_error", appErr.Id) 2288 }) 2289 2290 t.Run("update members correctly (in team without scheme)", func(t *testing.T) { 2291 team := &model.Team{ 2292 DisplayName: "Name", 2293 Name: "zz" + model.NewId(), 2294 Email: MakeEmail(), 2295 Type: model.TEAM_OPEN, 2296 } 2297 2298 team, nErr := ss.Team().Save(team) 2299 require.NoError(t, nErr) 2300 2301 member := &model.TeamMember{TeamId: team.Id, UserId: u1.Id} 2302 otherMember := &model.TeamMember{TeamId: team.Id, UserId: u2.Id} 2303 var members []*model.TeamMember 2304 members, nErr = ss.Team().SaveMultipleMembers([]*model.TeamMember{member, otherMember}, -1) 2305 require.NoError(t, nErr) 2306 require.Len(t, members, 2) 2307 member = members[0] 2308 otherMember = members[1] 2309 2310 testCases := []struct { 2311 Name string 2312 SchemeGuest bool 2313 SchemeUser bool 2314 SchemeAdmin bool 2315 ExplicitRoles string 2316 ExpectedRoles string 2317 ExpectedExplicitRoles string 2318 ExpectedSchemeGuest bool 2319 ExpectedSchemeUser bool 2320 ExpectedSchemeAdmin bool 2321 }{ 2322 { 2323 Name: "team user implicit", 2324 SchemeUser: true, 2325 ExpectedRoles: "team_user", 2326 ExpectedSchemeUser: true, 2327 }, 2328 { 2329 Name: "team user explicit", 2330 ExplicitRoles: "team_user", 2331 ExpectedRoles: "team_user", 2332 ExpectedSchemeUser: true, 2333 }, 2334 { 2335 Name: "team guest implicit", 2336 SchemeGuest: true, 2337 ExpectedRoles: "team_guest", 2338 ExpectedSchemeGuest: true, 2339 }, 2340 { 2341 Name: "team guest explicit", 2342 ExplicitRoles: "team_guest", 2343 ExpectedRoles: "team_guest", 2344 ExpectedSchemeGuest: true, 2345 }, 2346 { 2347 Name: "team admin implicit", 2348 SchemeUser: true, 2349 SchemeAdmin: true, 2350 ExpectedRoles: "team_user team_admin", 2351 ExpectedSchemeUser: true, 2352 ExpectedSchemeAdmin: true, 2353 }, 2354 { 2355 Name: "team admin explicit", 2356 ExplicitRoles: "team_user team_admin", 2357 ExpectedRoles: "team_user team_admin", 2358 ExpectedSchemeUser: true, 2359 ExpectedSchemeAdmin: true, 2360 }, 2361 { 2362 Name: "team user implicit and explicit custom role", 2363 SchemeUser: true, 2364 ExplicitRoles: "test", 2365 ExpectedRoles: "test team_user", 2366 ExpectedExplicitRoles: "test", 2367 ExpectedSchemeUser: true, 2368 }, 2369 { 2370 Name: "team user explicit and explicit custom role", 2371 ExplicitRoles: "team_user test", 2372 ExpectedRoles: "test team_user", 2373 ExpectedExplicitRoles: "test", 2374 ExpectedSchemeUser: true, 2375 }, 2376 { 2377 Name: "team guest implicit and explicit custom role", 2378 SchemeGuest: true, 2379 ExplicitRoles: "test", 2380 ExpectedRoles: "test team_guest", 2381 ExpectedExplicitRoles: "test", 2382 ExpectedSchemeGuest: true, 2383 }, 2384 { 2385 Name: "team guest explicit and explicit custom role", 2386 ExplicitRoles: "team_guest test", 2387 ExpectedRoles: "test team_guest", 2388 ExpectedExplicitRoles: "test", 2389 ExpectedSchemeGuest: true, 2390 }, 2391 { 2392 Name: "team admin implicit and explicit custom role", 2393 SchemeUser: true, 2394 SchemeAdmin: true, 2395 ExplicitRoles: "test", 2396 ExpectedRoles: "test team_user team_admin", 2397 ExpectedExplicitRoles: "test", 2398 ExpectedSchemeUser: true, 2399 ExpectedSchemeAdmin: true, 2400 }, 2401 { 2402 Name: "team admin explicit and explicit custom role", 2403 ExplicitRoles: "team_user team_admin test", 2404 ExpectedRoles: "test team_user team_admin", 2405 ExpectedExplicitRoles: "test", 2406 ExpectedSchemeUser: true, 2407 ExpectedSchemeAdmin: true, 2408 }, 2409 { 2410 Name: "team member with only explicit custom roles", 2411 ExplicitRoles: "test test2", 2412 ExpectedRoles: "test test2", 2413 ExpectedExplicitRoles: "test test2", 2414 }, 2415 } 2416 2417 for _, tc := range testCases { 2418 t.Run(tc.Name, func(t *testing.T) { 2419 member.SchemeGuest = tc.SchemeGuest 2420 member.SchemeUser = tc.SchemeUser 2421 member.SchemeAdmin = tc.SchemeAdmin 2422 member.ExplicitRoles = tc.ExplicitRoles 2423 2424 var members []*model.TeamMember 2425 members, nErr = ss.Team().UpdateMultipleMembers([]*model.TeamMember{member, otherMember}) 2426 require.NoError(t, nErr) 2427 require.Len(t, members, 2) 2428 member = members[0] 2429 2430 assert.Equal(t, tc.ExpectedRoles, member.Roles) 2431 assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles) 2432 assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest) 2433 assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser) 2434 assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin) 2435 }) 2436 } 2437 }) 2438 2439 t.Run("insert members correctly (in team with scheme)", func(t *testing.T) { 2440 ts := &model.Scheme{ 2441 Name: model.NewId(), 2442 DisplayName: model.NewId(), 2443 Description: model.NewId(), 2444 Scope: model.SCHEME_SCOPE_TEAM, 2445 } 2446 ts, nErr := ss.Scheme().Save(ts) 2447 require.NoError(t, nErr) 2448 2449 team := &model.Team{ 2450 DisplayName: "Name", 2451 Name: "zz" + model.NewId(), 2452 Email: MakeEmail(), 2453 Type: model.TEAM_OPEN, 2454 SchemeId: &ts.Id, 2455 } 2456 2457 team, nErr = ss.Team().Save(team) 2458 require.NoError(t, nErr) 2459 2460 member := &model.TeamMember{TeamId: team.Id, UserId: u1.Id} 2461 otherMember := &model.TeamMember{TeamId: team.Id, UserId: u2.Id} 2462 members, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{member, otherMember}, -1) 2463 require.NoError(t, nErr) 2464 require.Len(t, members, 2) 2465 member = members[0] 2466 otherMember = members[1] 2467 2468 testCases := []struct { 2469 Name string 2470 SchemeGuest bool 2471 SchemeUser bool 2472 SchemeAdmin bool 2473 ExplicitRoles string 2474 ExpectedRoles string 2475 ExpectedExplicitRoles string 2476 ExpectedSchemeGuest bool 2477 ExpectedSchemeUser bool 2478 ExpectedSchemeAdmin bool 2479 }{ 2480 { 2481 Name: "team user implicit", 2482 SchemeUser: true, 2483 ExpectedRoles: ts.DefaultTeamUserRole, 2484 ExpectedSchemeUser: true, 2485 }, 2486 { 2487 Name: "team user explicit", 2488 ExplicitRoles: "team_user", 2489 ExpectedRoles: ts.DefaultTeamUserRole, 2490 ExpectedSchemeUser: true, 2491 }, 2492 { 2493 Name: "team guest implicit", 2494 SchemeGuest: true, 2495 ExpectedRoles: ts.DefaultTeamGuestRole, 2496 ExpectedSchemeGuest: true, 2497 }, 2498 { 2499 Name: "team guest explicit", 2500 ExplicitRoles: "team_guest", 2501 ExpectedRoles: ts.DefaultTeamGuestRole, 2502 ExpectedSchemeGuest: true, 2503 }, 2504 { 2505 Name: "team admin implicit", 2506 SchemeUser: true, 2507 SchemeAdmin: true, 2508 ExpectedRoles: ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole, 2509 ExpectedSchemeUser: true, 2510 ExpectedSchemeAdmin: true, 2511 }, 2512 { 2513 Name: "team admin explicit", 2514 ExplicitRoles: "team_user team_admin", 2515 ExpectedRoles: ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole, 2516 ExpectedSchemeUser: true, 2517 ExpectedSchemeAdmin: true, 2518 }, 2519 { 2520 Name: "team user implicit and explicit custom role", 2521 SchemeUser: true, 2522 ExplicitRoles: "test", 2523 ExpectedRoles: "test " + ts.DefaultTeamUserRole, 2524 ExpectedExplicitRoles: "test", 2525 ExpectedSchemeUser: true, 2526 }, 2527 { 2528 Name: "team user explicit and explicit custom role", 2529 ExplicitRoles: "team_user test", 2530 ExpectedRoles: "test " + ts.DefaultTeamUserRole, 2531 ExpectedExplicitRoles: "test", 2532 ExpectedSchemeUser: true, 2533 }, 2534 { 2535 Name: "team guest implicit and explicit custom role", 2536 SchemeGuest: true, 2537 ExplicitRoles: "test", 2538 ExpectedRoles: "test " + ts.DefaultTeamGuestRole, 2539 ExpectedExplicitRoles: "test", 2540 ExpectedSchemeGuest: true, 2541 }, 2542 { 2543 Name: "team guest explicit and explicit custom role", 2544 ExplicitRoles: "team_guest test", 2545 ExpectedRoles: "test " + ts.DefaultTeamGuestRole, 2546 ExpectedExplicitRoles: "test", 2547 ExpectedSchemeGuest: true, 2548 }, 2549 { 2550 Name: "team admin implicit and explicit custom role", 2551 SchemeUser: true, 2552 SchemeAdmin: true, 2553 ExplicitRoles: "test", 2554 ExpectedRoles: "test " + ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole, 2555 ExpectedExplicitRoles: "test", 2556 ExpectedSchemeUser: true, 2557 ExpectedSchemeAdmin: true, 2558 }, 2559 { 2560 Name: "team admin explicit and explicit custom role", 2561 ExplicitRoles: "team_user team_admin test", 2562 ExpectedRoles: "test " + ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole, 2563 ExpectedExplicitRoles: "test", 2564 ExpectedSchemeUser: true, 2565 ExpectedSchemeAdmin: true, 2566 }, 2567 { 2568 Name: "team member with only explicit custom roles", 2569 ExplicitRoles: "test test2", 2570 ExpectedRoles: "test test2", 2571 ExpectedExplicitRoles: "test test2", 2572 }, 2573 } 2574 2575 for _, tc := range testCases { 2576 t.Run(tc.Name, func(t *testing.T) { 2577 member.SchemeGuest = tc.SchemeGuest 2578 member.SchemeUser = tc.SchemeUser 2579 member.SchemeAdmin = tc.SchemeAdmin 2580 member.ExplicitRoles = tc.ExplicitRoles 2581 2582 members, err := ss.Team().UpdateMultipleMembers([]*model.TeamMember{member, otherMember}) 2583 require.NoError(t, err) 2584 require.Len(t, members, 2) 2585 member = members[0] 2586 2587 assert.Equal(t, tc.ExpectedRoles, member.Roles) 2588 assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles) 2589 assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest) 2590 assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser) 2591 assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin) 2592 }) 2593 } 2594 }) 2595 } 2596 2597 func testTeamRemoveMember(t *testing.T, ss store.Store) { 2598 u1, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()}) 2599 require.NoError(t, err) 2600 u2, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()}) 2601 require.NoError(t, err) 2602 u3, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()}) 2603 require.NoError(t, err) 2604 u4, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()}) 2605 require.NoError(t, err) 2606 teamID := model.NewId() 2607 m1 := &model.TeamMember{TeamId: teamID, UserId: u1.Id} 2608 m2 := &model.TeamMember{TeamId: teamID, UserId: u2.Id} 2609 m3 := &model.TeamMember{TeamId: teamID, UserId: u3.Id} 2610 m4 := &model.TeamMember{TeamId: teamID, UserId: u4.Id} 2611 _, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3, m4}, -1) 2612 require.NoError(t, nErr) 2613 2614 t.Run("remove member from not existing team", func(t *testing.T) { 2615 nErr = ss.Team().RemoveMember("not-existing-team", u1.Id) 2616 require.NoError(t, nErr) 2617 var membersOtherTeam []*model.TeamMember 2618 membersOtherTeam, nErr = ss.Team().GetMembers(teamID, 0, 100, nil) 2619 require.NoError(t, nErr) 2620 require.Len(t, membersOtherTeam, 4) 2621 }) 2622 2623 t.Run("remove not existing member from an existing team", func(t *testing.T) { 2624 nErr = ss.Team().RemoveMember(teamID, model.NewId()) 2625 require.NoError(t, nErr) 2626 var membersOtherTeam []*model.TeamMember 2627 membersOtherTeam, nErr = ss.Team().GetMembers(teamID, 0, 100, nil) 2628 require.NoError(t, nErr) 2629 require.Len(t, membersOtherTeam, 4) 2630 }) 2631 2632 t.Run("remove existing member from an existing team", func(t *testing.T) { 2633 nErr = ss.Team().RemoveMember(teamID, u1.Id) 2634 require.NoError(t, nErr) 2635 defer ss.Team().SaveMember(m1, -1) 2636 var membersOtherTeam []*model.TeamMember 2637 membersOtherTeam, nErr = ss.Team().GetMembers(teamID, 0, 100, nil) 2638 require.NoError(t, nErr) 2639 require.Len(t, membersOtherTeam, 3) 2640 }) 2641 } 2642 2643 func testTeamRemoveMembers(t *testing.T, ss store.Store) { 2644 u1, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()}) 2645 require.NoError(t, err) 2646 u2, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()}) 2647 require.NoError(t, err) 2648 u3, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()}) 2649 require.NoError(t, err) 2650 u4, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()}) 2651 require.NoError(t, err) 2652 teamID := model.NewId() 2653 m1 := &model.TeamMember{TeamId: teamID, UserId: u1.Id} 2654 m2 := &model.TeamMember{TeamId: teamID, UserId: u2.Id} 2655 m3 := &model.TeamMember{TeamId: teamID, UserId: u3.Id} 2656 m4 := &model.TeamMember{TeamId: teamID, UserId: u4.Id} 2657 _, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3, m4}, -1) 2658 require.NoError(t, nErr) 2659 2660 t.Run("remove members from not existing team", func(t *testing.T) { 2661 nErr = ss.Team().RemoveMembers("not-existing-team", []string{u1.Id, u2.Id, u3.Id, u4.Id}) 2662 require.NoError(t, nErr) 2663 var membersOtherTeam []*model.TeamMember 2664 membersOtherTeam, nErr = ss.Team().GetMembers(teamID, 0, 100, nil) 2665 require.NoError(t, nErr) 2666 require.Len(t, membersOtherTeam, 4) 2667 }) 2668 2669 t.Run("remove not existing members from an existing team", func(t *testing.T) { 2670 nErr = ss.Team().RemoveMembers(teamID, []string{model.NewId(), model.NewId()}) 2671 require.NoError(t, nErr) 2672 var membersOtherTeam []*model.TeamMember 2673 membersOtherTeam, nErr = ss.Team().GetMembers(teamID, 0, 100, nil) 2674 require.NoError(t, nErr) 2675 require.Len(t, membersOtherTeam, 4) 2676 }) 2677 2678 t.Run("remove not existing and not existing members from an existing team", func(t *testing.T) { 2679 nErr = ss.Team().RemoveMembers(teamID, []string{u1.Id, u2.Id, model.NewId(), model.NewId()}) 2680 require.NoError(t, nErr) 2681 defer ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2}, -1) 2682 var membersOtherTeam []*model.TeamMember 2683 membersOtherTeam, nErr = ss.Team().GetMembers(teamID, 0, 100, nil) 2684 require.NoError(t, nErr) 2685 require.Len(t, membersOtherTeam, 2) 2686 }) 2687 t.Run("remove existing members from an existing team", func(t *testing.T) { 2688 nErr = ss.Team().RemoveMembers(teamID, []string{u1.Id, u2.Id, u3.Id}) 2689 require.NoError(t, nErr) 2690 defer ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3}, -1) 2691 var membersOtherTeam []*model.TeamMember 2692 membersOtherTeam, nErr = ss.Team().GetMembers(teamID, 0, 100, nil) 2693 require.NoError(t, nErr) 2694 require.Len(t, membersOtherTeam, 1) 2695 }) 2696 } 2697 2698 func testTeamMembersWithPagination(t *testing.T, ss store.Store) { 2699 teamId1 := model.NewId() 2700 teamId2 := model.NewId() 2701 2702 m1 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()} 2703 m2 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()} 2704 m3 := &model.TeamMember{TeamId: teamId2, UserId: model.NewId()} 2705 2706 _, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3}, -1) 2707 require.NoError(t, nErr) 2708 2709 ms, errTeam := ss.Team().GetTeamsForUserWithPagination(m1.UserId, 0, 1) 2710 require.NoError(t, errTeam) 2711 2712 require.Len(t, ms, 1) 2713 require.Equal(t, m1.TeamId, ms[0].TeamId) 2714 2715 e := ss.Team().RemoveMember(teamId1, m1.UserId) 2716 require.NoError(t, e) 2717 2718 ms, err := ss.Team().GetMembers(teamId1, 0, 100, nil) 2719 require.NoError(t, err) 2720 2721 require.Len(t, ms, 1) 2722 require.Equal(t, m2.UserId, ms[0].UserId) 2723 2724 _, nErr = ss.Team().SaveMember(m1, -1) 2725 require.NoError(t, nErr) 2726 2727 err = ss.Team().RemoveAllMembersByTeam(teamId1) 2728 require.NoError(t, err) 2729 2730 uid := model.NewId() 2731 m4 := &model.TeamMember{TeamId: teamId1, UserId: uid} 2732 m5 := &model.TeamMember{TeamId: teamId2, UserId: uid} 2733 _, nErr = ss.Team().SaveMultipleMembers([]*model.TeamMember{m4, m5}, -1) 2734 require.NoError(t, nErr) 2735 2736 result, err := ss.Team().GetTeamsForUserWithPagination(uid, 0, 1) 2737 require.NoError(t, err) 2738 require.Len(t, result, 1) 2739 2740 nErr = ss.Team().RemoveAllMembersByUser(uid) 2741 require.NoError(t, nErr) 2742 2743 result, err = ss.Team().GetTeamsForUserWithPagination(uid, 1, 1) 2744 require.NoError(t, err) 2745 require.Empty(t, result) 2746 } 2747 2748 func testSaveTeamMemberMaxMembers(t *testing.T, ss store.Store) { 2749 maxUsersPerTeam := 5 2750 2751 team, errSave := ss.Team().Save(&model.Team{ 2752 DisplayName: "DisplayName", 2753 Name: "z-z-z" + model.NewId() + "b", 2754 Type: model.TEAM_OPEN, 2755 }) 2756 require.NoError(t, errSave) 2757 defer func() { 2758 ss.Team().PermanentDelete(team.Id) 2759 }() 2760 2761 userIds := make([]string, maxUsersPerTeam) 2762 2763 for i := 0; i < maxUsersPerTeam; i++ { 2764 user, err := ss.User().Save(&model.User{ 2765 Username: model.NewId(), 2766 Email: MakeEmail(), 2767 }) 2768 require.NoError(t, err) 2769 userIds[i] = user.Id 2770 2771 defer func(userId string) { 2772 ss.User().PermanentDelete(userId) 2773 }(userIds[i]) 2774 2775 _, nErr := ss.Team().SaveMember(&model.TeamMember{ 2776 TeamId: team.Id, 2777 UserId: userIds[i], 2778 }, maxUsersPerTeam) 2779 require.NoError(t, nErr) 2780 2781 defer func(userId string) { 2782 ss.Team().RemoveMember(team.Id, userId) 2783 }(userIds[i]) 2784 } 2785 2786 totalMemberCount, err := ss.Team().GetTotalMemberCount(team.Id, nil) 2787 require.NoError(t, err) 2788 require.Equal(t, int(totalMemberCount), maxUsersPerTeam, "should start with 5 team members, had %v instead", totalMemberCount) 2789 2790 user, nErr := ss.User().Save(&model.User{ 2791 Username: model.NewId(), 2792 Email: MakeEmail(), 2793 }) 2794 require.NoError(t, nErr) 2795 newUserId := user.Id 2796 defer func() { 2797 ss.User().PermanentDelete(newUserId) 2798 }() 2799 2800 _, nErr = ss.Team().SaveMember(&model.TeamMember{ 2801 TeamId: team.Id, 2802 UserId: newUserId, 2803 }, maxUsersPerTeam) 2804 require.Error(t, nErr, "shouldn't be able to save member when at maximum members per team") 2805 2806 totalMemberCount, teamErr := ss.Team().GetTotalMemberCount(team.Id, nil) 2807 require.NoError(t, teamErr) 2808 require.Equal(t, maxUsersPerTeam, int(totalMemberCount), "should still have 5 team members, had %v instead", totalMemberCount) 2809 2810 // Leaving the team from the UI sets DeleteAt instead of using TeamStore.RemoveMember 2811 _, teamErr = ss.Team().UpdateMember(&model.TeamMember{ 2812 TeamId: team.Id, 2813 UserId: userIds[0], 2814 DeleteAt: 1234, 2815 }) 2816 require.NoError(t, teamErr) 2817 2818 totalMemberCount, teamErr = ss.Team().GetTotalMemberCount(team.Id, nil) 2819 require.NoError(t, teamErr) 2820 require.Equal(t, maxUsersPerTeam-1, int(totalMemberCount), "should now only have 4 team members, had %v instead", totalMemberCount) 2821 2822 _, nErr = ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: newUserId}, maxUsersPerTeam) 2823 require.NoError(t, nErr, "should've been able to save new member after deleting one") 2824 2825 defer ss.Team().RemoveMember(team.Id, newUserId) 2826 2827 totalMemberCount, teamErr = ss.Team().GetTotalMemberCount(team.Id, nil) 2828 require.NoError(t, teamErr) 2829 require.Equal(t, maxUsersPerTeam, int(totalMemberCount), "should have 5 team members again, had %v instead", totalMemberCount) 2830 2831 // Deactivating a user should make them stop counting against max members 2832 user2, nErr := ss.User().Get(context.Background(), userIds[1]) 2833 require.NoError(t, nErr) 2834 user2.DeleteAt = 1234 2835 _, nErr = ss.User().Update(user2, true) 2836 require.NoError(t, nErr) 2837 2838 user, nErr = ss.User().Save(&model.User{ 2839 Username: model.NewId(), 2840 Email: MakeEmail(), 2841 }) 2842 require.NoError(t, nErr) 2843 newUserId2 := user.Id 2844 _, nErr = ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: newUserId2}, maxUsersPerTeam) 2845 require.NoError(t, nErr, "should've been able to save new member after deleting one") 2846 2847 defer ss.Team().RemoveMember(team.Id, newUserId2) 2848 } 2849 2850 func testGetTeamMember(t *testing.T, ss store.Store) { 2851 teamId1 := model.NewId() 2852 2853 m1 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()} 2854 _, nErr := ss.Team().SaveMember(m1, -1) 2855 require.NoError(t, nErr) 2856 2857 var rm1 *model.TeamMember 2858 rm1, err := ss.Team().GetMember(m1.TeamId, m1.UserId) 2859 require.NoError(t, err) 2860 2861 require.Equal(t, rm1.TeamId, m1.TeamId, "bad team id") 2862 2863 require.Equal(t, rm1.UserId, m1.UserId, "bad user id") 2864 2865 _, err = ss.Team().GetMember(m1.TeamId, "") 2866 require.Error(t, err, "empty user id - should have failed") 2867 2868 _, err = ss.Team().GetMember("", m1.UserId) 2869 require.Error(t, err, "empty team id - should have failed") 2870 2871 // Test with a custom team scheme. 2872 s2 := &model.Scheme{ 2873 Name: model.NewId(), 2874 DisplayName: model.NewId(), 2875 Description: model.NewId(), 2876 Scope: model.SCHEME_SCOPE_TEAM, 2877 } 2878 s2, nErr = ss.Scheme().Save(s2) 2879 require.NoError(t, nErr) 2880 t.Log(s2) 2881 2882 t2, nErr := ss.Team().Save(&model.Team{ 2883 DisplayName: "DisplayName", 2884 Name: "z-z-z" + model.NewId() + "b", 2885 Type: model.TEAM_OPEN, 2886 SchemeId: &s2.Id, 2887 }) 2888 require.NoError(t, nErr) 2889 2890 defer func() { 2891 ss.Team().PermanentDelete(t2.Id) 2892 }() 2893 2894 m2 := &model.TeamMember{TeamId: t2.Id, UserId: model.NewId(), SchemeUser: true} 2895 _, nErr = ss.Team().SaveMember(m2, -1) 2896 require.NoError(t, nErr) 2897 2898 m3, err := ss.Team().GetMember(m2.TeamId, m2.UserId) 2899 require.NoError(t, err) 2900 t.Log(m3) 2901 2902 assert.Equal(t, s2.DefaultTeamUserRole, m3.Roles) 2903 2904 m4 := &model.TeamMember{TeamId: t2.Id, UserId: model.NewId(), SchemeGuest: true} 2905 _, nErr = ss.Team().SaveMember(m4, -1) 2906 require.NoError(t, nErr) 2907 2908 m5, err := ss.Team().GetMember(m4.TeamId, m4.UserId) 2909 require.NoError(t, err) 2910 2911 assert.Equal(t, s2.DefaultTeamGuestRole, m5.Roles) 2912 } 2913 2914 func testGetTeamMembersByIds(t *testing.T, ss store.Store) { 2915 teamId1 := model.NewId() 2916 2917 m1 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()} 2918 _, nErr := ss.Team().SaveMember(m1, -1) 2919 require.NoError(t, nErr) 2920 2921 var r []*model.TeamMember 2922 r, err := ss.Team().GetMembersByIds(m1.TeamId, []string{m1.UserId}, nil) 2923 require.NoError(t, err) 2924 rm1 := r[0] 2925 2926 require.Equal(t, rm1.TeamId, m1.TeamId, "bad team id") 2927 require.Equal(t, rm1.UserId, m1.UserId, "bad user id") 2928 2929 m2 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()} 2930 _, nErr = ss.Team().SaveMember(m2, -1) 2931 require.NoError(t, nErr) 2932 2933 rm, err := ss.Team().GetMembersByIds(m1.TeamId, []string{m1.UserId, m2.UserId, model.NewId()}, nil) 2934 require.NoError(t, err) 2935 2936 require.Len(t, rm, 2, "return wrong number of results") 2937 2938 _, err = ss.Team().GetMembersByIds(m1.TeamId, []string{}, nil) 2939 require.Error(t, err, "empty user ids - should have failed") 2940 } 2941 2942 func testTeamStoreMemberCount(t *testing.T, ss store.Store) { 2943 u1 := &model.User{} 2944 u1.Email = MakeEmail() 2945 _, err := ss.User().Save(u1) 2946 require.NoError(t, err) 2947 2948 u2 := &model.User{} 2949 u2.Email = MakeEmail() 2950 u2.DeleteAt = 1 2951 _, err = ss.User().Save(u2) 2952 require.NoError(t, err) 2953 2954 teamId1 := model.NewId() 2955 m1 := &model.TeamMember{TeamId: teamId1, UserId: u1.Id} 2956 _, nErr := ss.Team().SaveMember(m1, -1) 2957 require.NoError(t, nErr) 2958 2959 m2 := &model.TeamMember{TeamId: teamId1, UserId: u2.Id} 2960 _, nErr = ss.Team().SaveMember(m2, -1) 2961 require.NoError(t, nErr) 2962 2963 var totalMemberCount int64 2964 totalMemberCount, nErr = ss.Team().GetTotalMemberCount(teamId1, nil) 2965 require.NoError(t, nErr) 2966 require.Equal(t, int(totalMemberCount), 2, "wrong count") 2967 2968 var result int64 2969 result, nErr = ss.Team().GetActiveMemberCount(teamId1, nil) 2970 require.NoError(t, nErr) 2971 require.Equal(t, 1, int(result), "wrong count") 2972 2973 m3 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()} 2974 _, nErr = ss.Team().SaveMember(m3, -1) 2975 require.NoError(t, nErr) 2976 2977 totalMemberCount, nErr = ss.Team().GetTotalMemberCount(teamId1, nil) 2978 require.NoError(t, nErr) 2979 require.Equal(t, 2, int(totalMemberCount), "wrong count") 2980 2981 result, nErr = ss.Team().GetActiveMemberCount(teamId1, nil) 2982 require.NoError(t, nErr) 2983 require.Equal(t, 1, int(result), "wrong count") 2984 } 2985 2986 func testGetChannelUnreadsForAllTeams(t *testing.T, ss store.Store) { 2987 teamId1 := model.NewId() 2988 teamId2 := model.NewId() 2989 2990 uid := model.NewId() 2991 m1 := &model.TeamMember{TeamId: teamId1, UserId: uid} 2992 m2 := &model.TeamMember{TeamId: teamId2, UserId: uid} 2993 _, nErr := ss.Team().SaveMember(m1, -1) 2994 require.NoError(t, nErr) 2995 _, nErr = ss.Team().SaveMember(m2, -1) 2996 require.NoError(t, nErr) 2997 2998 c1 := &model.Channel{TeamId: m1.TeamId, Name: model.NewId(), DisplayName: "Town Square", Type: model.CHANNEL_OPEN, TotalMsgCount: 100} 2999 _, nErr = ss.Channel().Save(c1, -1) 3000 require.NoError(t, nErr) 3001 3002 c2 := &model.Channel{TeamId: m2.TeamId, Name: model.NewId(), DisplayName: "Town Square", Type: model.CHANNEL_OPEN, TotalMsgCount: 100} 3003 _, nErr = ss.Channel().Save(c2, -1) 3004 require.NoError(t, nErr) 3005 3006 cm1 := &model.ChannelMember{ChannelId: c1.Id, UserId: m1.UserId, NotifyProps: model.GetDefaultChannelNotifyProps(), MsgCount: 90} 3007 _, err := ss.Channel().SaveMember(cm1) 3008 require.NoError(t, err) 3009 cm2 := &model.ChannelMember{ChannelId: c2.Id, UserId: m2.UserId, NotifyProps: model.GetDefaultChannelNotifyProps(), MsgCount: 90} 3010 _, err = ss.Channel().SaveMember(cm2) 3011 require.NoError(t, err) 3012 3013 ms1, nErr := ss.Team().GetChannelUnreadsForAllTeams("", uid) 3014 require.NoError(t, nErr) 3015 membersMap := make(map[string]bool) 3016 for i := range ms1 { 3017 id := ms1[i].TeamId 3018 if _, ok := membersMap[id]; !ok { 3019 membersMap[id] = true 3020 } 3021 } 3022 require.Len(t, membersMap, 2, "Should be the unreads for all the teams") 3023 3024 require.Equal(t, 10, int(ms1[0].MsgCount), "subtraction failed") 3025 3026 ms2, nErr := ss.Team().GetChannelUnreadsForAllTeams(teamId1, uid) 3027 require.NoError(t, nErr) 3028 membersMap = make(map[string]bool) 3029 for i := range ms2 { 3030 id := ms2[i].TeamId 3031 if _, ok := membersMap[id]; !ok { 3032 membersMap[id] = true 3033 } 3034 } 3035 3036 require.Len(t, membersMap, 1, "Should be the unreads for just one team") 3037 3038 require.Equal(t, 10, int(ms2[0].MsgCount), "subtraction failed") 3039 3040 nErr = ss.Team().RemoveAllMembersByUser(uid) 3041 require.NoError(t, nErr) 3042 } 3043 3044 func testGetChannelUnreadsForTeam(t *testing.T, ss store.Store) { 3045 teamId1 := model.NewId() 3046 3047 uid := model.NewId() 3048 m1 := &model.TeamMember{TeamId: teamId1, UserId: uid} 3049 _, nErr := ss.Team().SaveMember(m1, -1) 3050 require.NoError(t, nErr) 3051 3052 c1 := &model.Channel{TeamId: m1.TeamId, Name: model.NewId(), DisplayName: "Town Square", Type: model.CHANNEL_OPEN, TotalMsgCount: 100} 3053 _, nErr = ss.Channel().Save(c1, -1) 3054 require.NoError(t, nErr) 3055 3056 c2 := &model.Channel{TeamId: m1.TeamId, Name: model.NewId(), DisplayName: "Town Square", Type: model.CHANNEL_OPEN, TotalMsgCount: 100} 3057 _, nErr = ss.Channel().Save(c2, -1) 3058 require.NoError(t, nErr) 3059 3060 cm1 := &model.ChannelMember{ChannelId: c1.Id, UserId: m1.UserId, NotifyProps: model.GetDefaultChannelNotifyProps(), MsgCount: 90} 3061 _, nErr = ss.Channel().SaveMember(cm1) 3062 require.NoError(t, nErr) 3063 cm2 := &model.ChannelMember{ChannelId: c2.Id, UserId: m1.UserId, NotifyProps: model.GetDefaultChannelNotifyProps(), MsgCount: 90} 3064 _, nErr = ss.Channel().SaveMember(cm2) 3065 require.NoError(t, nErr) 3066 3067 ms, err := ss.Team().GetChannelUnreadsForTeam(m1.TeamId, m1.UserId) 3068 require.NoError(t, err) 3069 require.Len(t, ms, 2, "wrong length") 3070 3071 require.Equal(t, 10, int(ms[0].MsgCount), "subtraction failed") 3072 } 3073 3074 func testUpdateLastTeamIconUpdate(t *testing.T, ss store.Store) { 3075 3076 // team icon initially updated a second ago 3077 lastTeamIconUpdateInitial := model.GetMillis() - 1000 3078 3079 o1 := &model.Team{} 3080 o1.DisplayName = "Display Name" 3081 o1.Name = "z-z-z" + model.NewId() + "b" 3082 o1.Email = MakeEmail() 3083 o1.Type = model.TEAM_OPEN 3084 o1.LastTeamIconUpdate = lastTeamIconUpdateInitial 3085 o1, err := ss.Team().Save(o1) 3086 require.NoError(t, err) 3087 3088 curTime := model.GetMillis() 3089 3090 err = ss.Team().UpdateLastTeamIconUpdate(o1.Id, curTime) 3091 require.NoError(t, err) 3092 3093 ro1, err := ss.Team().Get(o1.Id) 3094 require.NoError(t, err) 3095 3096 require.Greater(t, ro1.LastTeamIconUpdate, lastTeamIconUpdateInitial, "LastTeamIconUpdate not updated") 3097 } 3098 3099 func testGetTeamsByScheme(t *testing.T, ss store.Store) { 3100 // Create some schemes. 3101 s1 := &model.Scheme{ 3102 DisplayName: model.NewId(), 3103 Name: model.NewId(), 3104 Description: model.NewId(), 3105 Scope: model.SCHEME_SCOPE_TEAM, 3106 } 3107 3108 s2 := &model.Scheme{ 3109 DisplayName: model.NewId(), 3110 Name: model.NewId(), 3111 Description: model.NewId(), 3112 Scope: model.SCHEME_SCOPE_TEAM, 3113 } 3114 3115 s1, err := ss.Scheme().Save(s1) 3116 require.NoError(t, err) 3117 s2, err = ss.Scheme().Save(s2) 3118 require.NoError(t, err) 3119 3120 // Create and save some teams. 3121 t1 := &model.Team{ 3122 Name: "zz" + model.NewId(), 3123 DisplayName: model.NewId(), 3124 Email: MakeEmail(), 3125 Type: model.TEAM_OPEN, 3126 SchemeId: &s1.Id, 3127 } 3128 3129 t2 := &model.Team{ 3130 Name: "zz" + model.NewId(), 3131 DisplayName: model.NewId(), 3132 Email: MakeEmail(), 3133 Type: model.TEAM_OPEN, 3134 SchemeId: &s1.Id, 3135 } 3136 3137 t3 := &model.Team{ 3138 Name: "zz" + model.NewId(), 3139 DisplayName: model.NewId(), 3140 Email: MakeEmail(), 3141 Type: model.TEAM_OPEN, 3142 } 3143 3144 _, err = ss.Team().Save(t1) 3145 require.NoError(t, err) 3146 3147 _, err = ss.Team().Save(t2) 3148 require.NoError(t, err) 3149 3150 _, err = ss.Team().Save(t3) 3151 require.NoError(t, err) 3152 3153 // Get the teams by a valid Scheme ID. 3154 d, err := ss.Team().GetTeamsByScheme(s1.Id, 0, 100) 3155 assert.NoError(t, err) 3156 assert.Len(t, d, 2) 3157 3158 // Get the teams by a valid Scheme ID where there aren't any matching Teams. 3159 d, err = ss.Team().GetTeamsByScheme(s2.Id, 0, 100) 3160 assert.NoError(t, err) 3161 assert.Empty(t, d) 3162 3163 // Get the teams by an invalid Scheme ID. 3164 d, err = ss.Team().GetTeamsByScheme(model.NewId(), 0, 100) 3165 assert.NoError(t, err) 3166 assert.Empty(t, d) 3167 } 3168 3169 func testTeamStoreMigrateTeamMembers(t *testing.T, ss store.Store) { 3170 s1 := model.NewId() 3171 t1 := &model.Team{ 3172 DisplayName: "Name", 3173 Name: "z-z-z" + model.NewId() + "b", 3174 Email: MakeEmail(), 3175 Type: model.TEAM_OPEN, 3176 InviteId: model.NewId(), 3177 SchemeId: &s1, 3178 } 3179 t1, err := ss.Team().Save(t1) 3180 require.NoError(t, err) 3181 3182 tm1 := &model.TeamMember{ 3183 TeamId: t1.Id, 3184 UserId: model.NewId(), 3185 ExplicitRoles: "team_admin team_user", 3186 } 3187 tm2 := &model.TeamMember{ 3188 TeamId: t1.Id, 3189 UserId: model.NewId(), 3190 ExplicitRoles: "team_user", 3191 } 3192 tm3 := &model.TeamMember{ 3193 TeamId: t1.Id, 3194 UserId: model.NewId(), 3195 ExplicitRoles: "something_else", 3196 } 3197 3198 memberships, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{tm1, tm2, tm3}, -1) 3199 require.NoError(t, nErr) 3200 require.Len(t, memberships, 3) 3201 tm1 = memberships[0] 3202 tm2 = memberships[1] 3203 tm3 = memberships[2] 3204 3205 lastDoneTeamId := strings.Repeat("0", 26) 3206 lastDoneUserId := strings.Repeat("0", 26) 3207 3208 for { 3209 res, e := ss.Team().MigrateTeamMembers(lastDoneTeamId, lastDoneUserId) 3210 if assert.NoError(t, e) { 3211 if res == nil { 3212 break 3213 } 3214 lastDoneTeamId = res["TeamId"] 3215 lastDoneUserId = res["UserId"] 3216 } 3217 } 3218 3219 tm1b, err := ss.Team().GetMember(tm1.TeamId, tm1.UserId) 3220 assert.NoError(t, err) 3221 assert.Equal(t, "", tm1b.ExplicitRoles) 3222 assert.True(t, tm1b.SchemeUser) 3223 assert.True(t, tm1b.SchemeAdmin) 3224 3225 tm2b, err := ss.Team().GetMember(tm2.TeamId, tm2.UserId) 3226 assert.NoError(t, err) 3227 assert.Equal(t, "", tm2b.ExplicitRoles) 3228 assert.True(t, tm2b.SchemeUser) 3229 assert.False(t, tm2b.SchemeAdmin) 3230 3231 tm3b, err := ss.Team().GetMember(tm3.TeamId, tm3.UserId) 3232 assert.NoError(t, err) 3233 assert.Equal(t, "something_else", tm3b.ExplicitRoles) 3234 assert.False(t, tm3b.SchemeUser) 3235 assert.False(t, tm3b.SchemeAdmin) 3236 } 3237 3238 func testResetAllTeamSchemes(t *testing.T, ss store.Store) { 3239 s1 := &model.Scheme{ 3240 Name: model.NewId(), 3241 DisplayName: model.NewId(), 3242 Description: model.NewId(), 3243 Scope: model.SCHEME_SCOPE_TEAM, 3244 } 3245 s1, err := ss.Scheme().Save(s1) 3246 require.NoError(t, err) 3247 3248 t1 := &model.Team{ 3249 Name: "zz" + model.NewId(), 3250 DisplayName: model.NewId(), 3251 Email: MakeEmail(), 3252 Type: model.TEAM_OPEN, 3253 SchemeId: &s1.Id, 3254 } 3255 3256 t2 := &model.Team{ 3257 Name: "zz" + model.NewId(), 3258 DisplayName: model.NewId(), 3259 Email: MakeEmail(), 3260 Type: model.TEAM_OPEN, 3261 SchemeId: &s1.Id, 3262 } 3263 3264 t1, err = ss.Team().Save(t1) 3265 require.NoError(t, err) 3266 t2, err = ss.Team().Save(t2) 3267 require.NoError(t, err) 3268 3269 assert.Equal(t, s1.Id, *t1.SchemeId) 3270 assert.Equal(t, s1.Id, *t2.SchemeId) 3271 3272 res := ss.Team().ResetAllTeamSchemes() 3273 assert.NoError(t, res) 3274 3275 t1, err = ss.Team().Get(t1.Id) 3276 require.NoError(t, err) 3277 3278 t2, err = ss.Team().Get(t2.Id) 3279 require.NoError(t, err) 3280 3281 assert.Equal(t, "", *t1.SchemeId) 3282 assert.Equal(t, "", *t2.SchemeId) 3283 } 3284 3285 func testTeamStoreClearAllCustomRoleAssignments(t *testing.T, ss store.Store) { 3286 m1 := &model.TeamMember{ 3287 TeamId: model.NewId(), 3288 UserId: model.NewId(), 3289 ExplicitRoles: "team_post_all_public team_user team_admin", 3290 } 3291 m2 := &model.TeamMember{ 3292 TeamId: model.NewId(), 3293 UserId: model.NewId(), 3294 ExplicitRoles: "team_user custom_role team_admin another_custom_role", 3295 } 3296 m3 := &model.TeamMember{ 3297 TeamId: model.NewId(), 3298 UserId: model.NewId(), 3299 ExplicitRoles: "team_user", 3300 } 3301 m4 := &model.TeamMember{ 3302 TeamId: model.NewId(), 3303 UserId: model.NewId(), 3304 ExplicitRoles: "custom_only", 3305 } 3306 3307 _, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3, m4}, -1) 3308 require.NoError(t, nErr) 3309 3310 require.NoError(t, (ss.Team().ClearAllCustomRoleAssignments())) 3311 3312 r1, err := ss.Team().GetMember(m1.TeamId, m1.UserId) 3313 require.NoError(t, err) 3314 assert.Equal(t, m1.ExplicitRoles, r1.Roles) 3315 3316 r2, err := ss.Team().GetMember(m2.TeamId, m2.UserId) 3317 require.NoError(t, err) 3318 assert.Equal(t, "team_user team_admin", r2.Roles) 3319 3320 r3, err := ss.Team().GetMember(m3.TeamId, m3.UserId) 3321 require.NoError(t, err) 3322 assert.Equal(t, m3.ExplicitRoles, r3.Roles) 3323 3324 r4, err := ss.Team().GetMember(m4.TeamId, m4.UserId) 3325 require.NoError(t, err) 3326 assert.Equal(t, "", r4.Roles) 3327 } 3328 3329 func testTeamStoreAnalyticsGetTeamCountForScheme(t *testing.T, ss store.Store) { 3330 s1 := &model.Scheme{ 3331 DisplayName: model.NewId(), 3332 Name: model.NewId(), 3333 Description: model.NewId(), 3334 Scope: model.SCHEME_SCOPE_TEAM, 3335 } 3336 s1, err := ss.Scheme().Save(s1) 3337 require.NoError(t, err) 3338 3339 count1, err := ss.Team().AnalyticsGetTeamCountForScheme(s1.Id) 3340 assert.NoError(t, err) 3341 assert.Equal(t, int64(0), count1) 3342 3343 t1 := &model.Team{ 3344 Name: "zz" + model.NewId(), 3345 DisplayName: model.NewId(), 3346 Email: MakeEmail(), 3347 Type: model.TEAM_OPEN, 3348 SchemeId: &s1.Id, 3349 } 3350 _, err = ss.Team().Save(t1) 3351 require.NoError(t, err) 3352 3353 count2, err := ss.Team().AnalyticsGetTeamCountForScheme(s1.Id) 3354 assert.NoError(t, err) 3355 assert.Equal(t, int64(1), count2) 3356 3357 t2 := &model.Team{ 3358 Name: "zz" + model.NewId(), 3359 DisplayName: model.NewId(), 3360 Email: MakeEmail(), 3361 Type: model.TEAM_OPEN, 3362 SchemeId: &s1.Id, 3363 } 3364 _, err = ss.Team().Save(t2) 3365 require.NoError(t, err) 3366 3367 count3, err := ss.Team().AnalyticsGetTeamCountForScheme(s1.Id) 3368 assert.NoError(t, err) 3369 assert.Equal(t, int64(2), count3) 3370 3371 t3 := &model.Team{ 3372 Name: "zz" + model.NewId(), 3373 DisplayName: model.NewId(), 3374 Email: MakeEmail(), 3375 Type: model.TEAM_OPEN, 3376 } 3377 _, err = ss.Team().Save(t3) 3378 require.NoError(t, err) 3379 3380 count4, err := ss.Team().AnalyticsGetTeamCountForScheme(s1.Id) 3381 assert.NoError(t, err) 3382 assert.Equal(t, int64(2), count4) 3383 3384 t4 := &model.Team{ 3385 Name: "zz" + model.NewId(), 3386 DisplayName: model.NewId(), 3387 Email: MakeEmail(), 3388 Type: model.TEAM_OPEN, 3389 SchemeId: &s1.Id, 3390 DeleteAt: model.GetMillis(), 3391 } 3392 _, err = ss.Team().Save(t4) 3393 require.NoError(t, err) 3394 3395 count5, err := ss.Team().AnalyticsGetTeamCountForScheme(s1.Id) 3396 assert.NoError(t, err) 3397 assert.Equal(t, int64(2), count5) 3398 } 3399 3400 func testTeamStoreGetAllForExportAfter(t *testing.T, ss store.Store) { 3401 t1 := model.Team{} 3402 t1.DisplayName = "Name" 3403 t1.Name = "zz" + model.NewId() 3404 t1.Email = MakeEmail() 3405 t1.Type = model.TEAM_OPEN 3406 _, err := ss.Team().Save(&t1) 3407 require.NoError(t, err) 3408 3409 d1, err := ss.Team().GetAllForExportAfter(10000, strings.Repeat("0", 26)) 3410 assert.NoError(t, err) 3411 3412 found := false 3413 for _, team := range d1 { 3414 if team.Id == t1.Id { 3415 found = true 3416 assert.Equal(t, t1.Id, team.Id) 3417 assert.Nil(t, team.SchemeId) 3418 assert.Equal(t, t1.Name, team.Name) 3419 } 3420 } 3421 assert.True(t, found) 3422 } 3423 3424 func testTeamStoreGetTeamMembersForExport(t *testing.T, ss store.Store) { 3425 t1 := model.Team{} 3426 t1.DisplayName = "Name" 3427 t1.Name = "zz" + model.NewId() 3428 t1.Email = MakeEmail() 3429 t1.Type = model.TEAM_OPEN 3430 _, err := ss.Team().Save(&t1) 3431 require.NoError(t, err) 3432 3433 u1 := model.User{} 3434 u1.Email = MakeEmail() 3435 u1.Nickname = model.NewId() 3436 _, err = ss.User().Save(&u1) 3437 require.NoError(t, err) 3438 3439 u2 := model.User{} 3440 u2.Email = MakeEmail() 3441 u2.Nickname = model.NewId() 3442 _, err = ss.User().Save(&u2) 3443 require.NoError(t, err) 3444 3445 m1 := &model.TeamMember{TeamId: t1.Id, UserId: u1.Id} 3446 m2 := &model.TeamMember{TeamId: t1.Id, UserId: u2.Id} 3447 _, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2}, -1) 3448 require.NoError(t, nErr) 3449 3450 d1, err := ss.Team().GetTeamMembersForExport(u1.Id) 3451 assert.NoError(t, err) 3452 3453 assert.Len(t, d1, 1) 3454 3455 tmfe1 := d1[0] 3456 assert.Equal(t, t1.Id, tmfe1.TeamId) 3457 assert.Equal(t, u1.Id, tmfe1.UserId) 3458 assert.Equal(t, t1.Name, tmfe1.TeamName) 3459 } 3460 3461 func testGroupSyncedTeamCount(t *testing.T, ss store.Store) { 3462 team1, err := ss.Team().Save(&model.Team{ 3463 DisplayName: model.NewId(), 3464 Name: "zz" + model.NewId(), 3465 Email: MakeEmail(), 3466 Type: model.TEAM_INVITE, 3467 GroupConstrained: model.NewBool(true), 3468 }) 3469 require.NoError(t, err) 3470 require.True(t, team1.IsGroupConstrained()) 3471 defer ss.Team().PermanentDelete(team1.Id) 3472 3473 team2, err := ss.Team().Save(&model.Team{ 3474 DisplayName: model.NewId(), 3475 Name: "zz" + model.NewId(), 3476 Email: MakeEmail(), 3477 Type: model.TEAM_INVITE, 3478 }) 3479 require.NoError(t, err) 3480 require.False(t, team2.IsGroupConstrained()) 3481 defer ss.Team().PermanentDelete(team2.Id) 3482 3483 count, err := ss.Team().GroupSyncedTeamCount() 3484 require.NoError(t, err) 3485 require.GreaterOrEqual(t, count, int64(1)) 3486 3487 team2.GroupConstrained = model.NewBool(true) 3488 team2, err = ss.Team().Update(team2) 3489 require.NoError(t, err) 3490 require.True(t, team2.IsGroupConstrained()) 3491 3492 countAfter, err := ss.Team().GroupSyncedTeamCount() 3493 require.NoError(t, err) 3494 require.GreaterOrEqual(t, countAfter, count+1) 3495 }