github.com/masterhung0112/hk_server/v5@v5.0.0-20220302090640-ec71aef15e1c/store/storetest/user_store_test.go (about)

     1  package storetest
     2  
     3  import (
     4  	"context"
     5  	"strings"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/masterhung0112/hk_server/v5/model"
    10  	"github.com/masterhung0112/hk_server/v5/store"
    11  	"github.com/pkg/errors"
    12  	"github.com/stretchr/testify/suite"
    13  )
    14  
    15  const (
    16  	DAY_MILLISECONDS   = 24 * 60 * 60 * 1000
    17  	MONTH_MILLISECONDS = 31 * DAY_MILLISECONDS
    18  )
    19  
    20  // type UserStoreTestSuite struct {
    21  // 	suite.Suite
    22  // 	StoreTestSuite
    23  // }
    24  
    25  func sanitized(user *model.User) *model.User {
    26  	clonedUser := user.DeepCopy()
    27  	clonedUser.Sanitize(map[string]bool{})
    28  
    29  	return clonedUser
    30  }
    31  
    32  // type UserStoreTS struct {
    33  // 	suite.Suite
    34  // 	StoreTestSuite
    35  // }
    36  
    37  func (s *UserStoreTS) SetupTest() {
    38  	users, err := s.Store().User().GetAll()
    39  	s.Require().Nil(err, "failed cleaning up test users")
    40  
    41  	for _, u := range users {
    42  		err := s.Store().User().PermanentDelete(u.Id)
    43  		s.Require().Nil(err, "failed cleaning up test user %s", u.Username)
    44  	}
    45  }
    46  
    47  func TestUserStoreTS(t *testing.T) {
    48  	StoreTestSuiteWithSqlSupplier(t, &UserStoreTS{}, func(t *testing.T, testSuite StoreTestBaseSuite) {
    49  		suite.Run(t, testSuite)
    50  	})
    51  }
    52  
    53  func (s *UserStoreTS) cleanupStatusStore() {
    54  	_, execerr := s.SqlStore().GetMaster().ExecNoTimeout(` DELETE FROM Status `)
    55  	s.Require().Nil(execerr)
    56  }
    57  
    58  func (s *UserStoreTS) TestCount() {
    59  	teamId := model.NewId()
    60  	channelId := model.NewId()
    61  	regularUser := &model.User{}
    62  	regularUser.Email = MakeEmail()
    63  	regularUser.Roles = model.SYSTEM_USER_ROLE_ID
    64  	_, err := s.Store().User().Save(regularUser)
    65  	s.Require().Nil(err)
    66  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(regularUser.Id)) }()
    67  	_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: regularUser.Id, SchemeAdmin: false, SchemeUser: true}, -1)
    68  	s.Require().Nil(nErr)
    69  	_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{UserId: regularUser.Id, ChannelId: channelId, SchemeAdmin: false, SchemeUser: true, NotifyProps: model.GetDefaultChannelNotifyProps()})
    70  	s.Require().Nil(nErr)
    71  
    72  	guestUser := &model.User{}
    73  	guestUser.Email = MakeEmail()
    74  	guestUser.Roles = model.SYSTEM_GUEST_ROLE_ID
    75  	_, err = s.Store().User().Save(guestUser)
    76  	s.Require().Nil(err)
    77  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(guestUser.Id)) }()
    78  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: guestUser.Id, SchemeAdmin: false, SchemeUser: false, SchemeGuest: true}, -1)
    79  	s.Require().Nil(nErr)
    80  	_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{UserId: guestUser.Id, ChannelId: channelId, SchemeAdmin: false, SchemeUser: false, SchemeGuest: true, NotifyProps: model.GetDefaultChannelNotifyProps()})
    81  	s.Require().Nil(nErr)
    82  
    83  	teamAdmin := &model.User{}
    84  	teamAdmin.Email = MakeEmail()
    85  	teamAdmin.Roles = model.SYSTEM_USER_ROLE_ID
    86  	_, err = s.Store().User().Save(teamAdmin)
    87  	s.Require().Nil(err)
    88  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(teamAdmin.Id)) }()
    89  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: teamAdmin.Id, SchemeAdmin: true, SchemeUser: true}, -1)
    90  	s.Require().Nil(nErr)
    91  	_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{UserId: teamAdmin.Id, ChannelId: channelId, SchemeAdmin: true, SchemeUser: true, NotifyProps: model.GetDefaultChannelNotifyProps()})
    92  	s.Require().Nil(nErr)
    93  
    94  	sysAdmin := &model.User{}
    95  	sysAdmin.Email = MakeEmail()
    96  	sysAdmin.Roles = model.SYSTEM_ADMIN_ROLE_ID + " " + model.SYSTEM_USER_ROLE_ID
    97  	_, err = s.Store().User().Save(sysAdmin)
    98  	s.Require().Nil(err)
    99  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(sysAdmin.Id)) }()
   100  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: sysAdmin.Id, SchemeAdmin: false, SchemeUser: true}, -1)
   101  	s.Require().Nil(nErr)
   102  	_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{UserId: sysAdmin.Id, ChannelId: channelId, SchemeAdmin: true, SchemeUser: true, NotifyProps: model.GetDefaultChannelNotifyProps()})
   103  	s.Require().Nil(nErr)
   104  
   105  	// Deleted
   106  	deletedUser := &model.User{}
   107  	deletedUser.Email = MakeEmail()
   108  	deletedUser.DeleteAt = model.GetMillis()
   109  	_, err = s.Store().User().Save(deletedUser)
   110  	s.Require().Nil(err)
   111  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(deletedUser.Id)) }()
   112  
   113  	// Bot
   114  	botUser, err := s.Store().User().Save(&model.User{
   115  		Email: MakeEmail(),
   116  	})
   117  	s.Require().Nil(err)
   118  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(botUser.Id)) }()
   119  	_, nErr = s.Store().Bot().Save(&model.Bot{
   120  		UserId:   botUser.Id,
   121  		Username: botUser.Username,
   122  		OwnerId:  regularUser.Id,
   123  	})
   124  	s.Require().Nil(nErr)
   125  	botUser.IsBot = true
   126  	defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(botUser.Id)) }()
   127  
   128  	testCases := []struct {
   129  		Description string
   130  		Options     model.UserCountOptions
   131  		Expected    int64
   132  	}{
   133  		{
   134  			"No bot accounts no deleted accounts and no team id",
   135  			model.UserCountOptions{
   136  				IncludeBotAccounts: false,
   137  				IncludeDeleted:     false,
   138  				TeamId:             "",
   139  			},
   140  			4,
   141  		},
   142  		{
   143  			"Include bot accounts no deleted accounts and no team id",
   144  			model.UserCountOptions{
   145  				IncludeBotAccounts: true,
   146  				IncludeDeleted:     false,
   147  				TeamId:             "",
   148  			},
   149  			5,
   150  		},
   151  		{
   152  			"Include delete accounts no bots and no team id",
   153  			model.UserCountOptions{
   154  				IncludeBotAccounts: false,
   155  				IncludeDeleted:     true,
   156  				TeamId:             "",
   157  			},
   158  			5,
   159  		},
   160  		{
   161  			"Include bot accounts and deleted accounts and no team id",
   162  			model.UserCountOptions{
   163  				IncludeBotAccounts: true,
   164  				IncludeDeleted:     true,
   165  				TeamId:             "",
   166  			},
   167  			6,
   168  		},
   169  		{
   170  			"Include bot accounts, deleted accounts, exclude regular users with no team id",
   171  			model.UserCountOptions{
   172  				IncludeBotAccounts:  true,
   173  				IncludeDeleted:      true,
   174  				ExcludeRegularUsers: true,
   175  				TeamId:              "",
   176  			},
   177  			1,
   178  		},
   179  		{
   180  			"Include bot accounts and deleted accounts with existing team id",
   181  			model.UserCountOptions{
   182  				IncludeBotAccounts: true,
   183  				IncludeDeleted:     true,
   184  				TeamId:             teamId,
   185  			},
   186  			4,
   187  		},
   188  		{
   189  			"Include bot accounts and deleted accounts with fake team id",
   190  			model.UserCountOptions{
   191  				IncludeBotAccounts: true,
   192  				IncludeDeleted:     true,
   193  				TeamId:             model.NewId(),
   194  			},
   195  			0,
   196  		},
   197  		{
   198  			"Include bot accounts and deleted accounts with existing team id and view restrictions allowing team",
   199  			model.UserCountOptions{
   200  				IncludeBotAccounts: true,
   201  				IncludeDeleted:     true,
   202  				TeamId:             teamId,
   203  				ViewRestrictions:   &model.ViewUsersRestrictions{Teams: []string{teamId}},
   204  			},
   205  			4,
   206  		},
   207  		{
   208  			"Include bot accounts and deleted accounts with existing team id and view restrictions not allowing current team",
   209  			model.UserCountOptions{
   210  				IncludeBotAccounts: true,
   211  				IncludeDeleted:     true,
   212  				TeamId:             teamId,
   213  				ViewRestrictions:   &model.ViewUsersRestrictions{Teams: []string{model.NewId()}},
   214  			},
   215  			0,
   216  		},
   217  		{
   218  			"Filter by system admins only",
   219  			model.UserCountOptions{
   220  				TeamId: teamId,
   221  				Roles:  []string{model.SYSTEM_ADMIN_ROLE_ID},
   222  			},
   223  			1,
   224  		},
   225  		{
   226  			"Filter by system users only",
   227  			model.UserCountOptions{
   228  				TeamId: teamId,
   229  				Roles:  []string{model.SYSTEM_USER_ROLE_ID},
   230  			},
   231  			2,
   232  		},
   233  		{
   234  			"Filter by system guests only",
   235  			model.UserCountOptions{
   236  				TeamId: teamId,
   237  				Roles:  []string{model.SYSTEM_GUEST_ROLE_ID},
   238  			},
   239  			1,
   240  		},
   241  		{
   242  			"Filter by system admins and system users",
   243  			model.UserCountOptions{
   244  				TeamId: teamId,
   245  				Roles:  []string{model.SYSTEM_ADMIN_ROLE_ID, model.SYSTEM_USER_ROLE_ID},
   246  			},
   247  			3,
   248  		},
   249  		{
   250  			"Filter by system admins, system user and system guests",
   251  			model.UserCountOptions{
   252  				TeamId: teamId,
   253  				Roles:  []string{model.SYSTEM_ADMIN_ROLE_ID, model.SYSTEM_USER_ROLE_ID, model.SYSTEM_GUEST_ROLE_ID},
   254  			},
   255  			4,
   256  		},
   257  		{
   258  			"Filter by team admins",
   259  			model.UserCountOptions{
   260  				TeamId:    teamId,
   261  				TeamRoles: []string{model.TEAM_ADMIN_ROLE_ID},
   262  			},
   263  			1,
   264  		},
   265  		{
   266  			"Filter by team members",
   267  			model.UserCountOptions{
   268  				TeamId:    teamId,
   269  				TeamRoles: []string{model.TEAM_USER_ROLE_ID},
   270  			},
   271  			1,
   272  		},
   273  		{
   274  			"Filter by team guests",
   275  			model.UserCountOptions{
   276  				TeamId:    teamId,
   277  				TeamRoles: []string{model.TEAM_GUEST_ROLE_ID},
   278  			},
   279  			1,
   280  		},
   281  		{
   282  			"Filter by team guests and any system role",
   283  			model.UserCountOptions{
   284  				TeamId:    teamId,
   285  				TeamRoles: []string{model.TEAM_GUEST_ROLE_ID},
   286  				Roles:     []string{model.SYSTEM_ADMIN_ROLE_ID},
   287  			},
   288  			2,
   289  		},
   290  		{
   291  			"Filter by channel members",
   292  			model.UserCountOptions{
   293  				ChannelId:    channelId,
   294  				ChannelRoles: []string{model.CHANNEL_USER_ROLE_ID},
   295  			},
   296  			1,
   297  		},
   298  		{
   299  			"Filter by channel members and system admins",
   300  			model.UserCountOptions{
   301  				ChannelId:    channelId,
   302  				Roles:        []string{model.SYSTEM_ADMIN_ROLE_ID},
   303  				ChannelRoles: []string{model.CHANNEL_USER_ROLE_ID},
   304  			},
   305  			2,
   306  		},
   307  		{
   308  			"Filter by channel members and system admins and channel admins",
   309  			model.UserCountOptions{
   310  				ChannelId:    channelId,
   311  				Roles:        []string{model.SYSTEM_ADMIN_ROLE_ID},
   312  				ChannelRoles: []string{model.CHANNEL_USER_ROLE_ID, model.CHANNEL_ADMIN_ROLE_ID},
   313  			},
   314  			3,
   315  		},
   316  		{
   317  			"Filter by channel guests",
   318  			model.UserCountOptions{
   319  				ChannelId:    channelId,
   320  				ChannelRoles: []string{model.CHANNEL_GUEST_ROLE_ID},
   321  			},
   322  			1,
   323  		},
   324  		{
   325  			"Filter by channel guests and any system role",
   326  			model.UserCountOptions{
   327  				ChannelId:    channelId,
   328  				ChannelRoles: []string{model.CHANNEL_GUEST_ROLE_ID},
   329  				Roles:        []string{model.SYSTEM_ADMIN_ROLE_ID},
   330  			},
   331  			2,
   332  		},
   333  	}
   334  	for _, testCase := range testCases {
   335  		s.T().Run(testCase.Description, func(t *testing.T) {
   336  			count, err := s.Store().User().Count(testCase.Options)
   337  			s.Require().Nil(err)
   338  			s.Require().Equal(testCase.Expected, count)
   339  		})
   340  	}
   341  }
   342  
   343  func (s *UserStoreTS) TestSave() {
   344  	teamId := model.NewId()
   345  	maxUsersPerTeam := 50
   346  
   347  	u1 := model.User{
   348  		Email:    MakeEmail(),
   349  		Username: model.NewId(),
   350  	}
   351  
   352  	_, err := s.Store().User().Save(&u1)
   353  	s.Require().Nil(err, "couldn't save user")
   354  
   355  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
   356  
   357  	_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, maxUsersPerTeam)
   358  	s.Require().Nil(nErr)
   359  
   360  	_, err = s.Store().User().Save(&u1)
   361  	s.Require().NotNil(err, "shouldn't be able to update user from save")
   362  
   363  	u2 := model.User{
   364  		Email:    u1.Email,
   365  		Username: model.NewId(),
   366  	}
   367  	_, err = s.Store().User().Save(&u2)
   368  	s.Require().NotNil(err, "should be unique email")
   369  
   370  	u2.Email = MakeEmail()
   371  	u2.Username = u1.Username
   372  	_, err = s.Store().User().Save(&u2)
   373  	s.Require().NotNil(err, "should be unique username")
   374  
   375  	u2.Username = ""
   376  	_, err = s.Store().User().Save(&u2)
   377  	s.Require().NotNil(err, "should be unique username")
   378  
   379  	for i := 0; i < 49; i++ {
   380  		u := model.User{
   381  			Email:    MakeEmail(),
   382  			Username: model.NewId(),
   383  		}
   384  		_, err = s.Store().User().Save(&u)
   385  		s.Require().Nil(err, "couldn't save item")
   386  
   387  		defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u.Id)) }()
   388  
   389  		_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u.Id}, maxUsersPerTeam)
   390  		s.Require().Nil(nErr)
   391  	}
   392  
   393  	u2.Id = ""
   394  	u2.Email = MakeEmail()
   395  	u2.Username = model.NewId()
   396  	_, err = s.Store().User().Save(&u2)
   397  	s.Require().Nil(err, "couldn't save item")
   398  
   399  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }()
   400  
   401  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, maxUsersPerTeam)
   402  	s.Require().NotNil(nErr, "should be the limit")
   403  }
   404  
   405  func (s *UserStoreTS) TestUpdate() {
   406  	u1 := &model.User{
   407  		Email: MakeEmail(),
   408  	}
   409  	_, err := s.Store().User().Save(u1)
   410  	s.Require().Nil(err)
   411  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
   412  	_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1)
   413  	s.Require().Nil(nErr)
   414  
   415  	u2 := &model.User{
   416  		Email:       MakeEmail(),
   417  		AuthService: "ldap",
   418  	}
   419  	_, err = s.Store().User().Save(u2)
   420  	s.Require().Nil(err)
   421  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }()
   422  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}, -1)
   423  	s.Require().Nil(nErr)
   424  
   425  	_, err = s.Store().User().Update(u1, false)
   426  	s.Require().Nil(err)
   427  
   428  	missing := &model.User{}
   429  	_, err = s.Store().User().Update(missing, false)
   430  	s.Require().NotNil(err, "Update should have failed because of missing key")
   431  
   432  	newId := &model.User{
   433  		Id: model.NewId(),
   434  	}
   435  	_, err = s.Store().User().Update(newId, false)
   436  	s.Require().NotNil(err, "Update should have failed because id change")
   437  
   438  	u2.Email = MakeEmail()
   439  	_, err = s.Store().User().Update(u2, false)
   440  	s.Require().NotNil(err, "Update should have failed because you can't modify AD/LDAP fields")
   441  
   442  	u3 := &model.User{
   443  		Email:       MakeEmail(),
   444  		AuthService: "gitlab",
   445  	}
   446  	oldEmail := u3.Email
   447  	_, err = s.Store().User().Save(u3)
   448  	s.Require().Nil(err)
   449  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }()
   450  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u3.Id}, -1)
   451  	s.Require().Nil(nErr)
   452  
   453  	u3.Email = MakeEmail()
   454  	userUpdate, err := s.Store().User().Update(u3, false)
   455  	s.Require().Nil(err, "Update should not have failed")
   456  	s.Assert().Equal(oldEmail, userUpdate.New.Email, "Email should not have been updated as the update is not trusted")
   457  
   458  	u3.Email = MakeEmail()
   459  	userUpdate, err = s.Store().User().Update(u3, true)
   460  	s.Require().Nil(err, "Update should not have failed")
   461  	s.Assert().NotEqual(oldEmail, userUpdate.New.Email, "Email should have been updated as the update is trusted")
   462  
   463  	err = s.Store().User().UpdateLastPictureUpdate(u1.Id)
   464  	s.Require().Nil(err, "Update should not have failed")
   465  }
   466  
   467  func (s *UserStoreTS) TestResetLastPictureUpdate() {
   468  
   469  	u1 := &model.User{}
   470  	u1.Email = MakeEmail()
   471  	_, err := s.Store().User().Save(u1)
   472  	s.Require().NoError(err)
   473  	defer func() { s.Require().NoError(s.Store().User().PermanentDelete(u1.Id)) }()
   474  	_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1)
   475  	s.Require().NoError(nErr)
   476  
   477  	err = s.Store().User().UpdateLastPictureUpdate(u1.Id)
   478  	s.Require().NoError(err)
   479  
   480  	user, err := s.Store().User().Get(context.Background(), u1.Id)
   481  	s.Require().NoError(err)
   482  
   483  	s.Assert().NotZero(user.LastPictureUpdate)
   484  	s.Assert().NotZero(user.UpdateAt)
   485  
   486  	// Ensure update at timestamp changes
   487  	time.Sleep(time.Millisecond)
   488  
   489  	err = s.Store().User().ResetLastPictureUpdate(u1.Id)
   490  	s.Require().NoError(err)
   491  
   492  	s.Store().User().InvalidateProfileCacheForUser(u1.Id)
   493  
   494  	user2, err := s.Store().User().Get(context.Background(), u1.Id)
   495  	s.Require().NoError(err)
   496  
   497  	s.Assert().True(user2.UpdateAt > user.UpdateAt)
   498  	s.Assert().Zero(user2.LastPictureUpdate)
   499  }
   500  
   501  func (s *UserStoreTS) TestUpdatePassword() {
   502  	teamId := model.NewId()
   503  
   504  	u1 := &model.User{}
   505  	u1.Email = MakeEmail()
   506  	_, err := s.Store().User().Save(u1)
   507  	s.Require().Nil(err)
   508  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
   509  	_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)
   510  	s.Require().Nil(nErr)
   511  
   512  	hashedPassword := model.HashPassword("newpwd")
   513  
   514  	err = s.Store().User().UpdatePassword(u1.Id, hashedPassword)
   515  	s.Require().Nil(err)
   516  
   517  	user, err := s.Store().User().GetByEmail(u1.Email)
   518  	s.Require().Nil(err)
   519  	s.Require().Equal(user.Password, hashedPassword, "Password was not updated correctly")
   520  }
   521  
   522  func (s *UserStoreTS) TestUpdateUpdateAt() {
   523  	u1 := &model.User{}
   524  	u1.Email = MakeEmail()
   525  	_, err := s.Store().User().Save(u1)
   526  	s.Require().Nil(err)
   527  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
   528  	_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1)
   529  	s.Require().Nil(nErr)
   530  
   531  	_, err = s.Store().User().UpdateUpdateAt(u1.Id)
   532  	s.Require().Nil(err)
   533  
   534  	user, err := s.Store().User().Get(context.Background(), u1.Id)
   535  	s.Require().Nil(err)
   536  	s.Require().Less(u1.UpdateAt, user.UpdateAt, "UpdateAt not updated correctly")
   537  }
   538  
   539  func (s *UserStoreTS) TestUpdateAuthData() {
   540  	teamId := model.NewId()
   541  
   542  	u1 := &model.User{}
   543  	u1.Email = MakeEmail()
   544  	_, err := s.Store().User().Save(u1)
   545  	s.Require().Nil(err)
   546  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
   547  	_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)
   548  	s.Require().Nil(nErr)
   549  
   550  	service := "someservice"
   551  	authData := model.NewId()
   552  
   553  	_, err = s.Store().User().UpdateAuthData(u1.Id, service, &authData, "", true)
   554  	s.Require().Nil(err)
   555  
   556  	user, err := s.Store().User().GetByEmail(u1.Email)
   557  	s.Require().Nil(err)
   558  	s.Require().Equal(service, user.AuthService, "AuthService was not updated correctly")
   559  	s.Require().Equal(authData, *user.AuthData, "AuthData was not updated correctly")
   560  	s.Require().Equal("", user.Password, "Password was not cleared properly")
   561  }
   562  
   563  func (s *UserStoreTS) TestUpdateMfaSecret() {
   564  	u1 := model.User{}
   565  	u1.Email = MakeEmail()
   566  	_, err := s.Store().User().Save(&u1)
   567  	s.Require().Nil(err)
   568  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
   569  
   570  	err = s.Store().User().UpdateMfaSecret(u1.Id, "12345")
   571  	s.Require().Nil(err)
   572  
   573  	// should pass, no update will occur though
   574  	err = s.Store().User().UpdateMfaSecret("junk", "12345")
   575  	s.Require().Nil(err)
   576  }
   577  
   578  func (s *UserStoreTS) TestUpdateMfaActive() {
   579  	u1 := model.User{}
   580  	u1.Email = MakeEmail()
   581  	_, err := s.Store().User().Save(&u1)
   582  	s.Require().Nil(err)
   583  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
   584  
   585  	time.Sleep(time.Millisecond)
   586  
   587  	err = s.Store().User().UpdateMfaActive(u1.Id, true)
   588  	s.Require().Nil(err)
   589  
   590  	err = s.Store().User().UpdateMfaActive(u1.Id, false)
   591  	s.Require().Nil(err)
   592  
   593  	// should pass, no update will occur though
   594  	err = s.Store().User().UpdateMfaActive("junk", true)
   595  	s.Require().Nil(err)
   596  }
   597  
   598  func (s *UserStoreTS) TestGetProfilesInChannel() {
   599  	teamId := model.NewId()
   600  
   601  	u1, err := s.Store().User().Save(&model.User{
   602  		Email:    MakeEmail(),
   603  		Username: "u1" + model.NewId(),
   604  	})
   605  	s.Require().Nil(err)
   606  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
   607  	_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)
   608  	s.Require().Nil(nErr)
   609  
   610  	u2, err := s.Store().User().Save(&model.User{
   611  		Email:    MakeEmail(),
   612  		Username: "u2" + model.NewId(),
   613  	})
   614  	s.Require().Nil(err)
   615  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }()
   616  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)
   617  	s.Require().Nil(nErr)
   618  
   619  	u3, err := s.Store().User().Save(&model.User{
   620  		Email:    MakeEmail(),
   621  		Username: "u3" + model.NewId(),
   622  	})
   623  	s.Require().Nil(err)
   624  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }()
   625  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1)
   626  	s.Require().Nil(nErr)
   627  	_, nErr = s.Store().Bot().Save(&model.Bot{
   628  		UserId:   u3.Id,
   629  		Username: u3.Username,
   630  		OwnerId:  u1.Id,
   631  	})
   632  	s.Require().Nil(nErr)
   633  	u3.IsBot = true
   634  	defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }()
   635  
   636  	u4, err := s.Store().User().Save(&model.User{
   637  		Email:    MakeEmail(),
   638  		Username: "u4" + model.NewId(),
   639  	})
   640  	s.Require().Nil(err)
   641  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u4.Id)) }()
   642  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u4.Id}, -1)
   643  	s.Require().Nil(nErr)
   644  
   645  	ch1 := &model.Channel{
   646  		TeamId:      teamId,
   647  		DisplayName: "Profiles in channel",
   648  		Name:        "profiles-" + model.NewId(),
   649  		Type:        model.CHANNEL_OPEN,
   650  	}
   651  	c1, nErr := s.Store().Channel().Save(ch1, -1)
   652  	s.Require().Nil(nErr)
   653  
   654  	ch2 := &model.Channel{
   655  		TeamId:      teamId,
   656  		DisplayName: "Profiles in private",
   657  		Name:        "profiles-" + model.NewId(),
   658  		Type:        model.CHANNEL_PRIVATE,
   659  	}
   660  	c2, nErr := s.Store().Channel().Save(ch2, -1)
   661  	s.Require().Nil(nErr)
   662  
   663  	_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{
   664  		ChannelId:   c1.Id,
   665  		UserId:      u1.Id,
   666  		NotifyProps: model.GetDefaultChannelNotifyProps(),
   667  	})
   668  	s.Require().Nil(nErr)
   669  
   670  	_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{
   671  		ChannelId:   c1.Id,
   672  		UserId:      u2.Id,
   673  		NotifyProps: model.GetDefaultChannelNotifyProps(),
   674  	})
   675  	s.Require().Nil(nErr)
   676  
   677  	_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{
   678  		ChannelId:   c1.Id,
   679  		UserId:      u3.Id,
   680  		NotifyProps: model.GetDefaultChannelNotifyProps(),
   681  	})
   682  	s.Require().Nil(nErr)
   683  
   684  	_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{
   685  		ChannelId:   c1.Id,
   686  		UserId:      u4.Id,
   687  		NotifyProps: model.GetDefaultChannelNotifyProps(),
   688  	})
   689  	s.Require().Nil(nErr)
   690  
   691  	u4.DeleteAt = 1
   692  	_, err = s.Store().User().Update(u4, true)
   693  	s.Require().Nil(err)
   694  
   695  	_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{
   696  		ChannelId:   c2.Id,
   697  		UserId:      u1.Id,
   698  		NotifyProps: model.GetDefaultChannelNotifyProps(),
   699  	})
   700  	s.Require().Nil(nErr)
   701  
   702  	s.T().Run("get all users in channel 1, offset 0, limit 100", func(t *testing.T) {
   703  		users, err := s.Store().User().GetProfilesInChannel(&model.UserGetOptions{
   704  			InChannelId: c1.Id,
   705  			Page:        0,
   706  			PerPage:     100,
   707  		})
   708  		s.Require().Nil(err)
   709  		s.Assert().Equal([]*model.User{sanitized(u1), sanitized(u2), sanitized(u3), sanitized(u4)}, users)
   710  	})
   711  
   712  	s.T().Run("get only active users in channel 1, offset 0, limit 100", func(t *testing.T) {
   713  		users, err := s.Store().User().GetProfilesInChannel(&model.UserGetOptions{
   714  			InChannelId: c1.Id,
   715  			Page:        0,
   716  			PerPage:     100,
   717  			Active:      true,
   718  		})
   719  		s.Require().Nil(err)
   720  		s.Assert().Equal([]*model.User{sanitized(u1), sanitized(u2), sanitized(u3)}, users)
   721  	})
   722  
   723  	s.T().Run("get inactive users in channel 1, offset 0, limit 100", func(t *testing.T) {
   724  		users, err := s.Store().User().GetProfilesInChannel(&model.UserGetOptions{
   725  			InChannelId: c1.Id,
   726  			Page:        0,
   727  			PerPage:     100,
   728  			Inactive:    true,
   729  		})
   730  		s.Require().Nil(err)
   731  		s.Assert().Equal([]*model.User{sanitized(u4)}, users)
   732  	})
   733  
   734  	s.T().Run("get in channel 1, offset 1, limit 2", func(t *testing.T) {
   735  		users, err := s.Store().User().GetProfilesInChannel(&model.UserGetOptions{
   736  			InChannelId: c1.Id,
   737  			Page:        1,
   738  			PerPage:     1,
   739  		})
   740  		s.Require().Nil(err)
   741  		users_p2, err2 := s.Store().User().GetProfilesInChannel(&model.UserGetOptions{
   742  			InChannelId: c1.Id,
   743  			Page:        2,
   744  			PerPage:     1,
   745  		})
   746  		s.Require().Nil(err2)
   747  		users = append(users, users_p2...)
   748  		s.Assert().Equal([]*model.User{sanitized(u2), sanitized(u3)}, users)
   749  	})
   750  
   751  	s.T().Run("get in channel 2, offset 0, limit 1", func(t *testing.T) {
   752  		users, err := s.Store().User().GetProfilesInChannel(&model.UserGetOptions{
   753  			InChannelId: c2.Id,
   754  			Page:        0,
   755  			PerPage:     1,
   756  		})
   757  		s.Require().Nil(err)
   758  		s.Assert().Equal([]*model.User{sanitized(u1)}, users)
   759  	})
   760  }
   761  
   762  func (s *UserStoreTS) TestProfilesInChannelByStatus() {
   763  
   764  	s.cleanupStatusStore()
   765  
   766  	teamId := model.NewId()
   767  
   768  	u1, err := s.Store().User().Save(&model.User{
   769  		Email:    MakeEmail(),
   770  		Username: "u1" + model.NewId(),
   771  	})
   772  	s.Require().Nil(err)
   773  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
   774  	_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)
   775  	s.Require().Nil(nErr)
   776  
   777  	u2, err := s.Store().User().Save(&model.User{
   778  		Email:    MakeEmail(),
   779  		Username: "u2" + model.NewId(),
   780  	})
   781  	s.Require().Nil(err)
   782  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }()
   783  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)
   784  	s.Require().Nil(nErr)
   785  
   786  	u3, err := s.Store().User().Save(&model.User{
   787  		Email:    MakeEmail(),
   788  		Username: "u3" + model.NewId(),
   789  	})
   790  	s.Require().Nil(err)
   791  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }()
   792  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1)
   793  	s.Require().Nil(nErr)
   794  	_, nErr = s.Store().Bot().Save(&model.Bot{
   795  		UserId:   u3.Id,
   796  		Username: u3.Username,
   797  		OwnerId:  u1.Id,
   798  	})
   799  	s.Require().Nil(nErr)
   800  	u3.IsBot = true
   801  	defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }()
   802  
   803  	u4, err := s.Store().User().Save(&model.User{
   804  		Email:    MakeEmail(),
   805  		Username: "u4" + model.NewId(),
   806  	})
   807  	s.Require().Nil(err)
   808  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u4.Id)) }()
   809  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u4.Id}, -1)
   810  	s.Require().Nil(nErr)
   811  
   812  	ch1 := &model.Channel{
   813  		TeamId:      teamId,
   814  		DisplayName: "Profiles in channel",
   815  		Name:        "profiles-" + model.NewId(),
   816  		Type:        model.CHANNEL_OPEN,
   817  	}
   818  	c1, nErr := s.Store().Channel().Save(ch1, -1)
   819  	s.Require().Nil(nErr)
   820  
   821  	ch2 := &model.Channel{
   822  		TeamId:      teamId,
   823  		DisplayName: "Profiles in private",
   824  		Name:        "profiles-" + model.NewId(),
   825  		Type:        model.CHANNEL_PRIVATE,
   826  	}
   827  	c2, nErr := s.Store().Channel().Save(ch2, -1)
   828  	s.Require().Nil(nErr)
   829  
   830  	_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{
   831  		ChannelId:   c1.Id,
   832  		UserId:      u1.Id,
   833  		NotifyProps: model.GetDefaultChannelNotifyProps(),
   834  	})
   835  	s.Require().Nil(nErr)
   836  
   837  	_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{
   838  		ChannelId:   c1.Id,
   839  		UserId:      u2.Id,
   840  		NotifyProps: model.GetDefaultChannelNotifyProps(),
   841  	})
   842  	s.Require().Nil(nErr)
   843  
   844  	_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{
   845  		ChannelId:   c1.Id,
   846  		UserId:      u3.Id,
   847  		NotifyProps: model.GetDefaultChannelNotifyProps(),
   848  	})
   849  	s.Require().Nil(nErr)
   850  
   851  	_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{
   852  		ChannelId:   c1.Id,
   853  		UserId:      u4.Id,
   854  		NotifyProps: model.GetDefaultChannelNotifyProps(),
   855  	})
   856  	s.Require().Nil(nErr)
   857  
   858  	u4.DeleteAt = 1
   859  	_, err = s.Store().User().Update(u4, true)
   860  	s.Require().Nil(err)
   861  
   862  	_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{
   863  		ChannelId:   c2.Id,
   864  		UserId:      u1.Id,
   865  		NotifyProps: model.GetDefaultChannelNotifyProps(),
   866  	})
   867  	s.Require().Nil(nErr)
   868  	s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{
   869  		UserId: u1.Id,
   870  		Status: model.STATUS_DND,
   871  	}))
   872  	s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{
   873  		UserId: u2.Id,
   874  		Status: model.STATUS_AWAY,
   875  	}))
   876  	s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{
   877  		UserId: u3.Id,
   878  		Status: model.STATUS_ONLINE,
   879  	}))
   880  
   881  	s.T().Run("get all users in channel 1, offset 0, limit 100", func(t *testing.T) {
   882  		users, err := s.Store().User().GetProfilesInChannel(&model.UserGetOptions{
   883  			InChannelId: c1.Id,
   884  			Page:        0,
   885  			PerPage:     100,
   886  		})
   887  		s.Require().Nil(err)
   888  		s.Assert().Equal([]*model.User{sanitized(u1), sanitized(u2), sanitized(u3), sanitized(u4)}, users)
   889  	})
   890  
   891  	s.T().Run("get active in channel 1 by status, offset 0, limit 100", func(t *testing.T) {
   892  		users, err := s.Store().User().GetProfilesInChannelByStatus(&model.UserGetOptions{
   893  			InChannelId: c1.Id,
   894  			Page:        0,
   895  			PerPage:     100,
   896  			Active:      true,
   897  		})
   898  		s.Require().Nil(err)
   899  		s.Assert().Equal([]*model.User{sanitized(u3), sanitized(u2), sanitized(u1)}, users)
   900  	})
   901  
   902  	s.T().Run("get inactive users in channel 1, offset 0, limit 100", func(t *testing.T) {
   903  		users, err := s.Store().User().GetProfilesInChannel(&model.UserGetOptions{
   904  			InChannelId: c1.Id,
   905  			Page:        0,
   906  			PerPage:     100,
   907  			Inactive:    true,
   908  		})
   909  		s.Require().Nil(err)
   910  		s.Assert().Equal([]*model.User{sanitized(u4)}, users)
   911  	})
   912  
   913  	s.T().Run("get in channel 2 by status, offset 0, limit 1", func(t *testing.T) {
   914  		users, err := s.Store().User().GetProfilesInChannelByStatus(&model.UserGetOptions{
   915  			InChannelId: c2.Id,
   916  			Page:        0,
   917  			PerPage:     1,
   918  		})
   919  		s.Require().Nil(err)
   920  		s.Assert().Equal([]*model.User{sanitized(u1)}, users)
   921  	})
   922  }
   923  
   924  func (s *UserStoreTS) TestGetProfilesWithoutTeam() {
   925  	teamId := model.NewId()
   926  
   927  	u1, err := s.Store().User().Save(&model.User{
   928  		Email:    MakeEmail(),
   929  		Username: "u1" + model.NewId(),
   930  	})
   931  	s.Require().Nil(err)
   932  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
   933  	_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)
   934  	s.Require().Nil(nErr)
   935  
   936  	u2, err := s.Store().User().Save(&model.User{
   937  		Email:    MakeEmail(),
   938  		Username: "u2" + model.NewId(),
   939  	})
   940  	s.Require().Nil(err)
   941  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }()
   942  
   943  	u3, err := s.Store().User().Save(&model.User{
   944  		Email:    MakeEmail(),
   945  		Username: "u3" + model.NewId(),
   946  		DeleteAt: 1,
   947  		Roles:    "system_admin",
   948  	})
   949  	s.Require().Nil(err)
   950  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }()
   951  	_, nErr = s.Store().Bot().Save(&model.Bot{
   952  		UserId:   u3.Id,
   953  		Username: u3.Username,
   954  		OwnerId:  u1.Id,
   955  	})
   956  	s.Require().Nil(nErr)
   957  	u3.IsBot = true
   958  	defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }()
   959  
   960  	s.T().Run("get, page 0, per_page 100", func(t *testing.T) {
   961  		users, err := s.Store().User().GetProfilesWithoutTeam(&model.UserGetOptions{Page: 0, PerPage: 100})
   962  		s.Require().Nil(err)
   963  		s.Assert().Equal([]*model.User{sanitized(u2), sanitized(u3)}, users)
   964  	})
   965  
   966  	s.T().Run("get, page 1, per_page 1", func(t *testing.T) {
   967  		users, err := s.Store().User().GetProfilesWithoutTeam(&model.UserGetOptions{Page: 1, PerPage: 1})
   968  		s.Require().Nil(err)
   969  		s.Assert().Equal([]*model.User{sanitized(u3)}, users)
   970  	})
   971  
   972  	s.T().Run("get, page 2, per_page 1", func(t *testing.T) {
   973  		users, err := s.Store().User().GetProfilesWithoutTeam(&model.UserGetOptions{Page: 2, PerPage: 1})
   974  		s.Require().Nil(err)
   975  		s.Assert().Equal([]*model.User{}, users)
   976  	})
   977  
   978  	s.T().Run("get, page 0, per_page 100, inactive", func(t *testing.T) {
   979  		users, err := s.Store().User().GetProfilesWithoutTeam(&model.UserGetOptions{Page: 0, PerPage: 100, Inactive: true})
   980  		s.Require().Nil(err)
   981  		s.Assert().Equal([]*model.User{sanitized(u3)}, users)
   982  	})
   983  
   984  	s.T().Run("get, page 0, per_page 100, role", func(t *testing.T) {
   985  		users, err := s.Store().User().GetProfilesWithoutTeam(&model.UserGetOptions{Page: 0, PerPage: 100, Role: "system_admin"})
   986  		s.Require().Nil(err)
   987  		s.Assert().Equal([]*model.User{sanitized(u3)}, users)
   988  	})
   989  }
   990  
   991  func (s *UserStoreTS) TestGetProfilesByUsernames() {
   992  	teamId := model.NewId()
   993  	team2Id := model.NewId()
   994  
   995  	u1, err := s.Store().User().Save(&model.User{
   996  		Email:    MakeEmail(),
   997  		Username: "u1" + model.NewId(),
   998  	})
   999  	s.Require().Nil(err)
  1000  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
  1001  	_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)
  1002  	s.Require().Nil(nErr)
  1003  
  1004  	u2, err := s.Store().User().Save(&model.User{
  1005  		Email:    MakeEmail(),
  1006  		Username: "u2" + model.NewId(),
  1007  	})
  1008  	s.Require().Nil(err)
  1009  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }()
  1010  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)
  1011  	s.Require().Nil(nErr)
  1012  
  1013  	u3, err := s.Store().User().Save(&model.User{
  1014  		Email:    MakeEmail(),
  1015  		Username: "u3" + model.NewId(),
  1016  	})
  1017  	s.Require().Nil(err)
  1018  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }()
  1019  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: team2Id, UserId: u3.Id}, -1)
  1020  	s.Require().Nil(nErr)
  1021  	_, nErr = s.Store().Bot().Save(&model.Bot{
  1022  		UserId:   u3.Id,
  1023  		Username: u3.Username,
  1024  		OwnerId:  u1.Id,
  1025  	})
  1026  	s.Require().Nil(nErr)
  1027  	u3.IsBot = true
  1028  	defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }()
  1029  
  1030  	s.T().Run("get by u1 and u2 usernames, team id 1", func(t *testing.T) {
  1031  		users, err := s.Store().User().GetProfilesByUsernames([]string{u1.Username, u2.Username}, &model.ViewUsersRestrictions{Teams: []string{teamId}})
  1032  		s.Require().Nil(err)
  1033  		s.Assert().Equal([]*model.User{u1, u2}, users)
  1034  	})
  1035  
  1036  	s.T().Run("get by u1 username, team id 1", func(t *testing.T) {
  1037  		users, err := s.Store().User().GetProfilesByUsernames([]string{u1.Username}, &model.ViewUsersRestrictions{Teams: []string{teamId}})
  1038  		s.Require().Nil(err)
  1039  		s.Assert().Equal([]*model.User{u1}, users)
  1040  	})
  1041  
  1042  	s.T().Run("get by u1 and u3 usernames, no team id", func(t *testing.T) {
  1043  		users, err := s.Store().User().GetProfilesByUsernames([]string{u1.Username, u3.Username}, nil)
  1044  		s.Require().Nil(err)
  1045  		s.Assert().Equal([]*model.User{u1, u3}, users)
  1046  	})
  1047  
  1048  	s.T().Run("get by u1 and u3 usernames, team id 1", func(t *testing.T) {
  1049  		users, err := s.Store().User().GetProfilesByUsernames([]string{u1.Username, u3.Username}, &model.ViewUsersRestrictions{Teams: []string{teamId}})
  1050  		s.Require().Nil(err)
  1051  		s.Assert().Equal([]*model.User{u1}, users)
  1052  	})
  1053  
  1054  	s.T().Run("get by u1 and u3 usernames, team id 2", func(t *testing.T) {
  1055  		users, err := s.Store().User().GetProfilesByUsernames([]string{u1.Username, u3.Username}, &model.ViewUsersRestrictions{Teams: []string{team2Id}})
  1056  		s.Require().Nil(err)
  1057  		s.Assert().Equal([]*model.User{u3}, users)
  1058  	})
  1059  }
  1060  
  1061  // type UserStoreGetAllProfilesTS struct {
  1062  // 	suite.Suite
  1063  // 	StoreTestSuite
  1064  
  1065  // 	u1 *model.User
  1066  // 	u2 *model.User
  1067  // 	u3 *model.User
  1068  // 	u4 *model.User
  1069  // 	u5 *model.User
  1070  // 	u6 *model.User
  1071  // 	u7 *model.User
  1072  // }
  1073  
  1074  func TestUserStoreGetAllProfilesTS(t *testing.T) {
  1075  	StoreTestSuiteWithSqlSupplier(t, &UserStoreGetAllProfilesTS{}, func(t *testing.T, testSuite StoreTestBaseSuite) {
  1076  		suite.Run(t, testSuite)
  1077  	})
  1078  }
  1079  
  1080  func (s *UserStoreGetAllProfilesTS) SetupSuite() {
  1081  	// Clean all user first
  1082  	users, err := s.Store().User().GetAll()
  1083  	s.Require().Nil(err, "failed cleaning up test users")
  1084  
  1085  	for _, u := range users {
  1086  		err := s.Store().User().PermanentDelete(u.Id)
  1087  		s.Require().Nil(err, "failed cleaning up test user %s", u.Username)
  1088  	}
  1089  
  1090  	u1, err := s.Store().User().Save(&model.User{
  1091  		Email:    MakeEmail(),
  1092  		Username: "u1" + model.NewId(),
  1093  	})
  1094  	s.Require().Nil(err)
  1095  	s.u1 = u1
  1096  
  1097  	u2, err := s.Store().User().Save(&model.User{
  1098  		Email:    MakeEmail(),
  1099  		Username: "u2" + model.NewId(),
  1100  	})
  1101  	s.Require().Nil(err)
  1102  	s.u2 = u2
  1103  
  1104  	u3, err := s.Store().User().Save(&model.User{
  1105  		Email:    MakeEmail(),
  1106  		Username: "u3" + model.NewId(),
  1107  	})
  1108  	s.Require().Nil(err)
  1109  	s.u3 = u3
  1110  
  1111  	_, nErr := s.Store().Bot().Save(&model.Bot{
  1112  		UserId:   u3.Id,
  1113  		Username: u3.Username,
  1114  		OwnerId:  u1.Id,
  1115  	})
  1116  	s.Require().Nil(nErr)
  1117  	u3.IsBot = true
  1118  
  1119  	u4, err := s.Store().User().Save(&model.User{
  1120  		Email:    MakeEmail(),
  1121  		Username: "u4" + model.NewId(),
  1122  		Roles:    "system_user some-other-role",
  1123  	})
  1124  	s.Require().Nil(err)
  1125  	s.u4 = u4
  1126  
  1127  	u5, err := s.Store().User().Save(&model.User{
  1128  		Email:    MakeEmail(),
  1129  		Username: "u5" + model.NewId(),
  1130  		Roles:    "system_admin",
  1131  	})
  1132  	s.Require().Nil(err)
  1133  	s.u5 = u5
  1134  
  1135  	u6, err := s.Store().User().Save(&model.User{
  1136  		Email:    MakeEmail(),
  1137  		Username: "u6" + model.NewId(),
  1138  		DeleteAt: model.GetMillis(),
  1139  		Roles:    "system_admin",
  1140  	})
  1141  	s.Require().Nil(err)
  1142  	s.u6 = u6
  1143  
  1144  	u7, err := s.Store().User().Save(&model.User{
  1145  		Email:    MakeEmail(),
  1146  		Username: "u7" + model.NewId(),
  1147  		DeleteAt: model.GetMillis(),
  1148  	})
  1149  	s.Require().Nil(err)
  1150  	s.u7 = u7
  1151  }
  1152  
  1153  func (s *UserStoreGetAllProfilesTS) TearDownSuite() {
  1154  	s.Require().Nil(s.Store().User().PermanentDelete(s.u1.Id))
  1155  	s.Require().Nil(s.Store().User().PermanentDelete(s.u2.Id))
  1156  	s.Require().Nil(s.Store().User().PermanentDelete(s.u3.Id))
  1157  	s.Require().Nil(s.Store().User().PermanentDelete(s.u4.Id))
  1158  	s.Require().Nil(s.Store().User().PermanentDelete(s.u5.Id))
  1159  	s.Require().Nil(s.Store().User().PermanentDelete(s.u6.Id))
  1160  	s.Require().Nil(s.Store().User().PermanentDelete(s.u7.Id))
  1161  }
  1162  
  1163  func (s *UserStoreGetAllProfilesTS) TestGetOffset0Limit100() {
  1164  	options := &model.UserGetOptions{Page: 0, PerPage: 100}
  1165  	actual, err := s.Store().User().GetAllProfiles(options)
  1166  	s.Require().Nil(err)
  1167  
  1168  	s.Require().Equal([]*model.User{
  1169  		sanitized(s.u1),
  1170  		sanitized(s.u2),
  1171  		sanitized(s.u3),
  1172  		sanitized(s.u4),
  1173  		sanitized(s.u5),
  1174  		sanitized(s.u6),
  1175  		sanitized(s.u7),
  1176  	}, actual)
  1177  }
  1178  
  1179  func (s *UserStoreGetAllProfilesTS) TestGetOffset0Limit1() {
  1180  	actual, err := s.Store().User().GetAllProfiles(&model.UserGetOptions{
  1181  		Page:    0,
  1182  		PerPage: 1,
  1183  	})
  1184  	s.Require().Nil(err)
  1185  	s.Require().Equal([]*model.User{
  1186  		sanitized(s.u1),
  1187  	}, actual)
  1188  }
  1189  
  1190  func (s *UserStoreGetAllProfilesTS) TestGetAll() {
  1191  	actual, err := s.Store().User().GetAll()
  1192  	s.Require().Nil(err)
  1193  	s.Require().Equal([]*model.User{
  1194  		s.u1,
  1195  		s.u2,
  1196  		s.u3,
  1197  		s.u4,
  1198  		s.u5,
  1199  		s.u6,
  1200  		s.u7,
  1201  	}, actual)
  1202  }
  1203  
  1204  // etag changes for all after user creation
  1205  func (s *UserStoreGetAllProfilesTS) TestEtagChangesForAllAfterUserCreation() {
  1206  	etag := s.Store().User().GetEtagForAllProfiles()
  1207  
  1208  	uNew := &model.User{}
  1209  	uNew.Email = MakeEmail()
  1210  	_, err := s.Store().User().Save(uNew)
  1211  	s.Require().Nil(err)
  1212  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(uNew.Id)) }()
  1213  
  1214  	updatedEtag := s.Store().User().GetEtagForAllProfiles()
  1215  	s.Require().NotEqual(etag, updatedEtag)
  1216  }
  1217  
  1218  func (s *UserStoreGetAllProfilesTS) TestFilterToSystemAdminRole() {
  1219  	actual, err := s.Store().User().GetAllProfiles(&model.UserGetOptions{
  1220  		Page:    0,
  1221  		PerPage: 10,
  1222  		Role:    "system_admin",
  1223  	})
  1224  	s.Require().Nil(err)
  1225  	s.Require().Equal([]*model.User{
  1226  		sanitized(s.u5),
  1227  		sanitized(s.u6),
  1228  	}, actual)
  1229  }
  1230  
  1231  func (s *UserStoreGetAllProfilesTS) TestFilterToSystemAdminRoleInactive() {
  1232  	actual, err := s.Store().User().GetAllProfiles(&model.UserGetOptions{
  1233  		Page:     0,
  1234  		PerPage:  10,
  1235  		Role:     "system_admin",
  1236  		Inactive: true,
  1237  	})
  1238  	s.Require().Nil(err)
  1239  	s.Require().Equal([]*model.User{
  1240  		sanitized(s.u6),
  1241  	}, actual)
  1242  }
  1243  
  1244  func (s *UserStoreGetAllProfilesTS) TestFilterToInactive() {
  1245  	actual, err := s.Store().User().GetAllProfiles(&model.UserGetOptions{
  1246  		Page:     0,
  1247  		PerPage:  10,
  1248  		Inactive: true,
  1249  	})
  1250  	s.Require().Nil(err)
  1251  	s.Require().Equal([]*model.User{
  1252  		sanitized(s.u6),
  1253  		sanitized(s.u7),
  1254  	}, actual)
  1255  }
  1256  
  1257  func (s *UserStoreGetAllProfilesTS) TestFilterToActive() {
  1258  	actual, err := s.Store().User().GetAllProfiles(&model.UserGetOptions{
  1259  		Page:    0,
  1260  		PerPage: 10,
  1261  		Active:  true,
  1262  	})
  1263  	s.Require().Nil(err)
  1264  	s.Require().Equal([]*model.User{
  1265  		sanitized(s.u1),
  1266  		sanitized(s.u2),
  1267  		sanitized(s.u3),
  1268  		sanitized(s.u4),
  1269  		sanitized(s.u5),
  1270  	}, actual)
  1271  }
  1272  
  1273  func (s *UserStoreGetAllProfilesTS) TestTryToFilterToActiveAndInactive() {
  1274  	actual, err := s.Store().User().GetAllProfiles(&model.UserGetOptions{
  1275  		Page:     0,
  1276  		PerPage:  10,
  1277  		Inactive: true,
  1278  		Active:   true,
  1279  	})
  1280  	s.Require().Nil(err)
  1281  	s.Require().Equal([]*model.User{
  1282  		sanitized(s.u6),
  1283  		sanitized(s.u7),
  1284  	}, actual)
  1285  }
  1286  
  1287  // type UserStoreGetProfilesTS struct {
  1288  // 	suite.Suite
  1289  // 	StoreTestSuite
  1290  
  1291  // 	u1     *model.User
  1292  // 	u2     *model.User
  1293  // 	u3     *model.User
  1294  // 	u4     *model.User
  1295  // 	u5     *model.User
  1296  // 	u6     *model.User
  1297  // 	u7     *model.User
  1298  // 	teamId string
  1299  // }
  1300  
  1301  func TestUserStoreGetProfilesTS(t *testing.T) {
  1302  	StoreTestSuiteWithSqlSupplier(t, &UserStoreGetProfilesTS{}, func(t *testing.T, testSuite StoreTestBaseSuite) {
  1303  		suite.Run(t, testSuite)
  1304  	})
  1305  }
  1306  
  1307  func (s *UserStoreGetProfilesTS) SetupSuite() {
  1308  	teamId := model.NewId()
  1309  	s.teamId = teamId
  1310  
  1311  	u1, err := s.Store().User().Save(&model.User{
  1312  		Email:    MakeEmail(),
  1313  		Username: "u1" + model.NewId(),
  1314  	})
  1315  	s.Require().Nil(err)
  1316  	_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)
  1317  	s.Require().Nil(nErr)
  1318  	s.u1 = u1
  1319  
  1320  	u2, err := s.Store().User().Save(&model.User{
  1321  		Email:    MakeEmail(),
  1322  		Username: "u2" + model.NewId(),
  1323  	})
  1324  	s.Require().Nil(err)
  1325  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)
  1326  	s.Require().Nil(nErr)
  1327  	s.u2 = u2
  1328  
  1329  	u3, err := s.Store().User().Save(&model.User{
  1330  		Email:    MakeEmail(),
  1331  		Username: "u3" + model.NewId(),
  1332  	})
  1333  	s.Require().Nil(err)
  1334  	_, nErr = s.Store().Bot().Save(&model.Bot{
  1335  		UserId:   u3.Id,
  1336  		Username: u3.Username,
  1337  		OwnerId:  u1.Id,
  1338  	})
  1339  	s.Require().Nil(nErr)
  1340  	s.u3 = u3
  1341  	s.u3.IsBot = true
  1342  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1)
  1343  	s.Require().Nil(nErr)
  1344  
  1345  	u4, err := s.Store().User().Save(&model.User{
  1346  		Email:    MakeEmail(),
  1347  		Username: "u4" + model.NewId(),
  1348  		Roles:    "system_admin",
  1349  	})
  1350  	s.Require().Nil(err)
  1351  	defer func() {}()
  1352  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u4.Id}, -1)
  1353  	s.Require().Nil(nErr)
  1354  	s.u4 = u4
  1355  
  1356  	u5, err := s.Store().User().Save(&model.User{
  1357  		Email:    MakeEmail(),
  1358  		Username: "u5" + model.NewId(),
  1359  		DeleteAt: model.GetMillis(),
  1360  	})
  1361  	s.Require().Nil(err)
  1362  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u5.Id}, -1)
  1363  	s.Require().Nil(nErr)
  1364  	s.u5 = u5
  1365  }
  1366  
  1367  func (s *UserStoreGetProfilesTS) TearDownSuite() {
  1368  	s.Require().Nil(s.Store().User().PermanentDelete(s.u1.Id))
  1369  	s.Require().Nil(s.Store().User().PermanentDelete(s.u2.Id))
  1370  	s.Require().Nil(s.Store().User().PermanentDelete(s.u3.Id))
  1371  	s.Require().Nil(s.Store().Bot().PermanentDelete(s.u3.Id))
  1372  	s.Require().Nil(s.Store().User().PermanentDelete(s.u4.Id))
  1373  	s.Require().Nil(s.Store().User().PermanentDelete(s.u5.Id))
  1374  }
  1375  
  1376  // get page 0, perPage 100
  1377  func (s *UserStoreGetProfilesTS) TestGetPage0PerPage100() {
  1378  	actual, err := s.Store().User().GetProfiles(&model.UserGetOptions{
  1379  		InTeamId: s.teamId,
  1380  		Page:     0,
  1381  		PerPage:  100,
  1382  	})
  1383  	s.Require().Nil(err)
  1384  
  1385  	s.Require().Equal([]*model.User{
  1386  		sanitized(s.u1),
  1387  		sanitized(s.u2),
  1388  		sanitized(s.u3),
  1389  		sanitized(s.u4),
  1390  		sanitized(s.u5),
  1391  	}, actual)
  1392  }
  1393  
  1394  // get page 0, perPage 1
  1395  func (s *UserStoreGetProfilesTS) TestGetPage0PerPage1() {
  1396  	actual, err := s.Store().User().GetProfiles(&model.UserGetOptions{
  1397  		InTeamId: s.teamId,
  1398  		Page:     0,
  1399  		PerPage:  1,
  1400  	})
  1401  	s.Require().Nil(err)
  1402  	s.Require().Equal([]*model.User{sanitized(s.u1)}, actual)
  1403  }
  1404  
  1405  // get unknown team id
  1406  func (s *UserStoreGetProfilesTS) TestGetUnknownTeamId() {
  1407  	actual, err := s.Store().User().GetProfiles(&model.UserGetOptions{
  1408  		InTeamId: "123",
  1409  		Page:     0,
  1410  		PerPage:  100,
  1411  	})
  1412  	s.Require().Nil(err)
  1413  	s.Require().Equal([]*model.User{}, actual)
  1414  }
  1415  
  1416  // etag changes for all after user creation
  1417  func (s *UserStoreGetProfilesTS) TestEtagChangesForAllAfterUserCreation() {
  1418  	etag := s.Store().User().GetEtagForProfiles(s.teamId)
  1419  	uNew := &model.User{}
  1420  	uNew.Email = MakeEmail()
  1421  	_, err := s.Store().User().Save(uNew)
  1422  	s.Require().Nil(err)
  1423  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(uNew.Id)) }()
  1424  	_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: s.teamId, UserId: uNew.Id}, -1)
  1425  	s.Require().Nil(nErr)
  1426  	updatedEtag := s.Store().User().GetEtagForProfiles(s.teamId)
  1427  	s.Require().NotEqual(etag, updatedEtag)
  1428  }
  1429  
  1430  // filter to system_admin role
  1431  func (s *UserStoreGetProfilesTS) TestFilterToSystemAdminRole() {
  1432  	actual, err := s.Store().User().GetProfiles(&model.UserGetOptions{
  1433  		InTeamId: s.teamId,
  1434  		Page:     0,
  1435  		PerPage:  10,
  1436  		Role:     "system_admin",
  1437  	})
  1438  	s.Require().Nil(err)
  1439  	s.Require().Equal([]*model.User{
  1440  		sanitized(s.u4),
  1441  	}, actual)
  1442  }
  1443  
  1444  // filter to inactive
  1445  func (s *UserStoreGetProfilesTS) TestFilterToInActive() {
  1446  	actual, err := s.Store().User().GetProfiles(&model.UserGetOptions{
  1447  		InTeamId: s.teamId,
  1448  		Page:     0,
  1449  		PerPage:  10,
  1450  		Inactive: true,
  1451  	})
  1452  	s.Require().Nil(err)
  1453  	s.Require().Equal([]*model.User{
  1454  		sanitized(s.u5),
  1455  	}, actual)
  1456  }
  1457  
  1458  // filter to active
  1459  func (s *UserStoreGetProfilesTS) TestFilterToActive() {
  1460  	actual, err := s.Store().User().GetProfiles(&model.UserGetOptions{
  1461  		InTeamId: s.teamId,
  1462  		Page:     0,
  1463  		PerPage:  10,
  1464  		Active:   true,
  1465  	})
  1466  	s.Require().Nil(err)
  1467  	s.Require().Equal([]*model.User{
  1468  		sanitized(s.u1),
  1469  		sanitized(s.u2),
  1470  		sanitized(s.u3),
  1471  		sanitized(s.u4),
  1472  	}, actual)
  1473  }
  1474  
  1475  // try to filter to active and inactive
  1476  func (s *UserStoreGetProfilesTS) TestFilterToActiveAndInactive() {
  1477  	actual, err := s.Store().User().GetProfiles(&model.UserGetOptions{
  1478  		InTeamId: s.teamId,
  1479  		Page:     0,
  1480  		PerPage:  10,
  1481  		Inactive: true,
  1482  		Active:   true,
  1483  	})
  1484  	s.Require().Nil(err)
  1485  	s.Require().Equal([]*model.User{
  1486  		sanitized(s.u5),
  1487  	}, actual)
  1488  }
  1489  
  1490  // type UserStoreGetProfilesByIdsTS struct {
  1491  // 	suite.Suite
  1492  // 	StoreTestSuite
  1493  
  1494  // 	u1     *model.User
  1495  // 	u2     *model.User
  1496  // 	u3     *model.User
  1497  // 	u4     *model.User
  1498  // 	u5     *model.User
  1499  // 	u6     *model.User
  1500  // 	u7     *model.User
  1501  // 	teamId string
  1502  // }
  1503  
  1504  func TestUserStoreGetProfilesByIdsTS(t *testing.T) {
  1505  	StoreTestSuiteWithSqlSupplier(t, &UserStoreGetProfilesByIdsTS{}, func(t *testing.T, testSuite StoreTestBaseSuite) {
  1506  		suite.Run(t, testSuite)
  1507  	})
  1508  }
  1509  
  1510  func (s *UserStoreGetProfilesByIdsTS) SetupSuite() {
  1511  	teamId := model.NewId()
  1512  	s.teamId = teamId
  1513  
  1514  	u1, err := s.Store().User().Save(&model.User{
  1515  		Email:    MakeEmail(),
  1516  		Username: "u1" + model.NewId(),
  1517  	})
  1518  	s.Require().Nil(err)
  1519  	_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)
  1520  	s.Require().Nil(nErr)
  1521  	s.u1 = u1
  1522  
  1523  	u2, err := s.Store().User().Save(&model.User{
  1524  		Email:    MakeEmail(),
  1525  		Username: "u2" + model.NewId(),
  1526  	})
  1527  	s.Require().Nil(err)
  1528  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)
  1529  	s.Require().Nil(nErr)
  1530  	s.u2 = u2
  1531  
  1532  	time.Sleep(time.Millisecond)
  1533  	u3, err := s.Store().User().Save(&model.User{
  1534  		Email:    MakeEmail(),
  1535  		Username: "u3" + model.NewId(),
  1536  	})
  1537  	s.Require().Nil(err)
  1538  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1)
  1539  	s.Require().Nil(nErr)
  1540  	_, nErr = s.Store().Bot().Save(&model.Bot{
  1541  		UserId:   u3.Id,
  1542  		Username: u3.Username,
  1543  		OwnerId:  u1.Id,
  1544  	})
  1545  	s.Require().Nil(nErr)
  1546  	u3.IsBot = true
  1547  	s.u3 = u3
  1548  
  1549  	u4, err := s.Store().User().Save(&model.User{
  1550  		Email:    MakeEmail(),
  1551  		Username: "u4" + model.NewId(),
  1552  	})
  1553  	s.Require().Nil(err)
  1554  	s.u4 = u4
  1555  }
  1556  
  1557  func (s *UserStoreGetProfilesByIdsTS) TearDownSuite() {
  1558  	s.Require().Nil(s.Store().User().PermanentDelete(s.u1.Id))
  1559  	s.Require().Nil(s.Store().User().PermanentDelete(s.u2.Id))
  1560  	s.Require().Nil(s.Store().User().PermanentDelete(s.u3.Id))
  1561  	s.Require().Nil(s.Store().User().PermanentDelete(s.u4.Id))
  1562  }
  1563  
  1564  // get u1 by id, no caching
  1565  func (s *UserStoreGetProfilesByIdsTS) TestGetU1ByIdNoCaching() {
  1566  	users, err := s.Store().User().GetProfileByIds(context.Background(), []string{s.u1.Id}, nil, false)
  1567  	s.Require().Nil(err)
  1568  	s.Assert().Equal([]*model.User{s.u1}, users)
  1569  }
  1570  
  1571  func (s *UserStoreGetProfilesByIdsTS) TestGetU1ByIdCaching() {
  1572  	users, err := s.Store().User().GetProfileByIds(context.Background(), []string{s.u1.Id}, nil, true)
  1573  	s.Require().Nil(err)
  1574  	s.Assert().Equal([]*model.User{s.u1}, users)
  1575  }
  1576  
  1577  // get u1, u2, u3 by id, no caching
  1578  func (s *UserStoreGetProfilesByIdsTS) TestGetU1U2U3ByIdNoCaching() {
  1579  	users, err := s.Store().User().GetProfileByIds(context.Background(), []string{s.u1.Id, s.u2.Id, s.u3.Id}, nil, false)
  1580  	s.Require().Nil(err)
  1581  	s.Assert().Equal([]*model.User{s.u1, s.u2, s.u3}, users)
  1582  }
  1583  
  1584  // get u1, u2, u3 by id, caching
  1585  func (s *UserStoreGetProfilesByIdsTS) TestGetU1U2U3ByIdCaching() {
  1586  	users, err := s.Store().User().GetProfileByIds(context.Background(), []string{s.u1.Id, s.u2.Id, s.u3.Id}, nil, true)
  1587  	s.Require().Nil(err)
  1588  	s.Assert().Equal([]*model.User{s.u1, s.u2, s.u3}, users)
  1589  }
  1590  
  1591  // get unknown id, caching
  1592  func (s *UserStoreGetProfilesByIdsTS) TestGetUnknownByIdCaching() {
  1593  	users, err := s.Store().User().GetProfileByIds(context.Background(), []string{"123"}, nil, true)
  1594  	s.Require().Nil(err)
  1595  	s.Assert().Equal([]*model.User{}, users)
  1596  }
  1597  
  1598  // should only return users with UpdateAt greater than the since time
  1599  func (s *UserStoreGetProfilesByIdsTS) TestReturnUsersUpdateAtGreater() {
  1600  	users, err := s.Store().User().GetProfileByIds(context.Background(), []string{s.u1.Id, s.u2.Id, s.u3.Id, s.u4.Id}, &store.UserGetByIdsOpts{
  1601  		Since: s.u2.CreateAt,
  1602  	}, true)
  1603  	s.Require().Nil(err)
  1604  	s.Assert().Equal([]*model.User{s.u3, s.u4}, users)
  1605  }
  1606  
  1607  func (s *UserStoreTS) TestGetProfileByGroupChannelIdsForUser() {
  1608  	u1, err := s.Store().User().Save(&model.User{
  1609  		Email:    MakeEmail(),
  1610  		Username: "u1" + model.NewId(),
  1611  	})
  1612  	s.Require().Nil(err)
  1613  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
  1614  
  1615  	u2, err := s.Store().User().Save(&model.User{
  1616  		Email:    MakeEmail(),
  1617  		Username: "u2" + model.NewId(),
  1618  	})
  1619  	s.Require().Nil(err)
  1620  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }()
  1621  
  1622  	u3, err := s.Store().User().Save(&model.User{
  1623  		Email:    MakeEmail(),
  1624  		Username: "u3" + model.NewId(),
  1625  	})
  1626  	s.Require().Nil(err)
  1627  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }()
  1628  
  1629  	u4, err := s.Store().User().Save(&model.User{
  1630  		Email:    MakeEmail(),
  1631  		Username: "u4" + model.NewId(),
  1632  	})
  1633  	s.Require().Nil(err)
  1634  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u4.Id)) }()
  1635  
  1636  	gc1, nErr := s.Store().Channel().Save(&model.Channel{
  1637  		DisplayName: "Profiles in private",
  1638  		Name:        "profiles-" + model.NewId(),
  1639  		Type:        model.CHANNEL_GROUP,
  1640  	}, -1)
  1641  	s.Require().Nil(nErr)
  1642  
  1643  	for _, uId := range []string{u1.Id, u2.Id, u3.Id} {
  1644  		_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{
  1645  			ChannelId:   gc1.Id,
  1646  			UserId:      uId,
  1647  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  1648  		})
  1649  		s.Require().Nil(nErr)
  1650  	}
  1651  
  1652  	gc2, nErr := s.Store().Channel().Save(&model.Channel{
  1653  		DisplayName: "Profiles in private",
  1654  		Name:        "profiles-" + model.NewId(),
  1655  		Type:        model.CHANNEL_GROUP,
  1656  	}, -1)
  1657  	s.Require().Nil(nErr)
  1658  
  1659  	for _, uId := range []string{u1.Id, u3.Id, u4.Id} {
  1660  		_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{
  1661  			ChannelId:   gc2.Id,
  1662  			UserId:      uId,
  1663  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  1664  		})
  1665  		s.Require().Nil(nErr)
  1666  	}
  1667  
  1668  	testCases := []struct {
  1669  		Name                       string
  1670  		UserId                     string
  1671  		ChannelIds                 []string
  1672  		ExpectedUserIdsByChannel   map[string][]string
  1673  		EnsureChannelsNotInResults []string
  1674  	}{
  1675  		{
  1676  			Name:       "Get group 1 as user 1",
  1677  			UserId:     u1.Id,
  1678  			ChannelIds: []string{gc1.Id},
  1679  			ExpectedUserIdsByChannel: map[string][]string{
  1680  				gc1.Id: {u2.Id, u3.Id},
  1681  			},
  1682  			EnsureChannelsNotInResults: []string{},
  1683  		},
  1684  		{
  1685  			Name:       "Get groups 1 and 2 as user 1",
  1686  			UserId:     u1.Id,
  1687  			ChannelIds: []string{gc1.Id, gc2.Id},
  1688  			ExpectedUserIdsByChannel: map[string][]string{
  1689  				gc1.Id: {u2.Id, u3.Id},
  1690  				gc2.Id: {u3.Id, u4.Id},
  1691  			},
  1692  			EnsureChannelsNotInResults: []string{},
  1693  		},
  1694  		{
  1695  			Name:       "Get groups 1 and 2 as user 2",
  1696  			UserId:     u2.Id,
  1697  			ChannelIds: []string{gc1.Id, gc2.Id},
  1698  			ExpectedUserIdsByChannel: map[string][]string{
  1699  				gc1.Id: {u1.Id, u3.Id},
  1700  			},
  1701  			EnsureChannelsNotInResults: []string{gc2.Id},
  1702  		},
  1703  	}
  1704  
  1705  	for _, tc := range testCases {
  1706  		s.T().Run(tc.Name, func(t *testing.T) {
  1707  			res, err := s.Store().User().GetProfileByGroupChannelIdsForUser(tc.UserId, tc.ChannelIds)
  1708  			s.Require().Nil(err)
  1709  
  1710  			for channelId, expectedUsers := range tc.ExpectedUserIdsByChannel {
  1711  				users, ok := res[channelId]
  1712  				s.Require().True(ok)
  1713  
  1714  				var userIds []string
  1715  				for _, user := range users {
  1716  					userIds = append(userIds, user.Id)
  1717  				}
  1718  				s.Require().ElementsMatch(expectedUsers, userIds)
  1719  			}
  1720  
  1721  			for _, channelId := range tc.EnsureChannelsNotInResults {
  1722  				_, ok := res[channelId]
  1723  				s.Require().False(ok)
  1724  			}
  1725  		})
  1726  	}
  1727  }
  1728  
  1729  func (s *UserStoreTS) TestGetByEmail() {
  1730  	teamId := model.NewId()
  1731  
  1732  	u1, err := s.Store().User().Save(&model.User{
  1733  		Email:    MakeEmail(),
  1734  		Username: "u1" + model.NewId(),
  1735  	})
  1736  	s.Require().Nil(err)
  1737  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
  1738  	_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)
  1739  	s.Require().Nil(nErr)
  1740  
  1741  	u2, err := s.Store().User().Save(&model.User{
  1742  		Email:    MakeEmail(),
  1743  		Username: "u2" + model.NewId(),
  1744  	})
  1745  	s.Require().Nil(err)
  1746  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }()
  1747  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)
  1748  	s.Require().Nil(nErr)
  1749  
  1750  	u3, err := s.Store().User().Save(&model.User{
  1751  		Email:    MakeEmail(),
  1752  		Username: "u3" + model.NewId(),
  1753  	})
  1754  	s.Require().Nil(err)
  1755  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }()
  1756  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1)
  1757  	s.Require().Nil(nErr)
  1758  	_, nErr = s.Store().Bot().Save(&model.Bot{
  1759  		UserId:   u3.Id,
  1760  		Username: u3.Username,
  1761  		OwnerId:  u1.Id,
  1762  	})
  1763  	s.Require().Nil(nErr)
  1764  	u3.IsBot = true
  1765  	defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }()
  1766  
  1767  	s.T().Run("get u1 by email", func(t *testing.T) {
  1768  		u, err := s.Store().User().GetByEmail(u1.Email)
  1769  		s.Require().Nil(err)
  1770  		s.Assert().Equal(u1, u)
  1771  	})
  1772  
  1773  	s.T().Run("get u2 by email", func(t *testing.T) {
  1774  		u, err := s.Store().User().GetByEmail(u2.Email)
  1775  		s.Require().Nil(err)
  1776  		s.Assert().Equal(u2, u)
  1777  	})
  1778  
  1779  	s.T().Run("get u3 by email", func(t *testing.T) {
  1780  		u, err := s.Store().User().GetByEmail(u3.Email)
  1781  		s.Require().Nil(err)
  1782  		s.Assert().Equal(u3, u)
  1783  	})
  1784  
  1785  	s.T().Run("get by empty email", func(t *testing.T) {
  1786  		_, err := s.Store().User().GetByEmail("")
  1787  		s.Require().NotNil(err)
  1788  	})
  1789  
  1790  	s.T().Run("get by unknown", func(t *testing.T) {
  1791  		_, err := s.Store().User().GetByEmail("unknown")
  1792  		s.Require().NotNil(err)
  1793  	})
  1794  }
  1795  
  1796  func (s *UserStoreTS) TestGetByAuthData() {
  1797  	teamId := model.NewId()
  1798  	auth1 := model.NewId()
  1799  	auth3 := model.NewId()
  1800  
  1801  	u1, err := s.Store().User().Save(&model.User{
  1802  		Email:       MakeEmail(),
  1803  		Username:    "u1" + model.NewId(),
  1804  		AuthData:    &auth1,
  1805  		AuthService: "service",
  1806  	})
  1807  	s.Require().Nil(err)
  1808  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
  1809  	_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)
  1810  	s.Require().Nil(nErr)
  1811  
  1812  	u2, err := s.Store().User().Save(&model.User{
  1813  		Email:    MakeEmail(),
  1814  		Username: "u2" + model.NewId(),
  1815  	})
  1816  	s.Require().Nil(err)
  1817  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }()
  1818  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)
  1819  	s.Require().Nil(nErr)
  1820  
  1821  	u3, err := s.Store().User().Save(&model.User{
  1822  		Email:       MakeEmail(),
  1823  		Username:    "u3" + model.NewId(),
  1824  		AuthData:    &auth3,
  1825  		AuthService: "service2",
  1826  	})
  1827  	s.Require().Nil(err)
  1828  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }()
  1829  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1)
  1830  	s.Require().Nil(nErr)
  1831  	_, nErr = s.Store().Bot().Save(&model.Bot{
  1832  		UserId:   u3.Id,
  1833  		Username: u3.Username,
  1834  		OwnerId:  u1.Id,
  1835  	})
  1836  	s.Require().Nil(nErr)
  1837  	u3.IsBot = true
  1838  	defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }()
  1839  
  1840  	s.T().Run("get by u1 auth", func(t *testing.T) {
  1841  		u, err := s.Store().User().GetByAuth(u1.AuthData, u1.AuthService)
  1842  		s.Require().Nil(err)
  1843  		s.Assert().Equal(u1, u)
  1844  	})
  1845  
  1846  	s.T().Run("get by u3 auth", func(t *testing.T) {
  1847  		u, err := s.Store().User().GetByAuth(u3.AuthData, u3.AuthService)
  1848  		s.Require().Nil(err)
  1849  		s.Assert().Equal(u3, u)
  1850  	})
  1851  
  1852  	s.T().Run("get by u1 auth, unknown service", func(t *testing.T) {
  1853  		_, err := s.Store().User().GetByAuth(u1.AuthData, "unknown")
  1854  		s.Require().NotNil(err)
  1855  		var nfErr *store.ErrNotFound
  1856  		s.Require().True(errors.As(err, &nfErr))
  1857  	})
  1858  
  1859  	s.T().Run("get by unknown auth, u1 service", func(t *testing.T) {
  1860  		unknownAuth := ""
  1861  		_, err := s.Store().User().GetByAuth(&unknownAuth, u1.AuthService)
  1862  		s.Require().NotNil(err)
  1863  		var invErr *store.ErrInvalidInput
  1864  		s.Require().True(errors.As(err, &invErr))
  1865  	})
  1866  
  1867  	s.T().Run("get by unknown auth, unknown service", func(t *testing.T) {
  1868  		unknownAuth := ""
  1869  		_, err := s.Store().User().GetByAuth(&unknownAuth, "unknown")
  1870  		s.Require().NotNil(err)
  1871  		var invErr *store.ErrInvalidInput
  1872  		s.Require().True(errors.As(err, &invErr))
  1873  	})
  1874  }
  1875  
  1876  func (s *UserStoreTS) TestGetByUsername() {
  1877  	teamId := model.NewId()
  1878  
  1879  	u1, err := s.Store().User().Save(&model.User{
  1880  		Email:    MakeEmail(),
  1881  		Username: "u1" + model.NewId(),
  1882  	})
  1883  	s.Require().Nil(err)
  1884  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
  1885  	_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)
  1886  	s.Require().Nil(nErr)
  1887  
  1888  	u2, err := s.Store().User().Save(&model.User{
  1889  		Email:    MakeEmail(),
  1890  		Username: "u2" + model.NewId(),
  1891  	})
  1892  	s.Require().Nil(err)
  1893  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }()
  1894  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)
  1895  	s.Require().Nil(nErr)
  1896  
  1897  	u3, err := s.Store().User().Save(&model.User{
  1898  		Email:    MakeEmail(),
  1899  		Username: "u3" + model.NewId(),
  1900  	})
  1901  	s.Require().Nil(err)
  1902  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }()
  1903  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1)
  1904  	s.Require().Nil(nErr)
  1905  	_, nErr = s.Store().Bot().Save(&model.Bot{
  1906  		UserId:   u3.Id,
  1907  		Username: u3.Username,
  1908  		OwnerId:  u1.Id,
  1909  	})
  1910  	s.Require().Nil(nErr)
  1911  	u3.IsBot = true
  1912  	defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }()
  1913  
  1914  	s.T().Run("get u1 by username", func(t *testing.T) {
  1915  		result, err := s.Store().User().GetByUsername(u1.Username)
  1916  		s.Require().Nil(err)
  1917  		s.Assert().Equal(u1, result)
  1918  	})
  1919  
  1920  	s.T().Run("get u2 by username", func(t *testing.T) {
  1921  		result, err := s.Store().User().GetByUsername(u2.Username)
  1922  		s.Require().Nil(err)
  1923  		s.Assert().Equal(u2, result)
  1924  	})
  1925  
  1926  	s.T().Run("get u3 by username", func(t *testing.T) {
  1927  		result, err := s.Store().User().GetByUsername(u3.Username)
  1928  		s.Require().Nil(err)
  1929  		s.Assert().Equal(u3, result)
  1930  	})
  1931  
  1932  	s.T().Run("get by empty username", func(t *testing.T) {
  1933  		_, err := s.Store().User().GetByUsername("")
  1934  		s.Require().NotNil(err)
  1935  		var nfErr *store.ErrNotFound
  1936  		s.Require().True(errors.As(err, &nfErr))
  1937  	})
  1938  
  1939  	s.T().Run("get by unknown", func(t *testing.T) {
  1940  		_, err := s.Store().User().GetByUsername("unknown")
  1941  		s.Require().NotNil(err)
  1942  		var nfErr *store.ErrNotFound
  1943  		s.Require().True(errors.As(err, &nfErr))
  1944  	})
  1945  }
  1946  
  1947  func (s *UserStoreTS) TestGetForLogin() {
  1948  	teamId := model.NewId()
  1949  	auth := model.NewId()
  1950  	auth2 := model.NewId()
  1951  	auth3 := model.NewId()
  1952  
  1953  	u1, err := s.Store().User().Save(&model.User{
  1954  		Email:       MakeEmail(),
  1955  		Username:    "u1" + model.NewId(),
  1956  		AuthService: model.USER_AUTH_SERVICE_GITLAB,
  1957  		AuthData:    &auth,
  1958  	})
  1959  
  1960  	s.Require().Nil(err)
  1961  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
  1962  	_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)
  1963  	s.Require().Nil(nErr)
  1964  
  1965  	u2, err := s.Store().User().Save(&model.User{
  1966  		Email:       MakeEmail(),
  1967  		Username:    "u2" + model.NewId(),
  1968  		AuthService: model.USER_AUTH_SERVICE_LDAP,
  1969  		AuthData:    &auth2,
  1970  	})
  1971  	s.Require().Nil(err)
  1972  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }()
  1973  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)
  1974  	s.Require().Nil(nErr)
  1975  
  1976  	u3, err := s.Store().User().Save(&model.User{
  1977  		Email:       MakeEmail(),
  1978  		Username:    "u3" + model.NewId(),
  1979  		AuthService: model.USER_AUTH_SERVICE_LDAP,
  1980  		AuthData:    &auth3,
  1981  	})
  1982  	s.Require().Nil(err)
  1983  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }()
  1984  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1)
  1985  	s.Require().Nil(nErr)
  1986  	_, nErr = s.Store().Bot().Save(&model.Bot{
  1987  		UserId:   u3.Id,
  1988  		Username: u3.Username,
  1989  		OwnerId:  u1.Id,
  1990  	})
  1991  	s.Require().Nil(nErr)
  1992  	u3.IsBot = true
  1993  	defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }()
  1994  
  1995  	s.T().Run("get u1 by username, allow both", func(t *testing.T) {
  1996  		user, err := s.Store().User().GetForLogin(u1.Username, true, true)
  1997  		s.Require().Nil(err)
  1998  		s.Assert().Equal(u1, user)
  1999  	})
  2000  
  2001  	s.T().Run("get u1 by username, check for case issues", func(t *testing.T) {
  2002  		user, err := s.Store().User().GetForLogin(strings.ToUpper(u1.Username), true, true)
  2003  		s.Require().Nil(err)
  2004  		s.Assert().Equal(u1, user)
  2005  	})
  2006  
  2007  	s.T().Run("get u1 by username, allow only email", func(t *testing.T) {
  2008  		_, err := s.Store().User().GetForLogin(u1.Username, false, true)
  2009  		s.Require().NotNil(err)
  2010  		s.Require().Equal("user not found", err.Error())
  2011  	})
  2012  
  2013  	s.T().Run("get u1 by email, allow both", func(t *testing.T) {
  2014  		user, err := s.Store().User().GetForLogin(u1.Email, true, true)
  2015  		s.Require().Nil(err)
  2016  		s.Assert().Equal(u1, user)
  2017  	})
  2018  
  2019  	s.T().Run("get u1 by email, check for case issues", func(t *testing.T) {
  2020  		user, err := s.Store().User().GetForLogin(strings.ToUpper(u1.Email), true, true)
  2021  		s.Require().Nil(err)
  2022  		s.Assert().Equal(u1, user)
  2023  	})
  2024  
  2025  	s.T().Run("get u1 by email, allow only username", func(t *testing.T) {
  2026  		_, err := s.Store().User().GetForLogin(u1.Email, true, false)
  2027  		s.Require().NotNil(err)
  2028  		s.Require().Equal("user not found", err.Error())
  2029  	})
  2030  
  2031  	s.T().Run("get u2 by username, allow both", func(t *testing.T) {
  2032  		user, err := s.Store().User().GetForLogin(u2.Username, true, true)
  2033  		s.Require().Nil(err)
  2034  		s.Assert().Equal(u2, user)
  2035  	})
  2036  
  2037  	s.T().Run("get u2 by email, allow both", func(t *testing.T) {
  2038  		user, err := s.Store().User().GetForLogin(u2.Email, true, true)
  2039  		s.Require().Nil(err)
  2040  		s.Assert().Equal(u2, user)
  2041  	})
  2042  
  2043  	s.T().Run("get u2 by username, allow neither", func(t *testing.T) {
  2044  		_, err := s.Store().User().GetForLogin(u2.Username, false, false)
  2045  		s.Require().NotNil(err)
  2046  		s.Require().Equal("sign in with username and email are disabled", err.Error())
  2047  	})
  2048  }
  2049  
  2050  func (s *UserStoreTS) TestGetAllUsingAuthService() {
  2051  	teamId := model.NewId()
  2052  
  2053  	u1, err := s.Store().User().Save(&model.User{
  2054  		Email:       MakeEmail(),
  2055  		Username:    "u1" + model.NewId(),
  2056  		AuthService: "service",
  2057  	})
  2058  	s.Require().Nil(err)
  2059  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
  2060  	_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)
  2061  	s.Require().Nil(nErr)
  2062  
  2063  	u2, err := s.Store().User().Save(&model.User{
  2064  		Email:       MakeEmail(),
  2065  		Username:    "u2" + model.NewId(),
  2066  		AuthService: "service",
  2067  	})
  2068  	s.Require().Nil(err)
  2069  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }()
  2070  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)
  2071  	s.Require().Nil(nErr)
  2072  
  2073  	u3, err := s.Store().User().Save(&model.User{
  2074  		Email:       MakeEmail(),
  2075  		Username:    "u3" + model.NewId(),
  2076  		AuthService: "service2",
  2077  	})
  2078  	s.Require().Nil(err)
  2079  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }()
  2080  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1)
  2081  	s.Require().Nil(nErr)
  2082  	_, nErr = s.Store().Bot().Save(&model.Bot{
  2083  		UserId:   u3.Id,
  2084  		Username: u3.Username,
  2085  		OwnerId:  u1.Id,
  2086  	})
  2087  	s.Require().Nil(nErr)
  2088  	u3.IsBot = true
  2089  	defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }()
  2090  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }()
  2091  
  2092  	s.T().Run("get by unknown auth service", func(t *testing.T) {
  2093  		users, err := s.Store().User().GetAllUsingAuthService("unknown")
  2094  		s.Require().Nil(err)
  2095  		s.Assert().Equal([]*model.User{}, users)
  2096  	})
  2097  
  2098  	s.T().Run("get by auth service", func(t *testing.T) {
  2099  		users, err := s.Store().User().GetAllUsingAuthService("service")
  2100  		s.Require().Nil(err)
  2101  		s.Assert().Equal([]*model.User{u1, u2}, users)
  2102  	})
  2103  
  2104  	s.T().Run("get by other auth service", func(t *testing.T) {
  2105  		users, err := s.Store().User().GetAllUsingAuthService("service2")
  2106  		s.Require().Nil(err)
  2107  		s.Assert().Equal([]*model.User{u3}, users)
  2108  	})
  2109  }
  2110  
  2111  func (s *UserStoreTS) TestUpdateFailedPasswordAttempts() {
  2112  	u1 := &model.User{}
  2113  	u1.Email = MakeEmail()
  2114  	_, err := s.Store().User().Save(u1)
  2115  	s.Require().Nil(err)
  2116  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
  2117  	_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1)
  2118  	s.Require().Nil(nErr)
  2119  
  2120  	err = s.Store().User().UpdateFailedPasswordAttempts(u1.Id, 3)
  2121  	s.Require().Nil(err)
  2122  
  2123  	user, err := s.Store().User().Get(context.Background(), u1.Id)
  2124  	s.Require().Nil(err)
  2125  	s.Require().Equal(3, user.FailedAttempts, "FailedAttempts not updated correctly")
  2126  }
  2127  
  2128  func (s *UserStoreTS) TestUserStoreGetSystemAdminProfiles() {
  2129  	teamId := model.NewId()
  2130  
  2131  	u1, err := s.Store().User().Save(&model.User{
  2132  		Email:    MakeEmail(),
  2133  		Roles:    model.SYSTEM_USER_ROLE_ID + " " + model.SYSTEM_ADMIN_ROLE_ID,
  2134  		Username: "u1" + model.NewId(),
  2135  	})
  2136  	s.Require().Nil(err)
  2137  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
  2138  	_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)
  2139  	s.Require().Nil(nErr)
  2140  
  2141  	u2, err := s.Store().User().Save(&model.User{
  2142  		Email:    MakeEmail(),
  2143  		Username: "u2" + model.NewId(),
  2144  	})
  2145  	s.Require().Nil(err)
  2146  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }()
  2147  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)
  2148  	s.Require().Nil(nErr)
  2149  
  2150  	u3, err := s.Store().User().Save(&model.User{
  2151  		Email:    MakeEmail(),
  2152  		Roles:    model.SYSTEM_USER_ROLE_ID + " " + model.SYSTEM_ADMIN_ROLE_ID,
  2153  		Username: "u3" + model.NewId(),
  2154  	})
  2155  	s.Require().Nil(err)
  2156  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }()
  2157  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1)
  2158  	s.Require().Nil(nErr)
  2159  	_, nErr = s.Store().Bot().Save(&model.Bot{
  2160  		UserId:   u3.Id,
  2161  		Username: u3.Username,
  2162  		OwnerId:  u1.Id,
  2163  	})
  2164  	s.Require().Nil(nErr)
  2165  	u3.IsBot = true
  2166  	defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }()
  2167  
  2168  	s.T().Run("all system admin profiles", func(t *testing.T) {
  2169  		result, userError := s.Store().User().GetSystemAdminProfiles()
  2170  		s.Require().Nil(userError)
  2171  		s.Assert().Equal(map[string]*model.User{
  2172  			u1.Id: sanitized(u1),
  2173  			u3.Id: sanitized(u3),
  2174  		}, result)
  2175  	})
  2176  }
  2177  
  2178  func (s *UserStoreTS) TestAnalyticsActiveCount() {
  2179  	s.cleanupStatusStore()
  2180  
  2181  	// Create 5 users statuses u0, u1, u2, u3, u4.
  2182  	// u4 is also a bot
  2183  	u0, err := s.Store().User().Save(&model.User{
  2184  		Email:    MakeEmail(),
  2185  		Username: "u0" + model.NewId(),
  2186  	})
  2187  	s.Require().Nil(err)
  2188  	u1, err := s.Store().User().Save(&model.User{
  2189  		Email:    MakeEmail(),
  2190  		Username: "u1" + model.NewId(),
  2191  	})
  2192  	s.Require().Nil(err)
  2193  	u2, err := s.Store().User().Save(&model.User{
  2194  		Email:    MakeEmail(),
  2195  		Username: "u2" + model.NewId(),
  2196  	})
  2197  	s.Require().Nil(err)
  2198  	u3, err := s.Store().User().Save(&model.User{
  2199  		Email:    MakeEmail(),
  2200  		Username: "u3" + model.NewId(),
  2201  	})
  2202  	s.Require().Nil(err)
  2203  	u4, err := s.Store().User().Save(&model.User{
  2204  		Email:    MakeEmail(),
  2205  		Username: "u4" + model.NewId(),
  2206  	})
  2207  	s.Require().Nil(err)
  2208  	defer func() {
  2209  		s.Require().Nil(s.Store().User().PermanentDelete(u0.Id))
  2210  		s.Require().Nil(s.Store().User().PermanentDelete(u1.Id))
  2211  		s.Require().Nil(s.Store().User().PermanentDelete(u2.Id))
  2212  		s.Require().Nil(s.Store().User().PermanentDelete(u3.Id))
  2213  		s.Require().Nil(s.Store().User().PermanentDelete(u4.Id))
  2214  	}()
  2215  
  2216  	_, nErr := s.Store().Bot().Save(&model.Bot{
  2217  		UserId:   u4.Id,
  2218  		Username: u4.Username,
  2219  		OwnerId:  u1.Id,
  2220  	})
  2221  	s.Require().Nil(nErr)
  2222  
  2223  	millis := model.GetMillis()
  2224  	millisTwoDaysAgo := model.GetMillis() - (2 * DAY_MILLISECONDS)
  2225  	millisTwoMonthsAgo := model.GetMillis() - (2 * MONTH_MILLISECONDS)
  2226  
  2227  	// u0 last activity status is two months ago.
  2228  	// u1 last activity status is two days ago.
  2229  	// u2, u3, u4 last activity is within last day
  2230  	s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{UserId: u0.Id, Status: model.STATUS_OFFLINE, LastActivityAt: millisTwoMonthsAgo}))
  2231  	s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{UserId: u1.Id, Status: model.STATUS_OFFLINE, LastActivityAt: millisTwoDaysAgo}))
  2232  	s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{UserId: u2.Id, Status: model.STATUS_OFFLINE, LastActivityAt: millis}))
  2233  	s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{UserId: u3.Id, Status: model.STATUS_OFFLINE, LastActivityAt: millis}))
  2234  	s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{UserId: u4.Id, Status: model.STATUS_OFFLINE, LastActivityAt: millis}))
  2235  
  2236  	// Daily counts (without bots)
  2237  	count, err := s.Store().User().AnalyticsActiveCount(DAY_MILLISECONDS, model.UserCountOptions{IncludeBotAccounts: false, IncludeDeleted: true})
  2238  	s.Require().Nil(err)
  2239  	s.Assert().Equal(int64(2), count)
  2240  
  2241  	// Daily counts (with bots)
  2242  	count, err = s.Store().User().AnalyticsActiveCount(DAY_MILLISECONDS, model.UserCountOptions{IncludeBotAccounts: true, IncludeDeleted: true})
  2243  	s.Require().Nil(err)
  2244  	s.Assert().Equal(int64(3), count)
  2245  
  2246  	// Monthly counts (without bots)
  2247  	count, err = s.Store().User().AnalyticsActiveCount(MONTH_MILLISECONDS, model.UserCountOptions{IncludeBotAccounts: false, IncludeDeleted: true})
  2248  	s.Require().Nil(err)
  2249  	s.Assert().Equal(int64(3), count)
  2250  
  2251  	// Monthly counts - (with bots)
  2252  	count, err = s.Store().User().AnalyticsActiveCount(MONTH_MILLISECONDS, model.UserCountOptions{IncludeBotAccounts: true, IncludeDeleted: true})
  2253  	s.Require().Nil(err)
  2254  	s.Assert().Equal(int64(4), count)
  2255  
  2256  	// Monthly counts - (with bots, excluding deleted)
  2257  	count, err = s.Store().User().AnalyticsActiveCount(MONTH_MILLISECONDS, model.UserCountOptions{IncludeBotAccounts: true, IncludeDeleted: false})
  2258  	s.Require().Nil(err)
  2259  	s.Assert().Equal(int64(4), count)
  2260  }
  2261  
  2262  func (s *UserStoreTS) TestAnalyticsActiveCountForPeriod() {
  2263  
  2264  	s.cleanupStatusStore()
  2265  
  2266  	// Create 5 users statuses u0, u1, u2, u3, u4.
  2267  	// u4 is also a bot
  2268  	u0, err := s.Store().User().Save(&model.User{
  2269  		Email:    MakeEmail(),
  2270  		Username: "u0" + model.NewId(),
  2271  	})
  2272  	s.Require().Nil(err)
  2273  	u1, err := s.Store().User().Save(&model.User{
  2274  		Email:    MakeEmail(),
  2275  		Username: "u1" + model.NewId(),
  2276  	})
  2277  	s.Require().Nil(err)
  2278  	u2, err := s.Store().User().Save(&model.User{
  2279  		Email:    MakeEmail(),
  2280  		Username: "u2" + model.NewId(),
  2281  	})
  2282  	s.Require().Nil(err)
  2283  	u3, err := s.Store().User().Save(&model.User{
  2284  		Email:    MakeEmail(),
  2285  		Username: "u3" + model.NewId(),
  2286  	})
  2287  	s.Require().Nil(err)
  2288  	u4, err := s.Store().User().Save(&model.User{
  2289  		Email:    MakeEmail(),
  2290  		Username: "u4" + model.NewId(),
  2291  	})
  2292  	s.Require().Nil(err)
  2293  	defer func() {
  2294  		s.Require().Nil(s.Store().User().PermanentDelete(u0.Id))
  2295  		s.Require().Nil(s.Store().User().PermanentDelete(u1.Id))
  2296  		s.Require().Nil(s.Store().User().PermanentDelete(u2.Id))
  2297  		s.Require().Nil(s.Store().User().PermanentDelete(u3.Id))
  2298  		s.Require().Nil(s.Store().User().PermanentDelete(u4.Id))
  2299  	}()
  2300  
  2301  	_, nErr := s.Store().Bot().Save(&model.Bot{
  2302  		UserId:   u4.Id,
  2303  		Username: u4.Username,
  2304  		OwnerId:  u1.Id,
  2305  	})
  2306  	s.Require().Nil(nErr)
  2307  
  2308  	millis := model.GetMillis()
  2309  	millisTwoDaysAgo := model.GetMillis() - (2 * DAY_MILLISECONDS)
  2310  	millisTwoMonthsAgo := model.GetMillis() - (2 * MONTH_MILLISECONDS)
  2311  
  2312  	// u0 last activity status is two months ago.
  2313  	// u1 last activity status is one month ago
  2314  	// u2 last activiy is two days ago
  2315  	// u2 last activity is one day ago
  2316  	// u3 last activity is within last day
  2317  	// u4 last activity is within last day
  2318  	s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{UserId: u0.Id, Status: model.STATUS_OFFLINE, LastActivityAt: millisTwoMonthsAgo}))
  2319  	s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{UserId: u1.Id, Status: model.STATUS_OFFLINE, LastActivityAt: millisTwoMonthsAgo + MONTH_MILLISECONDS}))
  2320  	s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{UserId: u2.Id, Status: model.STATUS_OFFLINE, LastActivityAt: millisTwoDaysAgo}))
  2321  	s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{UserId: u3.Id, Status: model.STATUS_OFFLINE, LastActivityAt: millisTwoDaysAgo + DAY_MILLISECONDS}))
  2322  	s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{UserId: u4.Id, Status: model.STATUS_OFFLINE, LastActivityAt: millis}))
  2323  
  2324  	// Two months to two days (without bots)
  2325  	count, nerr := s.Store().User().AnalyticsActiveCountForPeriod(millisTwoMonthsAgo, millisTwoDaysAgo, model.UserCountOptions{IncludeBotAccounts: false, IncludeDeleted: false})
  2326  	s.Require().Nil(nerr)
  2327  	s.Assert().Equal(int64(2), count)
  2328  
  2329  	// Two months to two days (without bots)
  2330  	count, nerr = s.Store().User().AnalyticsActiveCountForPeriod(millisTwoMonthsAgo, millisTwoDaysAgo, model.UserCountOptions{IncludeBotAccounts: false, IncludeDeleted: true})
  2331  	s.Require().Nil(nerr)
  2332  	s.Assert().Equal(int64(2), count)
  2333  
  2334  	// Two days to present - (with bots)
  2335  	count, nerr = s.Store().User().AnalyticsActiveCountForPeriod(millisTwoDaysAgo, millis, model.UserCountOptions{IncludeBotAccounts: true, IncludeDeleted: false})
  2336  	s.Require().Nil(nerr)
  2337  	s.Assert().Equal(int64(2), count)
  2338  
  2339  	// Two days to present - (with bots, excluding deleted)
  2340  	count, nerr = s.Store().User().AnalyticsActiveCountForPeriod(millisTwoDaysAgo, millis, model.UserCountOptions{IncludeBotAccounts: true, IncludeDeleted: true})
  2341  	s.Require().Nil(nerr)
  2342  	s.Assert().Equal(int64(2), count)
  2343  }
  2344  
  2345  func (s *UserStoreTS) TestAnalyticsGetInactiveUsersCount() {
  2346  	u1 := &model.User{}
  2347  	u1.Email = MakeEmail()
  2348  	_, err := s.Store().User().Save(u1)
  2349  	s.Require().Nil(err)
  2350  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
  2351  
  2352  	count, err := s.Store().User().AnalyticsGetInactiveUsersCount()
  2353  	s.Require().Nil(err)
  2354  
  2355  	u2 := &model.User{}
  2356  	u2.Email = MakeEmail()
  2357  	u2.DeleteAt = model.GetMillis()
  2358  	_, err = s.Store().User().Save(u2)
  2359  	s.Require().Nil(err)
  2360  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }()
  2361  
  2362  	newCount, err := s.Store().User().AnalyticsGetInactiveUsersCount()
  2363  	s.Require().Nil(err)
  2364  	s.Require().Equal(count, newCount-1, "Expected 1 more inactive users but found otherwise.")
  2365  }
  2366  
  2367  func (s *UserStoreTS) TestAnalyticsGetSystemAdminCount() {
  2368  	countBefore, err := s.Store().User().AnalyticsGetSystemAdminCount()
  2369  	s.Require().Nil(err)
  2370  
  2371  	u1 := model.User{}
  2372  	u1.Email = MakeEmail()
  2373  	u1.Username = model.NewId()
  2374  	u1.Roles = "system_user system_admin"
  2375  
  2376  	u2 := model.User{}
  2377  	u2.Email = MakeEmail()
  2378  	u2.Username = model.NewId()
  2379  
  2380  	_, nErr := s.Store().User().Save(&u1)
  2381  	s.Require().Nil(nErr, "couldn't save user")
  2382  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
  2383  
  2384  	_, nErr = s.Store().User().Save(&u2)
  2385  	s.Require().Nil(nErr, "couldn't save user")
  2386  
  2387  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }()
  2388  
  2389  	result, err := s.Store().User().AnalyticsGetSystemAdminCount()
  2390  	s.Require().Nil(err)
  2391  	s.Require().Equal(countBefore+1, result, "Did not get the expected number of system admins.")
  2392  
  2393  }
  2394  
  2395  func (s *UserStoreTS) TestAnalyticsGetGuestCount() {
  2396  	countBefore, err := s.Store().User().AnalyticsGetGuestCount()
  2397  	s.Require().Nil(err)
  2398  
  2399  	u1 := model.User{}
  2400  	u1.Email = MakeEmail()
  2401  	u1.Username = model.NewId()
  2402  	u1.Roles = "system_user system_admin"
  2403  
  2404  	u2 := model.User{}
  2405  	u2.Email = MakeEmail()
  2406  	u2.Username = model.NewId()
  2407  	u2.Roles = "system_user"
  2408  
  2409  	u3 := model.User{}
  2410  	u3.Email = MakeEmail()
  2411  	u3.Username = model.NewId()
  2412  	u3.Roles = "system_guest"
  2413  
  2414  	_, nErr := s.Store().User().Save(&u1)
  2415  	s.Require().Nil(nErr, "couldn't save user")
  2416  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
  2417  
  2418  	_, nErr = s.Store().User().Save(&u2)
  2419  	s.Require().Nil(nErr, "couldn't save user")
  2420  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }()
  2421  
  2422  	_, nErr = s.Store().User().Save(&u3)
  2423  	s.Require().Nil(nErr, "couldn't save user")
  2424  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }()
  2425  
  2426  	result, err := s.Store().User().AnalyticsGetGuestCount()
  2427  	s.Require().Nil(err)
  2428  	s.Require().Equal(countBefore+1, result, "Did not get the expected number of guests.")
  2429  }
  2430  
  2431  func (s *UserStoreTS) TestAnalyticsGetExternalUsers() {
  2432  	localHostDomain := "mattermost.com"
  2433  	result, err := s.Store().User().AnalyticsGetExternalUsers(localHostDomain)
  2434  	s.Require().Nil(err)
  2435  	s.Assert().False(result)
  2436  
  2437  	u1 := model.User{}
  2438  	u1.Email = "a@mattermost.com"
  2439  	u1.Username = model.NewId()
  2440  	u1.Roles = "system_user system_admin"
  2441  
  2442  	u2 := model.User{}
  2443  	u2.Email = "b@example.com"
  2444  	u2.Username = model.NewId()
  2445  	u2.Roles = "system_user"
  2446  
  2447  	u3 := model.User{}
  2448  	u3.Email = "c@test.com"
  2449  	u3.Username = model.NewId()
  2450  	u3.Roles = "system_guest"
  2451  
  2452  	_, err = s.Store().User().Save(&u1)
  2453  	s.Require().Nil(err, "couldn't save user")
  2454  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
  2455  
  2456  	_, err = s.Store().User().Save(&u2)
  2457  	s.Require().Nil(err, "couldn't save user")
  2458  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }()
  2459  
  2460  	_, err = s.Store().User().Save(&u3)
  2461  	s.Require().Nil(err, "couldn't save user")
  2462  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }()
  2463  
  2464  	result, err = s.Store().User().AnalyticsGetExternalUsers(localHostDomain)
  2465  	s.Require().Nil(err)
  2466  	s.Assert().True(result)
  2467  }
  2468  
  2469  func (s *UserStoreTS) TestUserUnreadCount() {
  2470  	teamId := model.NewId()
  2471  
  2472  	c1 := model.Channel{}
  2473  	c1.TeamId = teamId
  2474  	c1.DisplayName = "Unread Messages"
  2475  	c1.Name = "unread-messages-" + model.NewId()
  2476  	c1.Type = model.CHANNEL_OPEN
  2477  
  2478  	c2 := model.Channel{}
  2479  	c2.TeamId = teamId
  2480  	c2.DisplayName = "Unread Direct"
  2481  	c2.Name = "unread-direct-" + model.NewId()
  2482  	c2.Type = model.CHANNEL_DIRECT
  2483  
  2484  	u1 := &model.User{}
  2485  	u1.Username = "user1" + model.NewId()
  2486  	u1.Email = MakeEmail()
  2487  	_, err := s.Store().User().Save(u1)
  2488  	s.Require().Nil(err)
  2489  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
  2490  	_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)
  2491  	s.Require().Nil(nErr)
  2492  
  2493  	u2 := &model.User{}
  2494  	u2.Email = MakeEmail()
  2495  	u2.Username = "user2" + model.NewId()
  2496  	_, err = s.Store().User().Save(u2)
  2497  	s.Require().Nil(err)
  2498  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }()
  2499  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)
  2500  	s.Require().Nil(nErr)
  2501  
  2502  	_, nErr = s.Store().Channel().Save(&c1, -1)
  2503  	s.Require().Nil(nErr, "couldn't save item")
  2504  
  2505  	m1 := model.ChannelMember{}
  2506  	m1.ChannelId = c1.Id
  2507  	m1.UserId = u1.Id
  2508  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
  2509  
  2510  	m2 := model.ChannelMember{}
  2511  	m2.ChannelId = c1.Id
  2512  	m2.UserId = u2.Id
  2513  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
  2514  
  2515  	_, nErr = s.Store().Channel().SaveMember(&m2)
  2516  	s.Require().Nil(nErr)
  2517  
  2518  	m1.ChannelId = c2.Id
  2519  	m2.ChannelId = c2.Id
  2520  
  2521  	_, nErr = s.Store().Channel().SaveDirectChannel(&c2, &m1, &m2)
  2522  	s.Require().Nil(nErr, "couldn't save direct channel")
  2523  
  2524  	p1 := model.Post{}
  2525  	p1.ChannelId = c1.Id
  2526  	p1.UserId = u1.Id
  2527  	p1.Message = "this is a message for @" + u2.Username
  2528  
  2529  	// Post one message with mention to open channel
  2530  	_, nErr = s.Store().Post().Save(&p1)
  2531  	s.Require().Nil(nErr)
  2532  	nErr = s.Store().Channel().IncrementMentionCount(c1.Id, u2.Id, false, false)
  2533  	s.Require().Nil(nErr)
  2534  
  2535  	// Post 2 messages without mention to direct channel
  2536  	p2 := model.Post{}
  2537  	p2.ChannelId = c2.Id
  2538  	p2.UserId = u1.Id
  2539  	p2.Message = "first message"
  2540  
  2541  	_, nErr = s.Store().Post().Save(&p2)
  2542  	s.Require().Nil(nErr)
  2543  	nErr = s.Store().Channel().IncrementMentionCount(c2.Id, u2.Id, false, false)
  2544  	s.Require().Nil(nErr)
  2545  
  2546  	p3 := model.Post{}
  2547  	p3.ChannelId = c2.Id
  2548  	p3.UserId = u1.Id
  2549  	p3.Message = "second message"
  2550  	_, nErr = s.Store().Post().Save(&p3)
  2551  	s.Require().Nil(nErr)
  2552  
  2553  	nErr = s.Store().Channel().IncrementMentionCount(c2.Id, u2.Id, false, false)
  2554  	s.Require().Nil(nErr)
  2555  
  2556  	badge, unreadCountErr := s.Store().User().GetUnreadCount(u2.Id)
  2557  	s.Require().Nil(unreadCountErr)
  2558  	s.Require().Equal(int64(3), badge, "should have 3 unread messages")
  2559  
  2560  	badge, unreadCountErr = s.Store().User().GetUnreadCountForChannel(u2.Id, c1.Id)
  2561  	s.Require().Nil(unreadCountErr)
  2562  	s.Require().Equal(int64(1), badge, "should have 1 unread messages for that channel")
  2563  
  2564  	badge, unreadCountErr = s.Store().User().GetUnreadCountForChannel(u2.Id, c2.Id)
  2565  	s.Require().Nil(unreadCountErr)
  2566  	s.Require().Equal(int64(2), badge, "should have 2 unread messages for that channel")
  2567  }
  2568  
  2569  func (s *UserStoreTS) TestGetRecentlyActiveUsersForTeam() {
  2570  
  2571  	s.cleanupStatusStore()
  2572  
  2573  	teamId := model.NewId()
  2574  
  2575  	u1, err := s.Store().User().Save(&model.User{
  2576  		Email:    MakeEmail(),
  2577  		Username: "u1" + model.NewId(),
  2578  	})
  2579  	s.Require().Nil(err)
  2580  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
  2581  	_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)
  2582  	s.Require().Nil(nErr)
  2583  
  2584  	u2, err := s.Store().User().Save(&model.User{
  2585  		Email:    MakeEmail(),
  2586  		Username: "u2" + model.NewId(),
  2587  	})
  2588  	s.Require().Nil(err)
  2589  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }()
  2590  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)
  2591  	s.Require().Nil(nErr)
  2592  
  2593  	u3, err := s.Store().User().Save(&model.User{
  2594  		Email:    MakeEmail(),
  2595  		Username: "u3" + model.NewId(),
  2596  	})
  2597  	s.Require().Nil(err)
  2598  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }()
  2599  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1)
  2600  	s.Require().Nil(nErr)
  2601  	_, nErr = s.Store().Bot().Save(&model.Bot{
  2602  		UserId:   u3.Id,
  2603  		Username: u3.Username,
  2604  		OwnerId:  u1.Id,
  2605  	})
  2606  	s.Require().Nil(nErr)
  2607  	u3.IsBot = true
  2608  	defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }()
  2609  
  2610  	millis := model.GetMillis()
  2611  	u3.LastActivityAt = millis
  2612  	u2.LastActivityAt = millis - 1
  2613  	u1.LastActivityAt = millis - 1
  2614  
  2615  	s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{UserId: u1.Id, Status: model.STATUS_ONLINE, Manual: false, LastActivityAt: u1.LastActivityAt, ActiveChannel: ""}))
  2616  	s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{UserId: u2.Id, Status: model.STATUS_ONLINE, Manual: false, LastActivityAt: u2.LastActivityAt, ActiveChannel: ""}))
  2617  	s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{UserId: u3.Id, Status: model.STATUS_ONLINE, Manual: false, LastActivityAt: u3.LastActivityAt, ActiveChannel: ""}))
  2618  
  2619  	s.T().Run("get team 1, offset 0, limit 100", func(t *testing.T) {
  2620  		users, err := s.Store().User().GetRecentlyActiveUsersForTeam(teamId, 0, 100, nil)
  2621  		s.Require().Nil(err)
  2622  		s.Assert().Equal([]*model.User{
  2623  			sanitized(u3),
  2624  			sanitized(u1),
  2625  			sanitized(u2),
  2626  		}, users)
  2627  	})
  2628  
  2629  	s.T().Run("get team 1, offset 0, limit 1", func(t *testing.T) {
  2630  		users, err := s.Store().User().GetRecentlyActiveUsersForTeam(teamId, 0, 1, nil)
  2631  		s.Require().Nil(err)
  2632  		s.Assert().Equal([]*model.User{
  2633  			sanitized(u3),
  2634  		}, users)
  2635  	})
  2636  
  2637  	s.T().Run("get team 1, offset 2, limit 1", func(t *testing.T) {
  2638  		users, err := s.Store().User().GetRecentlyActiveUsersForTeam(teamId, 2, 1, nil)
  2639  		s.Require().Nil(err)
  2640  		s.Assert().Equal([]*model.User{
  2641  			sanitized(u2),
  2642  		}, users)
  2643  	})
  2644  }
  2645  
  2646  func (s *UserStoreTS) TestGetNewUsersForTeam() {
  2647  	teamId := model.NewId()
  2648  	teamId2 := model.NewId()
  2649  
  2650  	u1, err := s.Store().User().Save(&model.User{
  2651  		Email:    MakeEmail(),
  2652  		Username: "Yuka",
  2653  	})
  2654  	s.Require().Nil(err)
  2655  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
  2656  	_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)
  2657  	s.Require().Nil(nErr)
  2658  
  2659  	u2, err := s.Store().User().Save(&model.User{
  2660  		Email:    MakeEmail(),
  2661  		Username: "Leia",
  2662  	})
  2663  	s.Require().Nil(err)
  2664  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }()
  2665  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)
  2666  	s.Require().Nil(nErr)
  2667  
  2668  	u3, err := s.Store().User().Save(&model.User{
  2669  		Email:    MakeEmail(),
  2670  		Username: "Ali",
  2671  	})
  2672  	s.Require().Nil(err)
  2673  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }()
  2674  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1)
  2675  	s.Require().Nil(nErr)
  2676  	_, nErr = s.Store().Bot().Save(&model.Bot{
  2677  		UserId:   u3.Id,
  2678  		Username: u3.Username,
  2679  		OwnerId:  u1.Id,
  2680  	})
  2681  	s.Require().Nil(nErr)
  2682  	u3.IsBot = true
  2683  	defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }()
  2684  
  2685  	u4, err := s.Store().User().Save(&model.User{
  2686  		Email:    MakeEmail(),
  2687  		Username: "u4" + model.NewId(),
  2688  	})
  2689  	s.Require().Nil(err)
  2690  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u4.Id)) }()
  2691  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId2, UserId: u4.Id}, -1)
  2692  	s.Require().Nil(nErr)
  2693  
  2694  	s.T().Run("get team 1, offset 0, limit 100", func(t *testing.T) {
  2695  		result, err := s.Store().User().GetNewUsersForTeam(teamId, 0, 100, nil)
  2696  		s.Require().Nil(err)
  2697  		s.Assert().Equal([]*model.User{
  2698  			sanitized(u3),
  2699  			sanitized(u2),
  2700  			sanitized(u1),
  2701  		}, result)
  2702  	})
  2703  
  2704  	s.T().Run("get team 1, offset 0, limit 1", func(t *testing.T) {
  2705  		result, err := s.Store().User().GetNewUsersForTeam(teamId, 0, 1, nil)
  2706  		s.Require().Nil(err)
  2707  		s.Assert().Equal([]*model.User{
  2708  			sanitized(u3),
  2709  		}, result)
  2710  	})
  2711  
  2712  	s.T().Run("get team 1, offset 2, limit 1", func(t *testing.T) {
  2713  		result, err := s.Store().User().GetNewUsersForTeam(teamId, 2, 1, nil)
  2714  		s.Require().Nil(err)
  2715  		s.Assert().Equal([]*model.User{
  2716  			sanitized(u1),
  2717  		}, result)
  2718  	})
  2719  
  2720  	s.T().Run("get team 2, offset 0, limit 100", func(t *testing.T) {
  2721  		result, err := s.Store().User().GetNewUsersForTeam(teamId2, 0, 100, nil)
  2722  		s.Require().Nil(err)
  2723  		s.Assert().Equal([]*model.User{
  2724  			sanitized(u4),
  2725  		}, result)
  2726  	})
  2727  }
  2728  
  2729  func (s *UserStoreTS) assertUsers(expected, actual []*model.User) {
  2730  	expectedUsernames := make([]string, 0, len(expected))
  2731  	for _, user := range expected {
  2732  		expectedUsernames = append(expectedUsernames, user.Username)
  2733  	}
  2734  
  2735  	actualUsernames := make([]string, 0, len(actual))
  2736  	for _, user := range actual {
  2737  		actualUsernames = append(actualUsernames, user.Username)
  2738  	}
  2739  
  2740  	if s.Assert().Equal(expectedUsernames, actualUsernames) {
  2741  		s.Assert().Equal(expected, actual)
  2742  	}
  2743  }
  2744  
  2745  func (s *UserStoreTS) TestSearch() {
  2746  	u1 := &model.User{
  2747  		Username:  "jimbo1" + model.NewId(),
  2748  		FirstName: "Tim",
  2749  		LastName:  "Bill",
  2750  		Nickname:  "Rob",
  2751  		Email:     "harold" + model.NewId() + "@simulator.amazonses.com",
  2752  		Roles:     "system_user system_admin",
  2753  	}
  2754  	_, err := s.Store().User().Save(u1)
  2755  	s.Require().Nil(err)
  2756  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
  2757  
  2758  	u2 := &model.User{
  2759  		Username: "jim2-bobby" + model.NewId(),
  2760  		Email:    MakeEmail(),
  2761  		Roles:    "system_user system_user_manager",
  2762  	}
  2763  	_, err = s.Store().User().Save(u2)
  2764  	s.Require().Nil(err)
  2765  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }()
  2766  
  2767  	u3 := &model.User{
  2768  		Username: "jimbo3" + model.NewId(),
  2769  		Email:    MakeEmail(),
  2770  		Roles:    "system_guest",
  2771  	}
  2772  	_, err = s.Store().User().Save(u3)
  2773  	s.Require().Nil(err)
  2774  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }()
  2775  
  2776  	// The users returned from the database will have AuthData as an empty string.
  2777  	nilAuthData := new(string)
  2778  	*nilAuthData = ""
  2779  	u1.AuthData = nilAuthData
  2780  	u2.AuthData = nilAuthData
  2781  	u3.AuthData = nilAuthData
  2782  
  2783  	t1id := model.NewId()
  2784  	_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: t1id, UserId: u1.Id, SchemeAdmin: true, SchemeUser: true}, -1)
  2785  	s.Require().Nil(nErr)
  2786  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: t1id, UserId: u2.Id, SchemeAdmin: true, SchemeUser: true}, -1)
  2787  	s.Require().Nil(nErr)
  2788  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: t1id, UserId: u3.Id, SchemeAdmin: false, SchemeUser: false, SchemeGuest: true}, -1)
  2789  	s.Require().Nil(nErr)
  2790  
  2791  	testCases := []struct {
  2792  		Description string
  2793  		TeamId      string
  2794  		Term        string
  2795  		Options     *model.UserSearchOptions
  2796  		Expected    []*model.User
  2797  	}{
  2798  		{
  2799  			"search jimb, team 1",
  2800  			t1id,
  2801  			"jimb",
  2802  			&model.UserSearchOptions{
  2803  				AllowFullNames: true,
  2804  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2805  			},
  2806  			[]*model.User{u1, u3},
  2807  		},
  2808  		{
  2809  			"search jimb, team 1 with team guest and team admin filters without sys admin filter",
  2810  			t1id,
  2811  			"jimb",
  2812  			&model.UserSearchOptions{
  2813  				AllowFullNames: true,
  2814  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2815  				TeamRoles:      []string{model.TEAM_GUEST_ROLE_ID, model.TEAM_ADMIN_ROLE_ID},
  2816  			},
  2817  			[]*model.User{u3},
  2818  		},
  2819  		{
  2820  			"search jimb, team 1 with team admin filter and sys admin filter",
  2821  			t1id,
  2822  			"jimb",
  2823  			&model.UserSearchOptions{
  2824  				AllowFullNames: true,
  2825  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2826  				Roles:          []string{model.SYSTEM_ADMIN_ROLE_ID},
  2827  				TeamRoles:      []string{model.TEAM_ADMIN_ROLE_ID},
  2828  			},
  2829  			[]*model.User{u1},
  2830  		},
  2831  		{
  2832  			"search jim, team 1 with team admin filter",
  2833  			t1id,
  2834  			"jim",
  2835  			&model.UserSearchOptions{
  2836  				AllowFullNames: true,
  2837  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2838  				TeamRoles:      []string{model.TEAM_ADMIN_ROLE_ID},
  2839  			},
  2840  			[]*model.User{u2},
  2841  		},
  2842  		{
  2843  			"search jim, team 1 with team admin and team guest filter",
  2844  			t1id,
  2845  			"jim",
  2846  			&model.UserSearchOptions{
  2847  				AllowFullNames: true,
  2848  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2849  				TeamRoles:      []string{model.TEAM_ADMIN_ROLE_ID, model.TEAM_GUEST_ROLE_ID},
  2850  			},
  2851  			[]*model.User{u2, u3},
  2852  		},
  2853  		{
  2854  			"search jim, team 1 with team admin and system admin filters",
  2855  			t1id,
  2856  			"jim",
  2857  			&model.UserSearchOptions{
  2858  				AllowFullNames: true,
  2859  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2860  				Roles:          []string{model.SYSTEM_ADMIN_ROLE_ID},
  2861  				TeamRoles:      []string{model.TEAM_ADMIN_ROLE_ID},
  2862  			},
  2863  			[]*model.User{u2, u1},
  2864  		},
  2865  		{
  2866  			"search jim, team 1 with system guest filter",
  2867  			t1id,
  2868  			"jim",
  2869  			&model.UserSearchOptions{
  2870  				AllowFullNames: true,
  2871  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2872  				Roles:          []string{model.SYSTEM_GUEST_ROLE_ID},
  2873  				TeamRoles:      []string{},
  2874  			},
  2875  			[]*model.User{u3},
  2876  		},
  2877  	}
  2878  
  2879  	for _, testCase := range testCases {
  2880  		s.T().Run(testCase.Description, func(t *testing.T) {
  2881  			users, err := s.Store().User().Search(
  2882  				testCase.TeamId,
  2883  				testCase.Term,
  2884  				testCase.Options,
  2885  			)
  2886  			s.Require().Nil(err)
  2887  			s.assertUsers(testCase.Expected, users)
  2888  		})
  2889  	}
  2890  }
  2891  
  2892  func (s *UserStoreTS) TestSearchNotInChannel() {
  2893  	u1 := &model.User{
  2894  		Username:  "jimbo1" + model.NewId(),
  2895  		FirstName: "Tim",
  2896  		LastName:  "Bill",
  2897  		Nickname:  "Rob",
  2898  		Email:     "harold" + model.NewId() + "@simulator.amazonses.com",
  2899  	}
  2900  	_, err := s.Store().User().Save(u1)
  2901  	s.Require().Nil(err)
  2902  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
  2903  
  2904  	u2 := &model.User{
  2905  		Username: "jim2-bobby" + model.NewId(),
  2906  		Email:    MakeEmail(),
  2907  	}
  2908  	_, err = s.Store().User().Save(u2)
  2909  	s.Require().Nil(err)
  2910  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }()
  2911  
  2912  	u3 := &model.User{
  2913  		Username: "jimbo3" + model.NewId(),
  2914  		Email:    MakeEmail(),
  2915  		DeleteAt: 1,
  2916  	}
  2917  	_, err = s.Store().User().Save(u3)
  2918  	s.Require().Nil(err)
  2919  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }()
  2920  	_, nErr := s.Store().Bot().Save(&model.Bot{
  2921  		UserId:   u3.Id,
  2922  		Username: u3.Username,
  2923  		OwnerId:  u1.Id,
  2924  	})
  2925  	s.Require().Nil(nErr)
  2926  	u3.IsBot = true
  2927  	defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }()
  2928  
  2929  	tid := model.NewId()
  2930  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u1.Id}, -1)
  2931  	s.Require().Nil(nErr)
  2932  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u2.Id}, -1)
  2933  	s.Require().Nil(nErr)
  2934  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u3.Id}, -1)
  2935  	s.Require().Nil(nErr)
  2936  
  2937  	// The users returned from the database will have AuthData as an empty string.
  2938  	nilAuthData := new(string)
  2939  	*nilAuthData = ""
  2940  
  2941  	u1.AuthData = nilAuthData
  2942  	u2.AuthData = nilAuthData
  2943  	u3.AuthData = nilAuthData
  2944  
  2945  	ch1 := model.Channel{
  2946  		TeamId:      tid,
  2947  		DisplayName: "NameName",
  2948  		Name:        "zz" + model.NewId() + "b",
  2949  		Type:        model.CHANNEL_OPEN,
  2950  	}
  2951  	c1, nErr := s.Store().Channel().Save(&ch1, -1)
  2952  	s.Require().Nil(nErr)
  2953  
  2954  	ch2 := model.Channel{
  2955  		TeamId:      tid,
  2956  		DisplayName: "NameName",
  2957  		Name:        "zz" + model.NewId() + "b",
  2958  		Type:        model.CHANNEL_OPEN,
  2959  	}
  2960  	c2, nErr := s.Store().Channel().Save(&ch2, -1)
  2961  	s.Require().Nil(nErr)
  2962  
  2963  	_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{
  2964  		ChannelId:   c2.Id,
  2965  		UserId:      u1.Id,
  2966  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  2967  	})
  2968  	s.Require().Nil(nErr)
  2969  	_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{
  2970  		ChannelId:   c1.Id,
  2971  		UserId:      u3.Id,
  2972  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  2973  	})
  2974  	s.Require().Nil(nErr)
  2975  	_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{
  2976  		ChannelId:   c2.Id,
  2977  		UserId:      u2.Id,
  2978  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  2979  	})
  2980  	s.Require().Nil(nErr)
  2981  
  2982  	testCases := []struct {
  2983  		Description string
  2984  		TeamId      string
  2985  		ChannelId   string
  2986  		Term        string
  2987  		Options     *model.UserSearchOptions
  2988  		Expected    []*model.User
  2989  	}{
  2990  		{
  2991  			"search jimb, channel 1",
  2992  			tid,
  2993  			c1.Id,
  2994  			"jimb",
  2995  			&model.UserSearchOptions{
  2996  				AllowFullNames: true,
  2997  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2998  			},
  2999  			[]*model.User{u1},
  3000  		},
  3001  		{
  3002  			"search jimb, allow inactive, channel 1",
  3003  			tid,
  3004  			c1.Id,
  3005  			"jimb",
  3006  			&model.UserSearchOptions{
  3007  				AllowFullNames: true,
  3008  				AllowInactive:  true,
  3009  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3010  			},
  3011  			[]*model.User{u1},
  3012  		},
  3013  		{
  3014  			"search jimb, channel 1, no team id",
  3015  			"",
  3016  			c1.Id,
  3017  			"jimb",
  3018  			&model.UserSearchOptions{
  3019  				AllowFullNames: true,
  3020  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3021  			},
  3022  			[]*model.User{u1},
  3023  		},
  3024  		{
  3025  			"search jimb, channel 1, junk team id",
  3026  			"junk",
  3027  			c1.Id,
  3028  			"jimb",
  3029  			&model.UserSearchOptions{
  3030  				AllowFullNames: true,
  3031  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3032  			},
  3033  			[]*model.User{},
  3034  		},
  3035  		{
  3036  			"search jimb, channel 2",
  3037  			tid,
  3038  			c2.Id,
  3039  			"jimb",
  3040  			&model.UserSearchOptions{
  3041  				AllowFullNames: true,
  3042  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3043  			},
  3044  			[]*model.User{},
  3045  		},
  3046  		{
  3047  			"search jimb, allow inactive, channel 2",
  3048  			tid,
  3049  			c2.Id,
  3050  			"jimb",
  3051  			&model.UserSearchOptions{
  3052  				AllowFullNames: true,
  3053  				AllowInactive:  true,
  3054  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3055  			},
  3056  			[]*model.User{u3},
  3057  		},
  3058  		{
  3059  			"search jimb, channel 2, no team id",
  3060  			"",
  3061  			c2.Id,
  3062  			"jimb",
  3063  			&model.UserSearchOptions{
  3064  				AllowFullNames: true,
  3065  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3066  			},
  3067  			[]*model.User{},
  3068  		},
  3069  		{
  3070  			"search jimb, channel 2, junk team id",
  3071  			"junk",
  3072  			c2.Id,
  3073  			"jimb",
  3074  			&model.UserSearchOptions{
  3075  				AllowFullNames: true,
  3076  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3077  			},
  3078  			[]*model.User{},
  3079  		},
  3080  		{
  3081  			"search jim, channel 1",
  3082  			tid,
  3083  			c1.Id,
  3084  			"jim",
  3085  			&model.UserSearchOptions{
  3086  				AllowFullNames: true,
  3087  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3088  			},
  3089  			[]*model.User{u2, u1},
  3090  		},
  3091  		{
  3092  			"search jim, channel 1, limit 1",
  3093  			tid,
  3094  			c1.Id,
  3095  			"jim",
  3096  			&model.UserSearchOptions{
  3097  				AllowFullNames: true,
  3098  				Limit:          1,
  3099  			},
  3100  			[]*model.User{u2},
  3101  		},
  3102  	}
  3103  
  3104  	for _, testCase := range testCases {
  3105  		s.T().Run(testCase.Description, func(t *testing.T) {
  3106  			users, err := s.Store().User().SearchNotInChannel(
  3107  				testCase.TeamId,
  3108  				testCase.ChannelId,
  3109  				testCase.Term,
  3110  				testCase.Options,
  3111  			)
  3112  			s.Require().Nil(err)
  3113  			s.assertUsers(testCase.Expected, users)
  3114  		})
  3115  	}
  3116  }
  3117  
  3118  func (s *UserStoreTS) TestSearchInChannel() {
  3119  	u1 := &model.User{
  3120  		Username:  "jimbo1" + model.NewId(),
  3121  		FirstName: "Tim",
  3122  		LastName:  "Bill",
  3123  		Nickname:  "Rob",
  3124  		Email:     "harold" + model.NewId() + "@simulator.amazonses.com",
  3125  		Roles:     "system_user system_admin",
  3126  	}
  3127  	_, err := s.Store().User().Save(u1)
  3128  	s.Require().Nil(err)
  3129  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
  3130  
  3131  	u2 := &model.User{
  3132  		Username: "jim-bobby" + model.NewId(),
  3133  		Email:    MakeEmail(),
  3134  		Roles:    "system_user",
  3135  	}
  3136  	_, err = s.Store().User().Save(u2)
  3137  	s.Require().Nil(err)
  3138  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }()
  3139  
  3140  	u3 := &model.User{
  3141  		Username: "jimbo3" + model.NewId(),
  3142  		Email:    MakeEmail(),
  3143  		DeleteAt: 1,
  3144  		Roles:    "system_user",
  3145  	}
  3146  	_, err = s.Store().User().Save(u3)
  3147  	s.Require().Nil(err)
  3148  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }()
  3149  	_, nErr := s.Store().Bot().Save(&model.Bot{
  3150  		UserId:   u3.Id,
  3151  		Username: u3.Username,
  3152  		OwnerId:  u1.Id,
  3153  	})
  3154  	s.Require().Nil(nErr)
  3155  	u3.IsBot = true
  3156  	defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }()
  3157  
  3158  	tid := model.NewId()
  3159  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u1.Id}, -1)
  3160  	s.Require().Nil(nErr)
  3161  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u2.Id}, -1)
  3162  	s.Require().Nil(nErr)
  3163  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u3.Id}, -1)
  3164  	s.Require().Nil(nErr)
  3165  
  3166  	// The users returned from the database will have AuthData as an empty string.
  3167  	nilAuthData := new(string)
  3168  	*nilAuthData = ""
  3169  
  3170  	u1.AuthData = nilAuthData
  3171  	u2.AuthData = nilAuthData
  3172  	u3.AuthData = nilAuthData
  3173  
  3174  	ch1 := model.Channel{
  3175  		TeamId:      tid,
  3176  		DisplayName: "NameName",
  3177  		Name:        "zz" + model.NewId() + "b",
  3178  		Type:        model.CHANNEL_OPEN,
  3179  	}
  3180  	c1, nErr := s.Store().Channel().Save(&ch1, -1)
  3181  	s.Require().Nil(nErr)
  3182  
  3183  	ch2 := model.Channel{
  3184  		TeamId:      tid,
  3185  		DisplayName: "NameName",
  3186  		Name:        "zz" + model.NewId() + "b",
  3187  		Type:        model.CHANNEL_OPEN,
  3188  	}
  3189  	c2, nErr := s.Store().Channel().Save(&ch2, -1)
  3190  	s.Require().Nil(nErr)
  3191  
  3192  	_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{
  3193  		ChannelId:   c1.Id,
  3194  		UserId:      u1.Id,
  3195  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  3196  		SchemeAdmin: true,
  3197  		SchemeUser:  true,
  3198  	})
  3199  	s.Require().Nil(nErr)
  3200  	_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{
  3201  		ChannelId:   c2.Id,
  3202  		UserId:      u2.Id,
  3203  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  3204  		SchemeAdmin: false,
  3205  		SchemeUser:  true,
  3206  	})
  3207  	s.Require().Nil(nErr)
  3208  	_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{
  3209  		ChannelId:   c1.Id,
  3210  		UserId:      u3.Id,
  3211  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  3212  		SchemeAdmin: false,
  3213  		SchemeUser:  true,
  3214  	})
  3215  	s.Require().Nil(nErr)
  3216  
  3217  	testCases := []struct {
  3218  		Description string
  3219  		ChannelId   string
  3220  		Term        string
  3221  		Options     *model.UserSearchOptions
  3222  		Expected    []*model.User
  3223  	}{
  3224  		{
  3225  			"search jimb, channel 1",
  3226  			c1.Id,
  3227  			"jimb",
  3228  			&model.UserSearchOptions{
  3229  				AllowFullNames: true,
  3230  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3231  			},
  3232  			[]*model.User{u1},
  3233  		},
  3234  		{
  3235  			"search jimb, allow inactive, channel 1",
  3236  			c1.Id,
  3237  			"jimb",
  3238  			&model.UserSearchOptions{
  3239  				AllowFullNames: true,
  3240  				AllowInactive:  true,
  3241  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3242  			},
  3243  			[]*model.User{u1, u3},
  3244  		},
  3245  		{
  3246  			"search jimb, allow inactive, channel 1, limit 1",
  3247  			c1.Id,
  3248  			"jimb",
  3249  			&model.UserSearchOptions{
  3250  				AllowFullNames: true,
  3251  				AllowInactive:  true,
  3252  				Limit:          1,
  3253  			},
  3254  			[]*model.User{u1},
  3255  		},
  3256  		{
  3257  			"search jimb, channel 2",
  3258  			c2.Id,
  3259  			"jimb",
  3260  			&model.UserSearchOptions{
  3261  				AllowFullNames: true,
  3262  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3263  			},
  3264  			[]*model.User{},
  3265  		},
  3266  		{
  3267  			"search jimb, allow inactive, channel 2",
  3268  			c2.Id,
  3269  			"jimb",
  3270  			&model.UserSearchOptions{
  3271  				AllowFullNames: true,
  3272  				AllowInactive:  true,
  3273  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3274  			},
  3275  			[]*model.User{},
  3276  		},
  3277  		{
  3278  			"search jim, allow inactive, channel 1 with system admin filter",
  3279  			c1.Id,
  3280  			"jim",
  3281  			&model.UserSearchOptions{
  3282  				AllowFullNames: true,
  3283  				AllowInactive:  true,
  3284  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3285  				Roles:          []string{model.SYSTEM_ADMIN_ROLE_ID},
  3286  			},
  3287  			[]*model.User{u1},
  3288  		},
  3289  		{
  3290  			"search jim, allow inactive, channel 1 with system admin and system user filter",
  3291  			c1.Id,
  3292  			"jim",
  3293  			&model.UserSearchOptions{
  3294  				AllowFullNames: true,
  3295  				AllowInactive:  true,
  3296  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3297  				Roles:          []string{model.SYSTEM_ADMIN_ROLE_ID, model.SYSTEM_USER_ROLE_ID},
  3298  			},
  3299  			[]*model.User{u1, u3},
  3300  		},
  3301  		{
  3302  			"search jim, allow inactive, channel 1 with channel user filter",
  3303  			c1.Id,
  3304  			"jim",
  3305  			&model.UserSearchOptions{
  3306  				AllowFullNames: true,
  3307  				AllowInactive:  true,
  3308  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3309  				ChannelRoles:   []string{model.CHANNEL_USER_ROLE_ID},
  3310  			},
  3311  			[]*model.User{u3},
  3312  		},
  3313  		{
  3314  			"search jim, allow inactive, channel 1 with channel user and channel admin filter",
  3315  			c1.Id,
  3316  			"jim",
  3317  			&model.UserSearchOptions{
  3318  				AllowFullNames: true,
  3319  				AllowInactive:  true,
  3320  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3321  				ChannelRoles:   []string{model.CHANNEL_USER_ROLE_ID, model.CHANNEL_ADMIN_ROLE_ID},
  3322  			},
  3323  			[]*model.User{u3},
  3324  		},
  3325  		{
  3326  			"search jim, allow inactive, channel 2 with channel user filter",
  3327  			c2.Id,
  3328  			"jim",
  3329  			&model.UserSearchOptions{
  3330  				AllowFullNames: true,
  3331  				AllowInactive:  true,
  3332  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3333  				ChannelRoles:   []string{model.CHANNEL_USER_ROLE_ID},
  3334  			},
  3335  			[]*model.User{u2},
  3336  		},
  3337  	}
  3338  
  3339  	for _, testCase := range testCases {
  3340  		s.T().Run(testCase.Description, func(t *testing.T) {
  3341  			users, err := s.Store().User().SearchInChannel(
  3342  				testCase.ChannelId,
  3343  				testCase.Term,
  3344  				testCase.Options,
  3345  			)
  3346  			s.Require().Nil(err)
  3347  			s.assertUsers(testCase.Expected, users)
  3348  		})
  3349  	}
  3350  }
  3351  
  3352  func (s *UserStoreTS) TestSearchNotInTeam() {
  3353  	u1 := &model.User{
  3354  		Username:  "jimbo1" + model.NewId(),
  3355  		FirstName: "Tim",
  3356  		LastName:  "Bill",
  3357  		Nickname:  "Rob",
  3358  		Email:     "harold" + model.NewId() + "@simulator.amazonses.com",
  3359  	}
  3360  	_, err := s.Store().User().Save(u1)
  3361  	s.Require().Nil(err)
  3362  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
  3363  
  3364  	u2 := &model.User{
  3365  		Username: "jim-bobby" + model.NewId(),
  3366  		Email:    MakeEmail(),
  3367  	}
  3368  	_, err = s.Store().User().Save(u2)
  3369  	s.Require().Nil(err)
  3370  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }()
  3371  
  3372  	u3 := &model.User{
  3373  		Username: "jimbo3" + model.NewId(),
  3374  		Email:    MakeEmail(),
  3375  		DeleteAt: 1,
  3376  	}
  3377  	_, err = s.Store().User().Save(u3)
  3378  	s.Require().Nil(err)
  3379  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }()
  3380  	_, nErr := s.Store().Bot().Save(&model.Bot{
  3381  		UserId:   u3.Id,
  3382  		Username: u3.Username,
  3383  		OwnerId:  u1.Id,
  3384  	})
  3385  	s.Require().Nil(nErr)
  3386  	u3.IsBot = true
  3387  	defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }()
  3388  
  3389  	u4 := &model.User{
  3390  		Username: "simon" + model.NewId(),
  3391  		Email:    MakeEmail(),
  3392  		DeleteAt: 0,
  3393  	}
  3394  	_, err = s.Store().User().Save(u4)
  3395  	s.Require().Nil(err)
  3396  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u4.Id)) }()
  3397  
  3398  	u5 := &model.User{
  3399  		Username:  "yu" + model.NewId(),
  3400  		FirstName: "En",
  3401  		LastName:  "Yu",
  3402  		Nickname:  "enyu",
  3403  		Email:     MakeEmail(),
  3404  	}
  3405  	_, err = s.Store().User().Save(u5)
  3406  	s.Require().Nil(err)
  3407  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u5.Id)) }()
  3408  
  3409  	u6 := &model.User{
  3410  		Username:  "underscore" + model.NewId(),
  3411  		FirstName: "Du_",
  3412  		LastName:  "_DE",
  3413  		Nickname:  "lodash",
  3414  		Email:     MakeEmail(),
  3415  	}
  3416  	_, err = s.Store().User().Save(u6)
  3417  	s.Require().Nil(err)
  3418  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u6.Id)) }()
  3419  
  3420  	teamId1 := model.NewId()
  3421  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId1, UserId: u1.Id}, -1)
  3422  	s.Require().Nil(nErr)
  3423  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId1, UserId: u2.Id}, -1)
  3424  	s.Require().Nil(nErr)
  3425  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId1, UserId: u3.Id}, -1)
  3426  	s.Require().Nil(nErr)
  3427  	// u4 is not in team 1
  3428  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId1, UserId: u5.Id}, -1)
  3429  	s.Require().Nil(nErr)
  3430  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId1, UserId: u6.Id}, -1)
  3431  	s.Require().Nil(nErr)
  3432  
  3433  	teamId2 := model.NewId()
  3434  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId2, UserId: u4.Id}, -1)
  3435  	s.Require().Nil(nErr)
  3436  
  3437  	// The users returned from the database will have AuthData as an empty string.
  3438  	nilAuthData := new(string)
  3439  	*nilAuthData = ""
  3440  
  3441  	u1.AuthData = nilAuthData
  3442  	u2.AuthData = nilAuthData
  3443  	u3.AuthData = nilAuthData
  3444  	u4.AuthData = nilAuthData
  3445  	u5.AuthData = nilAuthData
  3446  	u6.AuthData = nilAuthData
  3447  
  3448  	testCases := []struct {
  3449  		Description string
  3450  		TeamId      string
  3451  		Term        string
  3452  		Options     *model.UserSearchOptions
  3453  		Expected    []*model.User
  3454  	}{
  3455  		{
  3456  			"search simo, team 1",
  3457  			teamId1,
  3458  			"simo",
  3459  			&model.UserSearchOptions{
  3460  				AllowFullNames: true,
  3461  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3462  			},
  3463  			[]*model.User{u4},
  3464  		},
  3465  
  3466  		{
  3467  			"search jimb, team 1",
  3468  			teamId1,
  3469  			"jimb",
  3470  			&model.UserSearchOptions{
  3471  				AllowFullNames: true,
  3472  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3473  			},
  3474  			[]*model.User{},
  3475  		},
  3476  		{
  3477  			"search jimb, allow inactive, team 1",
  3478  			teamId1,
  3479  			"jimb",
  3480  			&model.UserSearchOptions{
  3481  				AllowFullNames: true,
  3482  				AllowInactive:  true,
  3483  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3484  			},
  3485  			[]*model.User{},
  3486  		},
  3487  		{
  3488  			"search simo, team 2",
  3489  			teamId2,
  3490  			"simo",
  3491  			&model.UserSearchOptions{
  3492  				AllowFullNames: true,
  3493  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3494  			},
  3495  			[]*model.User{},
  3496  		},
  3497  		{
  3498  			"search jimb, team2",
  3499  			teamId2,
  3500  			"jimb",
  3501  			&model.UserSearchOptions{
  3502  				AllowFullNames: true,
  3503  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3504  			},
  3505  			[]*model.User{u1},
  3506  		},
  3507  		{
  3508  			"search jimb, allow inactive, team 2",
  3509  			teamId2,
  3510  			"jimb",
  3511  			&model.UserSearchOptions{
  3512  				AllowFullNames: true,
  3513  				AllowInactive:  true,
  3514  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3515  			},
  3516  			[]*model.User{u1, u3},
  3517  		},
  3518  		{
  3519  			"search jimb, allow inactive, team 2, limit 1",
  3520  			teamId2,
  3521  			"jimb",
  3522  			&model.UserSearchOptions{
  3523  				AllowFullNames: true,
  3524  				AllowInactive:  true,
  3525  				Limit:          1,
  3526  			},
  3527  			[]*model.User{u1},
  3528  		},
  3529  	}
  3530  
  3531  	for _, testCase := range testCases {
  3532  		s.T().Run(testCase.Description, func(t *testing.T) {
  3533  			users, err := s.Store().User().SearchNotInTeam(
  3534  				testCase.TeamId,
  3535  				testCase.Term,
  3536  				testCase.Options,
  3537  			)
  3538  			s.Require().Nil(err)
  3539  			s.assertUsers(testCase.Expected, users)
  3540  		})
  3541  	}
  3542  }
  3543  
  3544  func (s *UserStoreTS) TestSearchWithoutTeam() {
  3545  	u1 := &model.User{
  3546  		Username:  "jimbo1" + model.NewId(),
  3547  		FirstName: "Tim",
  3548  		LastName:  "Bill",
  3549  		Nickname:  "Rob",
  3550  		Email:     "harold" + model.NewId() + "@simulator.amazonses.com",
  3551  	}
  3552  	_, err := s.Store().User().Save(u1)
  3553  	s.Require().Nil(err)
  3554  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
  3555  
  3556  	u2 := &model.User{
  3557  		Username: "jim2-bobby" + model.NewId(),
  3558  		Email:    MakeEmail(),
  3559  	}
  3560  	_, err = s.Store().User().Save(u2)
  3561  	s.Require().Nil(err)
  3562  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }()
  3563  
  3564  	u3 := &model.User{
  3565  		Username: "jimbo3" + model.NewId(),
  3566  		Email:    MakeEmail(),
  3567  		DeleteAt: 1,
  3568  	}
  3569  	_, err = s.Store().User().Save(u3)
  3570  	s.Require().Nil(err)
  3571  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }()
  3572  	_, nErr := s.Store().Bot().Save(&model.Bot{
  3573  		UserId:   u3.Id,
  3574  		Username: u3.Username,
  3575  		OwnerId:  u1.Id,
  3576  	})
  3577  	s.Require().Nil(nErr)
  3578  	u3.IsBot = true
  3579  	defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }()
  3580  
  3581  	tid := model.NewId()
  3582  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u3.Id}, -1)
  3583  	s.Require().Nil(nErr)
  3584  
  3585  	// The users returned from the database will have AuthData as an empty string.
  3586  	nilAuthData := new(string)
  3587  	*nilAuthData = ""
  3588  
  3589  	u1.AuthData = nilAuthData
  3590  	u2.AuthData = nilAuthData
  3591  	u3.AuthData = nilAuthData
  3592  
  3593  	testCases := []struct {
  3594  		Description string
  3595  		Term        string
  3596  		Options     *model.UserSearchOptions
  3597  		Expected    []*model.User
  3598  	}{
  3599  		{
  3600  			"empty string",
  3601  			"",
  3602  			&model.UserSearchOptions{
  3603  				AllowFullNames: true,
  3604  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3605  			},
  3606  			[]*model.User{u2, u1},
  3607  		},
  3608  		{
  3609  			"jim",
  3610  			"jim",
  3611  			&model.UserSearchOptions{
  3612  				AllowFullNames: true,
  3613  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3614  			},
  3615  			[]*model.User{u2, u1},
  3616  		},
  3617  		{
  3618  			"PLT-8354",
  3619  			"* ",
  3620  			&model.UserSearchOptions{
  3621  				AllowFullNames: true,
  3622  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3623  			},
  3624  			[]*model.User{u2, u1},
  3625  		},
  3626  		{
  3627  			"jim, limit 1",
  3628  			"jim",
  3629  			&model.UserSearchOptions{
  3630  				AllowFullNames: true,
  3631  				Limit:          1,
  3632  			},
  3633  			[]*model.User{u2},
  3634  		},
  3635  	}
  3636  
  3637  	for _, testCase := range testCases {
  3638  		s.T().Run(testCase.Description, func(t *testing.T) {
  3639  			users, err := s.Store().User().SearchWithoutTeam(
  3640  				testCase.Term,
  3641  				testCase.Options,
  3642  			)
  3643  			s.Require().Nil(err)
  3644  			s.assertUsers(testCase.Expected, users)
  3645  		})
  3646  	}
  3647  }
  3648  
  3649  func (s *UserStoreTS) TestSearchInGroup() {
  3650  	u1 := &model.User{
  3651  		Username:  "jimbo1" + model.NewId(),
  3652  		FirstName: "Tim",
  3653  		LastName:  "Bill",
  3654  		Nickname:  "Rob",
  3655  		Email:     "harold" + model.NewId() + "@simulator.amazonses.com",
  3656  	}
  3657  	_, err := s.Store().User().Save(u1)
  3658  	s.Require().Nil(err)
  3659  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
  3660  
  3661  	u2 := &model.User{
  3662  		Username: "jim-bobby" + model.NewId(),
  3663  		Email:    MakeEmail(),
  3664  	}
  3665  	_, err = s.Store().User().Save(u2)
  3666  	s.Require().Nil(err)
  3667  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }()
  3668  
  3669  	u3 := &model.User{
  3670  		Username: "jimbo3" + model.NewId(),
  3671  		Email:    MakeEmail(),
  3672  		DeleteAt: 1,
  3673  	}
  3674  	_, err = s.Store().User().Save(u3)
  3675  	s.Require().Nil(err)
  3676  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }()
  3677  
  3678  	// The users returned from the database will have AuthData as an empty string.
  3679  	nilAuthData := model.NewString("")
  3680  
  3681  	u1.AuthData = nilAuthData
  3682  	u2.AuthData = nilAuthData
  3683  	u3.AuthData = nilAuthData
  3684  
  3685  	g1 := &model.Group{
  3686  		Name:        model.NewString(model.NewId()),
  3687  		DisplayName: model.NewId(),
  3688  		Description: model.NewId(),
  3689  		Source:      model.GroupSourceLdap,
  3690  		RemoteId:    model.NewId(),
  3691  	}
  3692  	_, err = s.Store().Group().Create(g1)
  3693  	s.Require().Nil(err)
  3694  
  3695  	g2 := &model.Group{
  3696  		Name:        model.NewString(model.NewId()),
  3697  		DisplayName: model.NewId(),
  3698  		Description: model.NewId(),
  3699  		Source:      model.GroupSourceLdap,
  3700  		RemoteId:    model.NewId(),
  3701  	}
  3702  	_, err = s.Store().Group().Create(g2)
  3703  	s.Require().Nil(err)
  3704  
  3705  	_, err = s.Store().Group().UpsertMember(g1.Id, u1.Id)
  3706  	s.Require().Nil(err)
  3707  
  3708  	_, err = s.Store().Group().UpsertMember(g2.Id, u2.Id)
  3709  	s.Require().Nil(err)
  3710  
  3711  	_, err = s.Store().Group().UpsertMember(g1.Id, u3.Id)
  3712  	s.Require().Nil(err)
  3713  
  3714  	testCases := []struct {
  3715  		Description string
  3716  		GroupId     string
  3717  		Term        string
  3718  		Options     *model.UserSearchOptions
  3719  		Expected    []*model.User
  3720  	}{
  3721  		{
  3722  			"search jimb, group 1",
  3723  			g1.Id,
  3724  			"jimb",
  3725  			&model.UserSearchOptions{
  3726  				AllowFullNames: true,
  3727  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3728  			},
  3729  			[]*model.User{u1},
  3730  		},
  3731  		{
  3732  			"search jimb, group 1, allow inactive",
  3733  			g1.Id,
  3734  			"jimb",
  3735  			&model.UserSearchOptions{
  3736  				AllowFullNames: true,
  3737  				AllowInactive:  true,
  3738  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3739  			},
  3740  			[]*model.User{u1, u3},
  3741  		},
  3742  		{
  3743  			"search jimb, group 1, limit 1",
  3744  			g1.Id,
  3745  			"jimb",
  3746  			&model.UserSearchOptions{
  3747  				AllowFullNames: true,
  3748  				AllowInactive:  true,
  3749  				Limit:          1,
  3750  			},
  3751  			[]*model.User{u1},
  3752  		},
  3753  		{
  3754  			"search jimb, group 2",
  3755  			g2.Id,
  3756  			"jimb",
  3757  			&model.UserSearchOptions{
  3758  				AllowFullNames: true,
  3759  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3760  			},
  3761  			[]*model.User{},
  3762  		},
  3763  		{
  3764  			"search jimb, allow inactive, group 2",
  3765  			g2.Id,
  3766  			"jimb",
  3767  			&model.UserSearchOptions{
  3768  				AllowFullNames: true,
  3769  				AllowInactive:  true,
  3770  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  3771  			},
  3772  			[]*model.User{},
  3773  		},
  3774  	}
  3775  
  3776  	for _, testCase := range testCases {
  3777  		s.T().Run(testCase.Description, func(t *testing.T) {
  3778  			users, err := s.Store().User().SearchInGroup(
  3779  				testCase.GroupId,
  3780  				testCase.Term,
  3781  				testCase.Options,
  3782  			)
  3783  			s.Require().Nil(err)
  3784  			s.assertUsers(testCase.Expected, users)
  3785  		})
  3786  	}
  3787  }
  3788  
  3789  func (s *UserStoreTS) TestGetUsersBatchForIndexing() {
  3790  	// Set up all the objects needed
  3791  	t1, err := s.Store().Team().Save(&model.Team{
  3792  		DisplayName: "Team1",
  3793  		Name:        "zz" + model.NewId(),
  3794  		Type:        model.TEAM_OPEN,
  3795  	})
  3796  	s.Require().Nil(err)
  3797  
  3798  	ch1 := &model.Channel{
  3799  		Name: model.NewId(),
  3800  		Type: model.CHANNEL_OPEN,
  3801  	}
  3802  	cPub1, nErr := s.Store().Channel().Save(ch1, -1)
  3803  	s.Require().Nil(nErr)
  3804  
  3805  	ch2 := &model.Channel{
  3806  		Name: model.NewId(),
  3807  		Type: model.CHANNEL_OPEN,
  3808  	}
  3809  	cPub2, nErr := s.Store().Channel().Save(ch2, -1)
  3810  	s.Require().Nil(nErr)
  3811  
  3812  	ch3 := &model.Channel{
  3813  		Name: model.NewId(),
  3814  		Type: model.CHANNEL_PRIVATE,
  3815  	}
  3816  
  3817  	cPriv, nErr := s.Store().Channel().Save(ch3, -1)
  3818  	s.Require().Nil(nErr)
  3819  
  3820  	u1, err := s.Store().User().Save(&model.User{
  3821  		Email:    MakeEmail(),
  3822  		Username: model.NewId(),
  3823  		CreateAt: model.GetMillis(),
  3824  	})
  3825  	s.Require().Nil(err)
  3826  
  3827  	time.Sleep(time.Millisecond)
  3828  
  3829  	u2, err := s.Store().User().Save(&model.User{
  3830  		Email:    MakeEmail(),
  3831  		Username: model.NewId(),
  3832  		CreateAt: model.GetMillis(),
  3833  	})
  3834  	s.Require().Nil(err)
  3835  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{
  3836  		UserId: u2.Id,
  3837  		TeamId: t1.Id,
  3838  	}, 100)
  3839  	s.Require().Nil(nErr)
  3840  	_, err = s.Store().Channel().SaveMember(&model.ChannelMember{
  3841  		UserId:      u2.Id,
  3842  		ChannelId:   cPub1.Id,
  3843  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  3844  	})
  3845  	s.Require().Nil(err)
  3846  	_, err = s.Store().Channel().SaveMember(&model.ChannelMember{
  3847  		UserId:      u2.Id,
  3848  		ChannelId:   cPub2.Id,
  3849  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  3850  	})
  3851  	s.Require().Nil(err)
  3852  
  3853  	startTime := u2.CreateAt
  3854  	time.Sleep(time.Millisecond)
  3855  
  3856  	u3, err := s.Store().User().Save(&model.User{
  3857  		Email:    MakeEmail(),
  3858  		Username: model.NewId(),
  3859  		CreateAt: model.GetMillis(),
  3860  	})
  3861  	s.Require().Nil(err)
  3862  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{
  3863  		UserId:   u3.Id,
  3864  		TeamId:   t1.Id,
  3865  		DeleteAt: model.GetMillis(),
  3866  	}, 100)
  3867  	s.Require().Nil(nErr)
  3868  	_, err = s.Store().Channel().SaveMember(&model.ChannelMember{
  3869  		UserId:      u3.Id,
  3870  		ChannelId:   cPub2.Id,
  3871  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  3872  	})
  3873  	s.Require().Nil(err)
  3874  	_, err = s.Store().Channel().SaveMember(&model.ChannelMember{
  3875  		UserId:      u3.Id,
  3876  		ChannelId:   cPriv.Id,
  3877  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  3878  	})
  3879  	s.Require().Nil(err)
  3880  
  3881  	endTime := u3.CreateAt
  3882  
  3883  	// First and last user should be outside the range
  3884  	res1List, err := s.Store().User().GetUsersBatchForIndexing(startTime, endTime, 100)
  3885  	s.Require().Nil(err)
  3886  
  3887  	s.Assert().Len(res1List, 1)
  3888  	s.Assert().Equal(res1List[0].Username, u2.Username)
  3889  	s.Assert().ElementsMatch(res1List[0].TeamsIds, []string{t1.Id})
  3890  	s.Assert().ElementsMatch(res1List[0].ChannelsIds, []string{cPub1.Id, cPub2.Id})
  3891  
  3892  	// Update startTime to include first user
  3893  	startTime = u1.CreateAt
  3894  	res2List, err := s.Store().User().GetUsersBatchForIndexing(startTime, endTime, 100)
  3895  	s.Require().Nil(err)
  3896  
  3897  	s.Assert().Len(res2List, 2)
  3898  	s.Assert().Equal(res2List[0].Username, u1.Username)
  3899  	s.Assert().Equal(res2List[0].ChannelsIds, []string{})
  3900  	s.Assert().Equal(res2List[0].TeamsIds, []string{})
  3901  	s.Assert().Equal(res2List[1].Username, u2.Username)
  3902  
  3903  	// Update endTime to include last user
  3904  	endTime = model.GetMillis()
  3905  	res3List, err := s.Store().User().GetUsersBatchForIndexing(startTime, endTime, 100)
  3906  	s.Require().Nil(err)
  3907  
  3908  	s.Assert().Len(res3List, 3)
  3909  	s.Assert().Equal(res3List[0].Username, u1.Username)
  3910  	s.Assert().Equal(res3List[1].Username, u2.Username)
  3911  	s.Assert().Equal(res3List[2].Username, u3.Username)
  3912  	s.Assert().ElementsMatch(res3List[2].TeamsIds, []string{})
  3913  	s.Assert().ElementsMatch(res3List[2].ChannelsIds, []string{cPub2.Id})
  3914  
  3915  	// Testing the limit
  3916  	res4List, err := s.Store().User().GetUsersBatchForIndexing(startTime, endTime, 2)
  3917  	s.Require().Nil(err)
  3918  
  3919  	s.Assert().Len(res4List, 2)
  3920  	s.Assert().Equal(res4List[0].Username, u1.Username)
  3921  	s.Assert().Equal(res4List[1].Username, u2.Username)
  3922  }
  3923  
  3924  func (s *UserStoreTS) TestGetTeamGroupUsers() {
  3925  	// create team
  3926  	id := model.NewId()
  3927  	team, err := s.Store().Team().Save(&model.Team{
  3928  		DisplayName: "dn_" + id,
  3929  		Name:        "n-" + id,
  3930  		Email:       id + "@test.com",
  3931  		Type:        model.TEAM_INVITE,
  3932  	})
  3933  	s.Require().Nil(err)
  3934  	s.Require().NotNil(team)
  3935  
  3936  	// create users
  3937  	var testUsers []*model.User
  3938  	for i := 0; i < 3; i++ {
  3939  		id = model.NewId()
  3940  		user, userErr := s.Store().User().Save(&model.User{
  3941  			Email:     id + "@test.com",
  3942  			Username:  "un_" + id,
  3943  			Nickname:  "nn_" + id,
  3944  			FirstName: "f_" + id,
  3945  			LastName:  "l_" + id,
  3946  			Password:  "Password1",
  3947  		})
  3948  		s.Require().Nil(userErr)
  3949  		s.Require().NotNil(user)
  3950  		testUsers = append(testUsers, user)
  3951  	}
  3952  	s.Require().Len(testUsers, 3, "testUsers length doesn't meet required length")
  3953  	userGroupA, userGroupB, userNoGroup := testUsers[0], testUsers[1], testUsers[2]
  3954  
  3955  	// add non-group-member to the team (to prove that the query isn't just returning all members)
  3956  	_, nErr := s.Store().Team().SaveMember(&model.TeamMember{
  3957  		TeamId: team.Id,
  3958  		UserId: userNoGroup.Id,
  3959  	}, 999)
  3960  	s.Require().Nil(nErr)
  3961  
  3962  	// create groups
  3963  	var testGroups []*model.Group
  3964  	for i := 0; i < 2; i++ {
  3965  		id = model.NewId()
  3966  
  3967  		var group *model.Group
  3968  		group, err = s.Store().Group().Create(&model.Group{
  3969  			Name:        model.NewString("n_" + id),
  3970  			DisplayName: "dn_" + id,
  3971  			Source:      model.GroupSourceLdap,
  3972  			RemoteId:    "ri_" + id,
  3973  		})
  3974  		s.Require().Nil(err)
  3975  		s.Require().NotNil(group)
  3976  		testGroups = append(testGroups, group)
  3977  	}
  3978  	s.Require().Len(testGroups, 2, "testGroups length doesn't meet required length")
  3979  	groupA, groupB := testGroups[0], testGroups[1]
  3980  
  3981  	// add members to groups
  3982  	_, err = s.Store().Group().UpsertMember(groupA.Id, userGroupA.Id)
  3983  	s.Require().Nil(err)
  3984  	_, err = s.Store().Group().UpsertMember(groupB.Id, userGroupB.Id)
  3985  	s.Require().Nil(err)
  3986  
  3987  	// association one group to team
  3988  	_, err = s.Store().Group().CreateGroupSyncable(&model.GroupSyncable{
  3989  		GroupId:    groupA.Id,
  3990  		SyncableId: team.Id,
  3991  		Type:       model.GroupSyncableTypeTeam,
  3992  	})
  3993  	s.Require().Nil(err)
  3994  
  3995  	var users []*model.User
  3996  
  3997  	requireNUsers := func(n int) {
  3998  		users, err = s.Store().User().GetTeamGroupUsers(team.Id)
  3999  		s.Require().Nil(err)
  4000  		s.Require().NotNil(users)
  4001  		s.Require().Len(users, n)
  4002  	}
  4003  
  4004  	// team not group constrained returns users
  4005  	requireNUsers(1)
  4006  
  4007  	// update team to be group-constrained
  4008  	team.GroupConstrained = model.NewBool(true)
  4009  	team, err = s.Store().Team().Update(team)
  4010  	s.Require().Nil(err)
  4011  
  4012  	// still returns user (being group-constrained has no effect)
  4013  	requireNUsers(1)
  4014  
  4015  	// associate other group to team
  4016  	_, err = s.Store().Group().CreateGroupSyncable(&model.GroupSyncable{
  4017  		GroupId:    groupB.Id,
  4018  		SyncableId: team.Id,
  4019  		Type:       model.GroupSyncableTypeTeam,
  4020  	})
  4021  	s.Require().Nil(err)
  4022  
  4023  	// should return users from all groups
  4024  	// 2 users now that both groups have been associated to the team
  4025  	requireNUsers(2)
  4026  
  4027  	// add team membership of allowed user
  4028  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{
  4029  		TeamId: team.Id,
  4030  		UserId: userGroupA.Id,
  4031  	}, 999)
  4032  	s.Require().Nil(nErr)
  4033  
  4034  	// ensure allowed member still returned by query
  4035  	requireNUsers(2)
  4036  
  4037  	// delete team membership of allowed user
  4038  	err = s.Store().Team().RemoveMember(team.Id, userGroupA.Id)
  4039  	s.Require().Nil(err)
  4040  
  4041  	// ensure removed allowed member still returned by query
  4042  	requireNUsers(2)
  4043  }
  4044  
  4045  func (s *UserStoreTS) TestGetChannelGroupUsers() {
  4046  	// create channel
  4047  	id := model.NewId()
  4048  	channel, nErr := s.Store().Channel().Save(&model.Channel{
  4049  		DisplayName: "dn_" + id,
  4050  		Name:        "n-" + id,
  4051  		Type:        model.CHANNEL_PRIVATE,
  4052  	}, 999)
  4053  	s.Require().Nil(nErr)
  4054  	s.Require().NotNil(channel)
  4055  
  4056  	// create users
  4057  	var testUsers []*model.User
  4058  	for i := 0; i < 3; i++ {
  4059  		id = model.NewId()
  4060  		user, userErr := s.Store().User().Save(&model.User{
  4061  			Email:     id + "@test.com",
  4062  			Username:  "un_" + id,
  4063  			Nickname:  "nn_" + id,
  4064  			FirstName: "f_" + id,
  4065  			LastName:  "l_" + id,
  4066  			Password:  "Password1",
  4067  		})
  4068  		s.Require().Nil(userErr)
  4069  		s.Require().NotNil(user)
  4070  		testUsers = append(testUsers, user)
  4071  	}
  4072  	s.Require().Len(testUsers, 3, "testUsers length doesn't meet required length")
  4073  	userGroupA, userGroupB, userNoGroup := testUsers[0], testUsers[1], testUsers[2]
  4074  
  4075  	// add non-group-member to the channel (to prove that the query isn't just returning all members)
  4076  	_, err := s.Store().Channel().SaveMember(&model.ChannelMember{
  4077  		ChannelId:   channel.Id,
  4078  		UserId:      userNoGroup.Id,
  4079  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  4080  	})
  4081  	s.Require().Nil(err)
  4082  
  4083  	// create groups
  4084  	var testGroups []*model.Group
  4085  	for i := 0; i < 2; i++ {
  4086  		id = model.NewId()
  4087  		var group *model.Group
  4088  		group, err = s.Store().Group().Create(&model.Group{
  4089  			Name:        model.NewString("n_" + id),
  4090  			DisplayName: "dn_" + id,
  4091  			Source:      model.GroupSourceLdap,
  4092  			RemoteId:    "ri_" + id,
  4093  		})
  4094  		s.Require().Nil(err)
  4095  		s.Require().NotNil(group)
  4096  		testGroups = append(testGroups, group)
  4097  	}
  4098  	s.Require().Len(testGroups, 2, "testGroups length doesn't meet required length")
  4099  	groupA, groupB := testGroups[0], testGroups[1]
  4100  
  4101  	// add members to groups
  4102  	_, err = s.Store().Group().UpsertMember(groupA.Id, userGroupA.Id)
  4103  	s.Require().Nil(err)
  4104  	_, err = s.Store().Group().UpsertMember(groupB.Id, userGroupB.Id)
  4105  	s.Require().Nil(err)
  4106  
  4107  	// association one group to channel
  4108  	_, err = s.Store().Group().CreateGroupSyncable(&model.GroupSyncable{
  4109  		GroupId:    groupA.Id,
  4110  		SyncableId: channel.Id,
  4111  		Type:       model.GroupSyncableTypeChannel,
  4112  	})
  4113  	s.Require().Nil(err)
  4114  
  4115  	var users []*model.User
  4116  
  4117  	requireNUsers := func(n int) {
  4118  		users, err = s.Store().User().GetChannelGroupUsers(channel.Id)
  4119  		s.Require().Nil(err)
  4120  		s.Require().NotNil(users)
  4121  		s.Require().Len(users, n)
  4122  	}
  4123  
  4124  	// channel not group constrained returns users
  4125  	requireNUsers(1)
  4126  
  4127  	// update team to be group-constrained
  4128  	channel.GroupConstrained = model.NewBool(true)
  4129  	_, nErr = s.Store().Channel().Update(channel)
  4130  	s.Require().Nil(nErr)
  4131  
  4132  	// still returns user (being group-constrained has no effect)
  4133  	requireNUsers(1)
  4134  
  4135  	// associate other group to team
  4136  	_, err = s.Store().Group().CreateGroupSyncable(&model.GroupSyncable{
  4137  		GroupId:    groupB.Id,
  4138  		SyncableId: channel.Id,
  4139  		Type:       model.GroupSyncableTypeChannel,
  4140  	})
  4141  	s.Require().Nil(err)
  4142  
  4143  	// should return users from all groups
  4144  	// 2 users now that both groups have been associated to the team
  4145  	requireNUsers(2)
  4146  
  4147  	// add team membership of allowed user
  4148  	_, err = s.Store().Channel().SaveMember(&model.ChannelMember{
  4149  		ChannelId:   channel.Id,
  4150  		UserId:      userGroupA.Id,
  4151  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  4152  	})
  4153  	s.Require().Nil(err)
  4154  
  4155  	// ensure allowed member still returned by query
  4156  	requireNUsers(2)
  4157  
  4158  	// delete team membership of allowed user
  4159  	err = s.Store().Channel().RemoveMember(channel.Id, userGroupA.Id)
  4160  	s.Require().Nil(err)
  4161  
  4162  	// ensure removed allowed member still returned by query
  4163  	requireNUsers(2)
  4164  }
  4165  
  4166  func (s *UserStoreTS) TestPromoteGuestToUser() {
  4167  	// create users
  4168  	s.T().Run("Must do nothing with regular user", func(t *testing.T) {
  4169  		id := model.NewId()
  4170  		user, err := s.Store().User().Save(&model.User{
  4171  			Email:     id + "@test.com",
  4172  			Username:  "un_" + id,
  4173  			Nickname:  "nn_" + id,
  4174  			FirstName: "f_" + id,
  4175  			LastName:  "l_" + id,
  4176  			Password:  "Password1",
  4177  			Roles:     "system_user",
  4178  		})
  4179  		s.Require().Nil(err)
  4180  		defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user.Id)) }()
  4181  
  4182  		teamId := model.NewId()
  4183  		_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: user.Id, SchemeGuest: true, SchemeUser: false}, 999)
  4184  		s.Require().Nil(nErr)
  4185  
  4186  		channel, nErr := s.Store().Channel().Save(&model.Channel{
  4187  			TeamId:      teamId,
  4188  			DisplayName: "Channel name",
  4189  			Name:        "channel-" + model.NewId(),
  4190  			Type:        model.CHANNEL_OPEN,
  4191  		}, -1)
  4192  		s.Require().Nil(nErr)
  4193  		_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ChannelId: channel.Id, UserId: user.Id, SchemeGuest: true, SchemeUser: false, NotifyProps: model.GetDefaultChannelNotifyProps()})
  4194  		s.Require().Nil(nErr)
  4195  
  4196  		err = s.Store().User().PromoteGuestToUser(user.Id)
  4197  		s.Require().Nil(err)
  4198  		updatedUser, err := s.Store().User().Get(context.Background(), user.Id)
  4199  		s.Require().Nil(err)
  4200  		s.Require().Equal("system_user", updatedUser.Roles)
  4201  		s.Require().True(user.UpdateAt < updatedUser.UpdateAt)
  4202  
  4203  		updatedTeamMember, nErr := s.Store().Team().GetMember(context.Background(), teamId, user.Id)
  4204  		s.Require().Nil(nErr)
  4205  		s.Require().False(updatedTeamMember.SchemeGuest)
  4206  		s.Require().True(updatedTeamMember.SchemeUser)
  4207  
  4208  		updatedChannelMember, nErr := s.Store().Channel().GetMember(context.Background(), channel.Id, user.Id)
  4209  		s.Require().Nil(nErr)
  4210  		s.Require().False(updatedChannelMember.SchemeGuest)
  4211  		s.Require().True(updatedChannelMember.SchemeUser)
  4212  	})
  4213  
  4214  	s.T().Run("Must do nothing with admin user", func(t *testing.T) {
  4215  		id := model.NewId()
  4216  		user, err := s.Store().User().Save(&model.User{
  4217  			Email:     id + "@test.com",
  4218  			Username:  "un_" + id,
  4219  			Nickname:  "nn_" + id,
  4220  			FirstName: "f_" + id,
  4221  			LastName:  "l_" + id,
  4222  			Password:  "Password1",
  4223  			Roles:     "system_user system_admin",
  4224  		})
  4225  		s.Require().Nil(err)
  4226  		defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user.Id)) }()
  4227  
  4228  		teamId := model.NewId()
  4229  		_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: user.Id, SchemeGuest: true, SchemeUser: false}, 999)
  4230  		s.Require().Nil(nErr)
  4231  
  4232  		channel, nErr := s.Store().Channel().Save(&model.Channel{
  4233  			TeamId:      teamId,
  4234  			DisplayName: "Channel name",
  4235  			Name:        "channel-" + model.NewId(),
  4236  			Type:        model.CHANNEL_OPEN,
  4237  		}, -1)
  4238  		s.Require().Nil(nErr)
  4239  		_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ChannelId: channel.Id, UserId: user.Id, SchemeGuest: true, SchemeUser: false, NotifyProps: model.GetDefaultChannelNotifyProps()})
  4240  		s.Require().Nil(nErr)
  4241  
  4242  		err = s.Store().User().PromoteGuestToUser(user.Id)
  4243  		s.Require().Nil(err)
  4244  		updatedUser, err := s.Store().User().Get(context.Background(), user.Id)
  4245  		s.Require().Nil(err)
  4246  		s.Require().Equal("system_user system_admin", updatedUser.Roles)
  4247  
  4248  		updatedTeamMember, nErr := s.Store().Team().GetMember(context.Background(), teamId, user.Id)
  4249  		s.Require().Nil(nErr)
  4250  		s.Require().False(updatedTeamMember.SchemeGuest)
  4251  		s.Require().True(updatedTeamMember.SchemeUser)
  4252  
  4253  		updatedChannelMember, nErr := s.Store().Channel().GetMember(context.Background(), channel.Id, user.Id)
  4254  		s.Require().Nil(nErr)
  4255  		s.Require().False(updatedChannelMember.SchemeGuest)
  4256  		s.Require().True(updatedChannelMember.SchemeUser)
  4257  	})
  4258  
  4259  	s.T().Run("Must work with guest user without teams or channels", func(t *testing.T) {
  4260  		id := model.NewId()
  4261  		user, err := s.Store().User().Save(&model.User{
  4262  			Email:     id + "@test.com",
  4263  			Username:  "un_" + id,
  4264  			Nickname:  "nn_" + id,
  4265  			FirstName: "f_" + id,
  4266  			LastName:  "l_" + id,
  4267  			Password:  "Password1",
  4268  			Roles:     "system_guest",
  4269  		})
  4270  		s.Require().Nil(err)
  4271  		defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user.Id)) }()
  4272  
  4273  		err = s.Store().User().PromoteGuestToUser(user.Id)
  4274  		s.Require().Nil(err)
  4275  		updatedUser, err := s.Store().User().Get(context.Background(), user.Id)
  4276  		s.Require().Nil(err)
  4277  		s.Require().Equal("system_user", updatedUser.Roles)
  4278  	})
  4279  
  4280  	s.T().Run("Must work with guest user with teams but no channels", func(t *testing.T) {
  4281  		id := model.NewId()
  4282  		user, err := s.Store().User().Save(&model.User{
  4283  			Email:     id + "@test.com",
  4284  			Username:  "un_" + id,
  4285  			Nickname:  "nn_" + id,
  4286  			FirstName: "f_" + id,
  4287  			LastName:  "l_" + id,
  4288  			Password:  "Password1",
  4289  			Roles:     "system_guest",
  4290  		})
  4291  		s.Require().Nil(err)
  4292  		defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user.Id)) }()
  4293  
  4294  		teamId := model.NewId()
  4295  		_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: user.Id, SchemeGuest: true, SchemeUser: false}, 999)
  4296  		s.Require().Nil(nErr)
  4297  
  4298  		err = s.Store().User().PromoteGuestToUser(user.Id)
  4299  		s.Require().Nil(err)
  4300  		updatedUser, err := s.Store().User().Get(context.Background(), user.Id)
  4301  		s.Require().Nil(err)
  4302  		s.Require().Equal("system_user", updatedUser.Roles)
  4303  
  4304  		updatedTeamMember, nErr := s.Store().Team().GetMember(context.Background(), teamId, user.Id)
  4305  		s.Require().Nil(nErr)
  4306  		s.Require().False(updatedTeamMember.SchemeGuest)
  4307  		s.Require().True(updatedTeamMember.SchemeUser)
  4308  	})
  4309  
  4310  	s.T().Run("Must work with guest user with teams and channels", func(t *testing.T) {
  4311  		id := model.NewId()
  4312  		user, err := s.Store().User().Save(&model.User{
  4313  			Email:     id + "@test.com",
  4314  			Username:  "un_" + id,
  4315  			Nickname:  "nn_" + id,
  4316  			FirstName: "f_" + id,
  4317  			LastName:  "l_" + id,
  4318  			Password:  "Password1",
  4319  			Roles:     "system_guest",
  4320  		})
  4321  		s.Require().Nil(err)
  4322  		defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user.Id)) }()
  4323  
  4324  		teamId := model.NewId()
  4325  		_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: user.Id, SchemeGuest: true, SchemeUser: false}, 999)
  4326  		s.Require().Nil(nErr)
  4327  
  4328  		channel, nErr := s.Store().Channel().Save(&model.Channel{
  4329  			TeamId:      teamId,
  4330  			DisplayName: "Channel name",
  4331  			Name:        "channel-" + model.NewId(),
  4332  			Type:        model.CHANNEL_OPEN,
  4333  		}, -1)
  4334  		s.Require().Nil(nErr)
  4335  		_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ChannelId: channel.Id, UserId: user.Id, SchemeGuest: true, SchemeUser: false, NotifyProps: model.GetDefaultChannelNotifyProps()})
  4336  		s.Require().Nil(nErr)
  4337  
  4338  		err = s.Store().User().PromoteGuestToUser(user.Id)
  4339  		s.Require().Nil(err)
  4340  		updatedUser, err := s.Store().User().Get(context.Background(), user.Id)
  4341  		s.Require().Nil(err)
  4342  		s.Require().Equal("system_user", updatedUser.Roles)
  4343  
  4344  		updatedTeamMember, nErr := s.Store().Team().GetMember(context.Background(), teamId, user.Id)
  4345  		s.Require().Nil(nErr)
  4346  		s.Require().False(updatedTeamMember.SchemeGuest)
  4347  		s.Require().True(updatedTeamMember.SchemeUser)
  4348  
  4349  		updatedChannelMember, nErr := s.Store().Channel().GetMember(context.Background(), channel.Id, user.Id)
  4350  		s.Require().Nil(nErr)
  4351  		s.Require().False(updatedChannelMember.SchemeGuest)
  4352  		s.Require().True(updatedChannelMember.SchemeUser)
  4353  	})
  4354  
  4355  	s.T().Run("Must work with guest user with teams and channels and custom role", func(t *testing.T) {
  4356  		id := model.NewId()
  4357  		user, err := s.Store().User().Save(&model.User{
  4358  			Email:     id + "@test.com",
  4359  			Username:  "un_" + id,
  4360  			Nickname:  "nn_" + id,
  4361  			FirstName: "f_" + id,
  4362  			LastName:  "l_" + id,
  4363  			Password:  "Password1",
  4364  			Roles:     "system_guest custom_role",
  4365  		})
  4366  		s.Require().Nil(err)
  4367  		defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user.Id)) }()
  4368  
  4369  		teamId := model.NewId()
  4370  		_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: user.Id, SchemeGuest: true, SchemeUser: false}, 999)
  4371  		s.Require().Nil(nErr)
  4372  
  4373  		channel, nErr := s.Store().Channel().Save(&model.Channel{
  4374  			TeamId:      teamId,
  4375  			DisplayName: "Channel name",
  4376  			Name:        "channel-" + model.NewId(),
  4377  			Type:        model.CHANNEL_OPEN,
  4378  		}, -1)
  4379  		s.Require().Nil(nErr)
  4380  		_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ChannelId: channel.Id, UserId: user.Id, SchemeGuest: true, SchemeUser: false, NotifyProps: model.GetDefaultChannelNotifyProps()})
  4381  		s.Require().Nil(nErr)
  4382  
  4383  		err = s.Store().User().PromoteGuestToUser(user.Id)
  4384  		s.Require().Nil(err)
  4385  		updatedUser, err := s.Store().User().Get(context.Background(), user.Id)
  4386  		s.Require().Nil(err)
  4387  		s.Require().Equal("system_user custom_role", updatedUser.Roles)
  4388  
  4389  		updatedTeamMember, nErr := s.Store().Team().GetMember(context.Background(), teamId, user.Id)
  4390  		s.Require().Nil(nErr)
  4391  		s.Require().False(updatedTeamMember.SchemeGuest)
  4392  		s.Require().True(updatedTeamMember.SchemeUser)
  4393  
  4394  		updatedChannelMember, nErr := s.Store().Channel().GetMember(context.Background(), channel.Id, user.Id)
  4395  		s.Require().Nil(nErr)
  4396  		s.Require().False(updatedChannelMember.SchemeGuest)
  4397  		s.Require().True(updatedChannelMember.SchemeUser)
  4398  	})
  4399  
  4400  	s.T().Run("Must no change any other user guest role", func(t *testing.T) {
  4401  		id := model.NewId()
  4402  		user1, err := s.Store().User().Save(&model.User{
  4403  			Email:     id + "@test.com",
  4404  			Username:  "un_" + id,
  4405  			Nickname:  "nn_" + id,
  4406  			FirstName: "f_" + id,
  4407  			LastName:  "l_" + id,
  4408  			Password:  "Password1",
  4409  			Roles:     "system_guest",
  4410  		})
  4411  		s.Require().Nil(err)
  4412  		defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user1.Id)) }()
  4413  
  4414  		teamId1 := model.NewId()
  4415  		_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId1, UserId: user1.Id, SchemeGuest: true, SchemeUser: false}, 999)
  4416  		s.Require().Nil(nErr)
  4417  
  4418  		channel, nErr := s.Store().Channel().Save(&model.Channel{
  4419  			TeamId:      teamId1,
  4420  			DisplayName: "Channel name",
  4421  			Name:        "channel-" + model.NewId(),
  4422  			Type:        model.CHANNEL_OPEN,
  4423  		}, -1)
  4424  		s.Require().Nil(nErr)
  4425  
  4426  		_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ChannelId: channel.Id, UserId: user1.Id, SchemeGuest: true, SchemeUser: false, NotifyProps: model.GetDefaultChannelNotifyProps()})
  4427  		s.Require().Nil(nErr)
  4428  
  4429  		id = model.NewId()
  4430  		user2, err := s.Store().User().Save(&model.User{
  4431  			Email:     id + "@test.com",
  4432  			Username:  "un_" + id,
  4433  			Nickname:  "nn_" + id,
  4434  			FirstName: "f_" + id,
  4435  			LastName:  "l_" + id,
  4436  			Password:  "Password1",
  4437  			Roles:     "system_guest",
  4438  		})
  4439  		s.Require().Nil(err)
  4440  		defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user2.Id)) }()
  4441  
  4442  		teamId2 := model.NewId()
  4443  		_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId2, UserId: user2.Id, SchemeGuest: true, SchemeUser: false}, 999)
  4444  		s.Require().Nil(nErr)
  4445  
  4446  		_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ChannelId: channel.Id, UserId: user2.Id, SchemeGuest: true, SchemeUser: false, NotifyProps: model.GetDefaultChannelNotifyProps()})
  4447  		s.Require().Nil(nErr)
  4448  
  4449  		err = s.Store().User().PromoteGuestToUser(user1.Id)
  4450  		s.Require().Nil(err)
  4451  		updatedUser, err := s.Store().User().Get(context.Background(), user1.Id)
  4452  		s.Require().Nil(err)
  4453  		s.Require().Equal("system_user", updatedUser.Roles)
  4454  
  4455  		updatedTeamMember, nErr := s.Store().Team().GetMember(context.Background(), teamId1, user1.Id)
  4456  		s.Require().Nil(nErr)
  4457  		s.Require().False(updatedTeamMember.SchemeGuest)
  4458  		s.Require().True(updatedTeamMember.SchemeUser)
  4459  
  4460  		updatedChannelMember, nErr := s.Store().Channel().GetMember(context.Background(), channel.Id, user1.Id)
  4461  		s.Require().Nil(nErr)
  4462  		s.Require().False(updatedChannelMember.SchemeGuest)
  4463  		s.Require().True(updatedChannelMember.SchemeUser)
  4464  
  4465  		notUpdatedUser, err := s.Store().User().Get(context.Background(), user2.Id)
  4466  		s.Require().Nil(err)
  4467  		s.Require().Equal("system_guest", notUpdatedUser.Roles)
  4468  
  4469  		notUpdatedTeamMember, nErr := s.Store().Team().GetMember(context.Background(), teamId2, user2.Id)
  4470  		s.Require().Nil(nErr)
  4471  		s.Require().True(notUpdatedTeamMember.SchemeGuest)
  4472  		s.Require().False(notUpdatedTeamMember.SchemeUser)
  4473  
  4474  		notUpdatedChannelMember, nErr := s.Store().Channel().GetMember(context.Background(), channel.Id, user2.Id)
  4475  		s.Require().Nil(nErr)
  4476  		s.Require().True(notUpdatedChannelMember.SchemeGuest)
  4477  		s.Require().False(notUpdatedChannelMember.SchemeUser)
  4478  	})
  4479  }
  4480  
  4481  func (s *UserStoreTS) TestDemoteUserToGuest() {
  4482  	// create users
  4483  	s.T().Run("Must do nothing with guest", func(t *testing.T) {
  4484  		id := model.NewId()
  4485  		user, err := s.Store().User().Save(&model.User{
  4486  			Email:     id + "@test.com",
  4487  			Username:  "un_" + id,
  4488  			Nickname:  "nn_" + id,
  4489  			FirstName: "f_" + id,
  4490  			LastName:  "l_" + id,
  4491  			Password:  "Password1",
  4492  			Roles:     "system_guest",
  4493  		})
  4494  		s.Require().Nil(err)
  4495  		defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user.Id)) }()
  4496  
  4497  		teamId := model.NewId()
  4498  		_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: user.Id, SchemeGuest: false, SchemeUser: true}, 999)
  4499  		s.Require().Nil(nErr)
  4500  
  4501  		channel, nErr := s.Store().Channel().Save(&model.Channel{
  4502  			TeamId:      teamId,
  4503  			DisplayName: "Channel name",
  4504  			Name:        "channel-" + model.NewId(),
  4505  			Type:        model.CHANNEL_OPEN,
  4506  		}, -1)
  4507  		s.Require().Nil(nErr)
  4508  		_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ChannelId: channel.Id, UserId: user.Id, SchemeGuest: false, SchemeUser: true, NotifyProps: model.GetDefaultChannelNotifyProps()})
  4509  		s.Require().Nil(nErr)
  4510  
  4511  		updatedUser, err := s.Store().User().DemoteUserToGuest(user.Id)
  4512  		s.Require().NoError(err)
  4513  		s.Require().Equal("system_guest", updatedUser.Roles)
  4514  		s.Require().True(user.UpdateAt < updatedUser.UpdateAt)
  4515  
  4516  		updatedTeamMember, nErr := s.Store().Team().GetMember(context.Background(), teamId, user.Id)
  4517  		s.Require().Nil(nErr)
  4518  		s.Require().True(updatedTeamMember.SchemeGuest)
  4519  		s.Require().False(updatedTeamMember.SchemeUser)
  4520  
  4521  		updatedChannelMember, nErr := s.Store().Channel().GetMember(context.Background(), channel.Id, user.Id)
  4522  		s.Require().Nil(nErr)
  4523  		s.Require().True(updatedChannelMember.SchemeGuest)
  4524  		s.Require().False(updatedChannelMember.SchemeUser)
  4525  	})
  4526  
  4527  	s.T().Run("Must demote properly an admin user", func(t *testing.T) {
  4528  		id := model.NewId()
  4529  		user, err := s.Store().User().Save(&model.User{
  4530  			Email:     id + "@test.com",
  4531  			Username:  "un_" + id,
  4532  			Nickname:  "nn_" + id,
  4533  			FirstName: "f_" + id,
  4534  			LastName:  "l_" + id,
  4535  			Password:  "Password1",
  4536  			Roles:     "system_user system_admin",
  4537  		})
  4538  		s.Require().Nil(err)
  4539  		defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user.Id)) }()
  4540  
  4541  		teamId := model.NewId()
  4542  		_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: user.Id, SchemeGuest: true, SchemeUser: false}, 999)
  4543  		s.Require().Nil(nErr)
  4544  
  4545  		channel, nErr := s.Store().Channel().Save(&model.Channel{
  4546  			TeamId:      teamId,
  4547  			DisplayName: "Channel name",
  4548  			Name:        "channel-" + model.NewId(),
  4549  			Type:        model.CHANNEL_OPEN,
  4550  		}, -1)
  4551  		s.Require().Nil(nErr)
  4552  		_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ChannelId: channel.Id, UserId: user.Id, SchemeGuest: true, SchemeUser: false, NotifyProps: model.GetDefaultChannelNotifyProps()})
  4553  		s.Require().Nil(nErr)
  4554  
  4555  		updatedUser, err := s.Store().User().DemoteUserToGuest(user.Id)
  4556  		s.Require().NoError(err)
  4557  		s.Require().Equal("system_guest", updatedUser.Roles)
  4558  
  4559  		updatedTeamMember, nErr := s.Store().Team().GetMember(context.Background(), teamId, user.Id)
  4560  		s.Require().Nil(nErr)
  4561  		s.Require().True(updatedTeamMember.SchemeGuest)
  4562  		s.Require().False(updatedTeamMember.SchemeUser)
  4563  
  4564  		updatedChannelMember, nErr := s.Store().Channel().GetMember(context.Background(), channel.Id, user.Id)
  4565  		s.Require().Nil(nErr)
  4566  		s.Require().True(updatedChannelMember.SchemeGuest)
  4567  		s.Require().False(updatedChannelMember.SchemeUser)
  4568  	})
  4569  
  4570  	s.T().Run("Must work with user without teams or channels", func(t *testing.T) {
  4571  		id := model.NewId()
  4572  		user, err := s.Store().User().Save(&model.User{
  4573  			Email:     id + "@test.com",
  4574  			Username:  "un_" + id,
  4575  			Nickname:  "nn_" + id,
  4576  			FirstName: "f_" + id,
  4577  			LastName:  "l_" + id,
  4578  			Password:  "Password1",
  4579  			Roles:     "system_user",
  4580  		})
  4581  		s.Require().Nil(err)
  4582  		defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user.Id)) }()
  4583  
  4584  		updatedUser, err := s.Store().User().DemoteUserToGuest(user.Id)
  4585  		s.Require().NoError(err)
  4586  		s.Require().Equal("system_guest", updatedUser.Roles)
  4587  	})
  4588  
  4589  	s.T().Run("Must work with user with teams but no channels", func(t *testing.T) {
  4590  		id := model.NewId()
  4591  		user, err := s.Store().User().Save(&model.User{
  4592  			Email:     id + "@test.com",
  4593  			Username:  "un_" + id,
  4594  			Nickname:  "nn_" + id,
  4595  			FirstName: "f_" + id,
  4596  			LastName:  "l_" + id,
  4597  			Password:  "Password1",
  4598  			Roles:     "system_user",
  4599  		})
  4600  		s.Require().Nil(err)
  4601  		defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user.Id)) }()
  4602  
  4603  		teamId := model.NewId()
  4604  		_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: user.Id, SchemeGuest: false, SchemeUser: true}, 999)
  4605  		s.Require().Nil(nErr)
  4606  
  4607  		updatedUser, err := s.Store().User().DemoteUserToGuest(user.Id)
  4608  		s.Require().NoError(err)
  4609  		s.Require().Equal("system_guest", updatedUser.Roles)
  4610  
  4611  		updatedTeamMember, nErr := s.Store().Team().GetMember(context.Background(), teamId, user.Id)
  4612  		s.Require().Nil(nErr)
  4613  		s.Require().True(updatedTeamMember.SchemeGuest)
  4614  		s.Require().False(updatedTeamMember.SchemeUser)
  4615  	})
  4616  
  4617  	s.T().Run("Must work with user with teams and channels", func(t *testing.T) {
  4618  		id := model.NewId()
  4619  		user, err := s.Store().User().Save(&model.User{
  4620  			Email:     id + "@test.com",
  4621  			Username:  "un_" + id,
  4622  			Nickname:  "nn_" + id,
  4623  			FirstName: "f_" + id,
  4624  			LastName:  "l_" + id,
  4625  			Password:  "Password1",
  4626  			Roles:     "system_user",
  4627  		})
  4628  		s.Require().Nil(err)
  4629  		defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user.Id)) }()
  4630  
  4631  		teamId := model.NewId()
  4632  		_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: user.Id, SchemeGuest: false, SchemeUser: true}, 999)
  4633  		s.Require().Nil(nErr)
  4634  
  4635  		channel, nErr := s.Store().Channel().Save(&model.Channel{
  4636  			TeamId:      teamId,
  4637  			DisplayName: "Channel name",
  4638  			Name:        "channel-" + model.NewId(),
  4639  			Type:        model.CHANNEL_OPEN,
  4640  		}, -1)
  4641  		s.Require().Nil(nErr)
  4642  		_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ChannelId: channel.Id, UserId: user.Id, SchemeGuest: false, SchemeUser: true, NotifyProps: model.GetDefaultChannelNotifyProps()})
  4643  		s.Require().Nil(nErr)
  4644  
  4645  		updatedUser, err := s.Store().User().DemoteUserToGuest(user.Id)
  4646  		s.Require().Nil(err)
  4647  		s.Require().Equal("system_guest", updatedUser.Roles)
  4648  
  4649  		updatedTeamMember, nErr := s.Store().Team().GetMember(context.Background(), teamId, user.Id)
  4650  		s.Require().Nil(nErr)
  4651  		s.Require().True(updatedTeamMember.SchemeGuest)
  4652  		s.Require().False(updatedTeamMember.SchemeUser)
  4653  
  4654  		updatedChannelMember, nErr := s.Store().Channel().GetMember(context.Background(), channel.Id, user.Id)
  4655  		s.Require().Nil(nErr)
  4656  		s.Require().True(updatedChannelMember.SchemeGuest)
  4657  		s.Require().False(updatedChannelMember.SchemeUser)
  4658  	})
  4659  
  4660  	s.T().Run("Must work with user with teams and channels and custom role", func(t *testing.T) {
  4661  		id := model.NewId()
  4662  		user, err := s.Store().User().Save(&model.User{
  4663  			Email:     id + "@test.com",
  4664  			Username:  "un_" + id,
  4665  			Nickname:  "nn_" + id,
  4666  			FirstName: "f_" + id,
  4667  			LastName:  "l_" + id,
  4668  			Password:  "Password1",
  4669  			Roles:     "system_user custom_role",
  4670  		})
  4671  		s.Require().Nil(err)
  4672  		defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user.Id)) }()
  4673  
  4674  		teamId := model.NewId()
  4675  		_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: user.Id, SchemeGuest: false, SchemeUser: true}, 999)
  4676  		s.Require().Nil(nErr)
  4677  
  4678  		channel, nErr := s.Store().Channel().Save(&model.Channel{
  4679  			TeamId:      teamId,
  4680  			DisplayName: "Channel name",
  4681  			Name:        "channel-" + model.NewId(),
  4682  			Type:        model.CHANNEL_OPEN,
  4683  		}, -1)
  4684  		s.Require().Nil(nErr)
  4685  		_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ChannelId: channel.Id, UserId: user.Id, SchemeGuest: false, SchemeUser: true, NotifyProps: model.GetDefaultChannelNotifyProps()})
  4686  		s.Require().Nil(nErr)
  4687  
  4688  		updatedUser, err := s.Store().User().DemoteUserToGuest(user.Id)
  4689  		s.Require().Nil(err)
  4690  		s.Require().Equal("system_guest custom_role", updatedUser.Roles)
  4691  
  4692  		updatedTeamMember, nErr := s.Store().Team().GetMember(context.Background(), teamId, user.Id)
  4693  		s.Require().Nil(nErr)
  4694  		s.Require().True(updatedTeamMember.SchemeGuest)
  4695  		s.Require().False(updatedTeamMember.SchemeUser)
  4696  
  4697  		updatedChannelMember, nErr := s.Store().Channel().GetMember(context.Background(), channel.Id, user.Id)
  4698  		s.Require().Nil(nErr)
  4699  		s.Require().True(updatedChannelMember.SchemeGuest)
  4700  		s.Require().False(updatedChannelMember.SchemeUser)
  4701  	})
  4702  
  4703  	s.T().Run("Must no change any other user role", func(t *testing.T) {
  4704  		id := model.NewId()
  4705  		user1, err := s.Store().User().Save(&model.User{
  4706  			Email:     id + "@test.com",
  4707  			Username:  "un_" + id,
  4708  			Nickname:  "nn_" + id,
  4709  			FirstName: "f_" + id,
  4710  			LastName:  "l_" + id,
  4711  			Password:  "Password1",
  4712  			Roles:     "system_user",
  4713  		})
  4714  		s.Require().Nil(err)
  4715  		defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user1.Id)) }()
  4716  
  4717  		teamId1 := model.NewId()
  4718  		_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId1, UserId: user1.Id, SchemeGuest: false, SchemeUser: true}, 999)
  4719  		s.Require().Nil(nErr)
  4720  
  4721  		channel, nErr := s.Store().Channel().Save(&model.Channel{
  4722  			TeamId:      teamId1,
  4723  			DisplayName: "Channel name",
  4724  			Name:        "channel-" + model.NewId(),
  4725  			Type:        model.CHANNEL_OPEN,
  4726  		}, -1)
  4727  		s.Require().Nil(nErr)
  4728  
  4729  		_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ChannelId: channel.Id, UserId: user1.Id, SchemeGuest: false, SchemeUser: true, NotifyProps: model.GetDefaultChannelNotifyProps()})
  4730  		s.Require().Nil(nErr)
  4731  
  4732  		id = model.NewId()
  4733  		user2, err := s.Store().User().Save(&model.User{
  4734  			Email:     id + "@test.com",
  4735  			Username:  "un_" + id,
  4736  			Nickname:  "nn_" + id,
  4737  			FirstName: "f_" + id,
  4738  			LastName:  "l_" + id,
  4739  			Password:  "Password1",
  4740  			Roles:     "system_user",
  4741  		})
  4742  		s.Require().Nil(err)
  4743  		defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user2.Id)) }()
  4744  
  4745  		teamId2 := model.NewId()
  4746  		_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId2, UserId: user2.Id, SchemeGuest: false, SchemeUser: true}, 999)
  4747  		s.Require().Nil(nErr)
  4748  
  4749  		_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ChannelId: channel.Id, UserId: user2.Id, SchemeGuest: false, SchemeUser: true, NotifyProps: model.GetDefaultChannelNotifyProps()})
  4750  		s.Require().Nil(nErr)
  4751  
  4752  		updatedUser, err := s.Store().User().DemoteUserToGuest(user1.Id)
  4753  		s.Require().Nil(err)
  4754  		s.Require().Equal("system_guest", updatedUser.Roles)
  4755  
  4756  		updatedTeamMember, nErr := s.Store().Team().GetMember(context.Background(), teamId1, user1.Id)
  4757  		s.Require().Nil(nErr)
  4758  		s.Require().True(updatedTeamMember.SchemeGuest)
  4759  		s.Require().False(updatedTeamMember.SchemeUser)
  4760  
  4761  		updatedChannelMember, nErr := s.Store().Channel().GetMember(context.Background(), channel.Id, user1.Id)
  4762  		s.Require().Nil(nErr)
  4763  		s.Require().True(updatedChannelMember.SchemeGuest)
  4764  		s.Require().False(updatedChannelMember.SchemeUser)
  4765  
  4766  		notUpdatedUser, err := s.Store().User().Get(context.Background(), user2.Id)
  4767  		s.Require().Nil(err)
  4768  		s.Require().Equal("system_user", notUpdatedUser.Roles)
  4769  
  4770  		notUpdatedTeamMember, nErr := s.Store().Team().GetMember(context.Background(), teamId2, user2.Id)
  4771  		s.Require().Nil(nErr)
  4772  		s.Require().False(notUpdatedTeamMember.SchemeGuest)
  4773  		s.Require().True(notUpdatedTeamMember.SchemeUser)
  4774  
  4775  		notUpdatedChannelMember, nErr := s.Store().Channel().GetMember(context.Background(), channel.Id, user2.Id)
  4776  		s.Require().Nil(nErr)
  4777  		s.Require().False(notUpdatedChannelMember.SchemeGuest)
  4778  		s.Require().True(notUpdatedChannelMember.SchemeUser)
  4779  	})
  4780  }
  4781  
  4782  func (s *UserStoreTS) TestDeactivateGuests() {
  4783  	// create users
  4784  	s.T().Run("Must disable all guests and no regular user or already deactivated users", func(t *testing.T) {
  4785  		guest1Random := model.NewId()
  4786  		guest1, err := s.Store().User().Save(&model.User{
  4787  			Email:     guest1Random + "@test.com",
  4788  			Username:  "un_" + guest1Random,
  4789  			Nickname:  "nn_" + guest1Random,
  4790  			FirstName: "f_" + guest1Random,
  4791  			LastName:  "l_" + guest1Random,
  4792  			Password:  "Password1",
  4793  			Roles:     "system_guest",
  4794  		})
  4795  		s.Require().Nil(err)
  4796  		defer func() { s.Require().Nil(s.Store().User().PermanentDelete(guest1.Id)) }()
  4797  
  4798  		guest2Random := model.NewId()
  4799  		guest2, err := s.Store().User().Save(&model.User{
  4800  			Email:     guest2Random + "@test.com",
  4801  			Username:  "un_" + guest2Random,
  4802  			Nickname:  "nn_" + guest2Random,
  4803  			FirstName: "f_" + guest2Random,
  4804  			LastName:  "l_" + guest2Random,
  4805  			Password:  "Password1",
  4806  			Roles:     "system_guest",
  4807  		})
  4808  		s.Require().Nil(err)
  4809  		defer func() { s.Require().Nil(s.Store().User().PermanentDelete(guest2.Id)) }()
  4810  
  4811  		guest3Random := model.NewId()
  4812  		guest3, err := s.Store().User().Save(&model.User{
  4813  			Email:     guest3Random + "@test.com",
  4814  			Username:  "un_" + guest3Random,
  4815  			Nickname:  "nn_" + guest3Random,
  4816  			FirstName: "f_" + guest3Random,
  4817  			LastName:  "l_" + guest3Random,
  4818  			Password:  "Password1",
  4819  			Roles:     "system_guest",
  4820  			DeleteAt:  10,
  4821  		})
  4822  		s.Require().Nil(err)
  4823  		defer func() { s.Require().Nil(s.Store().User().PermanentDelete(guest3.Id)) }()
  4824  
  4825  		regularUserRandom := model.NewId()
  4826  		regularUser, err := s.Store().User().Save(&model.User{
  4827  			Email:     regularUserRandom + "@test.com",
  4828  			Username:  "un_" + regularUserRandom,
  4829  			Nickname:  "nn_" + regularUserRandom,
  4830  			FirstName: "f_" + regularUserRandom,
  4831  			LastName:  "l_" + regularUserRandom,
  4832  			Password:  "Password1",
  4833  			Roles:     "system_user",
  4834  		})
  4835  		s.Require().Nil(err)
  4836  		defer func() { s.Require().Nil(s.Store().User().PermanentDelete(regularUser.Id)) }()
  4837  
  4838  		ids, err := s.Store().User().DeactivateGuests()
  4839  		s.Require().Nil(err)
  4840  		s.Assert().ElementsMatch([]string{guest1.Id, guest2.Id}, ids)
  4841  
  4842  		u, err := s.Store().User().Get(context.Background(), guest1.Id)
  4843  		s.Require().Nil(err)
  4844  		s.Assert().NotEqual(u.DeleteAt, int64(0))
  4845  
  4846  		u, err = s.Store().User().Get(context.Background(), guest2.Id)
  4847  		s.Require().Nil(err)
  4848  		s.Assert().NotEqual(u.DeleteAt, int64(0))
  4849  
  4850  		u, err = s.Store().User().Get(context.Background(), guest3.Id)
  4851  		s.Require().Nil(err)
  4852  		s.Assert().Equal(u.DeleteAt, int64(10))
  4853  
  4854  		u, err = s.Store().User().Get(context.Background(), regularUser.Id)
  4855  		s.Require().Nil(err)
  4856  		s.Assert().Equal(u.DeleteAt, int64(0))
  4857  	})
  4858  }
  4859  
  4860  func (s *UserStoreTS) TestUserStoreResetLastPictureUpdate() {
  4861  	u1 := &model.User{}
  4862  	u1.Email = MakeEmail()
  4863  	_, err := s.Store().User().Save(u1)
  4864  	s.Require().Nil(err)
  4865  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
  4866  	_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1)
  4867  	s.Require().Nil(nErr)
  4868  
  4869  	err = s.Store().User().UpdateLastPictureUpdate(u1.Id)
  4870  	s.Require().Nil(err)
  4871  
  4872  	user, err := s.Store().User().Get(context.Background(), u1.Id)
  4873  	s.Require().Nil(err)
  4874  
  4875  	s.Assert().NotZero(user.LastPictureUpdate)
  4876  	s.Assert().NotZero(user.UpdateAt)
  4877  
  4878  	// Ensure update at timestamp changes
  4879  	time.Sleep(time.Millisecond)
  4880  
  4881  	err = s.Store().User().ResetLastPictureUpdate(u1.Id)
  4882  	s.Require().Nil(err)
  4883  
  4884  	s.Store().User().InvalidateProfileCacheForUser(u1.Id)
  4885  
  4886  	user2, err := s.Store().User().Get(context.Background(), u1.Id)
  4887  	s.Require().Nil(err)
  4888  
  4889  	s.Assert().True(user2.UpdateAt > user.UpdateAt)
  4890  	s.Assert().Zero(user2.LastPictureUpdate)
  4891  }
  4892  
  4893  func (s *UserStoreTS) testGetKnownUsers() {
  4894  	teamId := model.NewId()
  4895  
  4896  	u1, err := s.Store().User().Save(&model.User{
  4897  		Email:    MakeEmail(),
  4898  		Username: "u1" + model.NewId(),
  4899  	})
  4900  	s.Require().Nil(err)
  4901  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }()
  4902  	_, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)
  4903  	s.Require().Nil(nErr)
  4904  
  4905  	u2, err := s.Store().User().Save(&model.User{
  4906  		Email:    MakeEmail(),
  4907  		Username: "u2" + model.NewId(),
  4908  	})
  4909  	s.Require().Nil(err)
  4910  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }()
  4911  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)
  4912  	s.Require().Nil(nErr)
  4913  
  4914  	u3, err := s.Store().User().Save(&model.User{
  4915  		Email:    MakeEmail(),
  4916  		Username: "u3" + model.NewId(),
  4917  	})
  4918  	s.Require().Nil(err)
  4919  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }()
  4920  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1)
  4921  	s.Require().Nil(nErr)
  4922  	_, nErr = s.Store().Bot().Save(&model.Bot{
  4923  		UserId:   u3.Id,
  4924  		Username: u3.Username,
  4925  		OwnerId:  u1.Id,
  4926  	})
  4927  	s.Require().Nil(nErr)
  4928  	u3.IsBot = true
  4929  
  4930  	defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }()
  4931  
  4932  	u4, err := s.Store().User().Save(&model.User{
  4933  		Email:    MakeEmail(),
  4934  		Username: "u4" + model.NewId(),
  4935  	})
  4936  	s.Require().Nil(err)
  4937  	defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u4.Id)) }()
  4938  	_, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u4.Id}, -1)
  4939  	s.Require().Nil(nErr)
  4940  
  4941  	ch1 := &model.Channel{
  4942  		TeamId:      teamId,
  4943  		DisplayName: "Profiles in channel",
  4944  		Name:        "profiles-" + model.NewId(),
  4945  		Type:        model.CHANNEL_OPEN,
  4946  	}
  4947  	c1, nErr := s.Store().Channel().Save(ch1, -1)
  4948  	s.Require().Nil(nErr)
  4949  
  4950  	ch2 := &model.Channel{
  4951  		TeamId:      teamId,
  4952  		DisplayName: "Profiles in private",
  4953  		Name:        "profiles-" + model.NewId(),
  4954  		Type:        model.CHANNEL_PRIVATE,
  4955  	}
  4956  	c2, nErr := s.Store().Channel().Save(ch2, -1)
  4957  	s.Require().Nil(nErr)
  4958  
  4959  	ch3 := &model.Channel{
  4960  		TeamId:      teamId,
  4961  		DisplayName: "Profiles in private",
  4962  		Name:        "profiles-" + model.NewId(),
  4963  		Type:        model.CHANNEL_PRIVATE,
  4964  	}
  4965  	c3, nErr := s.Store().Channel().Save(ch3, -1)
  4966  	s.Require().Nil(nErr)
  4967  
  4968  	_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{
  4969  		ChannelId:   c1.Id,
  4970  		UserId:      u1.Id,
  4971  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  4972  	})
  4973  	s.Require().Nil(nErr)
  4974  
  4975  	_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{
  4976  		ChannelId:   c1.Id,
  4977  		UserId:      u2.Id,
  4978  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  4979  	})
  4980  	s.Require().Nil(nErr)
  4981  
  4982  	_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{
  4983  		ChannelId:   c2.Id,
  4984  		UserId:      u3.Id,
  4985  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  4986  	})
  4987  	s.Require().Nil(nErr)
  4988  
  4989  	_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{
  4990  		ChannelId:   c2.Id,
  4991  		UserId:      u1.Id,
  4992  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  4993  	})
  4994  	s.Require().Nil(nErr)
  4995  
  4996  	_, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{
  4997  		ChannelId:   c3.Id,
  4998  		UserId:      u4.Id,
  4999  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  5000  	})
  5001  	s.Require().Nil(nErr)
  5002  
  5003  	s.T().Run("get know users sharing no channels", func(t *testing.T) {
  5004  		userIds, err := s.Store().User().GetKnownUsers(u4.Id)
  5005  		s.Require().Nil(err)
  5006  		s.Assert().Empty(userIds)
  5007  	})
  5008  
  5009  	s.T().Run("get know users sharing one channel", func(t *testing.T) {
  5010  		userIds, err := s.Store().User().GetKnownUsers(u3.Id)
  5011  		s.Require().Nil(err)
  5012  		s.Assert().Len(userIds, 1)
  5013  		s.Assert().Equal(userIds[0], u1.Id)
  5014  	})
  5015  
  5016  	s.T().Run("get know users sharing multiple channels", func(t *testing.T) {
  5017  		userIds, err := s.Store().User().GetKnownUsers(u1.Id)
  5018  		s.Require().Nil(err)
  5019  		s.Assert().Len(userIds, 2)
  5020  		s.Assert().ElementsMatch(userIds, []string{u2.Id, u3.Id})
  5021  	})
  5022  }