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