github.com/mattermosttest/mattermost-server/v5@v5.0.0-20200917143240-9dfa12e121f9/store/storetest/user_store.go (about)

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