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