github.com/wgh-/mattermost-server@v4.8.0-rc2+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  	dataObject["invite_id"] = team.InviteId
  1347  
  1348  	data := model.MapToJson(dataObject)
  1349  	hashed := utils.HashSha256(fmt.Sprintf("%v:%v", data, th.App.Config().EmailSettings.InviteSalt))
  1350  
  1351  	tm, resp = Client.AddTeamMemberFromInvite(hashed, data, "")
  1352  	CheckNoError(t, resp)
  1353  
  1354  	if tm == nil {
  1355  		t.Fatal("should have returned team member")
  1356  	}
  1357  
  1358  	if tm.UserId != otherUser.Id {
  1359  		t.Fatal("user ids should have matched")
  1360  	}
  1361  
  1362  	if tm.TeamId != team.Id {
  1363  		t.Fatal("team ids should have matched")
  1364  	}
  1365  
  1366  	tm, resp = Client.AddTeamMemberFromInvite("junk", data, "")
  1367  	CheckBadRequestStatus(t, resp)
  1368  
  1369  	if tm != nil {
  1370  		t.Fatal("should have not returned team member")
  1371  	}
  1372  
  1373  	_, resp = Client.AddTeamMemberFromInvite(hashed, "junk", "")
  1374  	CheckBadRequestStatus(t, resp)
  1375  
  1376  	// expired data of more than 50 hours
  1377  	dataObject["time"] = fmt.Sprintf("%v", model.GetMillis()-1000*60*60*50)
  1378  	data = model.MapToJson(dataObject)
  1379  	hashed = utils.HashSha256(fmt.Sprintf("%v:%v", data, th.App.Config().EmailSettings.InviteSalt))
  1380  
  1381  	tm, resp = Client.AddTeamMemberFromInvite(hashed, data, "")
  1382  	CheckBadRequestStatus(t, resp)
  1383  
  1384  	// invalid team id
  1385  	dataObject["id"] = GenerateTestId()
  1386  	data = model.MapToJson(dataObject)
  1387  	hashed = utils.HashSha256(fmt.Sprintf("%v:%v", data, th.App.Config().EmailSettings.InviteSalt))
  1388  
  1389  	tm, resp = Client.AddTeamMemberFromInvite(hashed, data, "")
  1390  	CheckBadRequestStatus(t, resp)
  1391  
  1392  	// by invite_id
  1393  	Client.Login(otherUser.Email, otherUser.Password)
  1394  
  1395  	tm, resp = Client.AddTeamMemberFromInvite("", "", team.InviteId)
  1396  	CheckNoError(t, resp)
  1397  
  1398  	if tm == nil {
  1399  		t.Fatal("should have returned team member")
  1400  	}
  1401  
  1402  	if tm.UserId != otherUser.Id {
  1403  		t.Fatal("user ids should have matched")
  1404  	}
  1405  
  1406  	if tm.TeamId != team.Id {
  1407  		t.Fatal("team ids should have matched")
  1408  	}
  1409  
  1410  	tm, resp = Client.AddTeamMemberFromInvite("", "", "junk")
  1411  	CheckNotFoundStatus(t, resp)
  1412  
  1413  	if tm != nil {
  1414  		t.Fatal("should have not returned team member")
  1415  	}
  1416  }
  1417  
  1418  func TestAddTeamMembers(t *testing.T) {
  1419  	th := Setup().InitBasic().InitSystemAdmin()
  1420  	defer th.TearDown()
  1421  	Client := th.Client
  1422  	team := th.BasicTeam
  1423  	otherUser := th.CreateUser()
  1424  	userList := []string{
  1425  		otherUser.Id,
  1426  	}
  1427  
  1428  	if err := th.App.RemoveUserFromTeam(th.BasicTeam.Id, th.BasicUser2.Id, ""); err != nil {
  1429  		t.Fatalf(err.Error())
  1430  	}
  1431  
  1432  	// Regular user can't add a member to a team they don't belong to.
  1433  	th.LoginBasic2()
  1434  	tm, resp := Client.AddTeamMembers(team.Id, userList)
  1435  	CheckForbiddenStatus(t, resp)
  1436  	Client.Logout()
  1437  
  1438  	// Regular user can add a member to a team they belong to.
  1439  	th.LoginBasic()
  1440  	tm, resp = Client.AddTeamMembers(team.Id, userList)
  1441  	CheckNoError(t, resp)
  1442  	CheckCreatedStatus(t, resp)
  1443  
  1444  	// Check all the returned data.
  1445  	if tm[0] == nil {
  1446  		t.Fatal("should have returned team member")
  1447  	}
  1448  
  1449  	if tm[0].UserId != otherUser.Id {
  1450  		t.Fatal("user ids should have matched")
  1451  	}
  1452  
  1453  	if tm[0].TeamId != team.Id {
  1454  		t.Fatal("team ids should have matched")
  1455  	}
  1456  
  1457  	// Check with various invalid requests.
  1458  	_, resp = Client.AddTeamMembers("junk", userList)
  1459  	CheckBadRequestStatus(t, resp)
  1460  
  1461  	_, resp = Client.AddTeamMembers(GenerateTestId(), userList)
  1462  	CheckForbiddenStatus(t, resp)
  1463  
  1464  	testUserList := append(userList, GenerateTestId())
  1465  	_, resp = Client.AddTeamMembers(team.Id, testUserList)
  1466  	CheckNotFoundStatus(t, resp)
  1467  
  1468  	// Test with many users.
  1469  	for i := 0; i < 25; i++ {
  1470  		testUserList = append(testUserList, GenerateTestId())
  1471  	}
  1472  	_, resp = Client.AddTeamMembers(team.Id, testUserList)
  1473  	CheckBadRequestStatus(t, resp)
  1474  
  1475  	Client.Logout()
  1476  
  1477  	// Set the config so that only team admins can add a user to a team.
  1478  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.RestrictTeamInvite = model.PERMISSIONS_TEAM_ADMIN })
  1479  	th.LoginBasic()
  1480  
  1481  	// Test without the EE license to see that the permission restriction is ignored.
  1482  	_, resp = Client.AddTeamMembers(team.Id, userList)
  1483  	CheckNoError(t, resp)
  1484  
  1485  	// Add an EE license.
  1486  	th.App.SetLicense(model.NewTestLicense())
  1487  	th.LoginBasic()
  1488  
  1489  	// Check that a regular user can't add someone to the team.
  1490  	_, resp = Client.AddTeamMembers(team.Id, userList)
  1491  	CheckForbiddenStatus(t, resp)
  1492  
  1493  	// Update user to team admin
  1494  	th.UpdateUserToTeamAdmin(th.BasicUser, th.BasicTeam)
  1495  	th.App.InvalidateAllCaches()
  1496  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.RestrictTeamInvite = model.PERMISSIONS_TEAM_ADMIN })
  1497  	th.App.SetLicense(model.NewTestLicense())
  1498  	th.LoginBasic()
  1499  
  1500  	// Should work as a team admin.
  1501  	_, resp = Client.AddTeamMembers(team.Id, userList)
  1502  	CheckNoError(t, resp)
  1503  
  1504  	// Change permission level to System Admin
  1505  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.RestrictTeamInvite = model.PERMISSIONS_SYSTEM_ADMIN })
  1506  
  1507  	// Should not work as team admin.
  1508  	_, resp = Client.AddTeamMembers(team.Id, userList)
  1509  	CheckForbiddenStatus(t, resp)
  1510  
  1511  	// Should work as system admin.
  1512  	_, resp = th.SystemAdminClient.AddTeamMembers(team.Id, userList)
  1513  	CheckNoError(t, resp)
  1514  
  1515  	// Change permission level to All
  1516  	th.UpdateUserToNonTeamAdmin(th.BasicUser, th.BasicTeam)
  1517  	th.App.InvalidateAllCaches()
  1518  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.RestrictTeamInvite = model.PERMISSIONS_ALL })
  1519  	th.App.SetLicense(model.NewTestLicense())
  1520  	th.LoginBasic()
  1521  
  1522  	// Should work as a regular user.
  1523  	_, resp = Client.AddTeamMembers(team.Id, userList)
  1524  	CheckNoError(t, resp)
  1525  }
  1526  
  1527  func TestRemoveTeamMember(t *testing.T) {
  1528  	th := Setup().InitBasic().InitSystemAdmin()
  1529  	defer th.TearDown()
  1530  	Client := th.Client
  1531  
  1532  	pass, resp := Client.RemoveTeamMember(th.BasicTeam.Id, th.BasicUser.Id)
  1533  	CheckNoError(t, resp)
  1534  
  1535  	if !pass {
  1536  		t.Fatal("should have passed")
  1537  	}
  1538  
  1539  	_, resp = th.SystemAdminClient.AddTeamMember(th.BasicTeam.Id, th.BasicUser.Id)
  1540  	CheckNoError(t, resp)
  1541  
  1542  	_, resp = Client.RemoveTeamMember(th.BasicTeam.Id, "junk")
  1543  	CheckBadRequestStatus(t, resp)
  1544  
  1545  	_, resp = Client.RemoveTeamMember("junk", th.BasicUser2.Id)
  1546  	CheckBadRequestStatus(t, resp)
  1547  
  1548  	_, resp = Client.RemoveTeamMember(th.BasicTeam.Id, th.BasicUser2.Id)
  1549  	CheckForbiddenStatus(t, resp)
  1550  
  1551  	_, resp = Client.RemoveTeamMember(model.NewId(), th.BasicUser.Id)
  1552  	CheckNotFoundStatus(t, resp)
  1553  
  1554  	_, resp = th.SystemAdminClient.RemoveTeamMember(th.BasicTeam.Id, th.BasicUser.Id)
  1555  	CheckNoError(t, resp)
  1556  }
  1557  
  1558  func TestGetTeamStats(t *testing.T) {
  1559  	th := Setup().InitBasic().InitSystemAdmin()
  1560  	defer th.TearDown()
  1561  	Client := th.Client
  1562  	team := th.BasicTeam
  1563  
  1564  	rstats, resp := Client.GetTeamStats(team.Id, "")
  1565  	CheckNoError(t, resp)
  1566  
  1567  	if rstats.TeamId != team.Id {
  1568  		t.Fatal("wrong team id")
  1569  	}
  1570  
  1571  	if rstats.TotalMemberCount != 3 {
  1572  		t.Fatal("wrong count")
  1573  	}
  1574  
  1575  	if rstats.ActiveMemberCount != 3 {
  1576  		t.Fatal("wrong count")
  1577  	}
  1578  
  1579  	_, resp = Client.GetTeamStats("junk", "")
  1580  	CheckBadRequestStatus(t, resp)
  1581  
  1582  	_, resp = Client.GetTeamStats(model.NewId(), "")
  1583  	CheckForbiddenStatus(t, resp)
  1584  
  1585  	_, resp = th.SystemAdminClient.GetTeamStats(team.Id, "")
  1586  	CheckNoError(t, resp)
  1587  
  1588  	// deactivate BasicUser2
  1589  	th.UpdateActiveUser(th.BasicUser2, false)
  1590  
  1591  	rstats, resp = th.SystemAdminClient.GetTeamStats(team.Id, "")
  1592  	CheckNoError(t, resp)
  1593  
  1594  	if rstats.TotalMemberCount != 3 {
  1595  		t.Fatal("wrong count")
  1596  	}
  1597  
  1598  	if rstats.ActiveMemberCount != 2 {
  1599  		t.Fatal("wrong count")
  1600  	}
  1601  
  1602  	// login with different user and test if forbidden
  1603  	user := th.CreateUser()
  1604  	Client.Login(user.Email, user.Password)
  1605  	_, resp = Client.GetTeamStats(th.BasicTeam.Id, "")
  1606  	CheckForbiddenStatus(t, resp)
  1607  
  1608  	Client.Logout()
  1609  	_, resp = Client.GetTeamStats(th.BasicTeam.Id, "")
  1610  	CheckUnauthorizedStatus(t, resp)
  1611  }
  1612  
  1613  func TestUpdateTeamMemberRoles(t *testing.T) {
  1614  	th := Setup().InitBasic().InitSystemAdmin()
  1615  	defer th.TearDown()
  1616  	Client := th.Client
  1617  	SystemAdminClient := th.SystemAdminClient
  1618  
  1619  	const TEAM_MEMBER = "team_user"
  1620  	const TEAM_ADMIN = "team_user team_admin"
  1621  
  1622  	// user 1 tries to promote user 2
  1623  	ok, resp := Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser2.Id, TEAM_ADMIN)
  1624  	CheckForbiddenStatus(t, resp)
  1625  	if ok {
  1626  		t.Fatal("should have returned false")
  1627  	}
  1628  
  1629  	// user 1 tries to promote himself
  1630  	_, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser.Id, TEAM_ADMIN)
  1631  	CheckForbiddenStatus(t, resp)
  1632  
  1633  	// user 1 tries to demote someone
  1634  	_, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.SystemAdminUser.Id, TEAM_MEMBER)
  1635  	CheckForbiddenStatus(t, resp)
  1636  
  1637  	// system admin promotes user 1
  1638  	ok, resp = SystemAdminClient.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser.Id, TEAM_ADMIN)
  1639  	CheckNoError(t, resp)
  1640  	if !ok {
  1641  		t.Fatal("should have returned true")
  1642  	}
  1643  
  1644  	// user 1 (team admin) promotes user 2
  1645  	_, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser2.Id, TEAM_ADMIN)
  1646  	CheckNoError(t, resp)
  1647  
  1648  	// user 1 (team admin) demotes user 2 (team admin)
  1649  	_, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser2.Id, TEAM_MEMBER)
  1650  	CheckNoError(t, resp)
  1651  
  1652  	// user 1 (team admin) tries to demote system admin (not member of a team)
  1653  	_, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.SystemAdminUser.Id, TEAM_MEMBER)
  1654  	CheckBadRequestStatus(t, resp)
  1655  
  1656  	// user 1 (team admin) demotes system admin (member of a team)
  1657  	th.LinkUserToTeam(th.SystemAdminUser, th.BasicTeam)
  1658  	_, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.SystemAdminUser.Id, TEAM_MEMBER)
  1659  	CheckNoError(t, resp)
  1660  	// Note from API v3
  1661  	// Note to anyone who thinks this (above) test is wrong:
  1662  	// This operation will not affect the system admin's permissions because they have global access to all teams.
  1663  	// Their team level permissions are irrelavent. A team admin should be able to manage team level permissions.
  1664  
  1665  	// System admins should be able to manipulate permission no matter what their team level permissions are.
  1666  	// system admin promotes user 2
  1667  	_, resp = SystemAdminClient.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser2.Id, TEAM_ADMIN)
  1668  	CheckNoError(t, resp)
  1669  
  1670  	// system admin demotes user 2 (team admin)
  1671  	_, resp = SystemAdminClient.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser2.Id, TEAM_MEMBER)
  1672  	CheckNoError(t, resp)
  1673  
  1674  	// user 1 (team admin) tries to promote himself to a random team
  1675  	_, resp = Client.UpdateTeamMemberRoles(model.NewId(), th.BasicUser.Id, TEAM_ADMIN)
  1676  	CheckForbiddenStatus(t, resp)
  1677  
  1678  	// user 1 (team admin) tries to promote a random user
  1679  	_, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, model.NewId(), TEAM_ADMIN)
  1680  	CheckBadRequestStatus(t, resp)
  1681  
  1682  	// user 1 (team admin) tries to promote invalid team permission
  1683  	_, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser.Id, "junk")
  1684  	CheckBadRequestStatus(t, resp)
  1685  
  1686  	// user 1 (team admin) demotes himself
  1687  	_, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser.Id, TEAM_MEMBER)
  1688  	CheckNoError(t, resp)
  1689  }
  1690  
  1691  func TestGetMyTeamsUnread(t *testing.T) {
  1692  	th := Setup().InitBasic().InitSystemAdmin()
  1693  	defer th.TearDown()
  1694  	Client := th.Client
  1695  
  1696  	user := th.BasicUser
  1697  	Client.Login(user.Email, user.Password)
  1698  
  1699  	teams, resp := Client.GetTeamsUnreadForUser(user.Id, "")
  1700  	CheckNoError(t, resp)
  1701  	if len(teams) == 0 {
  1702  		t.Fatal("should have results")
  1703  	}
  1704  
  1705  	teams, resp = Client.GetTeamsUnreadForUser(user.Id, th.BasicTeam.Id)
  1706  	CheckNoError(t, resp)
  1707  	if len(teams) != 0 {
  1708  		t.Fatal("should not have results")
  1709  	}
  1710  
  1711  	_, resp = Client.GetTeamsUnreadForUser("fail", "")
  1712  	CheckBadRequestStatus(t, resp)
  1713  
  1714  	_, resp = Client.GetTeamsUnreadForUser(model.NewId(), "")
  1715  	CheckForbiddenStatus(t, resp)
  1716  
  1717  	Client.Logout()
  1718  	_, resp = Client.GetTeamsUnreadForUser(user.Id, "")
  1719  	CheckUnauthorizedStatus(t, resp)
  1720  }
  1721  
  1722  func TestTeamExists(t *testing.T) {
  1723  	th := Setup().InitBasic().InitSystemAdmin()
  1724  	defer th.TearDown()
  1725  	Client := th.Client
  1726  	team := th.BasicTeam
  1727  
  1728  	th.LoginBasic()
  1729  
  1730  	exists, resp := Client.TeamExists(team.Name, "")
  1731  	CheckNoError(t, resp)
  1732  	if !exists {
  1733  		t.Fatal("team should exist")
  1734  	}
  1735  
  1736  	exists, resp = Client.TeamExists("testingteam", "")
  1737  	CheckNoError(t, resp)
  1738  	if exists {
  1739  		t.Fatal("team should not exist")
  1740  	}
  1741  
  1742  	Client.Logout()
  1743  	_, resp = Client.TeamExists(team.Name, "")
  1744  	CheckUnauthorizedStatus(t, resp)
  1745  }
  1746  
  1747  func TestImportTeam(t *testing.T) {
  1748  	th := Setup().InitBasic().InitSystemAdmin()
  1749  	defer th.TearDown()
  1750  
  1751  	t.Run("ImportTeam", func(t *testing.T) {
  1752  		var data []byte
  1753  		var err error
  1754  		data, err = readTestFile("Fake_Team_Import.zip")
  1755  		if err != nil && len(data) == 0 {
  1756  			t.Fatal("Error while reading the test file.")
  1757  		}
  1758  
  1759  		// Import the channels/users/posts
  1760  		fileResp, resp := th.SystemAdminClient.ImportTeam(data, binary.Size(data), "slack", "Fake_Team_Import.zip", th.BasicTeam.Id)
  1761  		CheckNoError(t, resp)
  1762  
  1763  		fileData, err := base64.StdEncoding.DecodeString(fileResp["results"])
  1764  		if err != nil {
  1765  			t.Fatal("failed to decode base64 results data")
  1766  		}
  1767  
  1768  		fileReturned := fmt.Sprintf("%s", fileData)
  1769  		if !strings.Contains(fileReturned, "darth.vader@stardeath.com") {
  1770  			t.Log(fileReturned)
  1771  			t.Fatal("failed to report the user was imported")
  1772  		}
  1773  
  1774  		// Checking the imported users
  1775  		importedUser, resp := th.SystemAdminClient.GetUserByUsername("bot_test", "")
  1776  		CheckNoError(t, resp)
  1777  		if importedUser.Username != "bot_test" {
  1778  			t.Fatal("username should match with the imported user")
  1779  		}
  1780  
  1781  		importedUser, resp = th.SystemAdminClient.GetUserByUsername("lordvader", "")
  1782  		CheckNoError(t, resp)
  1783  		if importedUser.Username != "lordvader" {
  1784  			t.Fatal("username should match with the imported user")
  1785  		}
  1786  
  1787  		// Checking the imported Channels
  1788  		importedChannel, resp := th.SystemAdminClient.GetChannelByName("testchannel", th.BasicTeam.Id, "")
  1789  		CheckNoError(t, resp)
  1790  		if importedChannel.Name != "testchannel" {
  1791  			t.Fatal("names did not match expected: testchannel")
  1792  		}
  1793  
  1794  		importedChannel, resp = th.SystemAdminClient.GetChannelByName("general", th.BasicTeam.Id, "")
  1795  		CheckNoError(t, resp)
  1796  		if importedChannel.Name != "general" {
  1797  			t.Fatal("names did not match expected: general")
  1798  		}
  1799  
  1800  		posts, resp := th.SystemAdminClient.GetPostsForChannel(importedChannel.Id, 0, 60, "")
  1801  		CheckNoError(t, resp)
  1802  		if posts.Posts[posts.Order[3]].Message != "This is a test post to test the import process" {
  1803  			t.Fatal("missing posts in the import process")
  1804  		}
  1805  	})
  1806  
  1807  	t.Run("MissingFile", func(t *testing.T) {
  1808  		_, resp := th.SystemAdminClient.ImportTeam(nil, 4343, "slack", "Fake_Team_Import.zip", th.BasicTeam.Id)
  1809  		CheckBadRequestStatus(t, resp)
  1810  	})
  1811  
  1812  	t.Run("WrongPermission", func(t *testing.T) {
  1813  		var data []byte
  1814  		var err error
  1815  		data, err = readTestFile("Fake_Team_Import.zip")
  1816  		if err != nil && len(data) == 0 {
  1817  			t.Fatal("Error while reading the test file.")
  1818  		}
  1819  
  1820  		// Import the channels/users/posts
  1821  		_, resp := th.Client.ImportTeam(data, binary.Size(data), "slack", "Fake_Team_Import.zip", th.BasicTeam.Id)
  1822  		CheckForbiddenStatus(t, resp)
  1823  	})
  1824  }
  1825  
  1826  func TestInviteUsersToTeam(t *testing.T) {
  1827  	th := Setup().InitBasic().InitSystemAdmin()
  1828  	defer th.TearDown()
  1829  
  1830  	user1 := th.GenerateTestEmail()
  1831  	user2 := th.GenerateTestEmail()
  1832  
  1833  	emailList := []string{user1, user2}
  1834  
  1835  	//Delete all the messages before check the sample email
  1836  	utils.DeleteMailBox(user1)
  1837  	utils.DeleteMailBox(user2)
  1838  
  1839  	okMsg, resp := th.SystemAdminClient.InviteUsersToTeam(th.BasicTeam.Id, emailList)
  1840  	CheckNoError(t, resp)
  1841  	if !okMsg {
  1842  		t.Fatal("should return true")
  1843  	}
  1844  
  1845  	nameFormat := *th.App.Config().TeamSettings.TeammateNameDisplay
  1846  	expectedSubject := utils.T("api.templates.invite_subject",
  1847  		map[string]interface{}{"SenderName": th.SystemAdminUser.GetDisplayName(nameFormat),
  1848  			"TeamDisplayName": th.BasicTeam.DisplayName,
  1849  			"SiteName":        th.App.ClientConfig()["SiteName"]})
  1850  
  1851  	//Check if the email was send to the rigth email address
  1852  	for _, email := range emailList {
  1853  		var resultsMailbox utils.JSONMessageHeaderInbucket
  1854  		err := utils.RetryInbucket(5, func() error {
  1855  			var err error
  1856  			resultsMailbox, err = utils.GetMailBox(email)
  1857  			return err
  1858  		})
  1859  		if err != nil {
  1860  			t.Log(err)
  1861  			t.Log("No email was received, maybe due load on the server. Disabling this verification")
  1862  		}
  1863  		if err == nil && len(resultsMailbox) > 0 {
  1864  			if !strings.ContainsAny(resultsMailbox[len(resultsMailbox)-1].To[0], email) {
  1865  				t.Fatal("Wrong To recipient")
  1866  			} else {
  1867  				if resultsEmail, err := utils.GetMessageFromMailbox(email, resultsMailbox[len(resultsMailbox)-1].ID); err == nil {
  1868  					if resultsEmail.Subject != expectedSubject {
  1869  						t.Log(resultsEmail.Subject)
  1870  						t.Log(expectedSubject)
  1871  						t.Fatal("Wrong Subject")
  1872  					}
  1873  				}
  1874  			}
  1875  		}
  1876  	}
  1877  
  1878  	th.App.UpdateConfig(func(cfg *model.Config) { cfg.TeamSettings.RestrictCreationToDomains = "@example.com" })
  1879  
  1880  	err := th.App.InviteNewUsersToTeam(emailList, th.BasicTeam.Id, th.BasicUser.Id)
  1881  
  1882  	if err == nil {
  1883  		t.Fatal("Adding users with non-restricted domains was allowed")
  1884  	}
  1885  	if err.Where != "InviteNewUsersToTeam" || err.Id != "api.team.invite_members.invalid_email.app_error" {
  1886  		t.Log(err)
  1887  		t.Fatal("Got wrong error message!")
  1888  	}
  1889  }
  1890  
  1891  func TestGetTeamInviteInfo(t *testing.T) {
  1892  	th := Setup().InitBasic().InitSystemAdmin()
  1893  	defer th.TearDown()
  1894  	Client := th.Client
  1895  	team := th.BasicTeam
  1896  
  1897  	team, resp := Client.GetTeamInviteInfo(team.InviteId)
  1898  	CheckNoError(t, resp)
  1899  
  1900  	if team.DisplayName == "" {
  1901  		t.Fatal("should not be empty")
  1902  	}
  1903  
  1904  	if team.Email != "" {
  1905  		t.Fatal("should be empty")
  1906  	}
  1907  
  1908  	team.InviteId = "12345678901234567890123456789012"
  1909  	team, resp = th.SystemAdminClient.UpdateTeam(team)
  1910  	CheckNoError(t, resp)
  1911  
  1912  	team, resp = Client.GetTeamInviteInfo(team.InviteId)
  1913  	CheckNoError(t, resp)
  1914  
  1915  	_, resp = Client.GetTeamInviteInfo("junk")
  1916  	CheckNotFoundStatus(t, resp)
  1917  }