github.com/dschalla/mattermost-server@v4.8.1-rc1+incompatible/api4/team_test.go (about) 1 // Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package api4 5 6 import ( 7 "encoding/binary" 8 "fmt" 9 "net/http" 10 "strconv" 11 "strings" 12 "testing" 13 14 "encoding/base64" 15 16 "github.com/mattermost/mattermost-server/model" 17 "github.com/mattermost/mattermost-server/utils" 18 ) 19 20 func TestCreateTeam(t *testing.T) { 21 th := Setup().InitBasic() 22 defer th.TearDown() 23 Client := th.Client 24 25 team := &model.Team{Name: GenerateTestUsername(), DisplayName: "Some Team", Type: model.TEAM_OPEN} 26 rteam, resp := Client.CreateTeam(team) 27 CheckNoError(t, resp) 28 CheckCreatedStatus(t, resp) 29 30 if rteam.Name != team.Name { 31 t.Fatal("names did not match") 32 } 33 34 if rteam.DisplayName != team.DisplayName { 35 t.Fatal("display names did not match") 36 } 37 38 if rteam.Type != team.Type { 39 t.Fatal("types did not match") 40 } 41 42 _, resp = Client.CreateTeam(rteam) 43 CheckBadRequestStatus(t, resp) 44 45 rteam.Id = "" 46 _, resp = Client.CreateTeam(rteam) 47 CheckErrorMessage(t, resp, "store.sql_team.save.domain_exists.app_error") 48 CheckBadRequestStatus(t, resp) 49 50 rteam.Name = "" 51 _, resp = Client.CreateTeam(rteam) 52 CheckErrorMessage(t, resp, "model.team.is_valid.characters.app_error") 53 CheckBadRequestStatus(t, resp) 54 55 if r, err := Client.DoApiPost("/teams", "garbage"); err == nil { 56 t.Fatal("should have errored") 57 } else { 58 if r.StatusCode != http.StatusBadRequest { 59 t.Log("actual: " + strconv.Itoa(r.StatusCode)) 60 t.Log("expected: " + strconv.Itoa(http.StatusBadRequest)) 61 t.Fatal("wrong status code") 62 } 63 } 64 65 Client.Logout() 66 67 _, resp = Client.CreateTeam(rteam) 68 CheckUnauthorizedStatus(t, resp) 69 70 // Update permission 71 th.App.UpdateConfig(func(cfg *model.Config) { cfg.TeamSettings.EnableTeamCreation = false }) 72 73 th.LoginBasic() 74 _, resp = Client.CreateTeam(team) 75 CheckForbiddenStatus(t, resp) 76 } 77 78 func TestCreateTeamSanitization(t *testing.T) { 79 th := Setup().InitBasic().InitSystemAdmin() 80 defer th.TearDown() 81 82 // Non-admin users can create a team, but they become a team admin by doing so 83 84 t.Run("team admin", func(t *testing.T) { 85 team := &model.Team{ 86 DisplayName: t.Name() + "_1", 87 Name: GenerateTestTeamName(), 88 Email: th.GenerateTestEmail(), 89 Type: model.TEAM_OPEN, 90 AllowedDomains: "simulator.amazonses.com", 91 } 92 93 rteam, resp := th.Client.CreateTeam(team) 94 CheckNoError(t, resp) 95 if rteam.Email == "" { 96 t.Fatal("should not have sanitized email") 97 } else if rteam.AllowedDomains == "" { 98 t.Fatal("should not have sanitized allowed domains") 99 } 100 }) 101 102 t.Run("system admin", func(t *testing.T) { 103 team := &model.Team{ 104 DisplayName: t.Name() + "_2", 105 Name: GenerateTestTeamName(), 106 Email: th.GenerateTestEmail(), 107 Type: model.TEAM_OPEN, 108 AllowedDomains: "simulator.amazonses.com", 109 } 110 111 rteam, resp := th.SystemAdminClient.CreateTeam(team) 112 CheckNoError(t, resp) 113 if rteam.Email == "" { 114 t.Fatal("should not have sanitized email") 115 } else if rteam.AllowedDomains == "" { 116 t.Fatal("should not have sanitized allowed domains") 117 } 118 }) 119 } 120 121 func TestGetTeam(t *testing.T) { 122 th := Setup().InitBasic().InitSystemAdmin() 123 defer th.TearDown() 124 Client := th.Client 125 team := th.BasicTeam 126 127 rteam, resp := Client.GetTeam(team.Id, "") 128 CheckNoError(t, resp) 129 130 if rteam.Id != team.Id { 131 t.Fatal("wrong team") 132 } 133 134 _, resp = Client.GetTeam("junk", "") 135 CheckBadRequestStatus(t, resp) 136 137 _, resp = Client.GetTeam("", "") 138 CheckNotFoundStatus(t, resp) 139 140 _, resp = Client.GetTeam(model.NewId(), "") 141 CheckNotFoundStatus(t, resp) 142 143 th.LoginTeamAdmin() 144 145 team2 := &model.Team{DisplayName: "Name", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TEAM_OPEN, AllowOpenInvite: false} 146 rteam2, _ := Client.CreateTeam(team2) 147 148 team3 := &model.Team{DisplayName: "Name", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TEAM_INVITE, AllowOpenInvite: true} 149 rteam3, _ := Client.CreateTeam(team3) 150 151 th.LoginBasic() 152 // AllowInviteOpen is false and team is open, and user is not on team 153 _, resp = Client.GetTeam(rteam2.Id, "") 154 CheckForbiddenStatus(t, resp) 155 156 // AllowInviteOpen is true and team is invite, and user is not on team 157 _, resp = Client.GetTeam(rteam3.Id, "") 158 CheckForbiddenStatus(t, resp) 159 160 Client.Logout() 161 _, resp = Client.GetTeam(team.Id, "") 162 CheckUnauthorizedStatus(t, resp) 163 164 _, resp = th.SystemAdminClient.GetTeam(rteam2.Id, "") 165 CheckNoError(t, resp) 166 } 167 168 func TestGetTeamSanitization(t *testing.T) { 169 th := Setup().InitBasic().InitSystemAdmin() 170 defer th.TearDown() 171 172 team, resp := th.Client.CreateTeam(&model.Team{ 173 DisplayName: t.Name() + "_1", 174 Name: GenerateTestTeamName(), 175 Email: th.GenerateTestEmail(), 176 Type: model.TEAM_OPEN, 177 AllowedDomains: "simulator.amazonses.com", 178 }) 179 CheckNoError(t, resp) 180 181 t.Run("team user", func(t *testing.T) { 182 th.LinkUserToTeam(th.BasicUser2, team) 183 184 client := th.CreateClient() 185 th.LoginBasic2WithClient(client) 186 187 rteam, resp := client.GetTeam(team.Id, "") 188 CheckNoError(t, resp) 189 if rteam.Email != "" { 190 t.Fatal("should've sanitized email") 191 } else if rteam.AllowedDomains != "" { 192 t.Fatal("should've sanitized allowed domains") 193 } 194 }) 195 196 t.Run("team admin", func(t *testing.T) { 197 rteam, resp := th.Client.GetTeam(team.Id, "") 198 CheckNoError(t, resp) 199 if rteam.Email == "" { 200 t.Fatal("should not have sanitized email") 201 } else if rteam.AllowedDomains == "" { 202 t.Fatal("should not have sanitized allowed domains") 203 } 204 }) 205 206 t.Run("system admin", func(t *testing.T) { 207 rteam, resp := th.SystemAdminClient.GetTeam(team.Id, "") 208 CheckNoError(t, resp) 209 if rteam.Email == "" { 210 t.Fatal("should not have sanitized email") 211 } else if rteam.AllowedDomains == "" { 212 t.Fatal("should not have sanitized allowed domains") 213 } 214 }) 215 } 216 217 func TestGetTeamUnread(t *testing.T) { 218 th := Setup().InitBasic().InitSystemAdmin() 219 defer th.TearDown() 220 Client := th.Client 221 222 teamUnread, resp := Client.GetTeamUnread(th.BasicTeam.Id, th.BasicUser.Id) 223 CheckNoError(t, resp) 224 if teamUnread.TeamId != th.BasicTeam.Id { 225 t.Fatal("wrong team id returned for regular user call") 226 } 227 228 _, resp = Client.GetTeamUnread("junk", th.BasicUser.Id) 229 CheckBadRequestStatus(t, resp) 230 231 _, resp = Client.GetTeamUnread(th.BasicTeam.Id, "junk") 232 CheckBadRequestStatus(t, resp) 233 234 _, resp = Client.GetTeamUnread(model.NewId(), th.BasicUser.Id) 235 CheckForbiddenStatus(t, resp) 236 237 _, resp = Client.GetTeamUnread(th.BasicTeam.Id, model.NewId()) 238 CheckForbiddenStatus(t, resp) 239 240 Client.Logout() 241 _, resp = Client.GetTeamUnread(th.BasicTeam.Id, th.BasicUser.Id) 242 CheckUnauthorizedStatus(t, resp) 243 244 teamUnread, resp = th.SystemAdminClient.GetTeamUnread(th.BasicTeam.Id, th.BasicUser.Id) 245 CheckNoError(t, resp) 246 if teamUnread.TeamId != th.BasicTeam.Id { 247 t.Fatal("wrong team id returned") 248 } 249 } 250 251 func TestUpdateTeam(t *testing.T) { 252 th := Setup().InitBasic().InitSystemAdmin() 253 defer th.TearDown() 254 Client := th.Client 255 256 team := &model.Team{DisplayName: "Name", Description: "Some description", AllowOpenInvite: false, InviteId: "inviteid0", Name: "z-z-" + model.NewId() + "a", Email: "success+" + model.NewId() + "@simulator.amazonses.com", Type: model.TEAM_OPEN} 257 team, _ = Client.CreateTeam(team) 258 259 team.Description = "updated description" 260 uteam, resp := Client.UpdateTeam(team) 261 CheckNoError(t, resp) 262 263 if uteam.Description != "updated description" { 264 t.Fatal("Update failed") 265 } 266 267 team.DisplayName = "Updated Name" 268 uteam, resp = Client.UpdateTeam(team) 269 CheckNoError(t, resp) 270 271 if uteam.DisplayName != "Updated Name" { 272 t.Fatal("Update failed") 273 } 274 275 team.AllowOpenInvite = true 276 uteam, resp = Client.UpdateTeam(team) 277 CheckNoError(t, resp) 278 279 if !uteam.AllowOpenInvite { 280 t.Fatal("Update failed") 281 } 282 283 team.InviteId = "inviteid1" 284 uteam, resp = Client.UpdateTeam(team) 285 CheckNoError(t, resp) 286 287 if uteam.InviteId != "inviteid1" { 288 t.Fatal("Update failed") 289 } 290 291 team.AllowedDomains = "domain" 292 uteam, resp = Client.UpdateTeam(team) 293 CheckNoError(t, resp) 294 295 if uteam.AllowedDomains != "domain" { 296 t.Fatal("Update failed") 297 } 298 299 team.Name = "Updated name" 300 uteam, resp = Client.UpdateTeam(team) 301 CheckNoError(t, resp) 302 303 if uteam.Name == "Updated name" { 304 t.Fatal("Should not update name") 305 } 306 307 team.Email = "test@domain.com" 308 uteam, resp = Client.UpdateTeam(team) 309 CheckNoError(t, resp) 310 311 if uteam.Email == "test@domain.com" { 312 t.Fatal("Should not update email") 313 } 314 315 team.Type = model.TEAM_INVITE 316 uteam, resp = Client.UpdateTeam(team) 317 CheckNoError(t, resp) 318 319 if uteam.Type == model.TEAM_INVITE { 320 t.Fatal("Should not update type") 321 } 322 323 originalTeamId := team.Id 324 team.Id = model.NewId() 325 326 if r, err := Client.DoApiPut(Client.GetTeamRoute(originalTeamId), team.ToJson()); err != nil { 327 t.Fatal(err) 328 } else { 329 uteam = model.TeamFromJson(r.Body) 330 } 331 332 if uteam.Id != originalTeamId { 333 t.Fatal("wrong team id") 334 } 335 336 team.Id = "fake" 337 _, resp = Client.UpdateTeam(team) 338 CheckBadRequestStatus(t, resp) 339 340 Client.Logout() 341 _, resp = Client.UpdateTeam(team) 342 CheckUnauthorizedStatus(t, resp) 343 344 team.Id = originalTeamId 345 _, resp = th.SystemAdminClient.UpdateTeam(team) 346 CheckNoError(t, resp) 347 } 348 349 func TestUpdateTeamSanitization(t *testing.T) { 350 th := Setup().InitBasic().InitSystemAdmin() 351 defer th.TearDown() 352 353 team, resp := th.Client.CreateTeam(&model.Team{ 354 DisplayName: t.Name() + "_1", 355 Name: GenerateTestTeamName(), 356 Email: th.GenerateTestEmail(), 357 Type: model.TEAM_OPEN, 358 AllowedDomains: "simulator.amazonses.com", 359 }) 360 CheckNoError(t, resp) 361 362 // Non-admin users cannot update the team 363 364 t.Run("team admin", func(t *testing.T) { 365 rteam, resp := th.Client.UpdateTeam(team) 366 CheckNoError(t, resp) 367 if rteam.Email == "" { 368 t.Fatal("should not have sanitized email for admin") 369 } else if rteam.AllowedDomains == "" { 370 t.Fatal("should not have sanitized allowed domains") 371 } 372 }) 373 374 t.Run("system admin", func(t *testing.T) { 375 rteam, resp := th.SystemAdminClient.UpdateTeam(team) 376 CheckNoError(t, resp) 377 if rteam.Email == "" { 378 t.Fatal("should not have sanitized email for admin") 379 } else if rteam.AllowedDomains == "" { 380 t.Fatal("should not have sanitized allowed domains") 381 } 382 }) 383 } 384 385 func TestPatchTeam(t *testing.T) { 386 th := Setup().InitBasic().InitSystemAdmin() 387 defer th.TearDown() 388 Client := th.Client 389 390 team := &model.Team{DisplayName: "Name", Description: "Some description", CompanyName: "Some company name", AllowOpenInvite: false, InviteId: "inviteid0", Name: "z-z-" + model.NewId() + "a", Email: "success+" + model.NewId() + "@simulator.amazonses.com", Type: model.TEAM_OPEN} 391 team, _ = Client.CreateTeam(team) 392 393 patch := &model.TeamPatch{} 394 395 patch.DisplayName = model.NewString("Other name") 396 patch.Description = model.NewString("Other description") 397 patch.CompanyName = model.NewString("Other company name") 398 patch.InviteId = model.NewString("inviteid1") 399 patch.AllowOpenInvite = model.NewBool(true) 400 401 rteam, resp := Client.PatchTeam(team.Id, patch) 402 CheckNoError(t, resp) 403 404 if rteam.DisplayName != "Other name" { 405 t.Fatal("DisplayName did not update properly") 406 } 407 if rteam.Description != "Other description" { 408 t.Fatal("Description did not update properly") 409 } 410 if rteam.CompanyName != "Other company name" { 411 t.Fatal("CompanyName did not update properly") 412 } 413 if rteam.InviteId != "inviteid1" { 414 t.Fatal("InviteId did not update properly") 415 } 416 if !rteam.AllowOpenInvite { 417 t.Fatal("AllowOpenInvite did not update properly") 418 } 419 420 _, resp = Client.PatchTeam("junk", patch) 421 CheckBadRequestStatus(t, resp) 422 423 _, resp = Client.PatchTeam(GenerateTestId(), patch) 424 CheckForbiddenStatus(t, resp) 425 426 if r, err := Client.DoApiPut("/teams/"+team.Id+"/patch", "garbage"); err == nil { 427 t.Fatal("should have errored") 428 } else { 429 if r.StatusCode != http.StatusBadRequest { 430 t.Log("actual: " + strconv.Itoa(r.StatusCode)) 431 t.Log("expected: " + strconv.Itoa(http.StatusBadRequest)) 432 t.Fatal("wrong status code") 433 } 434 } 435 436 Client.Logout() 437 _, resp = Client.PatchTeam(team.Id, patch) 438 CheckUnauthorizedStatus(t, resp) 439 440 th.LoginBasic2() 441 _, resp = Client.PatchTeam(team.Id, patch) 442 CheckForbiddenStatus(t, resp) 443 444 _, resp = th.SystemAdminClient.PatchTeam(team.Id, patch) 445 CheckNoError(t, resp) 446 } 447 448 func TestPatchTeamSanitization(t *testing.T) { 449 th := Setup().InitBasic().InitSystemAdmin() 450 defer th.TearDown() 451 452 team, resp := th.Client.CreateTeam(&model.Team{ 453 DisplayName: t.Name() + "_1", 454 Name: GenerateTestTeamName(), 455 Email: th.GenerateTestEmail(), 456 Type: model.TEAM_OPEN, 457 AllowedDomains: "simulator.amazonses.com", 458 }) 459 CheckNoError(t, resp) 460 461 // Non-admin users cannot update the team 462 463 t.Run("team admin", func(t *testing.T) { 464 rteam, resp := th.Client.PatchTeam(team.Id, &model.TeamPatch{}) 465 CheckNoError(t, resp) 466 if rteam.Email == "" { 467 t.Fatal("should not have sanitized email for admin") 468 } else if rteam.AllowedDomains == "" { 469 t.Fatal("should not have sanitized allowed domains") 470 } 471 }) 472 473 t.Run("system admin", func(t *testing.T) { 474 rteam, resp := th.SystemAdminClient.PatchTeam(team.Id, &model.TeamPatch{}) 475 CheckNoError(t, resp) 476 if rteam.Email == "" { 477 t.Fatal("should not have sanitized email for admin") 478 } else if rteam.AllowedDomains == "" { 479 t.Fatal("should not have sanitized allowed domains") 480 } 481 }) 482 } 483 484 func TestSoftDeleteTeam(t *testing.T) { 485 th := Setup().InitBasic().InitSystemAdmin() 486 defer th.TearDown() 487 Client := th.Client 488 489 team := &model.Team{DisplayName: "DisplayName", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TEAM_OPEN} 490 team, _ = Client.CreateTeam(team) 491 492 ok, resp := Client.SoftDeleteTeam(team.Id) 493 CheckNoError(t, resp) 494 495 if !ok { 496 t.Fatal("should have returned true") 497 } 498 499 rteam, err := th.App.GetTeam(team.Id) 500 if err != nil { 501 t.Fatal("should have returned archived team") 502 } 503 if rteam.DeleteAt == 0 { 504 t.Fatal("should have not set to zero") 505 } 506 507 ok, resp = Client.SoftDeleteTeam("junk") 508 CheckBadRequestStatus(t, resp) 509 510 if ok { 511 t.Fatal("should have returned false") 512 } 513 514 otherTeam := th.BasicTeam 515 _, resp = Client.SoftDeleteTeam(otherTeam.Id) 516 CheckForbiddenStatus(t, resp) 517 518 Client.Logout() 519 _, resp = Client.SoftDeleteTeam(otherTeam.Id) 520 CheckUnauthorizedStatus(t, resp) 521 522 _, resp = th.SystemAdminClient.SoftDeleteTeam(otherTeam.Id) 523 CheckNoError(t, resp) 524 } 525 526 func TestPermanentDeleteTeam(t *testing.T) { 527 th := Setup().InitBasic().InitSystemAdmin() 528 defer th.TearDown() 529 Client := th.Client 530 531 team := &model.Team{DisplayName: "DisplayName", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TEAM_OPEN} 532 team, _ = Client.CreateTeam(team) 533 534 ok, resp := Client.PermanentDeleteTeam(team.Id) 535 CheckNoError(t, resp) 536 537 if !ok { 538 t.Fatal("should have returned true") 539 } 540 541 // The team is deleted in the background, its only soft deleted at this 542 // time 543 rteam, err := th.App.GetTeam(team.Id) 544 if err != nil { 545 t.Fatal("should have returned archived team") 546 } 547 if rteam.DeleteAt == 0 { 548 t.Fatal("should have not set to zero") 549 } 550 551 ok, resp = Client.PermanentDeleteTeam("junk") 552 CheckBadRequestStatus(t, resp) 553 554 if ok { 555 t.Fatal("should have returned false") 556 } 557 } 558 559 func TestGetAllTeams(t *testing.T) { 560 th := Setup().InitBasic().InitSystemAdmin() 561 defer th.TearDown() 562 Client := th.Client 563 564 team := &model.Team{DisplayName: "Name", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TEAM_OPEN, AllowOpenInvite: true} 565 _, resp := Client.CreateTeam(team) 566 CheckNoError(t, resp) 567 568 rrteams, resp := Client.GetAllTeams("", 0, 1) 569 CheckNoError(t, resp) 570 571 if len(rrteams) != 1 { 572 t.Log(len(rrteams)) 573 t.Fatal("wrong number of teams - should be 1") 574 } 575 576 for _, rt := range rrteams { 577 if !rt.AllowOpenInvite { 578 t.Fatal("not all teams are open") 579 } 580 } 581 582 rrteams, resp = Client.GetAllTeams("", 0, 10) 583 CheckNoError(t, resp) 584 585 for _, rt := range rrteams { 586 if !rt.AllowOpenInvite { 587 t.Fatal("not all teams are open") 588 } 589 } 590 591 rrteams1, resp := Client.GetAllTeams("", 1, 0) 592 CheckNoError(t, resp) 593 594 if len(rrteams1) != 0 { 595 t.Fatal("wrong number of teams - should be 0") 596 } 597 598 rrteams2, resp := th.SystemAdminClient.GetAllTeams("", 1, 1) 599 CheckNoError(t, resp) 600 601 if len(rrteams2) != 1 { 602 t.Fatal("wrong number of teams - should be 1") 603 } 604 605 rrteams2, resp = Client.GetAllTeams("", 1, 0) 606 CheckNoError(t, resp) 607 608 if len(rrteams2) != 0 { 609 t.Fatal("wrong number of teams - should be 0") 610 } 611 612 Client.Logout() 613 _, resp = Client.GetAllTeams("", 1, 10) 614 CheckUnauthorizedStatus(t, resp) 615 } 616 617 func TestGetAllTeamsSanitization(t *testing.T) { 618 th := Setup().InitBasic().InitSystemAdmin() 619 defer th.TearDown() 620 621 team, resp := th.Client.CreateTeam(&model.Team{ 622 DisplayName: t.Name() + "_1", 623 Name: GenerateTestTeamName(), 624 Email: th.GenerateTestEmail(), 625 Type: model.TEAM_OPEN, 626 AllowedDomains: "simulator.amazonses.com", 627 AllowOpenInvite: true, 628 }) 629 CheckNoError(t, resp) 630 team2, resp := th.SystemAdminClient.CreateTeam(&model.Team{ 631 DisplayName: t.Name() + "_2", 632 Name: GenerateTestTeamName(), 633 Email: th.GenerateTestEmail(), 634 Type: model.TEAM_OPEN, 635 AllowedDomains: "simulator.amazonses.com", 636 AllowOpenInvite: true, 637 }) 638 CheckNoError(t, resp) 639 640 // This may not work if the server has over 1000 open teams on it 641 642 t.Run("team admin/non-admin", func(t *testing.T) { 643 teamFound := false 644 team2Found := false 645 646 rteams, resp := th.Client.GetAllTeams("", 0, 1000) 647 CheckNoError(t, resp) 648 for _, rteam := range rteams { 649 if rteam.Id == team.Id { 650 teamFound = true 651 if rteam.Email == "" { 652 t.Fatal("should not have sanitized email for team admin") 653 } else if rteam.AllowedDomains == "" { 654 t.Fatal("should not have sanitized allowed domains for team admin") 655 } 656 } else if rteam.Id == team2.Id { 657 team2Found = true 658 if rteam.Email != "" { 659 t.Fatal("should've sanitized email for non-admin") 660 } else if rteam.AllowedDomains != "" { 661 t.Fatal("should've sanitized allowed domains for non-admin") 662 } 663 } 664 } 665 666 if !teamFound || !team2Found { 667 t.Fatal("wasn't returned the expected teams so the test wasn't run correctly") 668 } 669 }) 670 671 t.Run("system admin", func(t *testing.T) { 672 rteams, resp := th.SystemAdminClient.GetAllTeams("", 0, 1000) 673 CheckNoError(t, resp) 674 for _, rteam := range rteams { 675 if rteam.Id != team.Id && rteam.Id != team2.Id { 676 continue 677 } 678 679 if rteam.Email == "" { 680 t.Fatal("should not have sanitized email") 681 } else if rteam.AllowedDomains == "" { 682 t.Fatal("should not have sanitized allowed domains") 683 } 684 } 685 }) 686 } 687 688 func TestGetTeamByName(t *testing.T) { 689 th := Setup().InitBasic().InitSystemAdmin() 690 defer th.TearDown() 691 Client := th.Client 692 team := th.BasicTeam 693 694 rteam, resp := Client.GetTeamByName(team.Name, "") 695 CheckNoError(t, resp) 696 697 if rteam.Name != team.Name { 698 t.Fatal("wrong team") 699 } 700 701 _, resp = Client.GetTeamByName("junk", "") 702 CheckNotFoundStatus(t, resp) 703 704 _, resp = Client.GetTeamByName("", "") 705 CheckNotFoundStatus(t, resp) 706 707 _, resp = th.SystemAdminClient.GetTeamByName(strings.ToUpper(team.Name), "") 708 CheckNoError(t, resp) 709 710 Client.Logout() 711 _, resp = Client.GetTeamByName(team.Name, "") 712 CheckUnauthorizedStatus(t, resp) 713 714 _, resp = th.SystemAdminClient.GetTeamByName(team.Name, "") 715 CheckNoError(t, resp) 716 717 th.LoginTeamAdmin() 718 719 team2 := &model.Team{DisplayName: "Name", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TEAM_OPEN, AllowOpenInvite: false} 720 rteam2, _ := Client.CreateTeam(team2) 721 722 team3 := &model.Team{DisplayName: "Name", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TEAM_INVITE, AllowOpenInvite: true} 723 rteam3, _ := Client.CreateTeam(team3) 724 725 th.LoginBasic() 726 // AllowInviteOpen is false and team is open, and user is not on team 727 _, resp = Client.GetTeamByName(rteam2.Name, "") 728 CheckForbiddenStatus(t, resp) 729 730 // AllowInviteOpen is true and team is invite only, and user is not on team 731 _, resp = Client.GetTeamByName(rteam3.Name, "") 732 CheckForbiddenStatus(t, resp) 733 } 734 735 func TestGetTeamByNameSanitization(t *testing.T) { 736 th := Setup().InitBasic().InitSystemAdmin() 737 defer th.TearDown() 738 739 team, resp := th.Client.CreateTeam(&model.Team{ 740 DisplayName: t.Name() + "_1", 741 Name: GenerateTestTeamName(), 742 Email: th.GenerateTestEmail(), 743 Type: model.TEAM_OPEN, 744 AllowedDomains: "simulator.amazonses.com", 745 }) 746 CheckNoError(t, resp) 747 748 t.Run("team user", func(t *testing.T) { 749 th.LinkUserToTeam(th.BasicUser2, team) 750 751 client := th.CreateClient() 752 th.LoginBasic2WithClient(client) 753 754 rteam, resp := client.GetTeamByName(team.Name, "") 755 CheckNoError(t, resp) 756 if rteam.Email != "" { 757 t.Fatal("should've sanitized email") 758 } else if rteam.AllowedDomains != "" { 759 t.Fatal("should've sanitized allowed domains") 760 } 761 }) 762 763 t.Run("team admin/non-admin", func(t *testing.T) { 764 rteam, resp := th.Client.GetTeamByName(team.Name, "") 765 CheckNoError(t, resp) 766 if rteam.Email == "" { 767 t.Fatal("should not have sanitized email") 768 } else if rteam.AllowedDomains == "" { 769 t.Fatal("should not have sanitized allowed domains") 770 } 771 }) 772 773 t.Run("system admin", func(t *testing.T) { 774 rteam, resp := th.SystemAdminClient.GetTeamByName(team.Name, "") 775 CheckNoError(t, resp) 776 if rteam.Email == "" { 777 t.Fatal("should not have sanitized email") 778 } else if rteam.AllowedDomains == "" { 779 t.Fatal("should not have sanitized allowed domains") 780 } 781 }) 782 } 783 784 func TestSearchAllTeams(t *testing.T) { 785 th := Setup().InitBasic().InitSystemAdmin() 786 defer th.TearDown() 787 Client := th.Client 788 oTeam := th.BasicTeam 789 oTeam.AllowOpenInvite = true 790 791 if updatedTeam, err := th.App.UpdateTeam(oTeam); err != nil { 792 t.Fatal(err) 793 } else { 794 oTeam.UpdateAt = updatedTeam.UpdateAt 795 } 796 797 pTeam := &model.Team{DisplayName: "PName", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TEAM_INVITE} 798 Client.CreateTeam(pTeam) 799 800 rteams, resp := Client.SearchTeams(&model.TeamSearch{Term: oTeam.Name}) 801 CheckNoError(t, resp) 802 803 if len(rteams) != 1 { 804 t.Fatal("should have returned 1 team") 805 } 806 807 if oTeam.Id != rteams[0].Id { 808 t.Fatal("invalid team") 809 } 810 811 rteams, resp = Client.SearchTeams(&model.TeamSearch{Term: oTeam.DisplayName}) 812 CheckNoError(t, resp) 813 814 if len(rteams) != 1 { 815 t.Fatal("should have returned 1 team") 816 } 817 818 if rteams[0].Id != oTeam.Id { 819 t.Fatal("invalid team") 820 } 821 822 rteams, resp = Client.SearchTeams(&model.TeamSearch{Term: pTeam.Name}) 823 CheckNoError(t, resp) 824 825 if len(rteams) != 0 { 826 t.Fatal("should have not returned team") 827 } 828 829 rteams, resp = Client.SearchTeams(&model.TeamSearch{Term: pTeam.DisplayName}) 830 CheckNoError(t, resp) 831 832 if len(rteams) != 0 { 833 t.Fatal("should have not returned team") 834 } 835 836 rteams, resp = th.SystemAdminClient.SearchTeams(&model.TeamSearch{Term: oTeam.Name}) 837 CheckNoError(t, resp) 838 839 if len(rteams) != 1 { 840 t.Fatal("should have returned 1 team") 841 } 842 843 rteams, resp = th.SystemAdminClient.SearchTeams(&model.TeamSearch{Term: pTeam.DisplayName}) 844 CheckNoError(t, resp) 845 846 if len(rteams) != 1 { 847 t.Fatal("should have returned 1 team") 848 } 849 850 rteams, resp = Client.SearchTeams(&model.TeamSearch{Term: "junk"}) 851 CheckNoError(t, resp) 852 853 if len(rteams) != 0 { 854 t.Fatal("should have not returned team") 855 } 856 857 Client.Logout() 858 859 rteams, resp = Client.SearchTeams(&model.TeamSearch{Term: pTeam.Name}) 860 CheckUnauthorizedStatus(t, resp) 861 862 rteams, resp = Client.SearchTeams(&model.TeamSearch{Term: pTeam.DisplayName}) 863 CheckUnauthorizedStatus(t, resp) 864 } 865 866 func TestSearchAllTeamsSanitization(t *testing.T) { 867 th := Setup().InitBasic().InitSystemAdmin() 868 defer th.TearDown() 869 870 team, resp := th.Client.CreateTeam(&model.Team{ 871 DisplayName: t.Name() + "_1", 872 Name: GenerateTestTeamName(), 873 Email: th.GenerateTestEmail(), 874 Type: model.TEAM_OPEN, 875 AllowedDomains: "simulator.amazonses.com", 876 }) 877 CheckNoError(t, resp) 878 team2, resp := th.Client.CreateTeam(&model.Team{ 879 DisplayName: t.Name() + "_2", 880 Name: GenerateTestTeamName(), 881 Email: th.GenerateTestEmail(), 882 Type: model.TEAM_OPEN, 883 AllowedDomains: "simulator.amazonses.com", 884 }) 885 CheckNoError(t, resp) 886 887 t.Run("non-team user", func(t *testing.T) { 888 client := th.CreateClient() 889 th.LoginBasic2WithClient(client) 890 891 rteams, resp := client.SearchTeams(&model.TeamSearch{Term: t.Name()}) 892 CheckNoError(t, resp) 893 for _, rteam := range rteams { 894 if rteam.Email != "" { 895 t.Fatal("should've sanitized email") 896 } else if rteam.AllowedDomains != "" { 897 t.Fatal("should've sanitized allowed domains") 898 } 899 } 900 }) 901 902 t.Run("team user", func(t *testing.T) { 903 th.LinkUserToTeam(th.BasicUser2, team) 904 905 client := th.CreateClient() 906 th.LoginBasic2WithClient(client) 907 908 rteams, resp := client.SearchTeams(&model.TeamSearch{Term: t.Name()}) 909 CheckNoError(t, resp) 910 for _, rteam := range rteams { 911 if rteam.Email != "" { 912 t.Fatal("should've sanitized email") 913 } else if rteam.AllowedDomains != "" { 914 t.Fatal("should've sanitized allowed domains") 915 } 916 } 917 }) 918 919 t.Run("team admin", func(t *testing.T) { 920 rteams, resp := th.Client.SearchTeams(&model.TeamSearch{Term: t.Name()}) 921 CheckNoError(t, resp) 922 for _, rteam := range rteams { 923 if rteam.Id == team.Id || rteam.Id == team2.Id || rteam.Id == th.BasicTeam.Id { 924 if rteam.Email == "" { 925 t.Fatal("should not have sanitized email") 926 } else if rteam.AllowedDomains == "" { 927 t.Fatal("should not have sanitized allowed domains") 928 } 929 } 930 } 931 }) 932 933 t.Run("system admin", func(t *testing.T) { 934 rteams, resp := th.SystemAdminClient.SearchTeams(&model.TeamSearch{Term: t.Name()}) 935 CheckNoError(t, resp) 936 for _, rteam := range rteams { 937 if rteam.Email == "" { 938 t.Fatal("should not have sanitized email") 939 } else if rteam.AllowedDomains == "" { 940 t.Fatal("should not have sanitized allowed domains") 941 } 942 } 943 }) 944 } 945 946 func TestGetTeamsForUser(t *testing.T) { 947 th := Setup().InitBasic().InitSystemAdmin() 948 defer th.TearDown() 949 Client := th.Client 950 951 team2 := &model.Team{DisplayName: "Name", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TEAM_INVITE} 952 rteam2, _ := Client.CreateTeam(team2) 953 954 teams, resp := Client.GetTeamsForUser(th.BasicUser.Id, "") 955 CheckNoError(t, resp) 956 957 if len(teams) != 2 { 958 t.Fatal("wrong number of teams") 959 } 960 961 found1 := false 962 found2 := false 963 for _, t := range teams { 964 if t.Id == th.BasicTeam.Id { 965 found1 = true 966 } else if t.Id == rteam2.Id { 967 found2 = true 968 } 969 } 970 971 if !found1 || !found2 { 972 t.Fatal("missing team") 973 } 974 975 _, resp = Client.GetTeamsForUser("junk", "") 976 CheckBadRequestStatus(t, resp) 977 978 _, resp = Client.GetTeamsForUser(model.NewId(), "") 979 CheckForbiddenStatus(t, resp) 980 981 _, resp = Client.GetTeamsForUser(th.BasicUser2.Id, "") 982 CheckForbiddenStatus(t, resp) 983 984 _, resp = th.SystemAdminClient.GetTeamsForUser(th.BasicUser2.Id, "") 985 CheckNoError(t, resp) 986 } 987 988 func TestGetTeamsForUserSanitization(t *testing.T) { 989 th := Setup().InitBasic().InitSystemAdmin() 990 defer th.TearDown() 991 992 team, resp := th.Client.CreateTeam(&model.Team{ 993 DisplayName: t.Name() + "_1", 994 Name: GenerateTestTeamName(), 995 Email: th.GenerateTestEmail(), 996 Type: model.TEAM_OPEN, 997 AllowedDomains: "simulator.amazonses.com", 998 }) 999 CheckNoError(t, resp) 1000 team2, resp := th.Client.CreateTeam(&model.Team{ 1001 DisplayName: t.Name() + "_2", 1002 Name: GenerateTestTeamName(), 1003 Email: th.GenerateTestEmail(), 1004 Type: model.TEAM_OPEN, 1005 AllowedDomains: "simulator.amazonses.com", 1006 }) 1007 CheckNoError(t, resp) 1008 1009 t.Run("team user", func(t *testing.T) { 1010 th.LinkUserToTeam(th.BasicUser2, team) 1011 th.LinkUserToTeam(th.BasicUser2, team2) 1012 1013 client := th.CreateClient() 1014 th.LoginBasic2WithClient(client) 1015 1016 rteams, resp := client.GetTeamsForUser(th.BasicUser2.Id, "") 1017 CheckNoError(t, resp) 1018 for _, rteam := range rteams { 1019 if rteam.Id != team.Id && rteam.Id != team2.Id { 1020 continue 1021 } 1022 1023 if rteam.Email != "" { 1024 t.Fatal("should've sanitized email") 1025 } else if rteam.AllowedDomains != "" { 1026 t.Fatal("should've sanitized allowed domains") 1027 } 1028 } 1029 }) 1030 1031 t.Run("team admin", func(t *testing.T) { 1032 rteams, resp := th.Client.GetTeamsForUser(th.BasicUser.Id, "") 1033 CheckNoError(t, resp) 1034 for _, rteam := range rteams { 1035 if rteam.Id != team.Id && rteam.Id != team2.Id { 1036 continue 1037 } 1038 1039 if rteam.Email == "" { 1040 t.Fatal("should not have sanitized email") 1041 } else if rteam.AllowedDomains == "" { 1042 t.Fatal("should not have sanitized allowed domains") 1043 } 1044 } 1045 }) 1046 1047 t.Run("system admin", func(t *testing.T) { 1048 rteams, resp := th.SystemAdminClient.GetTeamsForUser(th.BasicUser.Id, "") 1049 CheckNoError(t, resp) 1050 for _, rteam := range rteams { 1051 if rteam.Id != team.Id && rteam.Id != team2.Id { 1052 continue 1053 } 1054 1055 if rteam.Email == "" { 1056 t.Fatal("should not have sanitized email") 1057 } else if rteam.AllowedDomains == "" { 1058 t.Fatal("should not have sanitized allowed domains") 1059 } 1060 } 1061 }) 1062 } 1063 1064 func TestGetTeamMember(t *testing.T) { 1065 th := Setup().InitBasic().InitSystemAdmin() 1066 defer th.TearDown() 1067 Client := th.Client 1068 team := th.BasicTeam 1069 user := th.BasicUser 1070 1071 rmember, resp := Client.GetTeamMember(team.Id, user.Id, "") 1072 CheckNoError(t, resp) 1073 1074 if rmember.TeamId != team.Id { 1075 t.Fatal("wrong team id") 1076 } 1077 1078 if rmember.UserId != user.Id { 1079 t.Fatal("wrong team id") 1080 } 1081 1082 _, resp = Client.GetTeamMember("junk", user.Id, "") 1083 CheckBadRequestStatus(t, resp) 1084 1085 _, resp = Client.GetTeamMember(team.Id, "junk", "") 1086 CheckBadRequestStatus(t, resp) 1087 1088 _, resp = Client.GetTeamMember("junk", "junk", "") 1089 CheckBadRequestStatus(t, resp) 1090 1091 _, resp = Client.GetTeamMember(team.Id, model.NewId(), "") 1092 CheckNotFoundStatus(t, resp) 1093 1094 _, resp = Client.GetTeamMember(model.NewId(), user.Id, "") 1095 CheckForbiddenStatus(t, resp) 1096 1097 _, resp = th.SystemAdminClient.GetTeamMember(team.Id, user.Id, "") 1098 CheckNoError(t, resp) 1099 } 1100 1101 func TestGetTeamMembers(t *testing.T) { 1102 th := Setup().InitBasic().InitSystemAdmin() 1103 defer th.TearDown() 1104 Client := th.Client 1105 team := th.BasicTeam 1106 userNotMember := th.CreateUser() 1107 1108 rmembers, resp := Client.GetTeamMembers(team.Id, 0, 100, "") 1109 CheckNoError(t, resp) 1110 1111 t.Logf("rmembers count %v\n", len(rmembers)) 1112 1113 if len(rmembers) == 0 { 1114 t.Fatal("should have results") 1115 } 1116 1117 for _, rmember := range rmembers { 1118 if rmember.TeamId != team.Id || rmember.UserId == userNotMember.Id { 1119 t.Fatal("user should be a member of team") 1120 } 1121 } 1122 1123 rmembers, resp = Client.GetTeamMembers(team.Id, 0, 1, "") 1124 CheckNoError(t, resp) 1125 if len(rmembers) != 1 { 1126 t.Fatal("should be 1 per page") 1127 } 1128 1129 rmembers, resp = Client.GetTeamMembers(team.Id, 1, 1, "") 1130 CheckNoError(t, resp) 1131 if len(rmembers) != 1 { 1132 t.Fatal("should be 1 per page") 1133 } 1134 1135 rmembers, resp = Client.GetTeamMembers(team.Id, 10000, 100, "") 1136 CheckNoError(t, resp) 1137 if len(rmembers) != 0 { 1138 t.Fatal("should be no member") 1139 } 1140 1141 _, resp = Client.GetTeamMembers("junk", 0, 100, "") 1142 CheckBadRequestStatus(t, resp) 1143 1144 _, resp = Client.GetTeamMembers(model.NewId(), 0, 100, "") 1145 CheckForbiddenStatus(t, resp) 1146 1147 Client.Logout() 1148 rmembers, resp = Client.GetTeamMembers(team.Id, 0, 1, "") 1149 CheckUnauthorizedStatus(t, resp) 1150 1151 rmembers, resp = th.SystemAdminClient.GetTeamMembers(team.Id, 0, 100, "") 1152 CheckNoError(t, resp) 1153 } 1154 1155 func TestGetTeamMembersForUser(t *testing.T) { 1156 th := Setup().InitBasic().InitSystemAdmin() 1157 defer th.TearDown() 1158 Client := th.Client 1159 1160 members, resp := Client.GetTeamMembersForUser(th.BasicUser.Id, "") 1161 CheckNoError(t, resp) 1162 1163 found := false 1164 for _, m := range members { 1165 if m.TeamId == th.BasicTeam.Id { 1166 found = true 1167 } 1168 } 1169 1170 if !found { 1171 t.Fatal("missing team member") 1172 } 1173 1174 _, resp = Client.GetTeamMembersForUser("junk", "") 1175 CheckBadRequestStatus(t, resp) 1176 1177 _, resp = Client.GetTeamMembersForUser(model.NewId(), "") 1178 CheckForbiddenStatus(t, resp) 1179 1180 Client.Logout() 1181 _, resp = Client.GetTeamMembersForUser(th.BasicUser.Id, "") 1182 CheckUnauthorizedStatus(t, resp) 1183 1184 user := th.CreateUser() 1185 Client.Login(user.Email, user.Password) 1186 _, resp = Client.GetTeamMembersForUser(th.BasicUser.Id, "") 1187 CheckForbiddenStatus(t, resp) 1188 1189 _, resp = th.SystemAdminClient.GetTeamMembersForUser(th.BasicUser.Id, "") 1190 CheckNoError(t, resp) 1191 } 1192 1193 func TestGetTeamMembersByIds(t *testing.T) { 1194 th := Setup().InitBasic() 1195 defer th.TearDown() 1196 Client := th.Client 1197 1198 tm, resp := Client.GetTeamMembersByIds(th.BasicTeam.Id, []string{th.BasicUser.Id}) 1199 CheckNoError(t, resp) 1200 1201 if tm[0].UserId != th.BasicUser.Id { 1202 t.Fatal("returned wrong user") 1203 } 1204 1205 _, resp = Client.GetTeamMembersByIds(th.BasicTeam.Id, []string{}) 1206 CheckBadRequestStatus(t, resp) 1207 1208 tm1, resp := Client.GetTeamMembersByIds(th.BasicTeam.Id, []string{"junk"}) 1209 CheckNoError(t, resp) 1210 if len(tm1) > 0 { 1211 t.Fatal("no users should be returned") 1212 } 1213 1214 tm1, resp = Client.GetTeamMembersByIds(th.BasicTeam.Id, []string{"junk", th.BasicUser.Id}) 1215 CheckNoError(t, resp) 1216 if len(tm1) != 1 { 1217 t.Fatal("1 user should be returned") 1218 } 1219 1220 tm1, resp = Client.GetTeamMembersByIds("junk", []string{th.BasicUser.Id}) 1221 CheckBadRequestStatus(t, resp) 1222 1223 tm1, resp = Client.GetTeamMembersByIds(model.NewId(), []string{th.BasicUser.Id}) 1224 CheckForbiddenStatus(t, resp) 1225 1226 Client.Logout() 1227 _, resp = Client.GetTeamMembersByIds(th.BasicTeam.Id, []string{th.BasicUser.Id}) 1228 CheckUnauthorizedStatus(t, resp) 1229 } 1230 1231 func TestAddTeamMember(t *testing.T) { 1232 th := Setup().InitBasic().InitSystemAdmin() 1233 defer th.TearDown() 1234 Client := th.Client 1235 team := th.BasicTeam 1236 otherUser := th.CreateUser() 1237 1238 if err := th.App.RemoveUserFromTeam(th.BasicTeam.Id, th.BasicUser2.Id, ""); err != nil { 1239 t.Fatalf(err.Error()) 1240 } 1241 1242 // Regular user can't add a member to a team they don't belong to. 1243 th.LoginBasic2() 1244 tm, resp := Client.AddTeamMember(team.Id, otherUser.Id) 1245 CheckForbiddenStatus(t, resp) 1246 if resp.Error == nil { 1247 t.Fatalf("Error is nil") 1248 } 1249 Client.Logout() 1250 1251 // Regular user can add a member to a team they belong to. 1252 th.LoginBasic() 1253 tm, resp = Client.AddTeamMember(team.Id, otherUser.Id) 1254 CheckNoError(t, resp) 1255 CheckCreatedStatus(t, resp) 1256 1257 // Check all the returned data. 1258 if tm == nil { 1259 t.Fatal("should have returned team member") 1260 } 1261 1262 if tm.UserId != otherUser.Id { 1263 t.Fatal("user ids should have matched") 1264 } 1265 1266 if tm.TeamId != team.Id { 1267 t.Fatal("team ids should have matched") 1268 } 1269 1270 // Check with various invalid requests. 1271 tm, resp = Client.AddTeamMember(team.Id, "junk") 1272 CheckBadRequestStatus(t, resp) 1273 1274 if tm != nil { 1275 t.Fatal("should have not returned team member") 1276 } 1277 1278 _, resp = Client.AddTeamMember("junk", otherUser.Id) 1279 CheckBadRequestStatus(t, resp) 1280 1281 _, resp = Client.AddTeamMember(GenerateTestId(), otherUser.Id) 1282 CheckForbiddenStatus(t, resp) 1283 1284 _, resp = Client.AddTeamMember(team.Id, GenerateTestId()) 1285 CheckNotFoundStatus(t, resp) 1286 1287 Client.Logout() 1288 1289 // Set the config so that only team admins can add a user to a team. 1290 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.RestrictTeamInvite = model.PERMISSIONS_TEAM_ADMIN }) 1291 th.LoginBasic() 1292 1293 // Test without the EE license to see that the permission restriction is ignored. 1294 _, resp = Client.AddTeamMember(team.Id, otherUser.Id) 1295 CheckNoError(t, resp) 1296 1297 // Add an EE license. 1298 th.App.SetLicense(model.NewTestLicense()) 1299 th.LoginBasic() 1300 1301 // Check that a regular user can't add someone to the team. 1302 _, resp = Client.AddTeamMember(team.Id, otherUser.Id) 1303 CheckForbiddenStatus(t, resp) 1304 1305 // Update user to team admin 1306 th.UpdateUserToTeamAdmin(th.BasicUser, th.BasicTeam) 1307 th.App.InvalidateAllCaches() 1308 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.RestrictTeamInvite = model.PERMISSIONS_TEAM_ADMIN }) 1309 th.App.SetLicense(model.NewTestLicense()) 1310 th.LoginBasic() 1311 1312 // Should work as a team admin. 1313 _, resp = Client.AddTeamMember(team.Id, otherUser.Id) 1314 CheckNoError(t, resp) 1315 1316 // Change permission level to System Admin 1317 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.RestrictTeamInvite = model.PERMISSIONS_SYSTEM_ADMIN }) 1318 1319 // Should not work as team admin. 1320 _, resp = Client.AddTeamMember(team.Id, otherUser.Id) 1321 CheckForbiddenStatus(t, resp) 1322 1323 // Should work as system admin. 1324 _, resp = th.SystemAdminClient.AddTeamMember(team.Id, otherUser.Id) 1325 CheckNoError(t, resp) 1326 1327 // Change permission level to All 1328 th.UpdateUserToNonTeamAdmin(th.BasicUser, th.BasicTeam) 1329 th.App.InvalidateAllCaches() 1330 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.RestrictTeamInvite = model.PERMISSIONS_ALL }) 1331 th.App.SetLicense(model.NewTestLicense()) 1332 th.LoginBasic() 1333 1334 // Should work as a regular user. 1335 _, resp = Client.AddTeamMember(team.Id, otherUser.Id) 1336 CheckNoError(t, resp) 1337 1338 th.LoginBasic() 1339 1340 // by hash and data 1341 Client.Login(otherUser.Email, otherUser.Password) 1342 1343 dataObject := make(map[string]string) 1344 dataObject["time"] = fmt.Sprintf("%v", model.GetMillis()) 1345 dataObject["id"] = team.Id 1346 1347 data := model.MapToJson(dataObject) 1348 hashed := utils.HashSha256(fmt.Sprintf("%v:%v", data, th.App.Config().EmailSettings.InviteSalt)) 1349 1350 tm, resp = Client.AddTeamMemberFromInvite(hashed, data, "") 1351 CheckNoError(t, resp) 1352 1353 if tm == nil { 1354 t.Fatal("should have returned team member") 1355 } 1356 1357 if tm.UserId != otherUser.Id { 1358 t.Fatal("user ids should have matched") 1359 } 1360 1361 if tm.TeamId != team.Id { 1362 t.Fatal("team ids should have matched") 1363 } 1364 1365 tm, resp = Client.AddTeamMemberFromInvite("junk", data, "") 1366 CheckBadRequestStatus(t, resp) 1367 1368 if tm != nil { 1369 t.Fatal("should have not returned team member") 1370 } 1371 1372 _, resp = Client.AddTeamMemberFromInvite(hashed, "junk", "") 1373 CheckBadRequestStatus(t, resp) 1374 1375 // expired data of more than 50 hours 1376 dataObject["time"] = fmt.Sprintf("%v", model.GetMillis()-1000*60*60*50) 1377 data = model.MapToJson(dataObject) 1378 hashed = utils.HashSha256(fmt.Sprintf("%v:%v", data, th.App.Config().EmailSettings.InviteSalt)) 1379 1380 tm, resp = Client.AddTeamMemberFromInvite(hashed, data, "") 1381 CheckBadRequestStatus(t, resp) 1382 1383 // invalid team id 1384 dataObject["id"] = GenerateTestId() 1385 data = model.MapToJson(dataObject) 1386 hashed = utils.HashSha256(fmt.Sprintf("%v:%v", data, th.App.Config().EmailSettings.InviteSalt)) 1387 1388 tm, resp = Client.AddTeamMemberFromInvite(hashed, data, "") 1389 CheckBadRequestStatus(t, resp) 1390 1391 // by invite_id 1392 Client.Login(otherUser.Email, otherUser.Password) 1393 1394 tm, resp = Client.AddTeamMemberFromInvite("", "", team.InviteId) 1395 CheckNoError(t, resp) 1396 1397 if tm == nil { 1398 t.Fatal("should have returned team member") 1399 } 1400 1401 if tm.UserId != otherUser.Id { 1402 t.Fatal("user ids should have matched") 1403 } 1404 1405 if tm.TeamId != team.Id { 1406 t.Fatal("team ids should have matched") 1407 } 1408 1409 tm, resp = Client.AddTeamMemberFromInvite("", "", "junk") 1410 CheckNotFoundStatus(t, resp) 1411 1412 if tm != nil { 1413 t.Fatal("should have not returned team member") 1414 } 1415 } 1416 1417 func TestAddTeamMembers(t *testing.T) { 1418 th := Setup().InitBasic().InitSystemAdmin() 1419 defer th.TearDown() 1420 Client := th.Client 1421 team := th.BasicTeam 1422 otherUser := th.CreateUser() 1423 userList := []string{ 1424 otherUser.Id, 1425 } 1426 1427 if err := th.App.RemoveUserFromTeam(th.BasicTeam.Id, th.BasicUser2.Id, ""); err != nil { 1428 t.Fatalf(err.Error()) 1429 } 1430 1431 // Regular user can't add a member to a team they don't belong to. 1432 th.LoginBasic2() 1433 tm, resp := Client.AddTeamMembers(team.Id, userList) 1434 CheckForbiddenStatus(t, resp) 1435 Client.Logout() 1436 1437 // Regular user can add a member to a team they belong to. 1438 th.LoginBasic() 1439 tm, resp = Client.AddTeamMembers(team.Id, userList) 1440 CheckNoError(t, resp) 1441 CheckCreatedStatus(t, resp) 1442 1443 // Check all the returned data. 1444 if tm[0] == nil { 1445 t.Fatal("should have returned team member") 1446 } 1447 1448 if tm[0].UserId != otherUser.Id { 1449 t.Fatal("user ids should have matched") 1450 } 1451 1452 if tm[0].TeamId != team.Id { 1453 t.Fatal("team ids should have matched") 1454 } 1455 1456 // Check with various invalid requests. 1457 _, resp = Client.AddTeamMembers("junk", userList) 1458 CheckBadRequestStatus(t, resp) 1459 1460 _, resp = Client.AddTeamMembers(GenerateTestId(), userList) 1461 CheckForbiddenStatus(t, resp) 1462 1463 testUserList := append(userList, GenerateTestId()) 1464 _, resp = Client.AddTeamMembers(team.Id, testUserList) 1465 CheckNotFoundStatus(t, resp) 1466 1467 // Test with many users. 1468 for i := 0; i < 25; i++ { 1469 testUserList = append(testUserList, GenerateTestId()) 1470 } 1471 _, resp = Client.AddTeamMembers(team.Id, testUserList) 1472 CheckBadRequestStatus(t, resp) 1473 1474 Client.Logout() 1475 1476 // Set the config so that only team admins can add a user to a team. 1477 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.RestrictTeamInvite = model.PERMISSIONS_TEAM_ADMIN }) 1478 th.LoginBasic() 1479 1480 // Test without the EE license to see that the permission restriction is ignored. 1481 _, resp = Client.AddTeamMembers(team.Id, userList) 1482 CheckNoError(t, resp) 1483 1484 // Add an EE license. 1485 th.App.SetLicense(model.NewTestLicense()) 1486 th.LoginBasic() 1487 1488 // Check that a regular user can't add someone to the team. 1489 _, resp = Client.AddTeamMembers(team.Id, userList) 1490 CheckForbiddenStatus(t, resp) 1491 1492 // Update user to team admin 1493 th.UpdateUserToTeamAdmin(th.BasicUser, th.BasicTeam) 1494 th.App.InvalidateAllCaches() 1495 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.RestrictTeamInvite = model.PERMISSIONS_TEAM_ADMIN }) 1496 th.App.SetLicense(model.NewTestLicense()) 1497 th.LoginBasic() 1498 1499 // Should work as a team admin. 1500 _, resp = Client.AddTeamMembers(team.Id, userList) 1501 CheckNoError(t, resp) 1502 1503 // Change permission level to System Admin 1504 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.RestrictTeamInvite = model.PERMISSIONS_SYSTEM_ADMIN }) 1505 1506 // Should not work as team admin. 1507 _, resp = Client.AddTeamMembers(team.Id, userList) 1508 CheckForbiddenStatus(t, resp) 1509 1510 // Should work as system admin. 1511 _, resp = th.SystemAdminClient.AddTeamMembers(team.Id, userList) 1512 CheckNoError(t, resp) 1513 1514 // Change permission level to All 1515 th.UpdateUserToNonTeamAdmin(th.BasicUser, th.BasicTeam) 1516 th.App.InvalidateAllCaches() 1517 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.RestrictTeamInvite = model.PERMISSIONS_ALL }) 1518 th.App.SetLicense(model.NewTestLicense()) 1519 th.LoginBasic() 1520 1521 // Should work as a regular user. 1522 _, resp = Client.AddTeamMembers(team.Id, userList) 1523 CheckNoError(t, resp) 1524 } 1525 1526 func TestRemoveTeamMember(t *testing.T) { 1527 th := Setup().InitBasic().InitSystemAdmin() 1528 defer th.TearDown() 1529 Client := th.Client 1530 1531 pass, resp := Client.RemoveTeamMember(th.BasicTeam.Id, th.BasicUser.Id) 1532 CheckNoError(t, resp) 1533 1534 if !pass { 1535 t.Fatal("should have passed") 1536 } 1537 1538 _, resp = th.SystemAdminClient.AddTeamMember(th.BasicTeam.Id, th.BasicUser.Id) 1539 CheckNoError(t, resp) 1540 1541 _, resp = Client.RemoveTeamMember(th.BasicTeam.Id, "junk") 1542 CheckBadRequestStatus(t, resp) 1543 1544 _, resp = Client.RemoveTeamMember("junk", th.BasicUser2.Id) 1545 CheckBadRequestStatus(t, resp) 1546 1547 _, resp = Client.RemoveTeamMember(th.BasicTeam.Id, th.BasicUser2.Id) 1548 CheckForbiddenStatus(t, resp) 1549 1550 _, resp = Client.RemoveTeamMember(model.NewId(), th.BasicUser.Id) 1551 CheckNotFoundStatus(t, resp) 1552 1553 _, resp = th.SystemAdminClient.RemoveTeamMember(th.BasicTeam.Id, th.BasicUser.Id) 1554 CheckNoError(t, resp) 1555 } 1556 1557 func TestGetTeamStats(t *testing.T) { 1558 th := Setup().InitBasic().InitSystemAdmin() 1559 defer th.TearDown() 1560 Client := th.Client 1561 team := th.BasicTeam 1562 1563 rstats, resp := Client.GetTeamStats(team.Id, "") 1564 CheckNoError(t, resp) 1565 1566 if rstats.TeamId != team.Id { 1567 t.Fatal("wrong team id") 1568 } 1569 1570 if rstats.TotalMemberCount != 3 { 1571 t.Fatal("wrong count") 1572 } 1573 1574 if rstats.ActiveMemberCount != 3 { 1575 t.Fatal("wrong count") 1576 } 1577 1578 _, resp = Client.GetTeamStats("junk", "") 1579 CheckBadRequestStatus(t, resp) 1580 1581 _, resp = Client.GetTeamStats(model.NewId(), "") 1582 CheckForbiddenStatus(t, resp) 1583 1584 _, resp = th.SystemAdminClient.GetTeamStats(team.Id, "") 1585 CheckNoError(t, resp) 1586 1587 // deactivate BasicUser2 1588 th.UpdateActiveUser(th.BasicUser2, false) 1589 1590 rstats, resp = th.SystemAdminClient.GetTeamStats(team.Id, "") 1591 CheckNoError(t, resp) 1592 1593 if rstats.TotalMemberCount != 3 { 1594 t.Fatal("wrong count") 1595 } 1596 1597 if rstats.ActiveMemberCount != 2 { 1598 t.Fatal("wrong count") 1599 } 1600 1601 // login with different user and test if forbidden 1602 user := th.CreateUser() 1603 Client.Login(user.Email, user.Password) 1604 _, resp = Client.GetTeamStats(th.BasicTeam.Id, "") 1605 CheckForbiddenStatus(t, resp) 1606 1607 Client.Logout() 1608 _, resp = Client.GetTeamStats(th.BasicTeam.Id, "") 1609 CheckUnauthorizedStatus(t, resp) 1610 } 1611 1612 func TestUpdateTeamMemberRoles(t *testing.T) { 1613 th := Setup().InitBasic().InitSystemAdmin() 1614 defer th.TearDown() 1615 Client := th.Client 1616 SystemAdminClient := th.SystemAdminClient 1617 1618 const TEAM_MEMBER = "team_user" 1619 const TEAM_ADMIN = "team_user team_admin" 1620 1621 // user 1 tries to promote user 2 1622 ok, resp := Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser2.Id, TEAM_ADMIN) 1623 CheckForbiddenStatus(t, resp) 1624 if ok { 1625 t.Fatal("should have returned false") 1626 } 1627 1628 // user 1 tries to promote himself 1629 _, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser.Id, TEAM_ADMIN) 1630 CheckForbiddenStatus(t, resp) 1631 1632 // user 1 tries to demote someone 1633 _, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.SystemAdminUser.Id, TEAM_MEMBER) 1634 CheckForbiddenStatus(t, resp) 1635 1636 // system admin promotes user 1 1637 ok, resp = SystemAdminClient.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser.Id, TEAM_ADMIN) 1638 CheckNoError(t, resp) 1639 if !ok { 1640 t.Fatal("should have returned true") 1641 } 1642 1643 // user 1 (team admin) promotes user 2 1644 _, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser2.Id, TEAM_ADMIN) 1645 CheckNoError(t, resp) 1646 1647 // user 1 (team admin) demotes user 2 (team admin) 1648 _, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser2.Id, TEAM_MEMBER) 1649 CheckNoError(t, resp) 1650 1651 // user 1 (team admin) tries to demote system admin (not member of a team) 1652 _, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.SystemAdminUser.Id, TEAM_MEMBER) 1653 CheckBadRequestStatus(t, resp) 1654 1655 // user 1 (team admin) demotes system admin (member of a team) 1656 th.LinkUserToTeam(th.SystemAdminUser, th.BasicTeam) 1657 _, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.SystemAdminUser.Id, TEAM_MEMBER) 1658 CheckNoError(t, resp) 1659 // Note from API v3 1660 // Note to anyone who thinks this (above) test is wrong: 1661 // This operation will not affect the system admin's permissions because they have global access to all teams. 1662 // Their team level permissions are irrelavent. A team admin should be able to manage team level permissions. 1663 1664 // System admins should be able to manipulate permission no matter what their team level permissions are. 1665 // system admin promotes user 2 1666 _, resp = SystemAdminClient.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser2.Id, TEAM_ADMIN) 1667 CheckNoError(t, resp) 1668 1669 // system admin demotes user 2 (team admin) 1670 _, resp = SystemAdminClient.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser2.Id, TEAM_MEMBER) 1671 CheckNoError(t, resp) 1672 1673 // user 1 (team admin) tries to promote himself to a random team 1674 _, resp = Client.UpdateTeamMemberRoles(model.NewId(), th.BasicUser.Id, TEAM_ADMIN) 1675 CheckForbiddenStatus(t, resp) 1676 1677 // user 1 (team admin) tries to promote a random user 1678 _, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, model.NewId(), TEAM_ADMIN) 1679 CheckBadRequestStatus(t, resp) 1680 1681 // user 1 (team admin) tries to promote invalid team permission 1682 _, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser.Id, "junk") 1683 CheckBadRequestStatus(t, resp) 1684 1685 // user 1 (team admin) demotes himself 1686 _, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser.Id, TEAM_MEMBER) 1687 CheckNoError(t, resp) 1688 } 1689 1690 func TestGetMyTeamsUnread(t *testing.T) { 1691 th := Setup().InitBasic().InitSystemAdmin() 1692 defer th.TearDown() 1693 Client := th.Client 1694 1695 user := th.BasicUser 1696 Client.Login(user.Email, user.Password) 1697 1698 teams, resp := Client.GetTeamsUnreadForUser(user.Id, "") 1699 CheckNoError(t, resp) 1700 if len(teams) == 0 { 1701 t.Fatal("should have results") 1702 } 1703 1704 teams, resp = Client.GetTeamsUnreadForUser(user.Id, th.BasicTeam.Id) 1705 CheckNoError(t, resp) 1706 if len(teams) != 0 { 1707 t.Fatal("should not have results") 1708 } 1709 1710 _, resp = Client.GetTeamsUnreadForUser("fail", "") 1711 CheckBadRequestStatus(t, resp) 1712 1713 _, resp = Client.GetTeamsUnreadForUser(model.NewId(), "") 1714 CheckForbiddenStatus(t, resp) 1715 1716 Client.Logout() 1717 _, resp = Client.GetTeamsUnreadForUser(user.Id, "") 1718 CheckUnauthorizedStatus(t, resp) 1719 } 1720 1721 func TestTeamExists(t *testing.T) { 1722 th := Setup().InitBasic().InitSystemAdmin() 1723 defer th.TearDown() 1724 Client := th.Client 1725 team := th.BasicTeam 1726 1727 th.LoginBasic() 1728 1729 exists, resp := Client.TeamExists(team.Name, "") 1730 CheckNoError(t, resp) 1731 if !exists { 1732 t.Fatal("team should exist") 1733 } 1734 1735 exists, resp = Client.TeamExists("testingteam", "") 1736 CheckNoError(t, resp) 1737 if exists { 1738 t.Fatal("team should not exist") 1739 } 1740 1741 Client.Logout() 1742 _, resp = Client.TeamExists(team.Name, "") 1743 CheckUnauthorizedStatus(t, resp) 1744 } 1745 1746 func TestImportTeam(t *testing.T) { 1747 th := Setup().InitBasic().InitSystemAdmin() 1748 defer th.TearDown() 1749 1750 t.Run("ImportTeam", func(t *testing.T) { 1751 var data []byte 1752 var err error 1753 data, err = readTestFile("Fake_Team_Import.zip") 1754 if err != nil && len(data) == 0 { 1755 t.Fatal("Error while reading the test file.") 1756 } 1757 1758 // Import the channels/users/posts 1759 fileResp, resp := th.SystemAdminClient.ImportTeam(data, binary.Size(data), "slack", "Fake_Team_Import.zip", th.BasicTeam.Id) 1760 CheckNoError(t, resp) 1761 1762 fileData, err := base64.StdEncoding.DecodeString(fileResp["results"]) 1763 if err != nil { 1764 t.Fatal("failed to decode base64 results data") 1765 } 1766 1767 fileReturned := fmt.Sprintf("%s", fileData) 1768 if !strings.Contains(fileReturned, "darth.vader@stardeath.com") { 1769 t.Log(fileReturned) 1770 t.Fatal("failed to report the user was imported") 1771 } 1772 1773 // Checking the imported users 1774 importedUser, resp := th.SystemAdminClient.GetUserByUsername("bot_test", "") 1775 CheckNoError(t, resp) 1776 if importedUser.Username != "bot_test" { 1777 t.Fatal("username should match with the imported user") 1778 } 1779 1780 importedUser, resp = th.SystemAdminClient.GetUserByUsername("lordvader", "") 1781 CheckNoError(t, resp) 1782 if importedUser.Username != "lordvader" { 1783 t.Fatal("username should match with the imported user") 1784 } 1785 1786 // Checking the imported Channels 1787 importedChannel, resp := th.SystemAdminClient.GetChannelByName("testchannel", th.BasicTeam.Id, "") 1788 CheckNoError(t, resp) 1789 if importedChannel.Name != "testchannel" { 1790 t.Fatal("names did not match expected: testchannel") 1791 } 1792 1793 importedChannel, resp = th.SystemAdminClient.GetChannelByName("general", th.BasicTeam.Id, "") 1794 CheckNoError(t, resp) 1795 if importedChannel.Name != "general" { 1796 t.Fatal("names did not match expected: general") 1797 } 1798 1799 posts, resp := th.SystemAdminClient.GetPostsForChannel(importedChannel.Id, 0, 60, "") 1800 CheckNoError(t, resp) 1801 if posts.Posts[posts.Order[3]].Message != "This is a test post to test the import process" { 1802 t.Fatal("missing posts in the import process") 1803 } 1804 }) 1805 1806 t.Run("MissingFile", func(t *testing.T) { 1807 _, resp := th.SystemAdminClient.ImportTeam(nil, 4343, "slack", "Fake_Team_Import.zip", th.BasicTeam.Id) 1808 CheckBadRequestStatus(t, resp) 1809 }) 1810 1811 t.Run("WrongPermission", func(t *testing.T) { 1812 var data []byte 1813 var err error 1814 data, err = readTestFile("Fake_Team_Import.zip") 1815 if err != nil && len(data) == 0 { 1816 t.Fatal("Error while reading the test file.") 1817 } 1818 1819 // Import the channels/users/posts 1820 _, resp := th.Client.ImportTeam(data, binary.Size(data), "slack", "Fake_Team_Import.zip", th.BasicTeam.Id) 1821 CheckForbiddenStatus(t, resp) 1822 }) 1823 } 1824 1825 func TestInviteUsersToTeam(t *testing.T) { 1826 th := Setup().InitBasic().InitSystemAdmin() 1827 defer th.TearDown() 1828 1829 user1 := th.GenerateTestEmail() 1830 user2 := th.GenerateTestEmail() 1831 1832 emailList := []string{user1, user2} 1833 1834 //Delete all the messages before check the sample email 1835 utils.DeleteMailBox(user1) 1836 utils.DeleteMailBox(user2) 1837 1838 okMsg, resp := th.SystemAdminClient.InviteUsersToTeam(th.BasicTeam.Id, emailList) 1839 CheckNoError(t, resp) 1840 if !okMsg { 1841 t.Fatal("should return true") 1842 } 1843 1844 nameFormat := *th.App.Config().TeamSettings.TeammateNameDisplay 1845 expectedSubject := utils.T("api.templates.invite_subject", 1846 map[string]interface{}{"SenderName": th.SystemAdminUser.GetDisplayName(nameFormat), 1847 "TeamDisplayName": th.BasicTeam.DisplayName, 1848 "SiteName": th.App.ClientConfig()["SiteName"]}) 1849 1850 //Check if the email was send to the rigth email address 1851 for _, email := range emailList { 1852 var resultsMailbox utils.JSONMessageHeaderInbucket 1853 err := utils.RetryInbucket(5, func() error { 1854 var err error 1855 resultsMailbox, err = utils.GetMailBox(email) 1856 return err 1857 }) 1858 if err != nil { 1859 t.Log(err) 1860 t.Log("No email was received, maybe due load on the server. Disabling this verification") 1861 } 1862 if err == nil && len(resultsMailbox) > 0 { 1863 if !strings.ContainsAny(resultsMailbox[len(resultsMailbox)-1].To[0], email) { 1864 t.Fatal("Wrong To recipient") 1865 } else { 1866 if resultsEmail, err := utils.GetMessageFromMailbox(email, resultsMailbox[len(resultsMailbox)-1].ID); err == nil { 1867 if resultsEmail.Subject != expectedSubject { 1868 t.Log(resultsEmail.Subject) 1869 t.Log(expectedSubject) 1870 t.Fatal("Wrong Subject") 1871 } 1872 } 1873 } 1874 } 1875 } 1876 1877 th.App.UpdateConfig(func(cfg *model.Config) { cfg.TeamSettings.RestrictCreationToDomains = "@example.com" }) 1878 1879 err := th.App.InviteNewUsersToTeam(emailList, th.BasicTeam.Id, th.BasicUser.Id) 1880 1881 if err == nil { 1882 t.Fatal("Adding users with non-restricted domains was allowed") 1883 } 1884 if err.Where != "InviteNewUsersToTeam" || err.Id != "api.team.invite_members.invalid_email.app_error" { 1885 t.Log(err) 1886 t.Fatal("Got wrong error message!") 1887 } 1888 } 1889 1890 func TestGetTeamInviteInfo(t *testing.T) { 1891 th := Setup().InitBasic().InitSystemAdmin() 1892 defer th.TearDown() 1893 Client := th.Client 1894 team := th.BasicTeam 1895 1896 team, resp := Client.GetTeamInviteInfo(team.InviteId) 1897 CheckNoError(t, resp) 1898 1899 if team.DisplayName == "" { 1900 t.Fatal("should not be empty") 1901 } 1902 1903 if team.Email != "" { 1904 t.Fatal("should be empty") 1905 } 1906 1907 team.InviteId = "12345678901234567890123456789012" 1908 team, resp = th.SystemAdminClient.UpdateTeam(team) 1909 CheckNoError(t, resp) 1910 1911 team, resp = Client.GetTeamInviteInfo(team.InviteId) 1912 CheckNoError(t, resp) 1913 1914 _, resp = Client.GetTeamInviteInfo("junk") 1915 CheckNotFoundStatus(t, resp) 1916 }