github.com/mattermosttest/mattermost-server/v5@v5.0.0-20200917143240-9dfa12e121f9/app/team_test.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package app
     5  
     6  import (
     7  	"fmt"
     8  	"math/rand"
     9  	"sort"
    10  	"strings"
    11  	"testing"
    12  
    13  	"github.com/mattermost/mattermost-server/v5/model"
    14  	"github.com/mattermost/mattermost-server/v5/store/storetest/mocks"
    15  	"github.com/stretchr/testify/assert"
    16  	"github.com/stretchr/testify/mock"
    17  	"github.com/stretchr/testify/require"
    18  )
    19  
    20  func TestCreateTeam(t *testing.T) {
    21  	th := Setup(t).InitBasic()
    22  	defer th.TearDown()
    23  
    24  	id := model.NewId()
    25  	team := &model.Team{
    26  		DisplayName: "dn_" + id,
    27  		Name:        "name" + id,
    28  		Email:       "success+" + id + "@simulator.amazonses.com",
    29  		Type:        model.TEAM_OPEN,
    30  	}
    31  
    32  	_, err := th.App.CreateTeam(team)
    33  	require.Nil(t, err, "Should create a new team")
    34  
    35  	_, err = th.App.CreateTeam(th.BasicTeam)
    36  	require.NotNil(t, err, "Should not create a new team - team already exist")
    37  }
    38  
    39  func TestCreateTeamWithUser(t *testing.T) {
    40  	th := Setup(t).InitBasic()
    41  	defer th.TearDown()
    42  
    43  	id := model.NewId()
    44  	team := &model.Team{
    45  		DisplayName: "dn_" + id,
    46  		Name:        "name" + id,
    47  		Email:       "success+" + id + "@simulator.amazonses.com",
    48  		Type:        model.TEAM_OPEN,
    49  	}
    50  
    51  	_, err := th.App.CreateTeamWithUser(team, th.BasicUser.Id)
    52  	require.Nil(t, err, "Should create a new team with existing user")
    53  
    54  	_, err = th.App.CreateTeamWithUser(team, model.NewId())
    55  	require.NotNil(t, err, "Should not create a new team - user does not exist")
    56  }
    57  
    58  func TestUpdateTeam(t *testing.T) {
    59  	th := Setup(t).InitBasic()
    60  	defer th.TearDown()
    61  
    62  	th.BasicTeam.DisplayName = "Testing 123"
    63  
    64  	updatedTeam, err := th.App.UpdateTeam(th.BasicTeam)
    65  	require.Nil(t, err, "Should update the team")
    66  	require.Equal(t, "Testing 123", updatedTeam.DisplayName, "Wrong Team DisplayName")
    67  }
    68  
    69  func TestAddUserToTeam(t *testing.T) {
    70  	th := Setup(t).InitBasic()
    71  	defer th.TearDown()
    72  
    73  	t.Run("add user", func(t *testing.T) {
    74  		user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
    75  		ruser, _ := th.App.CreateUser(&user)
    76  		defer th.App.PermanentDeleteUser(&user)
    77  
    78  		_, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
    79  		require.Nil(t, err, "Should add user to the team")
    80  	})
    81  
    82  	t.Run("allow user by domain", func(t *testing.T) {
    83  		th.BasicTeam.AllowedDomains = "example.com"
    84  		_, err := th.App.UpdateTeam(th.BasicTeam)
    85  		require.Nil(t, err, "Should update the team")
    86  
    87  		user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
    88  		ruser, _ := th.App.CreateUser(&user)
    89  		defer th.App.PermanentDeleteUser(&user)
    90  
    91  		_, err = th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
    92  		require.Nil(t, err, "Should have allowed whitelisted user")
    93  	})
    94  
    95  	t.Run("block user by domain but allow bot", func(t *testing.T) {
    96  		th.BasicTeam.AllowedDomains = "example.com"
    97  		_, err := th.App.UpdateTeam(th.BasicTeam)
    98  		require.Nil(t, err, "Should update the team")
    99  
   100  		user := model.User{Email: strings.ToLower(model.NewId()) + "test@invalid.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
   101  		ruser, err := th.App.CreateUser(&user)
   102  		require.Nil(t, err, "Error creating user: %s", err)
   103  		defer th.App.PermanentDeleteUser(&user)
   104  
   105  		_, err = th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
   106  		require.NotNil(t, err, "Should not add restricted user")
   107  		require.Equal(t, "JoinUserToTeam", err.Where, "Error should be JoinUserToTeam")
   108  
   109  		user = model.User{Email: strings.ToLower(model.NewId()) + "test@invalid.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), AuthService: "notnil", AuthData: model.NewString("notnil")}
   110  		ruser, err = th.App.CreateUser(&user)
   111  		require.Nil(t, err, "Error creating authservice user: %s", err)
   112  		defer th.App.PermanentDeleteUser(&user)
   113  
   114  		_, err = th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
   115  		require.NotNil(t, err, "Should not add authservice user")
   116  		require.Equal(t, "JoinUserToTeam", err.Where, "Error should be JoinUserToTeam")
   117  
   118  		bot, err := th.App.CreateBot(&model.Bot{
   119  			Username:    "somebot",
   120  			Description: "a bot",
   121  			OwnerId:     th.BasicUser.Id,
   122  		})
   123  		require.Nil(t, err)
   124  
   125  		_, err = th.App.AddUserToTeam(th.BasicTeam.Id, bot.UserId, "")
   126  		assert.Nil(t, err, "should be able to add bot to domain restricted team")
   127  	})
   128  
   129  	t.Run("block user with subdomain", func(t *testing.T) {
   130  		th.BasicTeam.AllowedDomains = "example.com"
   131  		_, err := th.App.UpdateTeam(th.BasicTeam)
   132  		require.Nil(t, err, "Should update the team")
   133  
   134  		user := model.User{Email: strings.ToLower(model.NewId()) + "test@invalid.example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
   135  		ruser, _ := th.App.CreateUser(&user)
   136  		defer th.App.PermanentDeleteUser(&user)
   137  
   138  		_, err = th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
   139  		require.NotNil(t, err, "Should not add restricted user")
   140  		require.Equal(t, "JoinUserToTeam", err.Where, "Error should be JoinUserToTeam")
   141  	})
   142  
   143  	t.Run("allow users by multiple domains", func(t *testing.T) {
   144  		th.BasicTeam.AllowedDomains = "foo.com, bar.com"
   145  		_, err := th.App.UpdateTeam(th.BasicTeam)
   146  		require.Nil(t, err, "Should update the team")
   147  
   148  		user1 := model.User{Email: strings.ToLower(model.NewId()) + "success+test@foo.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
   149  		ruser1, _ := th.App.CreateUser(&user1)
   150  
   151  		user2 := model.User{Email: strings.ToLower(model.NewId()) + "success+test@bar.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
   152  		ruser2, _ := th.App.CreateUser(&user2)
   153  
   154  		user3 := model.User{Email: strings.ToLower(model.NewId()) + "success+test@invalid.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
   155  		ruser3, _ := th.App.CreateUser(&user3)
   156  
   157  		defer th.App.PermanentDeleteUser(&user1)
   158  		defer th.App.PermanentDeleteUser(&user2)
   159  		defer th.App.PermanentDeleteUser(&user3)
   160  
   161  		_, err = th.App.AddUserToTeam(th.BasicTeam.Id, ruser1.Id, "")
   162  		require.Nil(t, err, "Should have allowed whitelisted user1")
   163  
   164  		_, err = th.App.AddUserToTeam(th.BasicTeam.Id, ruser2.Id, "")
   165  		require.Nil(t, err, "Should have allowed whitelisted user2")
   166  
   167  		_, err = th.App.AddUserToTeam(th.BasicTeam.Id, ruser3.Id, "")
   168  		require.NotNil(t, err, "Should not have allowed restricted user3")
   169  		require.Equal(t, "JoinUserToTeam", err.Where, "Error should be JoinUserToTeam")
   170  	})
   171  
   172  	t.Run("should set up initial sidebar categories when joining a team", func(t *testing.T) {
   173  		user := th.CreateUser()
   174  		team := th.CreateTeam()
   175  
   176  		_, err := th.App.AddUserToTeam(team.Id, user.Id, "")
   177  		require.Nil(t, err)
   178  
   179  		res, err := th.App.GetSidebarCategories(user.Id, team.Id)
   180  		require.Nil(t, err)
   181  		assert.Len(t, res.Categories, 3)
   182  		assert.Equal(t, model.SidebarCategoryFavorites, res.Categories[0].Type)
   183  		assert.Equal(t, model.SidebarCategoryChannels, res.Categories[1].Type)
   184  		assert.Equal(t, model.SidebarCategoryDirectMessages, res.Categories[2].Type)
   185  	})
   186  }
   187  
   188  func TestAddUserToTeamByToken(t *testing.T) {
   189  	th := Setup(t).InitBasic()
   190  	defer th.TearDown()
   191  
   192  	user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
   193  	ruser, _ := th.App.CreateUser(&user)
   194  	rguest := th.CreateGuest()
   195  
   196  	t.Run("invalid token", func(t *testing.T) {
   197  		_, err := th.App.AddUserToTeamByToken(ruser.Id, "123")
   198  		require.NotNil(t, err, "Should fail on unexisting token")
   199  	})
   200  
   201  	t.Run("invalid token type", func(t *testing.T) {
   202  		token := model.NewToken(
   203  			TOKEN_TYPE_VERIFY_EMAIL,
   204  			model.MapToJson(map[string]string{"teamId": th.BasicTeam.Id}),
   205  		)
   206  
   207  		require.Nil(t, th.App.Srv().Store.Token().Save(token))
   208  		defer th.App.DeleteToken(token)
   209  
   210  		_, err := th.App.AddUserToTeamByToken(ruser.Id, token.Token)
   211  		require.NotNil(t, err, "Should fail on bad token type")
   212  	})
   213  
   214  	t.Run("expired token", func(t *testing.T) {
   215  		token := model.NewToken(
   216  			TOKEN_TYPE_TEAM_INVITATION,
   217  			model.MapToJson(map[string]string{"teamId": th.BasicTeam.Id}),
   218  		)
   219  
   220  		token.CreateAt = model.GetMillis() - INVITATION_EXPIRY_TIME - 1
   221  		require.Nil(t, th.App.Srv().Store.Token().Save(token))
   222  		defer th.App.DeleteToken(token)
   223  
   224  		_, err := th.App.AddUserToTeamByToken(ruser.Id, token.Token)
   225  		require.NotNil(t, err, "Should fail on expired token")
   226  	})
   227  
   228  	t.Run("invalid team id", func(t *testing.T) {
   229  		token := model.NewToken(
   230  			TOKEN_TYPE_TEAM_INVITATION,
   231  			model.MapToJson(map[string]string{"teamId": model.NewId()}),
   232  		)
   233  		require.Nil(t, th.App.Srv().Store.Token().Save(token))
   234  		defer th.App.DeleteToken(token)
   235  
   236  		_, err := th.App.AddUserToTeamByToken(ruser.Id, token.Token)
   237  		require.NotNil(t, err, "Should fail on bad team id")
   238  	})
   239  
   240  	t.Run("invalid user id", func(t *testing.T) {
   241  		token := model.NewToken(
   242  			TOKEN_TYPE_TEAM_INVITATION,
   243  			model.MapToJson(map[string]string{"teamId": th.BasicTeam.Id}),
   244  		)
   245  		require.Nil(t, th.App.Srv().Store.Token().Save(token))
   246  		defer th.App.DeleteToken(token)
   247  
   248  		_, err := th.App.AddUserToTeamByToken(model.NewId(), token.Token)
   249  		require.NotNil(t, err, "Should fail on bad user id")
   250  	})
   251  
   252  	t.Run("valid request", func(t *testing.T) {
   253  		token := model.NewToken(
   254  			TOKEN_TYPE_TEAM_INVITATION,
   255  			model.MapToJson(map[string]string{"teamId": th.BasicTeam.Id}),
   256  		)
   257  		require.Nil(t, th.App.Srv().Store.Token().Save(token))
   258  		_, err := th.App.AddUserToTeamByToken(ruser.Id, token.Token)
   259  		require.Nil(t, err, "Should add user to the team")
   260  
   261  		_, nErr := th.App.Srv().Store.Token().GetByToken(token.Token)
   262  		require.NotNil(t, nErr, "The token must be deleted after be used")
   263  
   264  		members, err := th.App.GetChannelMembersForUser(th.BasicTeam.Id, ruser.Id)
   265  		require.Nil(t, err)
   266  		assert.Len(t, *members, 2)
   267  	})
   268  
   269  	t.Run("invalid add a guest using a regular invite", func(t *testing.T) {
   270  		token := model.NewToken(
   271  			TOKEN_TYPE_TEAM_INVITATION,
   272  			model.MapToJson(map[string]string{"teamId": th.BasicTeam.Id}),
   273  		)
   274  		require.Nil(t, th.App.Srv().Store.Token().Save(token))
   275  		_, err := th.App.AddUserToTeamByToken(rguest.Id, token.Token)
   276  		assert.NotNil(t, err)
   277  	})
   278  
   279  	t.Run("invalid add a regular user using a guest invite", func(t *testing.T) {
   280  		token := model.NewToken(
   281  			TOKEN_TYPE_GUEST_INVITATION,
   282  			model.MapToJson(map[string]string{"teamId": th.BasicTeam.Id, "channels": th.BasicChannel.Id}),
   283  		)
   284  		require.Nil(t, th.App.Srv().Store.Token().Save(token))
   285  		_, err := th.App.AddUserToTeamByToken(ruser.Id, token.Token)
   286  		assert.NotNil(t, err)
   287  	})
   288  
   289  	t.Run("invalid add a guest user with a non-granted email domain", func(t *testing.T) {
   290  		restrictedDomain := *th.App.Config().GuestAccountsSettings.RestrictCreationToDomains
   291  		defer func() {
   292  			th.App.UpdateConfig(func(cfg *model.Config) { cfg.GuestAccountsSettings.RestrictCreationToDomains = &restrictedDomain })
   293  		}()
   294  		th.App.UpdateConfig(func(cfg *model.Config) { *cfg.GuestAccountsSettings.RestrictCreationToDomains = "restricted.com" })
   295  		token := model.NewToken(
   296  			TOKEN_TYPE_GUEST_INVITATION,
   297  			model.MapToJson(map[string]string{"teamId": th.BasicTeam.Id, "channels": th.BasicChannel.Id}),
   298  		)
   299  		require.Nil(t, th.App.Srv().Store.Token().Save(token))
   300  		_, err := th.App.AddUserToTeamByToken(rguest.Id, token.Token)
   301  		require.NotNil(t, err)
   302  		assert.Equal(t, "api.team.join_user_to_team.allowed_domains.app_error", err.Id)
   303  	})
   304  
   305  	t.Run("add a guest user with a granted email domain", func(t *testing.T) {
   306  		restrictedDomain := *th.App.Config().GuestAccountsSettings.RestrictCreationToDomains
   307  		defer func() {
   308  			th.App.UpdateConfig(func(cfg *model.Config) { cfg.GuestAccountsSettings.RestrictCreationToDomains = &restrictedDomain })
   309  		}()
   310  		th.App.UpdateConfig(func(cfg *model.Config) { *cfg.GuestAccountsSettings.RestrictCreationToDomains = "restricted.com" })
   311  		token := model.NewToken(
   312  			TOKEN_TYPE_GUEST_INVITATION,
   313  			model.MapToJson(map[string]string{"teamId": th.BasicTeam.Id, "channels": th.BasicChannel.Id}),
   314  		)
   315  		guestEmail := rguest.Email
   316  		rguest.Email = "test@restricted.com"
   317  		_, err := th.App.Srv().Store.User().Update(rguest, false)
   318  		th.App.InvalidateCacheForUser(rguest.Id)
   319  		require.Nil(t, err)
   320  		require.Nil(t, th.App.Srv().Store.Token().Save(token))
   321  		_, err = th.App.AddUserToTeamByToken(rguest.Id, token.Token)
   322  		require.Nil(t, err)
   323  		rguest.Email = guestEmail
   324  		_, err = th.App.Srv().Store.User().Update(rguest, false)
   325  		require.Nil(t, err)
   326  	})
   327  
   328  	t.Run("add a guest user even though there are team and system domain restrictions", func(t *testing.T) {
   329  		th.BasicTeam.AllowedDomains = "restricted-team.com"
   330  		_, err := th.Server.Store.Team().Update(th.BasicTeam)
   331  		require.Nil(t, err)
   332  		restrictedDomain := *th.App.Config().TeamSettings.RestrictCreationToDomains
   333  		defer func() {
   334  			th.App.UpdateConfig(func(cfg *model.Config) { cfg.TeamSettings.RestrictCreationToDomains = &restrictedDomain })
   335  		}()
   336  		th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.RestrictCreationToDomains = "restricted.com" })
   337  		token := model.NewToken(
   338  			TOKEN_TYPE_GUEST_INVITATION,
   339  			model.MapToJson(map[string]string{"teamId": th.BasicTeam.Id, "channels": th.BasicChannel.Id}),
   340  		)
   341  		_, err = th.App.Srv().Store.User().Update(rguest, false)
   342  		require.Nil(t, err)
   343  		require.Nil(t, th.App.Srv().Store.Token().Save(token))
   344  		_, err = th.App.AddUserToTeamByToken(rguest.Id, token.Token)
   345  		require.Nil(t, err)
   346  		th.BasicTeam.AllowedDomains = ""
   347  		_, err = th.Server.Store.Team().Update(th.BasicTeam)
   348  		require.Nil(t, err)
   349  	})
   350  
   351  	t.Run("valid request from guest invite", func(t *testing.T) {
   352  		token := model.NewToken(
   353  			TOKEN_TYPE_GUEST_INVITATION,
   354  			model.MapToJson(map[string]string{"teamId": th.BasicTeam.Id, "channels": th.BasicChannel.Id}),
   355  		)
   356  		require.Nil(t, th.App.Srv().Store.Token().Save(token))
   357  
   358  		_, err := th.App.AddUserToTeamByToken(rguest.Id, token.Token)
   359  		require.Nil(t, err, "Should add user to the team")
   360  
   361  		_, nErr := th.App.Srv().Store.Token().GetByToken(token.Token)
   362  		require.NotNil(t, nErr, "The token must be deleted after be used")
   363  
   364  		members, err := th.App.GetChannelMembersForUser(th.BasicTeam.Id, rguest.Id)
   365  		require.Nil(t, err)
   366  		require.Len(t, *members, 1)
   367  		assert.Equal(t, (*members)[0].ChannelId, th.BasicChannel.Id)
   368  	})
   369  
   370  	t.Run("group-constrained team", func(t *testing.T) {
   371  		th.BasicTeam.GroupConstrained = model.NewBool(true)
   372  		_, err := th.App.UpdateTeam(th.BasicTeam)
   373  		require.Nil(t, err, "Should update the team")
   374  
   375  		token := model.NewToken(
   376  			TOKEN_TYPE_TEAM_INVITATION,
   377  			model.MapToJson(map[string]string{"teamId": th.BasicTeam.Id}),
   378  		)
   379  		require.Nil(t, th.App.Srv().Store.Token().Save(token))
   380  
   381  		_, err = th.App.AddUserToTeamByToken(ruser.Id, token.Token)
   382  		require.NotNil(t, err, "Should return an error when trying to join a group-constrained team.")
   383  		require.Equal(t, "app.team.invite_token.group_constrained.error", err.Id)
   384  
   385  		th.BasicTeam.GroupConstrained = model.NewBool(false)
   386  		_, err = th.App.UpdateTeam(th.BasicTeam)
   387  		require.Nil(t, err, "Should update the team")
   388  	})
   389  
   390  	t.Run("block user", func(t *testing.T) {
   391  		th.BasicTeam.AllowedDomains = "example.com"
   392  		_, err := th.App.UpdateTeam(th.BasicTeam)
   393  		require.Nil(t, err, "Should update the team")
   394  
   395  		user := model.User{Email: strings.ToLower(model.NewId()) + "test@invalid.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
   396  		ruser, _ := th.App.CreateUser(&user)
   397  		defer th.App.PermanentDeleteUser(&user)
   398  
   399  		token := model.NewToken(
   400  			TOKEN_TYPE_TEAM_INVITATION,
   401  			model.MapToJson(map[string]string{"teamId": th.BasicTeam.Id}),
   402  		)
   403  		require.Nil(t, th.App.Srv().Store.Token().Save(token))
   404  
   405  		_, err = th.App.AddUserToTeamByToken(ruser.Id, token.Token)
   406  		require.NotNil(t, err, "Should not add restricted user")
   407  		require.Equal(t, "JoinUserToTeam", err.Where, "Error should be JoinUserToTeam")
   408  	})
   409  
   410  	t.Run("should set up initial sidebar categories when joining a team by token", func(t *testing.T) {
   411  		user := th.CreateUser()
   412  		team := th.CreateTeam()
   413  
   414  		token := model.NewToken(
   415  			TOKEN_TYPE_TEAM_INVITATION,
   416  			model.MapToJson(map[string]string{"teamId": team.Id}),
   417  		)
   418  		require.Nil(t, th.App.Srv().Store.Token().Save(token))
   419  
   420  		_, err := th.App.AddUserToTeamByToken(user.Id, token.Token)
   421  		require.Nil(t, err)
   422  
   423  		res, err := th.App.GetSidebarCategories(user.Id, team.Id)
   424  		require.Nil(t, err)
   425  		assert.Len(t, res.Categories, 3)
   426  		assert.Equal(t, model.SidebarCategoryFavorites, res.Categories[0].Type)
   427  		assert.Equal(t, model.SidebarCategoryChannels, res.Categories[1].Type)
   428  		assert.Equal(t, model.SidebarCategoryDirectMessages, res.Categories[2].Type)
   429  	})
   430  }
   431  
   432  func TestAddUserToTeamByTeamId(t *testing.T) {
   433  	th := Setup(t).InitBasic()
   434  	defer th.TearDown()
   435  
   436  	t.Run("add user", func(t *testing.T) {
   437  		user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
   438  		ruser, _ := th.App.CreateUser(&user)
   439  
   440  		err := th.App.AddUserToTeamByTeamId(th.BasicTeam.Id, ruser)
   441  		require.Nil(t, err, "Should add user to the team")
   442  	})
   443  
   444  	t.Run("block user", func(t *testing.T) {
   445  		th.BasicTeam.AllowedDomains = "example.com"
   446  		_, err := th.App.UpdateTeam(th.BasicTeam)
   447  		require.Nil(t, err, "Should update the team")
   448  
   449  		user := model.User{Email: strings.ToLower(model.NewId()) + "test@invalid.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
   450  		ruser, _ := th.App.CreateUser(&user)
   451  		defer th.App.PermanentDeleteUser(&user)
   452  
   453  		err = th.App.AddUserToTeamByTeamId(th.BasicTeam.Id, ruser)
   454  		require.NotNil(t, err, "Should not add restricted user")
   455  		require.Equal(t, "JoinUserToTeam", err.Where, "Error should be JoinUserToTeam")
   456  	})
   457  
   458  }
   459  
   460  func TestPermanentDeleteTeam(t *testing.T) {
   461  	th := Setup(t).InitBasic()
   462  	defer th.TearDown()
   463  
   464  	team, err := th.App.CreateTeam(&model.Team{
   465  		DisplayName: "deletion-test",
   466  		Name:        "deletion-test",
   467  		Email:       "foo@foo.com",
   468  		Type:        model.TEAM_OPEN,
   469  	})
   470  	require.Nil(t, err, "Should create a team")
   471  
   472  	defer func() {
   473  		th.App.PermanentDeleteTeam(team)
   474  	}()
   475  
   476  	command, err := th.App.CreateCommand(&model.Command{
   477  		CreatorId: th.BasicUser.Id,
   478  		TeamId:    team.Id,
   479  		Trigger:   "foo",
   480  		URL:       "http://foo",
   481  		Method:    model.COMMAND_METHOD_POST,
   482  	})
   483  	require.Nil(t, err, "Should create a command")
   484  	defer th.App.DeleteCommand(command.Id)
   485  
   486  	command, err = th.App.GetCommand(command.Id)
   487  	require.NotNil(t, command, "command should not be nil")
   488  	require.Nil(t, err, "unable to get new command")
   489  
   490  	err = th.App.PermanentDeleteTeam(team)
   491  	require.Nil(t, err)
   492  
   493  	command, err = th.App.GetCommand(command.Id)
   494  	require.Nil(t, command, "command wasn't deleted")
   495  	require.NotNil(t, err, "should not return an error")
   496  
   497  	// Test deleting a team with no channels.
   498  	team = th.CreateTeam()
   499  	defer func() {
   500  		th.App.PermanentDeleteTeam(team)
   501  	}()
   502  
   503  	channels, err := th.App.GetPublicChannelsForTeam(team.Id, 0, 1000)
   504  	require.Nil(t, err)
   505  
   506  	for _, channel := range *channels {
   507  		err2 := th.App.PermanentDeleteChannel(channel)
   508  		require.Nil(t, err2)
   509  	}
   510  
   511  	err = th.App.PermanentDeleteTeam(team)
   512  	require.Nil(t, err)
   513  }
   514  
   515  func TestSanitizeTeam(t *testing.T) {
   516  	th := Setup(t)
   517  	defer th.TearDown()
   518  
   519  	team := &model.Team{
   520  		Id:             model.NewId(),
   521  		Email:          th.MakeEmail(),
   522  		InviteId:       model.NewId(),
   523  		AllowedDomains: "example.com",
   524  	}
   525  
   526  	copyTeam := func() *model.Team {
   527  		copy := &model.Team{}
   528  		*copy = *team
   529  		return copy
   530  	}
   531  
   532  	t.Run("not a user of the team", func(t *testing.T) {
   533  		userId := model.NewId()
   534  		session := model.Session{
   535  			Roles: model.SYSTEM_USER_ROLE_ID,
   536  			TeamMembers: []*model.TeamMember{
   537  				{
   538  					UserId: userId,
   539  					TeamId: model.NewId(),
   540  					Roles:  model.TEAM_USER_ROLE_ID,
   541  				},
   542  			},
   543  		}
   544  
   545  		sanitized := th.App.SanitizeTeam(session, copyTeam())
   546  		require.Empty(t, sanitized.Email, "should've sanitized team")
   547  		require.Empty(t, sanitized.InviteId, "should've sanitized inviteid")
   548  	})
   549  
   550  	t.Run("user of the team", func(t *testing.T) {
   551  		userId := model.NewId()
   552  		session := model.Session{
   553  			Roles: model.SYSTEM_USER_ROLE_ID,
   554  			TeamMembers: []*model.TeamMember{
   555  				{
   556  					UserId: userId,
   557  					TeamId: team.Id,
   558  					Roles:  model.TEAM_USER_ROLE_ID,
   559  				},
   560  			},
   561  		}
   562  
   563  		sanitized := th.App.SanitizeTeam(session, copyTeam())
   564  		require.Empty(t, sanitized.Email, "should've sanitized team")
   565  		require.NotEmpty(t, sanitized.InviteId, "should have not sanitized inviteid")
   566  	})
   567  
   568  	t.Run("team admin", func(t *testing.T) {
   569  		userId := model.NewId()
   570  		session := model.Session{
   571  			Roles: model.SYSTEM_USER_ROLE_ID,
   572  			TeamMembers: []*model.TeamMember{
   573  				{
   574  					UserId: userId,
   575  					TeamId: team.Id,
   576  					Roles:  model.TEAM_USER_ROLE_ID + " " + model.TEAM_ADMIN_ROLE_ID,
   577  				},
   578  			},
   579  		}
   580  
   581  		sanitized := th.App.SanitizeTeam(session, copyTeam())
   582  		require.NotEmpty(t, sanitized.Email, "shouldn't have sanitized team")
   583  		require.NotEmpty(t, sanitized.InviteId, "shouldn't have sanitized inviteid")
   584  	})
   585  
   586  	t.Run("team admin of another team", func(t *testing.T) {
   587  		userId := model.NewId()
   588  		session := model.Session{
   589  			Roles: model.SYSTEM_USER_ROLE_ID,
   590  			TeamMembers: []*model.TeamMember{
   591  				{
   592  					UserId: userId,
   593  					TeamId: model.NewId(),
   594  					Roles:  model.TEAM_USER_ROLE_ID + " " + model.TEAM_ADMIN_ROLE_ID,
   595  				},
   596  			},
   597  		}
   598  
   599  		sanitized := th.App.SanitizeTeam(session, copyTeam())
   600  		require.Empty(t, sanitized.Email, "should've sanitized team")
   601  		require.Empty(t, sanitized.InviteId, "should've sanitized inviteid")
   602  	})
   603  
   604  	t.Run("system admin, not a user of team", func(t *testing.T) {
   605  		userId := model.NewId()
   606  		session := model.Session{
   607  			Roles: model.SYSTEM_USER_ROLE_ID + " " + model.SYSTEM_ADMIN_ROLE_ID,
   608  			TeamMembers: []*model.TeamMember{
   609  				{
   610  					UserId: userId,
   611  					TeamId: model.NewId(),
   612  					Roles:  model.TEAM_USER_ROLE_ID,
   613  				},
   614  			},
   615  		}
   616  
   617  		sanitized := th.App.SanitizeTeam(session, copyTeam())
   618  		require.NotEmpty(t, sanitized.Email, "shouldn't have sanitized team")
   619  		require.NotEmpty(t, sanitized.InviteId, "shouldn't have sanitized inviteid")
   620  	})
   621  
   622  	t.Run("system admin, user of team", func(t *testing.T) {
   623  		userId := model.NewId()
   624  		session := model.Session{
   625  			Roles: model.SYSTEM_USER_ROLE_ID + " " + model.SYSTEM_ADMIN_ROLE_ID,
   626  			TeamMembers: []*model.TeamMember{
   627  				{
   628  					UserId: userId,
   629  					TeamId: team.Id,
   630  					Roles:  model.TEAM_USER_ROLE_ID,
   631  				},
   632  			},
   633  		}
   634  
   635  		sanitized := th.App.SanitizeTeam(session, copyTeam())
   636  		require.NotEmpty(t, sanitized.Email, "shouldn't have sanitized team")
   637  		require.NotEmpty(t, sanitized.InviteId, "shouldn't have sanitized inviteid")
   638  	})
   639  }
   640  
   641  func TestSanitizeTeams(t *testing.T) {
   642  	th := Setup(t)
   643  	defer th.TearDown()
   644  
   645  	t.Run("not a system admin", func(t *testing.T) {
   646  		teams := []*model.Team{
   647  			{
   648  				Id:             model.NewId(),
   649  				Email:          th.MakeEmail(),
   650  				AllowedDomains: "example.com",
   651  			},
   652  			{
   653  				Id:             model.NewId(),
   654  				Email:          th.MakeEmail(),
   655  				AllowedDomains: "example.com",
   656  			},
   657  		}
   658  
   659  		userId := model.NewId()
   660  		session := model.Session{
   661  			Roles: model.SYSTEM_USER_ROLE_ID,
   662  			TeamMembers: []*model.TeamMember{
   663  				{
   664  					UserId: userId,
   665  					TeamId: teams[0].Id,
   666  					Roles:  model.TEAM_USER_ROLE_ID,
   667  				},
   668  				{
   669  					UserId: userId,
   670  					TeamId: teams[1].Id,
   671  					Roles:  model.TEAM_USER_ROLE_ID + " " + model.TEAM_ADMIN_ROLE_ID,
   672  				},
   673  			},
   674  		}
   675  
   676  		sanitized := th.App.SanitizeTeams(session, teams)
   677  
   678  		require.Empty(t, sanitized[0].Email, "should've sanitized first team")
   679  		require.NotEmpty(t, sanitized[1].Email, "shouldn't have sanitized second team")
   680  	})
   681  
   682  	t.Run("system admin", func(t *testing.T) {
   683  		teams := []*model.Team{
   684  			{
   685  				Id:             model.NewId(),
   686  				Email:          th.MakeEmail(),
   687  				AllowedDomains: "example.com",
   688  			},
   689  			{
   690  				Id:             model.NewId(),
   691  				Email:          th.MakeEmail(),
   692  				AllowedDomains: "example.com",
   693  			},
   694  		}
   695  
   696  		userId := model.NewId()
   697  		session := model.Session{
   698  			Roles: model.SYSTEM_USER_ROLE_ID + " " + model.SYSTEM_ADMIN_ROLE_ID,
   699  			TeamMembers: []*model.TeamMember{
   700  				{
   701  					UserId: userId,
   702  					TeamId: teams[0].Id,
   703  					Roles:  model.TEAM_USER_ROLE_ID,
   704  				},
   705  			},
   706  		}
   707  
   708  		sanitized := th.App.SanitizeTeams(session, teams)
   709  		assert.NotEmpty(t, sanitized[0].Email, "shouldn't have sanitized first team")
   710  		assert.NotEmpty(t, sanitized[1].Email, "shouldn't have sanitized second team")
   711  	})
   712  }
   713  
   714  func TestJoinUserToTeam(t *testing.T) {
   715  	th := Setup(t)
   716  	defer th.TearDown()
   717  
   718  	id := model.NewId()
   719  	team := &model.Team{
   720  		DisplayName: "dn_" + id,
   721  		Name:        "name" + id,
   722  		Email:       "success+" + id + "@simulator.amazonses.com",
   723  		Type:        model.TEAM_OPEN,
   724  	}
   725  
   726  	_, err := th.App.CreateTeam(team)
   727  	require.Nil(t, err, "Should create a new team")
   728  
   729  	maxUsersPerTeam := th.App.Config().TeamSettings.MaxUsersPerTeam
   730  	defer func() {
   731  		th.App.UpdateConfig(func(cfg *model.Config) { cfg.TeamSettings.MaxUsersPerTeam = maxUsersPerTeam })
   732  		th.App.PermanentDeleteTeam(team)
   733  	}()
   734  	one := 1
   735  	th.App.UpdateConfig(func(cfg *model.Config) { cfg.TeamSettings.MaxUsersPerTeam = &one })
   736  
   737  	t.Run("new join", func(t *testing.T) {
   738  		user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
   739  		ruser, _ := th.App.CreateUser(&user)
   740  		defer th.App.PermanentDeleteUser(&user)
   741  
   742  		var alreadyAdded bool
   743  		_, alreadyAdded, err = th.App.joinUserToTeam(team, ruser)
   744  		require.False(t, alreadyAdded, "Should return already added equal to false")
   745  		require.Nil(t, err, "Should return no error")
   746  	})
   747  
   748  	t.Run("join when you are a member", func(t *testing.T) {
   749  		user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
   750  		ruser, _ := th.App.CreateUser(&user)
   751  		defer th.App.PermanentDeleteUser(&user)
   752  
   753  		th.App.joinUserToTeam(team, ruser)
   754  
   755  		var alreadyAdded bool
   756  		_, alreadyAdded, err = th.App.joinUserToTeam(team, ruser)
   757  		require.True(t, alreadyAdded, "Should return already added")
   758  		require.Nil(t, err, "Should return no error")
   759  	})
   760  
   761  	t.Run("re-join after leaving", func(t *testing.T) {
   762  		user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
   763  		ruser, _ := th.App.CreateUser(&user)
   764  		defer th.App.PermanentDeleteUser(&user)
   765  
   766  		th.App.joinUserToTeam(team, ruser)
   767  		th.App.LeaveTeam(team, ruser, ruser.Id)
   768  
   769  		var alreadyAdded bool
   770  		_, alreadyAdded, err = th.App.joinUserToTeam(team, ruser)
   771  		require.False(t, alreadyAdded, "Should return already added equal to false")
   772  		require.Nil(t, err, "Should return no error")
   773  	})
   774  
   775  	t.Run("new join with limit problem", func(t *testing.T) {
   776  		user1 := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
   777  		ruser1, _ := th.App.CreateUser(&user1)
   778  		user2 := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
   779  		ruser2, _ := th.App.CreateUser(&user2)
   780  
   781  		defer th.App.PermanentDeleteUser(&user1)
   782  		defer th.App.PermanentDeleteUser(&user2)
   783  		th.App.joinUserToTeam(team, ruser1)
   784  
   785  		_, _, err = th.App.joinUserToTeam(team, ruser2)
   786  		require.NotNil(t, err, "Should fail")
   787  	})
   788  
   789  	t.Run("re-join alfter leaving with limit problem", func(t *testing.T) {
   790  		user1 := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
   791  		ruser1, _ := th.App.CreateUser(&user1)
   792  
   793  		user2 := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
   794  		ruser2, _ := th.App.CreateUser(&user2)
   795  
   796  		defer th.App.PermanentDeleteUser(&user1)
   797  		defer th.App.PermanentDeleteUser(&user2)
   798  
   799  		th.App.joinUserToTeam(team, ruser1)
   800  		th.App.LeaveTeam(team, ruser1, ruser1.Id)
   801  		th.App.joinUserToTeam(team, ruser2)
   802  
   803  		_, _, err = th.App.joinUserToTeam(team, ruser1)
   804  		require.NotNil(t, err, "Should fail")
   805  	})
   806  
   807  	t.Run("new join with correct scheme_admin value from group syncable", func(t *testing.T) {
   808  		user1 := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
   809  		ruser1, _ := th.App.CreateUser(&user1)
   810  		defer th.App.PermanentDeleteUser(&user1)
   811  
   812  		group := th.CreateGroup()
   813  
   814  		_, err = th.App.UpsertGroupMember(group.Id, user1.Id)
   815  		require.Nil(t, err)
   816  
   817  		gs, err := th.App.UpsertGroupSyncable(&model.GroupSyncable{
   818  			AutoAdd:     true,
   819  			SyncableId:  team.Id,
   820  			Type:        model.GroupSyncableTypeTeam,
   821  			GroupId:     group.Id,
   822  			SchemeAdmin: false,
   823  		})
   824  		require.Nil(t, err)
   825  
   826  		th.App.UpdateConfig(func(cfg *model.Config) { cfg.TeamSettings.MaxUsersPerTeam = model.NewInt(999) })
   827  
   828  		tm1, _, err := th.App.joinUserToTeam(team, ruser1)
   829  		require.Nil(t, err)
   830  		require.False(t, tm1.SchemeAdmin)
   831  
   832  		user2 := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
   833  		ruser2, _ := th.App.CreateUser(&user2)
   834  		defer th.App.PermanentDeleteUser(&user2)
   835  
   836  		_, err = th.App.UpsertGroupMember(group.Id, user2.Id)
   837  		require.Nil(t, err)
   838  
   839  		gs.SchemeAdmin = true
   840  		_, err = th.App.UpdateGroupSyncable(gs)
   841  		require.Nil(t, err)
   842  
   843  		tm2, _, err := th.App.joinUserToTeam(team, ruser2)
   844  		require.Nil(t, err)
   845  		require.True(t, tm2.SchemeAdmin)
   846  	})
   847  }
   848  
   849  func TestAppUpdateTeamScheme(t *testing.T) {
   850  	th := Setup(t).InitBasic()
   851  	defer th.TearDown()
   852  
   853  	team := th.BasicTeam
   854  	mockID := model.NewString("x")
   855  	team.SchemeId = mockID
   856  
   857  	updatedTeam, err := th.App.UpdateTeamScheme(th.BasicTeam)
   858  	require.Nil(t, err)
   859  	require.Equal(t, mockID, updatedTeam.SchemeId, "Wrong Team SchemeId")
   860  }
   861  
   862  func TestGetTeamMembers(t *testing.T) {
   863  	th := Setup(t).InitBasic()
   864  	defer th.TearDown()
   865  
   866  	var users []model.User
   867  	users = append(users, *th.BasicUser)
   868  	users = append(users, *th.BasicUser2)
   869  
   870  	for i := 0; i < 8; i++ {
   871  		user := model.User{
   872  			Email:    strings.ToLower(model.NewId()) + "success+test@example.com",
   873  			Username: fmt.Sprintf("user%v", i),
   874  			Password: "passwd1",
   875  			DeleteAt: int64(rand.Intn(2)),
   876  		}
   877  		ruser, err := th.App.CreateUser(&user)
   878  		require.Nil(t, err)
   879  		require.NotNil(t, ruser)
   880  		defer th.App.PermanentDeleteUser(&user)
   881  
   882  		_, err = th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
   883  		require.Nil(t, err)
   884  
   885  		// Store the users for comparison later
   886  		users = append(users, *ruser)
   887  	}
   888  
   889  	t.Run("Ensure Sorted By Username when TeamMemberGet options is passed", func(t *testing.T) {
   890  		members, err := th.App.GetTeamMembers(th.BasicTeam.Id, 0, 100, &model.TeamMembersGetOptions{Sort: model.USERNAME})
   891  		require.Nil(t, err)
   892  
   893  		// Sort the users array by username
   894  		sort.Slice(users, func(i, j int) bool {
   895  			return users[i].Username < users[j].Username
   896  		})
   897  
   898  		// We should have the same number of users in both users and members array as we have not excluded any deleted members
   899  		require.Equal(t, len(users), len(members))
   900  		for i, member := range members {
   901  			assert.Equal(t, users[i].Id, member.UserId)
   902  		}
   903  	})
   904  
   905  	t.Run("Ensure ExcludedDeletedUsers when TeamMemberGetOptions is passed", func(t *testing.T) {
   906  		members, err := th.App.GetTeamMembers(th.BasicTeam.Id, 0, 100, &model.TeamMembersGetOptions{ExcludeDeletedUsers: true})
   907  		require.Nil(t, err)
   908  
   909  		// Choose all users who aren't deleted from our users array
   910  		var usersNotDeletedIDs []string
   911  		var membersIDs []string
   912  		for _, u := range users {
   913  			if u.DeleteAt == 0 {
   914  				usersNotDeletedIDs = append(usersNotDeletedIDs, u.Id)
   915  			}
   916  		}
   917  
   918  		for _, m := range members {
   919  			membersIDs = append(membersIDs, m.UserId)
   920  		}
   921  
   922  		require.Equal(t, len(usersNotDeletedIDs), len(membersIDs))
   923  		require.ElementsMatch(t, usersNotDeletedIDs, membersIDs)
   924  	})
   925  
   926  	t.Run("Ensure Sorted By Username and ExcludedDeletedUsers when TeamMemberGetOptions is passed", func(t *testing.T) {
   927  		members, err := th.App.GetTeamMembers(th.BasicTeam.Id, 0, 100, &model.TeamMembersGetOptions{Sort: model.USERNAME, ExcludeDeletedUsers: true})
   928  		require.Nil(t, err)
   929  
   930  		var usersNotDeleted []model.User
   931  		for _, u := range users {
   932  			if u.DeleteAt == 0 {
   933  				usersNotDeleted = append(usersNotDeleted, u)
   934  			}
   935  		}
   936  
   937  		// Sort our non deleted members by username
   938  		sort.Slice(usersNotDeleted, func(i, j int) bool {
   939  			return usersNotDeleted[i].Username < usersNotDeleted[j].Username
   940  		})
   941  
   942  		require.Equal(t, len(usersNotDeleted), len(members))
   943  		for i, member := range members {
   944  			assert.Equal(t, usersNotDeleted[i].Id, member.UserId)
   945  		}
   946  	})
   947  
   948  	t.Run("Ensure Sorted By User ID when no TeamMemberGetOptions is passed", func(t *testing.T) {
   949  
   950  		// Sort them by UserID because the result of GetTeamMembers() is also sorted
   951  		sort.Slice(users, func(i, j int) bool {
   952  			return users[i].Id < users[j].Id
   953  		})
   954  
   955  		// Fetch team members multipile times
   956  		members, err := th.App.GetTeamMembers(th.BasicTeam.Id, 0, 5, nil)
   957  		require.Nil(t, err)
   958  
   959  		// This should return 5 members
   960  		members2, err := th.App.GetTeamMembers(th.BasicTeam.Id, 5, 6, nil)
   961  		require.Nil(t, err)
   962  		members = append(members, members2...)
   963  
   964  		require.Equal(t, len(users), len(members))
   965  		for i, member := range members {
   966  			assert.Equal(t, users[i].Id, member.UserId)
   967  		}
   968  	})
   969  }
   970  
   971  func TestGetTeamStats(t *testing.T) {
   972  	th := Setup(t).InitBasic()
   973  	defer th.TearDown()
   974  
   975  	t.Run("without view restrictions", func(t *testing.T) {
   976  		teamStats, err := th.App.GetTeamStats(th.BasicTeam.Id, nil)
   977  		require.Nil(t, err)
   978  		require.NotNil(t, teamStats)
   979  		members, err := th.App.GetTeamMembers(th.BasicTeam.Id, 0, 5, nil)
   980  		require.Nil(t, err)
   981  		assert.Equal(t, int64(len(members)), teamStats.TotalMemberCount)
   982  		assert.Equal(t, int64(len(members)), teamStats.ActiveMemberCount)
   983  	})
   984  
   985  	t.Run("with view restrictions by this team", func(t *testing.T) {
   986  		restrictions := &model.ViewUsersRestrictions{Teams: []string{th.BasicTeam.Id}}
   987  		teamStats, err := th.App.GetTeamStats(th.BasicTeam.Id, restrictions)
   988  		require.Nil(t, err)
   989  		require.NotNil(t, teamStats)
   990  		members, err := th.App.GetTeamMembers(th.BasicTeam.Id, 0, 5, nil)
   991  		require.Nil(t, err)
   992  		assert.Equal(t, int64(len(members)), teamStats.TotalMemberCount)
   993  		assert.Equal(t, int64(len(members)), teamStats.ActiveMemberCount)
   994  	})
   995  
   996  	t.Run("with view restrictions by valid channel", func(t *testing.T) {
   997  		restrictions := &model.ViewUsersRestrictions{Teams: []string{}, Channels: []string{th.BasicChannel.Id}}
   998  		teamStats, err := th.App.GetTeamStats(th.BasicTeam.Id, restrictions)
   999  		require.Nil(t, err)
  1000  		require.NotNil(t, teamStats)
  1001  		members, err := th.App.GetChannelMembersPage(th.BasicChannel.Id, 0, 5)
  1002  		require.Nil(t, err)
  1003  		assert.Equal(t, int64(len(*members)), teamStats.TotalMemberCount)
  1004  		assert.Equal(t, int64(len(*members)), teamStats.ActiveMemberCount)
  1005  	})
  1006  
  1007  	t.Run("with view restrictions to not see anything", func(t *testing.T) {
  1008  		restrictions := &model.ViewUsersRestrictions{Teams: []string{}, Channels: []string{}}
  1009  		teamStats, err := th.App.GetTeamStats(th.BasicTeam.Id, restrictions)
  1010  		require.Nil(t, err)
  1011  		require.NotNil(t, teamStats)
  1012  		assert.Equal(t, int64(0), teamStats.TotalMemberCount)
  1013  		assert.Equal(t, int64(0), teamStats.ActiveMemberCount)
  1014  	})
  1015  
  1016  	t.Run("with view restrictions by other team", func(t *testing.T) {
  1017  		restrictions := &model.ViewUsersRestrictions{Teams: []string{"other-team-id"}}
  1018  		teamStats, err := th.App.GetTeamStats(th.BasicTeam.Id, restrictions)
  1019  		require.Nil(t, err)
  1020  		require.NotNil(t, teamStats)
  1021  		assert.Equal(t, int64(0), teamStats.TotalMemberCount)
  1022  		assert.Equal(t, int64(0), teamStats.ActiveMemberCount)
  1023  	})
  1024  
  1025  	t.Run("with view restrictions by not-existing channel", func(t *testing.T) {
  1026  		restrictions := &model.ViewUsersRestrictions{Teams: []string{}, Channels: []string{"test"}}
  1027  		teamStats, err := th.App.GetTeamStats(th.BasicTeam.Id, restrictions)
  1028  		require.Nil(t, err)
  1029  		require.NotNil(t, teamStats)
  1030  		assert.Equal(t, int64(0), teamStats.TotalMemberCount)
  1031  		assert.Equal(t, int64(0), teamStats.ActiveMemberCount)
  1032  	})
  1033  }
  1034  
  1035  func TestUpdateTeamMemberRolesChangingGuest(t *testing.T) {
  1036  	th := Setup(t).InitBasic()
  1037  	defer th.TearDown()
  1038  
  1039  	t.Run("from guest to user", func(t *testing.T) {
  1040  		user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
  1041  		ruser, _ := th.App.CreateGuest(&user)
  1042  
  1043  		_, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
  1044  		require.Nil(t, err)
  1045  
  1046  		_, err = th.App.UpdateTeamMemberRoles(th.BasicTeam.Id, ruser.Id, "team_user")
  1047  		require.NotNil(t, err, "Should fail when try to modify the guest role")
  1048  	})
  1049  
  1050  	t.Run("from user to guest", func(t *testing.T) {
  1051  		user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
  1052  		ruser, _ := th.App.CreateUser(&user)
  1053  
  1054  		_, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
  1055  		require.Nil(t, err)
  1056  
  1057  		_, err = th.App.UpdateTeamMemberRoles(th.BasicTeam.Id, ruser.Id, "team_guest")
  1058  		require.NotNil(t, err, "Should fail when try to modify the guest role")
  1059  	})
  1060  
  1061  	t.Run("from user to admin", func(t *testing.T) {
  1062  		user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
  1063  		ruser, _ := th.App.CreateUser(&user)
  1064  
  1065  		_, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
  1066  		require.Nil(t, err)
  1067  
  1068  		_, err = th.App.UpdateTeamMemberRoles(th.BasicTeam.Id, ruser.Id, "team_user team_admin")
  1069  		require.Nil(t, err, "Should work when you not modify guest role")
  1070  	})
  1071  
  1072  	t.Run("from guest to guest plus custom", func(t *testing.T) {
  1073  		user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
  1074  		ruser, _ := th.App.CreateGuest(&user)
  1075  
  1076  		_, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
  1077  		require.Nil(t, err)
  1078  
  1079  		_, err = th.App.CreateRole(&model.Role{Name: "custom", DisplayName: "custom", Description: "custom"})
  1080  		require.Nil(t, err)
  1081  
  1082  		_, err = th.App.UpdateTeamMemberRoles(th.BasicTeam.Id, ruser.Id, "team_guest custom")
  1083  		require.Nil(t, err, "Should work when you not modify guest role")
  1084  	})
  1085  
  1086  	t.Run("a guest cant have user role", func(t *testing.T) {
  1087  		user := model.User{Email: strings.ToLower(model.NewId()) + "success+test@example.com", Nickname: "Darth Vader", Username: "vader" + model.NewId(), Password: "passwd1", AuthService: ""}
  1088  		ruser, _ := th.App.CreateGuest(&user)
  1089  
  1090  		_, err := th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
  1091  		require.Nil(t, err)
  1092  
  1093  		_, err = th.App.UpdateTeamMemberRoles(th.BasicTeam.Id, ruser.Id, "team_guest team_user")
  1094  		require.NotNil(t, err, "Should work when you not modify guest role")
  1095  	})
  1096  }
  1097  
  1098  func TestInvalidateAllEmailInvites(t *testing.T) {
  1099  	th := Setup(t)
  1100  	defer th.TearDown()
  1101  
  1102  	t1 := model.Token{
  1103  		Token:    "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  1104  		CreateAt: model.GetMillis(),
  1105  		Type:     TOKEN_TYPE_GUEST_INVITATION,
  1106  		Extra:    "",
  1107  	}
  1108  	err := th.App.Srv().Store.Token().Save(&t1)
  1109  	require.Nil(t, err)
  1110  
  1111  	t2 := model.Token{
  1112  		Token:    "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
  1113  		CreateAt: model.GetMillis(),
  1114  		Type:     TOKEN_TYPE_TEAM_INVITATION,
  1115  		Extra:    "",
  1116  	}
  1117  	err = th.App.Srv().Store.Token().Save(&t2)
  1118  	require.Nil(t, err)
  1119  
  1120  	t3 := model.Token{
  1121  		Token:    "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz",
  1122  		CreateAt: model.GetMillis(),
  1123  		Type:     "other",
  1124  		Extra:    "",
  1125  	}
  1126  	err = th.App.Srv().Store.Token().Save(&t3)
  1127  	require.Nil(t, err)
  1128  
  1129  	err = th.App.InvalidateAllEmailInvites()
  1130  	require.Nil(t, err)
  1131  
  1132  	_, err = th.App.Srv().Store.Token().GetByToken(t1.Token)
  1133  	require.NotNil(t, err)
  1134  
  1135  	_, err = th.App.Srv().Store.Token().GetByToken(t2.Token)
  1136  	require.NotNil(t, err)
  1137  
  1138  	_, err = th.App.Srv().Store.Token().GetByToken(t3.Token)
  1139  	require.Nil(t, err)
  1140  }
  1141  
  1142  func TestClearTeamMembersCache(t *testing.T) {
  1143  	th := SetupWithStoreMock(t)
  1144  	defer th.TearDown()
  1145  
  1146  	mockStore := th.App.Srv().Store.(*mocks.Store)
  1147  	mockTeamStore := mocks.TeamStore{}
  1148  	tms := []*model.TeamMember{}
  1149  	for i := 0; i < 200; i++ {
  1150  		tms = append(tms, &model.TeamMember{
  1151  			TeamId: "1",
  1152  		})
  1153  	}
  1154  	mockTeamStore.On("GetMembers", "teamID", 0, 100, mock.Anything).Return(tms, nil)
  1155  	mockTeamStore.On("GetMembers", "teamID", 100, 100, mock.Anything).Return([]*model.TeamMember{{
  1156  		TeamId: "1",
  1157  	}}, nil)
  1158  	mockStore.On("Team").Return(&mockTeamStore)
  1159  
  1160  	th.App.ClearTeamMembersCache("teamID")
  1161  }