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