github.com/nhannv/mattermost-server@v5.11.1+incompatible/store/storetest/user_store.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package storetest
     5  
     6  import (
     7  	"strings"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/stretchr/testify/require"
    13  
    14  	"github.com/mattermost/mattermost-server/model"
    15  	"github.com/mattermost/mattermost-server/store"
    16  )
    17  
    18  func TestUserStore(t *testing.T, ss store.Store) {
    19  	result := <-ss.User().GetAll()
    20  	require.Nil(t, result.Err, "failed cleaning up test users")
    21  	users := result.Data.([]*model.User)
    22  
    23  	for _, u := range users {
    24  		result := <-ss.User().PermanentDelete(u.Id)
    25  		require.Nil(t, result.Err, "failed cleaning up test user %s", u.Username)
    26  	}
    27  
    28  	t.Run("Count", func(t *testing.T) { testCount(t, ss) })
    29  	t.Run("AnalyticsGetInactiveUsersCount", func(t *testing.T) { testUserStoreAnalyticsGetInactiveUsersCount(t, ss) })
    30  	t.Run("AnalyticsGetSystemAdminCount", func(t *testing.T) { testUserStoreAnalyticsGetSystemAdminCount(t, ss) })
    31  	t.Run("Save", func(t *testing.T) { testUserStoreSave(t, ss) })
    32  	t.Run("Update", func(t *testing.T) { testUserStoreUpdate(t, ss) })
    33  	t.Run("UpdateUpdateAt", func(t *testing.T) { testUserStoreUpdateUpdateAt(t, ss) })
    34  	t.Run("UpdateFailedPasswordAttempts", func(t *testing.T) { testUserStoreUpdateFailedPasswordAttempts(t, ss) })
    35  	t.Run("Get", func(t *testing.T) { testUserStoreGet(t, ss) })
    36  	t.Run("GetAllUsingAuthService", func(t *testing.T) { testGetAllUsingAuthService(t, ss) })
    37  	t.Run("GetAllProfiles", func(t *testing.T) { testUserStoreGetAllProfiles(t, ss) })
    38  	t.Run("GetProfiles", func(t *testing.T) { testUserStoreGetProfiles(t, ss) })
    39  	t.Run("GetProfilesInChannel", func(t *testing.T) { testUserStoreGetProfilesInChannel(t, ss) })
    40  	t.Run("GetProfilesInChannelByStatus", func(t *testing.T) { testUserStoreGetProfilesInChannelByStatus(t, ss) })
    41  	t.Run("GetProfilesWithoutTeam", func(t *testing.T) { testUserStoreGetProfilesWithoutTeam(t, ss) })
    42  	t.Run("GetAllProfilesInChannel", func(t *testing.T) { testUserStoreGetAllProfilesInChannel(t, ss) })
    43  	t.Run("GetProfilesNotInChannel", func(t *testing.T) { testUserStoreGetProfilesNotInChannel(t, ss) })
    44  	t.Run("GetProfilesByIds", func(t *testing.T) { testUserStoreGetProfilesByIds(t, ss) })
    45  	t.Run("GetProfilesByUsernames", func(t *testing.T) { testUserStoreGetProfilesByUsernames(t, ss) })
    46  	t.Run("GetSystemAdminProfiles", func(t *testing.T) { testUserStoreGetSystemAdminProfiles(t, ss) })
    47  	t.Run("GetByEmail", func(t *testing.T) { testUserStoreGetByEmail(t, ss) })
    48  	t.Run("GetByAuthData", func(t *testing.T) { testUserStoreGetByAuthData(t, ss) })
    49  	t.Run("GetByUsername", func(t *testing.T) { testUserStoreGetByUsername(t, ss) })
    50  	t.Run("GetForLogin", func(t *testing.T) { testUserStoreGetForLogin(t, ss) })
    51  	t.Run("UpdatePassword", func(t *testing.T) { testUserStoreUpdatePassword(t, ss) })
    52  	t.Run("Delete", func(t *testing.T) { testUserStoreDelete(t, ss) })
    53  	t.Run("UpdateAuthData", func(t *testing.T) { testUserStoreUpdateAuthData(t, ss) })
    54  	t.Run("UserUnreadCount", func(t *testing.T) { testUserUnreadCount(t, ss) })
    55  	t.Run("UpdateMfaSecret", func(t *testing.T) { testUserStoreUpdateMfaSecret(t, ss) })
    56  	t.Run("UpdateMfaActive", func(t *testing.T) { testUserStoreUpdateMfaActive(t, ss) })
    57  	t.Run("GetRecentlyActiveUsersForTeam", func(t *testing.T) { testUserStoreGetRecentlyActiveUsersForTeam(t, ss) })
    58  	t.Run("GetNewUsersForTeam", func(t *testing.T) { testUserStoreGetNewUsersForTeam(t, ss) })
    59  	t.Run("Search", func(t *testing.T) { testUserStoreSearch(t, ss) })
    60  	t.Run("SearchNotInChannel", func(t *testing.T) { testUserStoreSearchNotInChannel(t, ss) })
    61  	t.Run("SearchInChannel", func(t *testing.T) { testUserStoreSearchInChannel(t, ss) })
    62  	t.Run("SearchNotInTeam", func(t *testing.T) { testUserStoreSearchNotInTeam(t, ss) })
    63  	t.Run("SearchWithoutTeam", func(t *testing.T) { testUserStoreSearchWithoutTeam(t, ss) })
    64  	t.Run("GetProfilesNotInTeam", func(t *testing.T) { testUserStoreGetProfilesNotInTeam(t, ss) })
    65  	t.Run("ClearAllCustomRoleAssignments", func(t *testing.T) { testUserStoreClearAllCustomRoleAssignments(t, ss) })
    66  	t.Run("GetAllAfter", func(t *testing.T) { testUserStoreGetAllAfter(t, ss) })
    67  	t.Run("GetUsersBatchForIndexing", func(t *testing.T) { testUserStoreGetUsersBatchForIndexing(t, ss) })
    68  }
    69  
    70  func testUserStoreSave(t *testing.T, ss store.Store) {
    71  	teamId := model.NewId()
    72  	maxUsersPerTeam := 50
    73  
    74  	u1 := model.User{
    75  		Email:    MakeEmail(),
    76  		Username: model.NewId(),
    77  	}
    78  
    79  	if err := (<-ss.User().Save(&u1)).Err; err != nil {
    80  		t.Fatal("couldn't save user", err)
    81  	}
    82  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
    83  
    84  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, maxUsersPerTeam))
    85  
    86  	if err := (<-ss.User().Save(&u1)).Err; err == nil {
    87  		t.Fatal("shouldn't be able to update user from save")
    88  	}
    89  
    90  	u2 := model.User{
    91  		Email:    u1.Email,
    92  		Username: model.NewId(),
    93  	}
    94  	if err := (<-ss.User().Save(&u2)).Err; err == nil {
    95  		t.Fatal("should be unique email")
    96  	}
    97  
    98  	u2.Email = MakeEmail()
    99  	u2.Username = u1.Username
   100  	if err := (<-ss.User().Save(&u1)).Err; err == nil {
   101  		t.Fatal("should be unique username")
   102  	}
   103  
   104  	u2.Username = ""
   105  	if err := (<-ss.User().Save(&u1)).Err; err == nil {
   106  		t.Fatal("should be unique username")
   107  	}
   108  
   109  	for i := 0; i < 49; i++ {
   110  		u := model.User{
   111  			Email:    MakeEmail(),
   112  			Username: model.NewId(),
   113  		}
   114  		if err := (<-ss.User().Save(&u)).Err; err != nil {
   115  			t.Fatal("couldn't save item", err)
   116  		}
   117  		defer func() { store.Must(ss.User().PermanentDelete(u.Id)) }()
   118  
   119  		store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u.Id}, maxUsersPerTeam))
   120  	}
   121  
   122  	u2.Id = ""
   123  	u2.Email = MakeEmail()
   124  	u2.Username = model.NewId()
   125  	if err := (<-ss.User().Save(&u2)).Err; err != nil {
   126  		t.Fatal("couldn't save item", err)
   127  	}
   128  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
   129  
   130  	if err := (<-ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, maxUsersPerTeam)).Err; err == nil {
   131  		t.Fatal("should be the limit")
   132  	}
   133  }
   134  
   135  func testUserStoreUpdate(t *testing.T, ss store.Store) {
   136  	u1 := &model.User{
   137  		Email: MakeEmail(),
   138  	}
   139  	store.Must(ss.User().Save(u1))
   140  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
   141  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1))
   142  
   143  	u2 := &model.User{
   144  		Email:       MakeEmail(),
   145  		AuthService: "ldap",
   146  	}
   147  	store.Must(ss.User().Save(u2))
   148  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
   149  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}, -1))
   150  
   151  	time.Sleep(100 * time.Millisecond)
   152  
   153  	if err := (<-ss.User().Update(u1, false)).Err; err != nil {
   154  		t.Fatal(err)
   155  	}
   156  
   157  	missing := &model.User{}
   158  	if err := (<-ss.User().Update(missing, false)).Err; err == nil {
   159  		t.Fatal("Update should have failed because of missing key")
   160  	}
   161  
   162  	newId := &model.User{
   163  		Id: model.NewId(),
   164  	}
   165  	if err := (<-ss.User().Update(newId, false)).Err; err == nil {
   166  		t.Fatal("Update should have failed because id change")
   167  	}
   168  
   169  	u2.Email = MakeEmail()
   170  	if err := (<-ss.User().Update(u2, false)).Err; err == nil {
   171  		t.Fatal("Update should have failed because you can't modify AD/LDAP fields")
   172  	}
   173  
   174  	u3 := &model.User{
   175  		Email:       MakeEmail(),
   176  		AuthService: "gitlab",
   177  	}
   178  	oldEmail := u3.Email
   179  	store.Must(ss.User().Save(u3))
   180  	defer func() { store.Must(ss.User().PermanentDelete(u3.Id)) }()
   181  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u3.Id}, -1))
   182  
   183  	u3.Email = MakeEmail()
   184  	if result := <-ss.User().Update(u3, false); result.Err != nil {
   185  		t.Fatal("Update should not have failed")
   186  	} else {
   187  		newUser := result.Data.([2]*model.User)[0]
   188  		if newUser.Email != oldEmail {
   189  			t.Fatal("Email should not have been updated as the update is not trusted")
   190  		}
   191  	}
   192  
   193  	u3.Email = MakeEmail()
   194  	if result := <-ss.User().Update(u3, true); result.Err != nil {
   195  		t.Fatal("Update should not have failed")
   196  	} else {
   197  		newUser := result.Data.([2]*model.User)[0]
   198  		if newUser.Email == oldEmail {
   199  			t.Fatal("Email should have been updated as the update is trusted")
   200  		}
   201  	}
   202  
   203  	if result := <-ss.User().UpdateLastPictureUpdate(u1.Id); result.Err != nil {
   204  		t.Fatal("Update should not have failed")
   205  	}
   206  }
   207  
   208  func testUserStoreUpdateUpdateAt(t *testing.T, ss store.Store) {
   209  	u1 := &model.User{}
   210  	u1.Email = MakeEmail()
   211  	store.Must(ss.User().Save(u1))
   212  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
   213  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1))
   214  
   215  	time.Sleep(10 * time.Millisecond)
   216  
   217  	if err := (<-ss.User().UpdateUpdateAt(u1.Id)).Err; err != nil {
   218  		t.Fatal(err)
   219  	}
   220  
   221  	if r1 := <-ss.User().Get(u1.Id); r1.Err != nil {
   222  		t.Fatal(r1.Err)
   223  	} else {
   224  		if r1.Data.(*model.User).UpdateAt <= u1.UpdateAt {
   225  			t.Fatal("UpdateAt not updated correctly")
   226  		}
   227  	}
   228  
   229  }
   230  
   231  func testUserStoreUpdateFailedPasswordAttempts(t *testing.T, ss store.Store) {
   232  	u1 := &model.User{}
   233  	u1.Email = MakeEmail()
   234  	store.Must(ss.User().Save(u1))
   235  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
   236  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1))
   237  
   238  	if err := (<-ss.User().UpdateFailedPasswordAttempts(u1.Id, 3)).Err; err != nil {
   239  		t.Fatal(err)
   240  	}
   241  
   242  	if r1 := <-ss.User().Get(u1.Id); r1.Err != nil {
   243  		t.Fatal(r1.Err)
   244  	} else {
   245  		if r1.Data.(*model.User).FailedAttempts != 3 {
   246  			t.Fatal("FailedAttempts not updated correctly")
   247  		}
   248  	}
   249  
   250  }
   251  
   252  func testUserStoreGet(t *testing.T, ss store.Store) {
   253  	u1 := &model.User{
   254  		Email: MakeEmail(),
   255  	}
   256  	store.Must(ss.User().Save(u1))
   257  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
   258  
   259  	u2 := store.Must(ss.User().Save(&model.User{
   260  		Email:    MakeEmail(),
   261  		Username: model.NewId(),
   262  	})).(*model.User)
   263  	store.Must(ss.Bot().Save(&model.Bot{
   264  		UserId:   u2.Id,
   265  		Username: u2.Username,
   266  		OwnerId:  u1.Id,
   267  	}))
   268  	u2.IsBot = true
   269  	defer func() { store.Must(ss.Bot().PermanentDelete(u2.Id)) }()
   270  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
   271  
   272  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1))
   273  
   274  	t.Run("fetch empty id", func(t *testing.T) {
   275  		require.NotNil(t, (<-ss.User().Get("")).Err)
   276  	})
   277  
   278  	t.Run("fetch user 1", func(t *testing.T) {
   279  		result := <-ss.User().Get(u1.Id)
   280  		require.Nil(t, result.Err)
   281  
   282  		actual := result.Data.(*model.User)
   283  		require.Equal(t, u1, actual)
   284  		require.False(t, actual.IsBot)
   285  	})
   286  
   287  	t.Run("fetch user 2, also a bot", func(t *testing.T) {
   288  		result := <-ss.User().Get(u2.Id)
   289  		require.Nil(t, result.Err)
   290  
   291  		actual := result.Data.(*model.User)
   292  		require.Equal(t, u2, actual)
   293  		require.True(t, actual.IsBot)
   294  	})
   295  }
   296  
   297  func testGetAllUsingAuthService(t *testing.T, ss store.Store) {
   298  	teamId := model.NewId()
   299  
   300  	u1 := store.Must(ss.User().Save(&model.User{
   301  		Email:       MakeEmail(),
   302  		Username:    "u1" + model.NewId(),
   303  		AuthService: "service",
   304  	})).(*model.User)
   305  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
   306  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
   307  
   308  	u2 := store.Must(ss.User().Save(&model.User{
   309  		Email:       MakeEmail(),
   310  		Username:    "u2" + model.NewId(),
   311  		AuthService: "service",
   312  	})).(*model.User)
   313  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
   314  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1))
   315  
   316  	u3 := store.Must(ss.User().Save(&model.User{
   317  		Email:       MakeEmail(),
   318  		Username:    "u3" + model.NewId(),
   319  		AuthService: "service2",
   320  	})).(*model.User)
   321  	defer func() { store.Must(ss.User().PermanentDelete(u3.Id)) }()
   322  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1))
   323  	store.Must(ss.Bot().Save(&model.Bot{
   324  		UserId:   u3.Id,
   325  		Username: u3.Username,
   326  		OwnerId:  u1.Id,
   327  	}))
   328  	u3.IsBot = true
   329  	defer func() { store.Must(ss.Bot().PermanentDelete(u3.Id)) }()
   330  	defer func() { store.Must(ss.User().PermanentDelete(u3.Id)) }()
   331  
   332  	t.Run("get by unknown auth service", func(t *testing.T) {
   333  		result := <-ss.User().GetAllUsingAuthService("unknown")
   334  		require.Nil(t, result.Err)
   335  		assert.Equal(t, []*model.User{}, result.Data.([]*model.User))
   336  	})
   337  
   338  	t.Run("get by auth service", func(t *testing.T) {
   339  		result := <-ss.User().GetAllUsingAuthService("service")
   340  		require.Nil(t, result.Err)
   341  		assert.Equal(t, []*model.User{u1, u2}, result.Data.([]*model.User))
   342  	})
   343  
   344  	t.Run("get by other auth service", func(t *testing.T) {
   345  		result := <-ss.User().GetAllUsingAuthService("service2")
   346  		require.Nil(t, result.Err)
   347  		assert.Equal(t, []*model.User{u3}, result.Data.([]*model.User))
   348  	})
   349  }
   350  
   351  func sanitized(user *model.User) *model.User {
   352  	clonedUser := model.UserFromJson(strings.NewReader(user.ToJson()))
   353  	clonedUser.AuthData = new(string)
   354  	*clonedUser.AuthData = ""
   355  	clonedUser.Props = model.StringMap{}
   356  
   357  	return clonedUser
   358  }
   359  
   360  func testUserStoreGetAllProfiles(t *testing.T, ss store.Store) {
   361  	u1 := store.Must(ss.User().Save(&model.User{
   362  		Email:    MakeEmail(),
   363  		Username: "u1" + model.NewId(),
   364  	})).(*model.User)
   365  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
   366  
   367  	u2 := store.Must(ss.User().Save(&model.User{
   368  		Email:    MakeEmail(),
   369  		Username: "u2" + model.NewId(),
   370  	})).(*model.User)
   371  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
   372  
   373  	u3 := store.Must(ss.User().Save(&model.User{
   374  		Email:    MakeEmail(),
   375  		Username: "u3" + model.NewId(),
   376  	})).(*model.User)
   377  	store.Must(ss.Bot().Save(&model.Bot{
   378  		UserId:   u3.Id,
   379  		Username: u3.Username,
   380  		OwnerId:  u1.Id,
   381  	}))
   382  	u3.IsBot = true
   383  	defer func() { store.Must(ss.Bot().PermanentDelete(u3.Id)) }()
   384  	defer func() { store.Must(ss.User().PermanentDelete(u3.Id)) }()
   385  
   386  	u4 := store.Must(ss.User().Save(&model.User{
   387  		Email:    MakeEmail(),
   388  		Username: "u4" + model.NewId(),
   389  		Roles:    "system_user some-other-role",
   390  	})).(*model.User)
   391  	defer func() { store.Must(ss.User().PermanentDelete(u4.Id)) }()
   392  
   393  	u5 := store.Must(ss.User().Save(&model.User{
   394  		Email:    MakeEmail(),
   395  		Username: "u5" + model.NewId(),
   396  		Roles:    "system_admin",
   397  	})).(*model.User)
   398  	defer func() { store.Must(ss.User().PermanentDelete(u5.Id)) }()
   399  
   400  	u6 := store.Must(ss.User().Save(&model.User{
   401  		Email:    MakeEmail(),
   402  		Username: "u6" + model.NewId(),
   403  		DeleteAt: model.GetMillis(),
   404  		Roles:    "system_admin",
   405  	})).(*model.User)
   406  	defer func() { store.Must(ss.User().PermanentDelete(u6.Id)) }()
   407  
   408  	u7 := store.Must(ss.User().Save(&model.User{
   409  		Email:    MakeEmail(),
   410  		Username: "u7" + model.NewId(),
   411  		DeleteAt: model.GetMillis(),
   412  	})).(*model.User)
   413  	defer func() { store.Must(ss.User().PermanentDelete(u7.Id)) }()
   414  
   415  	t.Run("get offset 0, limit 100", func(t *testing.T) {
   416  		options := &model.UserGetOptions{Page: 0, PerPage: 100}
   417  		result := <-ss.User().GetAllProfiles(options)
   418  		require.Nil(t, result.Err)
   419  
   420  		actual := result.Data.([]*model.User)
   421  		require.Equal(t, []*model.User{
   422  			sanitized(u1),
   423  			sanitized(u2),
   424  			sanitized(u3),
   425  			sanitized(u4),
   426  			sanitized(u5),
   427  			sanitized(u6),
   428  			sanitized(u7),
   429  		}, actual)
   430  	})
   431  
   432  	t.Run("get offset 0, limit 1", func(t *testing.T) {
   433  		result := <-ss.User().GetAllProfiles(&model.UserGetOptions{
   434  			Page:    0,
   435  			PerPage: 1,
   436  		})
   437  		require.Nil(t, result.Err)
   438  		actual := result.Data.([]*model.User)
   439  		require.Equal(t, []*model.User{
   440  			sanitized(u1),
   441  		}, actual)
   442  	})
   443  
   444  	t.Run("get all", func(t *testing.T) {
   445  		result := <-ss.User().GetAll()
   446  		require.Nil(t, result.Err)
   447  
   448  		actual := result.Data.([]*model.User)
   449  		require.Equal(t, []*model.User{
   450  			u1,
   451  			u2,
   452  			u3,
   453  			u4,
   454  			u5,
   455  			u6,
   456  			u7,
   457  		}, actual)
   458  	})
   459  
   460  	t.Run("etag changes for all after user creation", func(t *testing.T) {
   461  		result := <-ss.User().GetEtagForAllProfiles()
   462  		require.Nil(t, result.Err)
   463  		etag := result.Data.(string)
   464  
   465  		uNew := &model.User{}
   466  		uNew.Email = MakeEmail()
   467  		store.Must(ss.User().Save(uNew))
   468  		defer func() { store.Must(ss.User().PermanentDelete(uNew.Id)) }()
   469  
   470  		result = <-ss.User().GetEtagForAllProfiles()
   471  		require.Nil(t, result.Err)
   472  		updatedEtag := result.Data.(string)
   473  
   474  		require.NotEqual(t, etag, updatedEtag)
   475  	})
   476  
   477  	t.Run("filter to system_admin role", func(t *testing.T) {
   478  		result := <-ss.User().GetAllProfiles(&model.UserGetOptions{
   479  			Page:    0,
   480  			PerPage: 10,
   481  			Role:    "system_admin",
   482  		})
   483  		require.Nil(t, result.Err)
   484  		actual := result.Data.([]*model.User)
   485  		require.Equal(t, []*model.User{
   486  			sanitized(u5),
   487  			sanitized(u6),
   488  		}, actual)
   489  	})
   490  
   491  	t.Run("filter to system_admin role, inactive", func(t *testing.T) {
   492  		result := <-ss.User().GetAllProfiles(&model.UserGetOptions{
   493  			Page:     0,
   494  			PerPage:  10,
   495  			Role:     "system_admin",
   496  			Inactive: true,
   497  		})
   498  		require.Nil(t, result.Err)
   499  		actual := result.Data.([]*model.User)
   500  		require.Equal(t, []*model.User{
   501  			sanitized(u6),
   502  		}, actual)
   503  	})
   504  
   505  	t.Run("filter to inactive", func(t *testing.T) {
   506  		result := <-ss.User().GetAllProfiles(&model.UserGetOptions{
   507  			Page:     0,
   508  			PerPage:  10,
   509  			Inactive: true,
   510  		})
   511  		require.Nil(t, result.Err)
   512  		actual := result.Data.([]*model.User)
   513  		require.Equal(t, []*model.User{
   514  			sanitized(u6),
   515  			sanitized(u7),
   516  		}, actual)
   517  	})
   518  }
   519  
   520  func testUserStoreGetProfiles(t *testing.T, ss store.Store) {
   521  	teamId := model.NewId()
   522  
   523  	u1 := store.Must(ss.User().Save(&model.User{
   524  		Email:    MakeEmail(),
   525  		Username: "u1" + model.NewId(),
   526  	})).(*model.User)
   527  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
   528  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
   529  
   530  	u2 := store.Must(ss.User().Save(&model.User{
   531  		Email:    MakeEmail(),
   532  		Username: "u2" + model.NewId(),
   533  	})).(*model.User)
   534  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
   535  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1))
   536  
   537  	u3 := store.Must(ss.User().Save(&model.User{
   538  		Email:    MakeEmail(),
   539  		Username: "u3" + model.NewId(),
   540  	})).(*model.User)
   541  	store.Must(ss.Bot().Save(&model.Bot{
   542  		UserId:   u3.Id,
   543  		Username: u3.Username,
   544  		OwnerId:  u1.Id,
   545  	}))
   546  	u3.IsBot = true
   547  	defer func() { store.Must(ss.Bot().PermanentDelete(u3.Id)) }()
   548  	defer func() { store.Must(ss.User().PermanentDelete(u3.Id)) }()
   549  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1))
   550  
   551  	u4 := store.Must(ss.User().Save(&model.User{
   552  		Email:    MakeEmail(),
   553  		Username: "u4" + model.NewId(),
   554  		Roles:    "system_admin",
   555  	})).(*model.User)
   556  	defer func() { store.Must(ss.User().PermanentDelete(u4.Id)) }()
   557  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u4.Id}, -1))
   558  
   559  	u5 := store.Must(ss.User().Save(&model.User{
   560  		Email:    MakeEmail(),
   561  		Username: "u5" + model.NewId(),
   562  		DeleteAt: model.GetMillis(),
   563  	})).(*model.User)
   564  	defer func() { store.Must(ss.User().PermanentDelete(u5.Id)) }()
   565  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u5.Id}, -1))
   566  
   567  	t.Run("get page 0, perPage 100", func(t *testing.T) {
   568  		result := <-ss.User().GetProfiles(&model.UserGetOptions{
   569  			InTeamId: teamId,
   570  			Page:     0,
   571  			PerPage:  100,
   572  		})
   573  		require.Nil(t, result.Err)
   574  
   575  		actual := result.Data.([]*model.User)
   576  		require.Equal(t, []*model.User{
   577  			sanitized(u1),
   578  			sanitized(u2),
   579  			sanitized(u3),
   580  			sanitized(u4),
   581  			sanitized(u5),
   582  		}, actual)
   583  	})
   584  
   585  	t.Run("get page 0, perPage 1", func(t *testing.T) {
   586  		result := <-ss.User().GetProfiles(&model.UserGetOptions{
   587  			InTeamId: teamId,
   588  			Page:     0,
   589  			PerPage:  1,
   590  		})
   591  		require.Nil(t, result.Err)
   592  
   593  		actual := result.Data.([]*model.User)
   594  		require.Equal(t, []*model.User{sanitized(u1)}, actual)
   595  	})
   596  
   597  	t.Run("get unknown team id", func(t *testing.T) {
   598  		result := <-ss.User().GetProfiles(&model.UserGetOptions{
   599  			InTeamId: "123",
   600  			Page:     0,
   601  			PerPage:  100,
   602  		})
   603  		require.Nil(t, result.Err)
   604  
   605  		actual := result.Data.([]*model.User)
   606  		require.Equal(t, []*model.User{}, actual)
   607  	})
   608  
   609  	t.Run("etag changes for all after user creation", func(t *testing.T) {
   610  		result := <-ss.User().GetEtagForProfiles(teamId)
   611  		require.Nil(t, result.Err)
   612  		etag := result.Data.(string)
   613  
   614  		uNew := &model.User{}
   615  		uNew.Email = MakeEmail()
   616  		store.Must(ss.User().Save(uNew))
   617  		defer func() { store.Must(ss.User().PermanentDelete(uNew.Id)) }()
   618  		store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: uNew.Id}, -1))
   619  
   620  		result = <-ss.User().GetEtagForProfiles(teamId)
   621  		require.Nil(t, result.Err)
   622  		updatedEtag := result.Data.(string)
   623  
   624  		require.NotEqual(t, etag, updatedEtag)
   625  	})
   626  
   627  	t.Run("filter to system_admin role", func(t *testing.T) {
   628  		result := <-ss.User().GetProfiles(&model.UserGetOptions{
   629  			InTeamId: teamId,
   630  			Page:     0,
   631  			PerPage:  10,
   632  			Role:     "system_admin",
   633  		})
   634  		require.Nil(t, result.Err)
   635  		actual := result.Data.([]*model.User)
   636  		require.Equal(t, []*model.User{
   637  			sanitized(u4),
   638  		}, actual)
   639  	})
   640  
   641  	t.Run("filter to inactive", func(t *testing.T) {
   642  		result := <-ss.User().GetProfiles(&model.UserGetOptions{
   643  			InTeamId: teamId,
   644  			Page:     0,
   645  			PerPage:  10,
   646  			Inactive: true,
   647  		})
   648  		require.Nil(t, result.Err)
   649  		actual := result.Data.([]*model.User)
   650  		require.Equal(t, []*model.User{
   651  			sanitized(u5),
   652  		}, actual)
   653  	})
   654  }
   655  
   656  func testUserStoreGetProfilesInChannel(t *testing.T, ss store.Store) {
   657  	teamId := model.NewId()
   658  
   659  	u1 := store.Must(ss.User().Save(&model.User{
   660  		Email:    MakeEmail(),
   661  		Username: "u1" + model.NewId(),
   662  	})).(*model.User)
   663  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
   664  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
   665  
   666  	u2 := store.Must(ss.User().Save(&model.User{
   667  		Email:    MakeEmail(),
   668  		Username: "u2" + model.NewId(),
   669  	})).(*model.User)
   670  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
   671  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1))
   672  
   673  	u3 := store.Must(ss.User().Save(&model.User{
   674  		Email:    MakeEmail(),
   675  		Username: "u3" + model.NewId(),
   676  	})).(*model.User)
   677  	defer func() { store.Must(ss.User().PermanentDelete(u3.Id)) }()
   678  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1))
   679  	store.Must(ss.Bot().Save(&model.Bot{
   680  		UserId:   u3.Id,
   681  		Username: u3.Username,
   682  		OwnerId:  u1.Id,
   683  	}))
   684  	u3.IsBot = true
   685  	defer func() { store.Must(ss.Bot().PermanentDelete(u3.Id)) }()
   686  
   687  	c1 := store.Must(ss.Channel().Save(&model.Channel{
   688  		TeamId:      teamId,
   689  		DisplayName: "Profiles in channel",
   690  		Name:        "profiles-" + model.NewId(),
   691  		Type:        model.CHANNEL_OPEN,
   692  	}, -1)).(*model.Channel)
   693  
   694  	c2 := store.Must(ss.Channel().Save(&model.Channel{
   695  		TeamId:      teamId,
   696  		DisplayName: "Profiles in private",
   697  		Name:        "profiles-" + model.NewId(),
   698  		Type:        model.CHANNEL_PRIVATE,
   699  	}, -1)).(*model.Channel)
   700  
   701  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
   702  		ChannelId:   c1.Id,
   703  		UserId:      u1.Id,
   704  		NotifyProps: model.GetDefaultChannelNotifyProps(),
   705  	}))
   706  
   707  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
   708  		ChannelId:   c1.Id,
   709  		UserId:      u2.Id,
   710  		NotifyProps: model.GetDefaultChannelNotifyProps(),
   711  	}))
   712  
   713  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
   714  		ChannelId:   c1.Id,
   715  		UserId:      u3.Id,
   716  		NotifyProps: model.GetDefaultChannelNotifyProps(),
   717  	}))
   718  
   719  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
   720  		ChannelId:   c2.Id,
   721  		UserId:      u1.Id,
   722  		NotifyProps: model.GetDefaultChannelNotifyProps(),
   723  	}))
   724  
   725  	t.Run("get in channel 1, offset 0, limit 100", func(t *testing.T) {
   726  		result := <-ss.User().GetProfilesInChannel(c1.Id, 0, 100)
   727  		require.Nil(t, result.Err)
   728  		assert.Equal(t, []*model.User{sanitized(u1), sanitized(u2), sanitized(u3)}, result.Data.([]*model.User))
   729  	})
   730  
   731  	t.Run("get in channel 1, offset 1, limit 2", func(t *testing.T) {
   732  		result := <-ss.User().GetProfilesInChannel(c1.Id, 1, 2)
   733  		require.Nil(t, result.Err)
   734  		assert.Equal(t, []*model.User{sanitized(u2), sanitized(u3)}, result.Data.([]*model.User))
   735  	})
   736  
   737  	t.Run("get in channel 2, offset 0, limit 1", func(t *testing.T) {
   738  		result := <-ss.User().GetProfilesInChannel(c2.Id, 0, 1)
   739  		require.Nil(t, result.Err)
   740  		assert.Equal(t, []*model.User{sanitized(u1)}, result.Data.([]*model.User))
   741  	})
   742  }
   743  
   744  func testUserStoreGetProfilesInChannelByStatus(t *testing.T, ss store.Store) {
   745  	teamId := model.NewId()
   746  
   747  	u1 := store.Must(ss.User().Save(&model.User{
   748  		Email:    MakeEmail(),
   749  		Username: "u1" + model.NewId(),
   750  	})).(*model.User)
   751  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
   752  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
   753  
   754  	u2 := store.Must(ss.User().Save(&model.User{
   755  		Email:    MakeEmail(),
   756  		Username: "u2" + model.NewId(),
   757  	})).(*model.User)
   758  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
   759  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1))
   760  
   761  	u3 := store.Must(ss.User().Save(&model.User{
   762  		Email:    MakeEmail(),
   763  		Username: "u3" + model.NewId(),
   764  	})).(*model.User)
   765  	defer func() { store.Must(ss.User().PermanentDelete(u3.Id)) }()
   766  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1))
   767  	store.Must(ss.Bot().Save(&model.Bot{
   768  		UserId:   u3.Id,
   769  		Username: u3.Username,
   770  		OwnerId:  u1.Id,
   771  	}))
   772  	u3.IsBot = true
   773  	defer func() { store.Must(ss.Bot().PermanentDelete(u3.Id)) }()
   774  
   775  	c1 := store.Must(ss.Channel().Save(&model.Channel{
   776  		TeamId:      teamId,
   777  		DisplayName: "Profiles in channel",
   778  		Name:        "profiles-" + model.NewId(),
   779  		Type:        model.CHANNEL_OPEN,
   780  	}, -1)).(*model.Channel)
   781  
   782  	c2 := store.Must(ss.Channel().Save(&model.Channel{
   783  		TeamId:      teamId,
   784  		DisplayName: "Profiles in private",
   785  		Name:        "profiles-" + model.NewId(),
   786  		Type:        model.CHANNEL_PRIVATE,
   787  	}, -1)).(*model.Channel)
   788  
   789  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
   790  		ChannelId:   c1.Id,
   791  		UserId:      u1.Id,
   792  		NotifyProps: model.GetDefaultChannelNotifyProps(),
   793  	}))
   794  
   795  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
   796  		ChannelId:   c1.Id,
   797  		UserId:      u2.Id,
   798  		NotifyProps: model.GetDefaultChannelNotifyProps(),
   799  	}))
   800  
   801  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
   802  		ChannelId:   c1.Id,
   803  		UserId:      u3.Id,
   804  		NotifyProps: model.GetDefaultChannelNotifyProps(),
   805  	}))
   806  
   807  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
   808  		ChannelId:   c2.Id,
   809  		UserId:      u1.Id,
   810  		NotifyProps: model.GetDefaultChannelNotifyProps(),
   811  	}))
   812  
   813  	store.Must(ss.Status().SaveOrUpdate(&model.Status{
   814  		UserId: u1.Id,
   815  		Status: model.STATUS_DND,
   816  	}))
   817  	store.Must(ss.Status().SaveOrUpdate(&model.Status{
   818  		UserId: u2.Id,
   819  		Status: model.STATUS_AWAY,
   820  	}))
   821  	store.Must(ss.Status().SaveOrUpdate(&model.Status{
   822  		UserId: u3.Id,
   823  		Status: model.STATUS_ONLINE,
   824  	}))
   825  
   826  	t.Run("get in channel 1 by status, offset 0, limit 100", func(t *testing.T) {
   827  		result := <-ss.User().GetProfilesInChannelByStatus(c1.Id, 0, 100)
   828  		require.Nil(t, result.Err)
   829  		assert.Equal(t, []*model.User{sanitized(u3), sanitized(u2), sanitized(u1)}, result.Data.([]*model.User))
   830  	})
   831  
   832  	t.Run("get in channel 2 by status, offset 0, limit 1", func(t *testing.T) {
   833  		result := <-ss.User().GetProfilesInChannelByStatus(c2.Id, 0, 1)
   834  		require.Nil(t, result.Err)
   835  		assert.Equal(t, []*model.User{sanitized(u1)}, result.Data.([]*model.User))
   836  	})
   837  }
   838  
   839  func testUserStoreGetProfilesWithoutTeam(t *testing.T, ss store.Store) {
   840  	teamId := model.NewId()
   841  
   842  	u1 := store.Must(ss.User().Save(&model.User{
   843  		Email:    MakeEmail(),
   844  		Username: "u1" + model.NewId(),
   845  	})).(*model.User)
   846  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
   847  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
   848  
   849  	u2 := store.Must(ss.User().Save(&model.User{
   850  		Email:    MakeEmail(),
   851  		Username: "u2" + model.NewId(),
   852  	})).(*model.User)
   853  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
   854  
   855  	u3 := store.Must(ss.User().Save(&model.User{
   856  		Email:    MakeEmail(),
   857  		Username: "u3" + model.NewId(),
   858  	})).(*model.User)
   859  	defer func() { store.Must(ss.User().PermanentDelete(u3.Id)) }()
   860  	store.Must(ss.Bot().Save(&model.Bot{
   861  		UserId:   u3.Id,
   862  		Username: u3.Username,
   863  		OwnerId:  u1.Id,
   864  	}))
   865  	u3.IsBot = true
   866  	defer func() { store.Must(ss.Bot().PermanentDelete(u3.Id)) }()
   867  
   868  	t.Run("get, offset 0, limit 100", func(t *testing.T) {
   869  		result := <-ss.User().GetProfilesWithoutTeam(0, 100)
   870  		require.Nil(t, result.Err)
   871  		assert.Equal(t, []*model.User{sanitized(u2), sanitized(u3)}, result.Data.([]*model.User))
   872  	})
   873  
   874  	t.Run("get, offset 1, limit 1", func(t *testing.T) {
   875  		result := <-ss.User().GetProfilesWithoutTeam(1, 1)
   876  		require.Nil(t, result.Err)
   877  		assert.Equal(t, []*model.User{sanitized(u3)}, result.Data.([]*model.User))
   878  	})
   879  
   880  	t.Run("get, offset 2, limit 1", func(t *testing.T) {
   881  		result := <-ss.User().GetProfilesWithoutTeam(2, 1)
   882  		require.Nil(t, result.Err)
   883  		assert.Equal(t, []*model.User{}, result.Data.([]*model.User))
   884  	})
   885  }
   886  
   887  func testUserStoreGetAllProfilesInChannel(t *testing.T, ss store.Store) {
   888  	teamId := model.NewId()
   889  
   890  	u1 := store.Must(ss.User().Save(&model.User{
   891  		Email:    MakeEmail(),
   892  		Username: "u1" + model.NewId(),
   893  	})).(*model.User)
   894  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
   895  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
   896  
   897  	u2 := store.Must(ss.User().Save(&model.User{
   898  		Email:    MakeEmail(),
   899  		Username: "u2" + model.NewId(),
   900  	})).(*model.User)
   901  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
   902  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1))
   903  
   904  	u3 := store.Must(ss.User().Save(&model.User{
   905  		Email:    MakeEmail(),
   906  		Username: "u3" + model.NewId(),
   907  	})).(*model.User)
   908  	defer func() { store.Must(ss.User().PermanentDelete(u3.Id)) }()
   909  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1))
   910  	store.Must(ss.Bot().Save(&model.Bot{
   911  		UserId:   u3.Id,
   912  		Username: u3.Username,
   913  		OwnerId:  u1.Id,
   914  	}))
   915  	u3.IsBot = true
   916  	defer func() { store.Must(ss.Bot().PermanentDelete(u3.Id)) }()
   917  
   918  	c1 := store.Must(ss.Channel().Save(&model.Channel{
   919  		TeamId:      teamId,
   920  		DisplayName: "Profiles in channel",
   921  		Name:        "profiles-" + model.NewId(),
   922  		Type:        model.CHANNEL_OPEN,
   923  	}, -1)).(*model.Channel)
   924  
   925  	c2 := store.Must(ss.Channel().Save(&model.Channel{
   926  		TeamId:      teamId,
   927  		DisplayName: "Profiles in private",
   928  		Name:        "profiles-" + model.NewId(),
   929  		Type:        model.CHANNEL_PRIVATE,
   930  	}, -1)).(*model.Channel)
   931  
   932  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
   933  		ChannelId:   c1.Id,
   934  		UserId:      u1.Id,
   935  		NotifyProps: model.GetDefaultChannelNotifyProps(),
   936  	}))
   937  
   938  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
   939  		ChannelId:   c1.Id,
   940  		UserId:      u2.Id,
   941  		NotifyProps: model.GetDefaultChannelNotifyProps(),
   942  	}))
   943  
   944  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
   945  		ChannelId:   c1.Id,
   946  		UserId:      u3.Id,
   947  		NotifyProps: model.GetDefaultChannelNotifyProps(),
   948  	}))
   949  
   950  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
   951  		ChannelId:   c2.Id,
   952  		UserId:      u1.Id,
   953  		NotifyProps: model.GetDefaultChannelNotifyProps(),
   954  	}))
   955  
   956  	t.Run("all profiles in channel 1, no caching", func(t *testing.T) {
   957  		result := <-ss.User().GetAllProfilesInChannel(c1.Id, false)
   958  		require.Nil(t, result.Err)
   959  		assert.Equal(t, map[string]*model.User{
   960  			u1.Id: sanitized(u1),
   961  			u2.Id: sanitized(u2),
   962  			u3.Id: sanitized(u3),
   963  		}, result.Data.(map[string]*model.User))
   964  	})
   965  
   966  	t.Run("all profiles in channel 2, no caching", func(t *testing.T) {
   967  		result := <-ss.User().GetAllProfilesInChannel(c2.Id, false)
   968  		require.Nil(t, result.Err)
   969  		assert.Equal(t, map[string]*model.User{
   970  			u1.Id: sanitized(u1),
   971  		}, result.Data.(map[string]*model.User))
   972  	})
   973  
   974  	t.Run("all profiles in channel 2, caching", func(t *testing.T) {
   975  		result := <-ss.User().GetAllProfilesInChannel(c2.Id, true)
   976  		require.Nil(t, result.Err)
   977  		assert.Equal(t, map[string]*model.User{
   978  			u1.Id: sanitized(u1),
   979  		}, result.Data.(map[string]*model.User))
   980  	})
   981  
   982  	t.Run("all profiles in channel 2, caching [repeated]", func(t *testing.T) {
   983  		result := <-ss.User().GetAllProfilesInChannel(c2.Id, true)
   984  		require.Nil(t, result.Err)
   985  		assert.Equal(t, map[string]*model.User{
   986  			u1.Id: sanitized(u1),
   987  		}, result.Data.(map[string]*model.User))
   988  	})
   989  
   990  	ss.User().InvalidateProfilesInChannelCacheByUser(u1.Id)
   991  	ss.User().InvalidateProfilesInChannelCache(c2.Id)
   992  }
   993  
   994  func testUserStoreGetProfilesNotInChannel(t *testing.T, ss store.Store) {
   995  	teamId := model.NewId()
   996  
   997  	u1 := store.Must(ss.User().Save(&model.User{
   998  		Email:    MakeEmail(),
   999  		Username: "u1" + model.NewId(),
  1000  	})).(*model.User)
  1001  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
  1002  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
  1003  
  1004  	u2 := store.Must(ss.User().Save(&model.User{
  1005  		Email:    MakeEmail(),
  1006  		Username: "u2" + model.NewId(),
  1007  	})).(*model.User)
  1008  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
  1009  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1))
  1010  
  1011  	u3 := store.Must(ss.User().Save(&model.User{
  1012  		Email:    MakeEmail(),
  1013  		Username: "u3" + model.NewId(),
  1014  	})).(*model.User)
  1015  	defer func() { store.Must(ss.User().PermanentDelete(u3.Id)) }()
  1016  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1))
  1017  	store.Must(ss.Bot().Save(&model.Bot{
  1018  		UserId:   u3.Id,
  1019  		Username: u3.Username,
  1020  		OwnerId:  u1.Id,
  1021  	}))
  1022  	u3.IsBot = true
  1023  	defer func() { store.Must(ss.Bot().PermanentDelete(u3.Id)) }()
  1024  
  1025  	c1 := store.Must(ss.Channel().Save(&model.Channel{
  1026  		TeamId:      teamId,
  1027  		DisplayName: "Profiles in channel",
  1028  		Name:        "profiles-" + model.NewId(),
  1029  		Type:        model.CHANNEL_OPEN,
  1030  	}, -1)).(*model.Channel)
  1031  
  1032  	c2 := store.Must(ss.Channel().Save(&model.Channel{
  1033  		TeamId:      teamId,
  1034  		DisplayName: "Profiles in private",
  1035  		Name:        "profiles-" + model.NewId(),
  1036  		Type:        model.CHANNEL_PRIVATE,
  1037  	}, -1)).(*model.Channel)
  1038  
  1039  	t.Run("get team 1, channel 1, offset 0, limit 100", func(t *testing.T) {
  1040  		result := <-ss.User().GetProfilesNotInChannel(teamId, c1.Id, 0, 100)
  1041  		require.Nil(t, result.Err)
  1042  		assert.Equal(t, []*model.User{
  1043  			sanitized(u1),
  1044  			sanitized(u2),
  1045  			sanitized(u3),
  1046  		}, result.Data.([]*model.User))
  1047  	})
  1048  
  1049  	t.Run("get team 1, channel 2, offset 0, limit 100", func(t *testing.T) {
  1050  		result := <-ss.User().GetProfilesNotInChannel(teamId, c2.Id, 0, 100)
  1051  		require.Nil(t, result.Err)
  1052  		assert.Equal(t, []*model.User{
  1053  			sanitized(u1),
  1054  			sanitized(u2),
  1055  			sanitized(u3),
  1056  		}, result.Data.([]*model.User))
  1057  	})
  1058  
  1059  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
  1060  		ChannelId:   c1.Id,
  1061  		UserId:      u1.Id,
  1062  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  1063  	}))
  1064  
  1065  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
  1066  		ChannelId:   c1.Id,
  1067  		UserId:      u2.Id,
  1068  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  1069  	}))
  1070  
  1071  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
  1072  		ChannelId:   c1.Id,
  1073  		UserId:      u3.Id,
  1074  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  1075  	}))
  1076  
  1077  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
  1078  		ChannelId:   c2.Id,
  1079  		UserId:      u1.Id,
  1080  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  1081  	}))
  1082  
  1083  	t.Run("get team 1, channel 1, offset 0, limit 100, after update", func(t *testing.T) {
  1084  		result := <-ss.User().GetProfilesNotInChannel(teamId, c1.Id, 0, 100)
  1085  		require.Nil(t, result.Err)
  1086  		assert.Equal(t, []*model.User{}, result.Data.([]*model.User))
  1087  	})
  1088  
  1089  	t.Run("get team 1, channel 2, offset 0, limit 100, after update", func(t *testing.T) {
  1090  		result := <-ss.User().GetProfilesNotInChannel(teamId, c2.Id, 0, 100)
  1091  		require.Nil(t, result.Err)
  1092  		assert.Equal(t, []*model.User{
  1093  			sanitized(u2),
  1094  			sanitized(u3),
  1095  		}, result.Data.([]*model.User))
  1096  	})
  1097  }
  1098  
  1099  func testUserStoreGetProfilesByIds(t *testing.T, ss store.Store) {
  1100  	teamId := model.NewId()
  1101  
  1102  	u1 := store.Must(ss.User().Save(&model.User{
  1103  		Email:    MakeEmail(),
  1104  		Username: "u1" + model.NewId(),
  1105  	})).(*model.User)
  1106  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
  1107  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
  1108  
  1109  	u2 := store.Must(ss.User().Save(&model.User{
  1110  		Email:    MakeEmail(),
  1111  		Username: "u2" + model.NewId(),
  1112  	})).(*model.User)
  1113  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
  1114  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1))
  1115  
  1116  	u3 := store.Must(ss.User().Save(&model.User{
  1117  		Email:    MakeEmail(),
  1118  		Username: "u3" + model.NewId(),
  1119  	})).(*model.User)
  1120  	defer func() { store.Must(ss.User().PermanentDelete(u3.Id)) }()
  1121  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1))
  1122  	store.Must(ss.Bot().Save(&model.Bot{
  1123  		UserId:   u3.Id,
  1124  		Username: u3.Username,
  1125  		OwnerId:  u1.Id,
  1126  	}))
  1127  	u3.IsBot = true
  1128  	defer func() { store.Must(ss.Bot().PermanentDelete(u3.Id)) }()
  1129  
  1130  	t.Run("get u1 by id, no caching", func(t *testing.T) {
  1131  		result := <-ss.User().GetProfileByIds([]string{u1.Id}, false)
  1132  		require.Nil(t, result.Err)
  1133  		assert.Equal(t, []*model.User{sanitized(u1)}, result.Data.([]*model.User))
  1134  	})
  1135  
  1136  	t.Run("get u1 by id, caching", func(t *testing.T) {
  1137  		result := <-ss.User().GetProfileByIds([]string{u1.Id}, true)
  1138  		require.Nil(t, result.Err)
  1139  		assert.Equal(t, []*model.User{sanitized(u1)}, result.Data.([]*model.User))
  1140  	})
  1141  
  1142  	t.Run("get u1, u2, u3 by id, no caching", func(t *testing.T) {
  1143  		result := <-ss.User().GetProfileByIds([]string{u1.Id, u2.Id, u3.Id}, false)
  1144  		require.Nil(t, result.Err)
  1145  		assert.Equal(t, []*model.User{sanitized(u1), sanitized(u2), sanitized(u3)}, result.Data.([]*model.User))
  1146  	})
  1147  
  1148  	t.Run("get u1, u2, u3 by id, caching", func(t *testing.T) {
  1149  		result := <-ss.User().GetProfileByIds([]string{u1.Id, u2.Id, u3.Id}, true)
  1150  		require.Nil(t, result.Err)
  1151  		assert.Equal(t, []*model.User{sanitized(u1), sanitized(u2), sanitized(u3)}, result.Data.([]*model.User))
  1152  	})
  1153  
  1154  	t.Run("get unknown id, caching", func(t *testing.T) {
  1155  		result := <-ss.User().GetProfileByIds([]string{"123"}, true)
  1156  		require.Nil(t, result.Err)
  1157  		assert.Equal(t, []*model.User{}, result.Data.([]*model.User))
  1158  	})
  1159  }
  1160  
  1161  func testUserStoreGetProfilesByUsernames(t *testing.T, ss store.Store) {
  1162  	teamId := model.NewId()
  1163  	team2Id := model.NewId()
  1164  
  1165  	u1 := store.Must(ss.User().Save(&model.User{
  1166  		Email:    MakeEmail(),
  1167  		Username: "u1" + model.NewId(),
  1168  	})).(*model.User)
  1169  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
  1170  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
  1171  
  1172  	u2 := store.Must(ss.User().Save(&model.User{
  1173  		Email:    MakeEmail(),
  1174  		Username: "u2" + model.NewId(),
  1175  	})).(*model.User)
  1176  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
  1177  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1))
  1178  
  1179  	u3 := store.Must(ss.User().Save(&model.User{
  1180  		Email:    MakeEmail(),
  1181  		Username: "u3" + model.NewId(),
  1182  	})).(*model.User)
  1183  	defer func() { store.Must(ss.User().PermanentDelete(u3.Id)) }()
  1184  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: team2Id, UserId: u3.Id}, -1))
  1185  	store.Must(ss.Bot().Save(&model.Bot{
  1186  		UserId:   u3.Id,
  1187  		Username: u3.Username,
  1188  		OwnerId:  u1.Id,
  1189  	}))
  1190  	u3.IsBot = true
  1191  	defer func() { store.Must(ss.Bot().PermanentDelete(u3.Id)) }()
  1192  
  1193  	t.Run("get by u1 and u2 usernames, team id 1", func(t *testing.T) {
  1194  		result := <-ss.User().GetProfilesByUsernames([]string{u1.Username, u2.Username}, teamId)
  1195  		require.Nil(t, result.Err)
  1196  		assert.Equal(t, []*model.User{u1, u2}, result.Data.([]*model.User))
  1197  	})
  1198  
  1199  	t.Run("get by u1 username, team id 1", func(t *testing.T) {
  1200  		result := <-ss.User().GetProfilesByUsernames([]string{u1.Username}, teamId)
  1201  		require.Nil(t, result.Err)
  1202  		assert.Equal(t, []*model.User{u1}, result.Data.([]*model.User))
  1203  	})
  1204  
  1205  	t.Run("get by u1 and u3 usernames, no team id", func(t *testing.T) {
  1206  		result := <-ss.User().GetProfilesByUsernames([]string{u1.Username, u3.Username}, "")
  1207  		require.Nil(t, result.Err)
  1208  		assert.Equal(t, []*model.User{u1, u3}, result.Data.([]*model.User))
  1209  	})
  1210  
  1211  	t.Run("get by u1 and u3 usernames, team id 1", func(t *testing.T) {
  1212  		result := <-ss.User().GetProfilesByUsernames([]string{u1.Username, u3.Username}, teamId)
  1213  		require.Nil(t, result.Err)
  1214  		assert.Equal(t, []*model.User{u1}, result.Data.([]*model.User))
  1215  	})
  1216  
  1217  	t.Run("get by u1 and u3 usernames, team id 2", func(t *testing.T) {
  1218  		result := <-ss.User().GetProfilesByUsernames([]string{u1.Username, u3.Username}, team2Id)
  1219  		require.Nil(t, result.Err)
  1220  		assert.Equal(t, []*model.User{u3}, result.Data.([]*model.User))
  1221  	})
  1222  }
  1223  
  1224  func testUserStoreGetSystemAdminProfiles(t *testing.T, ss store.Store) {
  1225  	teamId := model.NewId()
  1226  
  1227  	u1 := store.Must(ss.User().Save(&model.User{
  1228  		Email:    MakeEmail(),
  1229  		Roles:    model.SYSTEM_USER_ROLE_ID + " " + model.SYSTEM_ADMIN_ROLE_ID,
  1230  		Username: "u1" + model.NewId(),
  1231  	})).(*model.User)
  1232  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
  1233  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
  1234  
  1235  	u2 := store.Must(ss.User().Save(&model.User{
  1236  		Email:    MakeEmail(),
  1237  		Username: "u2" + model.NewId(),
  1238  	})).(*model.User)
  1239  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
  1240  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1))
  1241  
  1242  	u3 := store.Must(ss.User().Save(&model.User{
  1243  		Email:    MakeEmail(),
  1244  		Roles:    model.SYSTEM_USER_ROLE_ID + " " + model.SYSTEM_ADMIN_ROLE_ID,
  1245  		Username: "u3" + model.NewId(),
  1246  	})).(*model.User)
  1247  	defer func() { store.Must(ss.User().PermanentDelete(u3.Id)) }()
  1248  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1))
  1249  	store.Must(ss.Bot().Save(&model.Bot{
  1250  		UserId:   u3.Id,
  1251  		Username: u3.Username,
  1252  		OwnerId:  u1.Id,
  1253  	}))
  1254  	u3.IsBot = true
  1255  	defer func() { store.Must(ss.Bot().PermanentDelete(u3.Id)) }()
  1256  
  1257  	t.Run("all system admin profiles", func(t *testing.T) {
  1258  		result := <-ss.User().GetSystemAdminProfiles()
  1259  		require.Nil(t, result.Err)
  1260  		assert.Equal(t, map[string]*model.User{
  1261  			u1.Id: sanitized(u1),
  1262  			u3.Id: sanitized(u3),
  1263  		}, result.Data.(map[string]*model.User))
  1264  	})
  1265  }
  1266  
  1267  func testUserStoreGetByEmail(t *testing.T, ss store.Store) {
  1268  	teamId := model.NewId()
  1269  
  1270  	u1 := store.Must(ss.User().Save(&model.User{
  1271  		Email:    MakeEmail(),
  1272  		Username: "u1" + model.NewId(),
  1273  	})).(*model.User)
  1274  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
  1275  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
  1276  
  1277  	u2 := store.Must(ss.User().Save(&model.User{
  1278  		Email:    MakeEmail(),
  1279  		Username: "u2" + model.NewId(),
  1280  	})).(*model.User)
  1281  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
  1282  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1))
  1283  
  1284  	u3 := store.Must(ss.User().Save(&model.User{
  1285  		Email:    MakeEmail(),
  1286  		Username: "u3" + model.NewId(),
  1287  	})).(*model.User)
  1288  	defer func() { store.Must(ss.User().PermanentDelete(u3.Id)) }()
  1289  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1))
  1290  	store.Must(ss.Bot().Save(&model.Bot{
  1291  		UserId:   u3.Id,
  1292  		Username: u3.Username,
  1293  		OwnerId:  u1.Id,
  1294  	}))
  1295  	u3.IsBot = true
  1296  	defer func() { store.Must(ss.Bot().PermanentDelete(u3.Id)) }()
  1297  
  1298  	t.Run("get u1 by email", func(t *testing.T) {
  1299  		result := <-ss.User().GetByEmail(u1.Email)
  1300  		require.Nil(t, result.Err)
  1301  		assert.Equal(t, u1, result.Data.(*model.User))
  1302  	})
  1303  
  1304  	t.Run("get u2 by email", func(t *testing.T) {
  1305  		result := <-ss.User().GetByEmail(u2.Email)
  1306  		require.Nil(t, result.Err)
  1307  		assert.Equal(t, u2, result.Data.(*model.User))
  1308  	})
  1309  
  1310  	t.Run("get u3 by email", func(t *testing.T) {
  1311  		result := <-ss.User().GetByEmail(u3.Email)
  1312  		require.Nil(t, result.Err)
  1313  		assert.Equal(t, u3, result.Data.(*model.User))
  1314  	})
  1315  
  1316  	t.Run("get by empty email", func(t *testing.T) {
  1317  		result := <-ss.User().GetByEmail("")
  1318  		require.NotNil(t, result.Err)
  1319  		require.Equal(t, result.Err.Id, store.MISSING_ACCOUNT_ERROR)
  1320  	})
  1321  
  1322  	t.Run("get by unknown", func(t *testing.T) {
  1323  		result := <-ss.User().GetByEmail("unknown")
  1324  		require.NotNil(t, result.Err)
  1325  		require.Equal(t, result.Err.Id, store.MISSING_ACCOUNT_ERROR)
  1326  	})
  1327  }
  1328  
  1329  func testUserStoreGetByAuthData(t *testing.T, ss store.Store) {
  1330  	teamId := model.NewId()
  1331  	auth1 := model.NewId()
  1332  	auth3 := model.NewId()
  1333  
  1334  	u1 := store.Must(ss.User().Save(&model.User{
  1335  		Email:       MakeEmail(),
  1336  		Username:    "u1" + model.NewId(),
  1337  		AuthData:    &auth1,
  1338  		AuthService: "service",
  1339  	})).(*model.User)
  1340  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
  1341  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
  1342  
  1343  	u2 := store.Must(ss.User().Save(&model.User{
  1344  		Email:    MakeEmail(),
  1345  		Username: "u2" + model.NewId(),
  1346  	})).(*model.User)
  1347  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
  1348  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1))
  1349  
  1350  	u3 := store.Must(ss.User().Save(&model.User{
  1351  		Email:       MakeEmail(),
  1352  		Username:    "u3" + model.NewId(),
  1353  		AuthData:    &auth3,
  1354  		AuthService: "service2",
  1355  	})).(*model.User)
  1356  	defer func() { store.Must(ss.User().PermanentDelete(u3.Id)) }()
  1357  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1))
  1358  	store.Must(ss.Bot().Save(&model.Bot{
  1359  		UserId:   u3.Id,
  1360  		Username: u3.Username,
  1361  		OwnerId:  u1.Id,
  1362  	}))
  1363  	u3.IsBot = true
  1364  	defer func() { store.Must(ss.Bot().PermanentDelete(u3.Id)) }()
  1365  
  1366  	t.Run("get by u1 auth", func(t *testing.T) {
  1367  		result := <-ss.User().GetByAuth(u1.AuthData, u1.AuthService)
  1368  		require.Nil(t, result.Err)
  1369  		assert.Equal(t, u1, result.Data.(*model.User))
  1370  	})
  1371  
  1372  	t.Run("get by u3 auth", func(t *testing.T) {
  1373  		result := <-ss.User().GetByAuth(u3.AuthData, u3.AuthService)
  1374  		require.Nil(t, result.Err)
  1375  		assert.Equal(t, u3, result.Data.(*model.User))
  1376  	})
  1377  
  1378  	t.Run("get by u1 auth, unknown service", func(t *testing.T) {
  1379  		result := <-ss.User().GetByAuth(u1.AuthData, "unknown")
  1380  		require.NotNil(t, result.Err)
  1381  		require.Equal(t, result.Err.Id, store.MISSING_AUTH_ACCOUNT_ERROR)
  1382  	})
  1383  
  1384  	t.Run("get by unknown auth, u1 service", func(t *testing.T) {
  1385  		unknownAuth := ""
  1386  		result := <-ss.User().GetByAuth(&unknownAuth, u1.AuthService)
  1387  		require.NotNil(t, result.Err)
  1388  		require.Equal(t, result.Err.Id, store.MISSING_AUTH_ACCOUNT_ERROR)
  1389  	})
  1390  
  1391  	t.Run("get by unknown auth, unknown service", func(t *testing.T) {
  1392  		unknownAuth := ""
  1393  		result := <-ss.User().GetByAuth(&unknownAuth, "unknown")
  1394  		require.NotNil(t, result.Err)
  1395  		require.Equal(t, result.Err.Id, store.MISSING_AUTH_ACCOUNT_ERROR)
  1396  	})
  1397  }
  1398  
  1399  func testUserStoreGetByUsername(t *testing.T, ss store.Store) {
  1400  	teamId := model.NewId()
  1401  
  1402  	u1 := store.Must(ss.User().Save(&model.User{
  1403  		Email:    MakeEmail(),
  1404  		Username: "u1" + model.NewId(),
  1405  	})).(*model.User)
  1406  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
  1407  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
  1408  
  1409  	u2 := store.Must(ss.User().Save(&model.User{
  1410  		Email:    MakeEmail(),
  1411  		Username: "u2" + model.NewId(),
  1412  	})).(*model.User)
  1413  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
  1414  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1))
  1415  
  1416  	u3 := store.Must(ss.User().Save(&model.User{
  1417  		Email:    MakeEmail(),
  1418  		Username: "u3" + model.NewId(),
  1419  	})).(*model.User)
  1420  	defer func() { store.Must(ss.User().PermanentDelete(u3.Id)) }()
  1421  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1))
  1422  	store.Must(ss.Bot().Save(&model.Bot{
  1423  		UserId:   u3.Id,
  1424  		Username: u3.Username,
  1425  		OwnerId:  u1.Id,
  1426  	}))
  1427  	u3.IsBot = true
  1428  	defer func() { store.Must(ss.Bot().PermanentDelete(u3.Id)) }()
  1429  
  1430  	t.Run("get u1 by username", func(t *testing.T) {
  1431  		result := <-ss.User().GetByUsername(u1.Username)
  1432  		require.Nil(t, result.Err)
  1433  		assert.Equal(t, u1, result.Data.(*model.User))
  1434  	})
  1435  
  1436  	t.Run("get u2 by username", func(t *testing.T) {
  1437  		result := <-ss.User().GetByUsername(u2.Username)
  1438  		require.Nil(t, result.Err)
  1439  		assert.Equal(t, u2, result.Data.(*model.User))
  1440  	})
  1441  
  1442  	t.Run("get u3 by username", func(t *testing.T) {
  1443  		result := <-ss.User().GetByUsername(u3.Username)
  1444  		require.Nil(t, result.Err)
  1445  		assert.Equal(t, u3, result.Data.(*model.User))
  1446  	})
  1447  
  1448  	t.Run("get by empty username", func(t *testing.T) {
  1449  		result := <-ss.User().GetByUsername("")
  1450  		require.NotNil(t, result.Err)
  1451  		require.Equal(t, result.Err.Id, "store.sql_user.get_by_username.app_error")
  1452  	})
  1453  
  1454  	t.Run("get by unknown", func(t *testing.T) {
  1455  		result := <-ss.User().GetByUsername("unknown")
  1456  		require.NotNil(t, result.Err)
  1457  		require.Equal(t, result.Err.Id, "store.sql_user.get_by_username.app_error")
  1458  	})
  1459  }
  1460  
  1461  func testUserStoreGetForLogin(t *testing.T, ss store.Store) {
  1462  	teamId := model.NewId()
  1463  	auth := model.NewId()
  1464  	auth2 := model.NewId()
  1465  	auth3 := model.NewId()
  1466  
  1467  	u1 := store.Must(ss.User().Save(&model.User{
  1468  		Email:       MakeEmail(),
  1469  		Username:    "u1" + model.NewId(),
  1470  		AuthService: model.USER_AUTH_SERVICE_GITLAB,
  1471  		AuthData:    &auth,
  1472  	})).(*model.User)
  1473  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
  1474  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
  1475  
  1476  	u2 := store.Must(ss.User().Save(&model.User{
  1477  		Email:       MakeEmail(),
  1478  		Username:    "u2" + model.NewId(),
  1479  		AuthService: model.USER_AUTH_SERVICE_LDAP,
  1480  		AuthData:    &auth2,
  1481  	})).(*model.User)
  1482  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
  1483  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1))
  1484  
  1485  	u3 := store.Must(ss.User().Save(&model.User{
  1486  		Email:       MakeEmail(),
  1487  		Username:    "u3" + model.NewId(),
  1488  		AuthService: model.USER_AUTH_SERVICE_LDAP,
  1489  		AuthData:    &auth3,
  1490  	})).(*model.User)
  1491  	defer func() { store.Must(ss.User().PermanentDelete(u3.Id)) }()
  1492  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1))
  1493  	store.Must(ss.Bot().Save(&model.Bot{
  1494  		UserId:   u3.Id,
  1495  		Username: u3.Username,
  1496  		OwnerId:  u1.Id,
  1497  	}))
  1498  	u3.IsBot = true
  1499  	defer func() { store.Must(ss.Bot().PermanentDelete(u3.Id)) }()
  1500  
  1501  	t.Run("get u1 by username, allow both", func(t *testing.T) {
  1502  		result := <-ss.User().GetForLogin(u1.Username, true, true)
  1503  		require.Nil(t, result.Err)
  1504  		assert.Equal(t, u1, result.Data.(*model.User))
  1505  	})
  1506  
  1507  	t.Run("get u1 by username, allow only email", func(t *testing.T) {
  1508  		result := <-ss.User().GetForLogin(u1.Username, false, true)
  1509  		require.NotNil(t, result.Err)
  1510  		require.Equal(t, result.Err.Id, "store.sql_user.get_for_login.app_error")
  1511  	})
  1512  
  1513  	t.Run("get u1 by email, allow both", func(t *testing.T) {
  1514  		result := <-ss.User().GetForLogin(u1.Email, true, true)
  1515  		require.Nil(t, result.Err)
  1516  		assert.Equal(t, u1, result.Data.(*model.User))
  1517  	})
  1518  
  1519  	t.Run("get u1 by email, allow only username", func(t *testing.T) {
  1520  		result := <-ss.User().GetForLogin(u1.Email, true, false)
  1521  		require.NotNil(t, result.Err)
  1522  		require.Equal(t, result.Err.Id, "store.sql_user.get_for_login.app_error")
  1523  	})
  1524  
  1525  	t.Run("get u2 by username, allow both", func(t *testing.T) {
  1526  		result := <-ss.User().GetForLogin(u2.Username, true, true)
  1527  		require.Nil(t, result.Err)
  1528  		assert.Equal(t, u2, result.Data.(*model.User))
  1529  	})
  1530  
  1531  	t.Run("get u2 by email, allow both", func(t *testing.T) {
  1532  		result := <-ss.User().GetForLogin(u2.Email, true, true)
  1533  		require.Nil(t, result.Err)
  1534  		assert.Equal(t, u2, result.Data.(*model.User))
  1535  	})
  1536  
  1537  	t.Run("get u2 by username, allow neither", func(t *testing.T) {
  1538  		result := <-ss.User().GetForLogin(u2.Username, false, false)
  1539  		require.NotNil(t, result.Err)
  1540  		require.Equal(t, result.Err.Id, "store.sql_user.get_for_login.app_error")
  1541  	})
  1542  }
  1543  
  1544  func testUserStoreUpdatePassword(t *testing.T, ss store.Store) {
  1545  	teamId := model.NewId()
  1546  
  1547  	u1 := &model.User{}
  1548  	u1.Email = MakeEmail()
  1549  	store.Must(ss.User().Save(u1))
  1550  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
  1551  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
  1552  
  1553  	hashedPassword := model.HashPassword("newpwd")
  1554  
  1555  	if err := (<-ss.User().UpdatePassword(u1.Id, hashedPassword)).Err; err != nil {
  1556  		t.Fatal(err)
  1557  	}
  1558  
  1559  	if r1 := <-ss.User().GetByEmail(u1.Email); r1.Err != nil {
  1560  		t.Fatal(r1.Err)
  1561  	} else {
  1562  		user := r1.Data.(*model.User)
  1563  		if user.Password != hashedPassword {
  1564  			t.Fatal("Password was not updated correctly")
  1565  		}
  1566  	}
  1567  }
  1568  
  1569  func testUserStoreDelete(t *testing.T, ss store.Store) {
  1570  	u1 := &model.User{}
  1571  	u1.Email = MakeEmail()
  1572  	store.Must(ss.User().Save(u1))
  1573  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
  1574  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1))
  1575  
  1576  	if err := (<-ss.User().PermanentDelete(u1.Id)).Err; err != nil {
  1577  		t.Fatal(err)
  1578  	}
  1579  }
  1580  
  1581  func testUserStoreUpdateAuthData(t *testing.T, ss store.Store) {
  1582  	teamId := model.NewId()
  1583  
  1584  	u1 := &model.User{}
  1585  	u1.Email = MakeEmail()
  1586  	store.Must(ss.User().Save(u1))
  1587  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
  1588  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
  1589  
  1590  	service := "someservice"
  1591  	authData := model.NewId()
  1592  
  1593  	if err := (<-ss.User().UpdateAuthData(u1.Id, service, &authData, "", true)).Err; err != nil {
  1594  		t.Fatal(err)
  1595  	}
  1596  
  1597  	if r1 := <-ss.User().GetByEmail(u1.Email); r1.Err != nil {
  1598  		t.Fatal(r1.Err)
  1599  	} else {
  1600  		user := r1.Data.(*model.User)
  1601  		if user.AuthService != service {
  1602  			t.Fatal("AuthService was not updated correctly")
  1603  		}
  1604  		if *user.AuthData != authData {
  1605  			t.Fatal("AuthData was not updated correctly")
  1606  		}
  1607  		if user.Password != "" {
  1608  			t.Fatal("Password was not cleared properly")
  1609  		}
  1610  	}
  1611  }
  1612  
  1613  func testUserUnreadCount(t *testing.T, ss store.Store) {
  1614  	teamId := model.NewId()
  1615  
  1616  	c1 := model.Channel{}
  1617  	c1.TeamId = teamId
  1618  	c1.DisplayName = "Unread Messages"
  1619  	c1.Name = "unread-messages-" + model.NewId()
  1620  	c1.Type = model.CHANNEL_OPEN
  1621  
  1622  	c2 := model.Channel{}
  1623  	c2.TeamId = teamId
  1624  	c2.DisplayName = "Unread Direct"
  1625  	c2.Name = "unread-direct-" + model.NewId()
  1626  	c2.Type = model.CHANNEL_DIRECT
  1627  
  1628  	u1 := &model.User{}
  1629  	u1.Username = "user1" + model.NewId()
  1630  	u1.Email = MakeEmail()
  1631  	store.Must(ss.User().Save(u1))
  1632  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
  1633  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
  1634  
  1635  	u2 := &model.User{}
  1636  	u2.Email = MakeEmail()
  1637  	u2.Username = "user2" + model.NewId()
  1638  	store.Must(ss.User().Save(u2))
  1639  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
  1640  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1))
  1641  
  1642  	if err := (<-ss.Channel().Save(&c1, -1)).Err; err != nil {
  1643  		t.Fatal("couldn't save item", err)
  1644  	}
  1645  
  1646  	m1 := model.ChannelMember{}
  1647  	m1.ChannelId = c1.Id
  1648  	m1.UserId = u1.Id
  1649  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
  1650  
  1651  	m2 := model.ChannelMember{}
  1652  	m2.ChannelId = c1.Id
  1653  	m2.UserId = u2.Id
  1654  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
  1655  
  1656  	store.Must(ss.Channel().SaveMember(&m1))
  1657  	store.Must(ss.Channel().SaveMember(&m2))
  1658  
  1659  	m1.ChannelId = c2.Id
  1660  	m2.ChannelId = c2.Id
  1661  
  1662  	if err := (<-ss.Channel().SaveDirectChannel(&c2, &m1, &m2)).Err; err != nil {
  1663  		t.Fatal("couldn't save direct channel", err)
  1664  	}
  1665  
  1666  	p1 := model.Post{}
  1667  	p1.ChannelId = c1.Id
  1668  	p1.UserId = u1.Id
  1669  	p1.Message = "this is a message for @" + u2.Username
  1670  
  1671  	// Post one message with mention to open channel
  1672  	store.Must(ss.Post().Save(&p1))
  1673  	store.Must(ss.Channel().IncrementMentionCount(c1.Id, u2.Id))
  1674  
  1675  	// Post 2 messages without mention to direct channel
  1676  	p2 := model.Post{}
  1677  	p2.ChannelId = c2.Id
  1678  	p2.UserId = u1.Id
  1679  	p2.Message = "first message"
  1680  	store.Must(ss.Post().Save(&p2))
  1681  	store.Must(ss.Channel().IncrementMentionCount(c2.Id, u2.Id))
  1682  
  1683  	p3 := model.Post{}
  1684  	p3.ChannelId = c2.Id
  1685  	p3.UserId = u1.Id
  1686  	p3.Message = "second message"
  1687  	store.Must(ss.Post().Save(&p3))
  1688  	store.Must(ss.Channel().IncrementMentionCount(c2.Id, u2.Id))
  1689  
  1690  	badge := (<-ss.User().GetUnreadCount(u2.Id)).Data.(int64)
  1691  	if badge != 3 {
  1692  		t.Fatal("should have 3 unread messages")
  1693  	}
  1694  
  1695  	badge = (<-ss.User().GetUnreadCountForChannel(u2.Id, c1.Id)).Data.(int64)
  1696  	if badge != 1 {
  1697  		t.Fatal("should have 1 unread messages for that channel")
  1698  	}
  1699  
  1700  	badge = (<-ss.User().GetUnreadCountForChannel(u2.Id, c2.Id)).Data.(int64)
  1701  	if badge != 2 {
  1702  		t.Fatal("should have 2 unread messages for that channel")
  1703  	}
  1704  }
  1705  
  1706  func testUserStoreUpdateMfaSecret(t *testing.T, ss store.Store) {
  1707  	u1 := model.User{}
  1708  	u1.Email = MakeEmail()
  1709  	store.Must(ss.User().Save(&u1))
  1710  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
  1711  
  1712  	time.Sleep(100 * time.Millisecond)
  1713  
  1714  	if err := (<-ss.User().UpdateMfaSecret(u1.Id, "12345")).Err; err != nil {
  1715  		t.Fatal(err)
  1716  	}
  1717  
  1718  	// should pass, no update will occur though
  1719  	if err := (<-ss.User().UpdateMfaSecret("junk", "12345")).Err; err != nil {
  1720  		t.Fatal(err)
  1721  	}
  1722  }
  1723  
  1724  func testUserStoreUpdateMfaActive(t *testing.T, ss store.Store) {
  1725  	u1 := model.User{}
  1726  	u1.Email = MakeEmail()
  1727  	store.Must(ss.User().Save(&u1))
  1728  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
  1729  
  1730  	time.Sleep(100 * time.Millisecond)
  1731  
  1732  	if err := (<-ss.User().UpdateMfaActive(u1.Id, true)).Err; err != nil {
  1733  		t.Fatal(err)
  1734  	}
  1735  
  1736  	if err := (<-ss.User().UpdateMfaActive(u1.Id, false)).Err; err != nil {
  1737  		t.Fatal(err)
  1738  	}
  1739  
  1740  	// should pass, no update will occur though
  1741  	if err := (<-ss.User().UpdateMfaActive("junk", true)).Err; err != nil {
  1742  		t.Fatal(err)
  1743  	}
  1744  }
  1745  
  1746  func testUserStoreGetRecentlyActiveUsersForTeam(t *testing.T, ss store.Store) {
  1747  	teamId := model.NewId()
  1748  
  1749  	u1 := store.Must(ss.User().Save(&model.User{
  1750  		Email:    MakeEmail(),
  1751  		Username: "u1" + model.NewId(),
  1752  	})).(*model.User)
  1753  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
  1754  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
  1755  
  1756  	u2 := store.Must(ss.User().Save(&model.User{
  1757  		Email:    MakeEmail(),
  1758  		Username: "u2" + model.NewId(),
  1759  	})).(*model.User)
  1760  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
  1761  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1))
  1762  
  1763  	u3 := store.Must(ss.User().Save(&model.User{
  1764  		Email:    MakeEmail(),
  1765  		Username: "u3" + model.NewId(),
  1766  	})).(*model.User)
  1767  	defer func() { store.Must(ss.User().PermanentDelete(u3.Id)) }()
  1768  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1))
  1769  	store.Must(ss.Bot().Save(&model.Bot{
  1770  		UserId:   u3.Id,
  1771  		Username: u3.Username,
  1772  		OwnerId:  u1.Id,
  1773  	}))
  1774  	u3.IsBot = true
  1775  	defer func() { store.Must(ss.Bot().PermanentDelete(u3.Id)) }()
  1776  
  1777  	millis := model.GetMillis()
  1778  	u3.LastActivityAt = millis
  1779  	u2.LastActivityAt = millis - 1
  1780  	u1.LastActivityAt = millis - 1
  1781  
  1782  	store.Must(ss.Status().SaveOrUpdate(&model.Status{UserId: u1.Id, Status: model.STATUS_ONLINE, Manual: false, LastActivityAt: u1.LastActivityAt, ActiveChannel: ""}))
  1783  	store.Must(ss.Status().SaveOrUpdate(&model.Status{UserId: u2.Id, Status: model.STATUS_ONLINE, Manual: false, LastActivityAt: u2.LastActivityAt, ActiveChannel: ""}))
  1784  	store.Must(ss.Status().SaveOrUpdate(&model.Status{UserId: u3.Id, Status: model.STATUS_ONLINE, Manual: false, LastActivityAt: u3.LastActivityAt, ActiveChannel: ""}))
  1785  
  1786  	t.Run("get team 1, offset 0, limit 100", func(t *testing.T) {
  1787  		result := <-ss.User().GetRecentlyActiveUsersForTeam(teamId, 0, 100)
  1788  		require.Nil(t, result.Err)
  1789  		assert.Equal(t, []*model.User{
  1790  			sanitized(u3),
  1791  			sanitized(u1),
  1792  			sanitized(u2),
  1793  		}, result.Data.([]*model.User))
  1794  	})
  1795  
  1796  	t.Run("get team 1, offset 0, limit 1", func(t *testing.T) {
  1797  		result := <-ss.User().GetRecentlyActiveUsersForTeam(teamId, 0, 1)
  1798  		require.Nil(t, result.Err)
  1799  		assert.Equal(t, []*model.User{
  1800  			sanitized(u3),
  1801  		}, result.Data.([]*model.User))
  1802  	})
  1803  
  1804  	t.Run("get team 1, offset 2, limit 1", func(t *testing.T) {
  1805  		result := <-ss.User().GetRecentlyActiveUsersForTeam(teamId, 2, 1)
  1806  		require.Nil(t, result.Err)
  1807  		assert.Equal(t, []*model.User{
  1808  			sanitized(u2),
  1809  		}, result.Data.([]*model.User))
  1810  	})
  1811  }
  1812  
  1813  func testUserStoreGetNewUsersForTeam(t *testing.T, ss store.Store) {
  1814  	teamId := model.NewId()
  1815  	teamId2 := model.NewId()
  1816  
  1817  	u1 := store.Must(ss.User().Save(&model.User{
  1818  		Email:    MakeEmail(),
  1819  		Username: "u1" + model.NewId(),
  1820  	})).(*model.User)
  1821  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
  1822  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
  1823  
  1824  	u2 := store.Must(ss.User().Save(&model.User{
  1825  		Email:    MakeEmail(),
  1826  		Username: "u2" + model.NewId(),
  1827  	})).(*model.User)
  1828  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
  1829  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1))
  1830  
  1831  	u3 := store.Must(ss.User().Save(&model.User{
  1832  		Email:    MakeEmail(),
  1833  		Username: "u3" + model.NewId(),
  1834  	})).(*model.User)
  1835  	defer func() { store.Must(ss.User().PermanentDelete(u3.Id)) }()
  1836  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1))
  1837  	store.Must(ss.Bot().Save(&model.Bot{
  1838  		UserId:   u3.Id,
  1839  		Username: u3.Username,
  1840  		OwnerId:  u1.Id,
  1841  	}))
  1842  	u3.IsBot = true
  1843  	defer func() { store.Must(ss.Bot().PermanentDelete(u3.Id)) }()
  1844  
  1845  	u4 := store.Must(ss.User().Save(&model.User{
  1846  		Email:    MakeEmail(),
  1847  		Username: "u4" + model.NewId(),
  1848  	})).(*model.User)
  1849  	defer func() { store.Must(ss.User().PermanentDelete(u4.Id)) }()
  1850  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId2, UserId: u4.Id}, -1))
  1851  
  1852  	t.Run("get team 1, offset 0, limit 100", func(t *testing.T) {
  1853  		result := <-ss.User().GetNewUsersForTeam(teamId, 0, 100)
  1854  		require.Nil(t, result.Err)
  1855  		assert.Equal(t, []*model.User{
  1856  			sanitized(u3),
  1857  			sanitized(u2),
  1858  			sanitized(u1),
  1859  		}, result.Data.([]*model.User))
  1860  	})
  1861  
  1862  	t.Run("get team 1, offset 0, limit 1", func(t *testing.T) {
  1863  		result := <-ss.User().GetNewUsersForTeam(teamId, 0, 1)
  1864  		require.Nil(t, result.Err)
  1865  		assert.Equal(t, []*model.User{
  1866  			sanitized(u3),
  1867  		}, result.Data.([]*model.User))
  1868  	})
  1869  
  1870  	t.Run("get team 1, offset 2, limit 1", func(t *testing.T) {
  1871  		result := <-ss.User().GetNewUsersForTeam(teamId, 2, 1)
  1872  		require.Nil(t, result.Err)
  1873  		assert.Equal(t, []*model.User{
  1874  			sanitized(u1),
  1875  		}, result.Data.([]*model.User))
  1876  	})
  1877  
  1878  	t.Run("get team 2, offset 0, limit 100", func(t *testing.T) {
  1879  		result := <-ss.User().GetNewUsersForTeam(teamId2, 0, 100)
  1880  		require.Nil(t, result.Err)
  1881  		assert.Equal(t, []*model.User{
  1882  			sanitized(u4),
  1883  		}, result.Data.([]*model.User))
  1884  	})
  1885  }
  1886  
  1887  func assertUsers(t *testing.T, expected, actual []*model.User) {
  1888  	expectedUsernames := make([]string, 0, len(expected))
  1889  	for _, user := range expected {
  1890  		expectedUsernames = append(expectedUsernames, user.Username)
  1891  	}
  1892  
  1893  	actualUsernames := make([]string, 0, len(actual))
  1894  	for _, user := range actual {
  1895  		actualUsernames = append(actualUsernames, user.Username)
  1896  	}
  1897  
  1898  	if assert.Equal(t, expectedUsernames, actualUsernames) {
  1899  		assert.Equal(t, expected, actual)
  1900  	}
  1901  }
  1902  
  1903  func assertUsersMatchInAnyOrder(t *testing.T, expected, actual []*model.User) {
  1904  	expectedUsernames := make([]string, 0, len(expected))
  1905  	for _, user := range expected {
  1906  		expectedUsernames = append(expectedUsernames, user.Username)
  1907  	}
  1908  
  1909  	actualUsernames := make([]string, 0, len(actual))
  1910  	for _, user := range actual {
  1911  		actualUsernames = append(actualUsernames, user.Username)
  1912  	}
  1913  
  1914  	if assert.ElementsMatch(t, expectedUsernames, actualUsernames) {
  1915  		assert.ElementsMatch(t, expected, actual)
  1916  	}
  1917  }
  1918  
  1919  func testUserStoreSearch(t *testing.T, ss store.Store) {
  1920  	u1 := &model.User{
  1921  		Username:  "jimbo1" + model.NewId(),
  1922  		FirstName: "Tim",
  1923  		LastName:  "Bill",
  1924  		Nickname:  "Rob",
  1925  		Email:     "harold" + model.NewId() + "@simulator.amazonses.com",
  1926  		Roles:     "system_user system_admin",
  1927  	}
  1928  	store.Must(ss.User().Save(u1))
  1929  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
  1930  
  1931  	u2 := &model.User{
  1932  		Username: "jim-bobby" + model.NewId(),
  1933  		Email:    MakeEmail(),
  1934  		Roles:    "system_user",
  1935  	}
  1936  	store.Must(ss.User().Save(u2))
  1937  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
  1938  
  1939  	u3 := &model.User{
  1940  		Username: "jimbo3" + model.NewId(),
  1941  		Email:    MakeEmail(),
  1942  		DeleteAt: 1,
  1943  		Roles:    "system_admin",
  1944  	}
  1945  	store.Must(ss.User().Save(u3))
  1946  	defer func() { store.Must(ss.User().PermanentDelete(u3.Id)) }()
  1947  	store.Must(ss.Bot().Save(&model.Bot{
  1948  		UserId:   u3.Id,
  1949  		Username: u3.Username,
  1950  		OwnerId:  u1.Id,
  1951  	}))
  1952  	u3.IsBot = true
  1953  	defer func() { store.Must(ss.Bot().PermanentDelete(u3.Id)) }()
  1954  
  1955  	u5 := &model.User{
  1956  		Username:  "yu" + model.NewId(),
  1957  		FirstName: "En",
  1958  		LastName:  "Yu",
  1959  		Nickname:  "enyu",
  1960  		Email:     MakeEmail(),
  1961  	}
  1962  	store.Must(ss.User().Save(u5))
  1963  	defer func() { store.Must(ss.User().PermanentDelete(u5.Id)) }()
  1964  
  1965  	u6 := &model.User{
  1966  		Username:  "underscore" + model.NewId(),
  1967  		FirstName: "Du_",
  1968  		LastName:  "_DE",
  1969  		Nickname:  "lodash",
  1970  		Email:     MakeEmail(),
  1971  	}
  1972  	store.Must(ss.User().Save(u6))
  1973  	defer func() { store.Must(ss.User().PermanentDelete(u6.Id)) }()
  1974  
  1975  	tid := model.NewId()
  1976  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u1.Id}, -1))
  1977  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u2.Id}, -1))
  1978  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u3.Id}, -1))
  1979  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u5.Id}, -1))
  1980  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u6.Id}, -1))
  1981  
  1982  	// The users returned from the database will have AuthData as an empty string.
  1983  	nilAuthData := new(string)
  1984  	*nilAuthData = ""
  1985  
  1986  	u1.AuthData = nilAuthData
  1987  	u2.AuthData = nilAuthData
  1988  	u3.AuthData = nilAuthData
  1989  	u5.AuthData = nilAuthData
  1990  	u6.AuthData = nilAuthData
  1991  
  1992  	testCases := []struct {
  1993  		Description string
  1994  		TeamId      string
  1995  		Term        string
  1996  		Options     *model.UserSearchOptions
  1997  		Expected    []*model.User
  1998  	}{
  1999  		{
  2000  			"search jimb",
  2001  			tid,
  2002  			"jimb",
  2003  			&model.UserSearchOptions{
  2004  				AllowFullNames: true,
  2005  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2006  			},
  2007  			[]*model.User{u1},
  2008  		},
  2009  		{
  2010  			"search en",
  2011  			tid,
  2012  			"en",
  2013  			&model.UserSearchOptions{
  2014  				AllowFullNames: true,
  2015  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2016  			},
  2017  			[]*model.User{u5},
  2018  		},
  2019  		{
  2020  			"search email",
  2021  			tid,
  2022  			u1.Email,
  2023  			&model.UserSearchOptions{
  2024  				AllowEmails:    true,
  2025  				AllowFullNames: true,
  2026  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2027  			},
  2028  			[]*model.User{u1},
  2029  		},
  2030  		{
  2031  			"search maps * to space",
  2032  			tid,
  2033  			"jimb*",
  2034  			&model.UserSearchOptions{
  2035  				AllowFullNames: true,
  2036  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2037  			},
  2038  			[]*model.User{u1},
  2039  		},
  2040  		{
  2041  			"should not return spurious matches",
  2042  			tid,
  2043  			"harol",
  2044  			&model.UserSearchOptions{
  2045  				AllowFullNames: true,
  2046  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2047  			},
  2048  			[]*model.User{},
  2049  		},
  2050  		{
  2051  			"% should be escaped",
  2052  			tid,
  2053  			"h%",
  2054  			&model.UserSearchOptions{
  2055  				AllowFullNames: true,
  2056  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2057  			},
  2058  			[]*model.User{},
  2059  		},
  2060  		{
  2061  			"_ should be escaped",
  2062  			tid,
  2063  			"h_",
  2064  			&model.UserSearchOptions{
  2065  				AllowFullNames: true,
  2066  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2067  			},
  2068  			[]*model.User{},
  2069  		},
  2070  		{
  2071  			"_ should be escaped (2)",
  2072  			tid,
  2073  			"Du_",
  2074  			&model.UserSearchOptions{
  2075  				AllowFullNames: true,
  2076  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2077  			},
  2078  			[]*model.User{u6},
  2079  		},
  2080  		{
  2081  			"_ should be escaped (2)",
  2082  			tid,
  2083  			"_dE",
  2084  			&model.UserSearchOptions{
  2085  				AllowFullNames: true,
  2086  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2087  			},
  2088  			[]*model.User{u6},
  2089  		},
  2090  		{
  2091  			"search jimb, allowing inactive",
  2092  			tid,
  2093  			"jimb",
  2094  			&model.UserSearchOptions{
  2095  				AllowFullNames: true,
  2096  				AllowInactive:  true,
  2097  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2098  			},
  2099  			[]*model.User{u1, u3},
  2100  		},
  2101  		{
  2102  			"search jimb, no team id",
  2103  			"",
  2104  			"jimb",
  2105  			&model.UserSearchOptions{
  2106  				AllowFullNames: true,
  2107  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2108  			},
  2109  			[]*model.User{u1},
  2110  		},
  2111  		{
  2112  			"search jim-bobb, no team id",
  2113  			"",
  2114  			"jim-bobb",
  2115  			&model.UserSearchOptions{
  2116  				AllowFullNames: true,
  2117  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2118  			},
  2119  			[]*model.User{u2},
  2120  		},
  2121  
  2122  		{
  2123  			"search harol, search all fields",
  2124  			tid,
  2125  			"harol",
  2126  			&model.UserSearchOptions{
  2127  				AllowFullNames: true,
  2128  				AllowEmails:    true,
  2129  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2130  			},
  2131  			[]*model.User{u1},
  2132  		},
  2133  		{
  2134  			"search Tim, search all fields",
  2135  			tid,
  2136  			"Tim",
  2137  			&model.UserSearchOptions{
  2138  				AllowFullNames: true,
  2139  				AllowEmails:    true,
  2140  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2141  			},
  2142  			[]*model.User{u1},
  2143  		},
  2144  		{
  2145  			"search Tim, don't search full names",
  2146  			tid,
  2147  			"Tim",
  2148  			&model.UserSearchOptions{
  2149  				AllowFullNames: false,
  2150  				AllowEmails:    true,
  2151  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2152  			},
  2153  			[]*model.User{},
  2154  		},
  2155  		{
  2156  			"search Bill, search all fields",
  2157  			tid,
  2158  			"Bill",
  2159  			&model.UserSearchOptions{
  2160  				AllowFullNames: true,
  2161  				AllowEmails:    true,
  2162  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2163  			},
  2164  			[]*model.User{u1},
  2165  		},
  2166  		{
  2167  			"search Rob, search all fields",
  2168  			tid,
  2169  			"Rob",
  2170  			&model.UserSearchOptions{
  2171  				AllowFullNames: true,
  2172  				AllowEmails:    true,
  2173  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2174  			},
  2175  			[]*model.User{u1},
  2176  		},
  2177  		{
  2178  			"leading @ should be ignored",
  2179  			tid,
  2180  			"@jimb",
  2181  			&model.UserSearchOptions{
  2182  				AllowFullNames: true,
  2183  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2184  			},
  2185  			[]*model.User{u1},
  2186  		},
  2187  		{
  2188  			"search jim-bobby with system_user roles",
  2189  			tid,
  2190  			"jim-bobby",
  2191  			&model.UserSearchOptions{
  2192  				AllowFullNames: true,
  2193  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2194  				Role:           "system_user",
  2195  			},
  2196  			[]*model.User{u2},
  2197  		},
  2198  		{
  2199  			"search jim with system_admin roles",
  2200  			tid,
  2201  			"jim",
  2202  			&model.UserSearchOptions{
  2203  				AllowFullNames: true,
  2204  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2205  				Role:           "system_admin",
  2206  			},
  2207  			[]*model.User{u1},
  2208  		},
  2209  		{
  2210  			"search ji with system_user roles",
  2211  			tid,
  2212  			"ji",
  2213  			&model.UserSearchOptions{
  2214  				AllowFullNames: true,
  2215  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2216  				Role:           "system_user",
  2217  			},
  2218  			[]*model.User{u1, u2},
  2219  		},
  2220  	}
  2221  
  2222  	for _, testCase := range testCases {
  2223  		t.Run(testCase.Description, func(t *testing.T) {
  2224  			result := <-ss.User().Search(testCase.TeamId, testCase.Term, testCase.Options)
  2225  			require.Nil(t, result.Err)
  2226  			assertUsersMatchInAnyOrder(t, testCase.Expected, result.Data.([]*model.User))
  2227  		})
  2228  	}
  2229  
  2230  	t.Run("search empty string", func(t *testing.T) {
  2231  		searchOptions := &model.UserSearchOptions{
  2232  			AllowFullNames: true,
  2233  			Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2234  		}
  2235  
  2236  		r1 := <-ss.User().Search(tid, "", searchOptions)
  2237  		require.Nil(t, r1.Err)
  2238  		assert.Len(t, r1.Data.([]*model.User), 4)
  2239  		// Don't assert contents, since Postgres' default collation order is left up to
  2240  		// the operating system, and jimbo1 might sort before or after jim-bo.
  2241  		// assertUsers(t, []*model.User{u2, u1, u6, u5}, r1.Data.([]*model.User))
  2242  	})
  2243  
  2244  	t.Run("search empty string, limit 2", func(t *testing.T) {
  2245  		searchOptions := &model.UserSearchOptions{
  2246  			AllowFullNames: true,
  2247  			Limit:          2,
  2248  		}
  2249  
  2250  		r1 := <-ss.User().Search(tid, "", searchOptions)
  2251  		require.Nil(t, r1.Err)
  2252  		assert.Len(t, r1.Data.([]*model.User), 2)
  2253  		// Don't assert contents, since Postgres' default collation order is left up to
  2254  		// the operating system, and jimbo1 might sort before or after jim-bo.
  2255  		// assertUsers(t, []*model.User{u2, u1, u6, u5}, r1.Data.([]*model.User))
  2256  	})
  2257  }
  2258  
  2259  func testUserStoreSearchNotInChannel(t *testing.T, ss store.Store) {
  2260  	u1 := &model.User{
  2261  		Username:  "jimbo1" + model.NewId(),
  2262  		FirstName: "Tim",
  2263  		LastName:  "Bill",
  2264  		Nickname:  "Rob",
  2265  		Email:     "harold" + model.NewId() + "@simulator.amazonses.com",
  2266  	}
  2267  	store.Must(ss.User().Save(u1))
  2268  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
  2269  
  2270  	u2 := &model.User{
  2271  		Username: "jim2-bobby" + model.NewId(),
  2272  		Email:    MakeEmail(),
  2273  	}
  2274  	store.Must(ss.User().Save(u2))
  2275  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
  2276  
  2277  	u3 := &model.User{
  2278  		Username: "jimbo3" + model.NewId(),
  2279  		Email:    MakeEmail(),
  2280  		DeleteAt: 1,
  2281  	}
  2282  	store.Must(ss.User().Save(u3))
  2283  	defer func() { store.Must(ss.User().PermanentDelete(u3.Id)) }()
  2284  	store.Must(ss.Bot().Save(&model.Bot{
  2285  		UserId:   u3.Id,
  2286  		Username: u3.Username,
  2287  		OwnerId:  u1.Id,
  2288  	}))
  2289  	u3.IsBot = true
  2290  	defer func() { store.Must(ss.Bot().PermanentDelete(u3.Id)) }()
  2291  
  2292  	tid := model.NewId()
  2293  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u1.Id}, -1))
  2294  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u2.Id}, -1))
  2295  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u3.Id}, -1))
  2296  
  2297  	// The users returned from the database will have AuthData as an empty string.
  2298  	nilAuthData := new(string)
  2299  	*nilAuthData = ""
  2300  
  2301  	u1.AuthData = nilAuthData
  2302  	u2.AuthData = nilAuthData
  2303  	u3.AuthData = nilAuthData
  2304  
  2305  	c1 := model.Channel{
  2306  		TeamId:      tid,
  2307  		DisplayName: "NameName",
  2308  		Name:        "zz" + model.NewId() + "b",
  2309  		Type:        model.CHANNEL_OPEN,
  2310  	}
  2311  	c1 = *store.Must(ss.Channel().Save(&c1, -1)).(*model.Channel)
  2312  
  2313  	c2 := model.Channel{
  2314  		TeamId:      tid,
  2315  		DisplayName: "NameName",
  2316  		Name:        "zz" + model.NewId() + "b",
  2317  		Type:        model.CHANNEL_OPEN,
  2318  	}
  2319  	c2 = *store.Must(ss.Channel().Save(&c2, -1)).(*model.Channel)
  2320  
  2321  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
  2322  		ChannelId:   c2.Id,
  2323  		UserId:      u1.Id,
  2324  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  2325  	}))
  2326  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
  2327  		ChannelId:   c1.Id,
  2328  		UserId:      u3.Id,
  2329  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  2330  	}))
  2331  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
  2332  		ChannelId:   c2.Id,
  2333  		UserId:      u2.Id,
  2334  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  2335  	}))
  2336  
  2337  	testCases := []struct {
  2338  		Description string
  2339  		TeamId      string
  2340  		ChannelId   string
  2341  		Term        string
  2342  		Options     *model.UserSearchOptions
  2343  		Expected    []*model.User
  2344  	}{
  2345  		{
  2346  			"search jimb, channel 1",
  2347  			tid,
  2348  			c1.Id,
  2349  			"jimb",
  2350  			&model.UserSearchOptions{
  2351  				AllowFullNames: true,
  2352  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2353  			},
  2354  			[]*model.User{u1},
  2355  		},
  2356  		{
  2357  			"search jimb, allow inactive, channel 1",
  2358  			tid,
  2359  			c1.Id,
  2360  			"jimb",
  2361  			&model.UserSearchOptions{
  2362  				AllowFullNames: true,
  2363  				AllowInactive:  true,
  2364  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2365  			},
  2366  			[]*model.User{u1},
  2367  		},
  2368  		{
  2369  			"search jimb, channel 1, no team id",
  2370  			"",
  2371  			c1.Id,
  2372  			"jimb",
  2373  			&model.UserSearchOptions{
  2374  				AllowFullNames: true,
  2375  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2376  			},
  2377  			[]*model.User{u1},
  2378  		},
  2379  		{
  2380  			"search jimb, channel 1, junk team id",
  2381  			"junk",
  2382  			c1.Id,
  2383  			"jimb",
  2384  			&model.UserSearchOptions{
  2385  				AllowFullNames: true,
  2386  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2387  			},
  2388  			[]*model.User{},
  2389  		},
  2390  		{
  2391  			"search jimb, channel 2",
  2392  			tid,
  2393  			c2.Id,
  2394  			"jimb",
  2395  			&model.UserSearchOptions{
  2396  				AllowFullNames: true,
  2397  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2398  			},
  2399  			[]*model.User{},
  2400  		},
  2401  		{
  2402  			"search jimb, allow inactive, channel 2",
  2403  			tid,
  2404  			c2.Id,
  2405  			"jimb",
  2406  			&model.UserSearchOptions{
  2407  				AllowFullNames: true,
  2408  				AllowInactive:  true,
  2409  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2410  			},
  2411  			[]*model.User{u3},
  2412  		},
  2413  		{
  2414  			"search jimb, channel 2, no team id",
  2415  			"",
  2416  			c2.Id,
  2417  			"jimb",
  2418  			&model.UserSearchOptions{
  2419  				AllowFullNames: true,
  2420  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2421  			},
  2422  			[]*model.User{},
  2423  		},
  2424  		{
  2425  			"search jimb, channel 2, junk team id",
  2426  			"junk",
  2427  			c2.Id,
  2428  			"jimb",
  2429  			&model.UserSearchOptions{
  2430  				AllowFullNames: true,
  2431  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2432  			},
  2433  			[]*model.User{},
  2434  		},
  2435  		{
  2436  			"search jim, channel 1",
  2437  			tid,
  2438  			c1.Id,
  2439  			"jim",
  2440  			&model.UserSearchOptions{
  2441  				AllowFullNames: true,
  2442  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2443  			},
  2444  			[]*model.User{u2, u1},
  2445  		},
  2446  		{
  2447  			"search jim, channel 1, limit 1",
  2448  			tid,
  2449  			c1.Id,
  2450  			"jim",
  2451  			&model.UserSearchOptions{
  2452  				AllowFullNames: true,
  2453  				Limit:          1,
  2454  			},
  2455  			[]*model.User{u2},
  2456  		},
  2457  	}
  2458  
  2459  	for _, testCase := range testCases {
  2460  		t.Run(testCase.Description, func(t *testing.T) {
  2461  			result := <-ss.User().SearchNotInChannel(
  2462  				testCase.TeamId,
  2463  				testCase.ChannelId,
  2464  				testCase.Term,
  2465  				testCase.Options,
  2466  			)
  2467  			require.Nil(t, result.Err)
  2468  			assertUsers(t, testCase.Expected, result.Data.([]*model.User))
  2469  		})
  2470  	}
  2471  }
  2472  
  2473  func testUserStoreSearchInChannel(t *testing.T, ss store.Store) {
  2474  	u1 := &model.User{
  2475  		Username:  "jimbo1" + model.NewId(),
  2476  		FirstName: "Tim",
  2477  		LastName:  "Bill",
  2478  		Nickname:  "Rob",
  2479  		Email:     "harold" + model.NewId() + "@simulator.amazonses.com",
  2480  	}
  2481  	store.Must(ss.User().Save(u1))
  2482  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
  2483  
  2484  	u2 := &model.User{
  2485  		Username: "jim-bobby" + model.NewId(),
  2486  		Email:    MakeEmail(),
  2487  	}
  2488  	store.Must(ss.User().Save(u2))
  2489  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
  2490  
  2491  	u3 := &model.User{
  2492  		Username: "jimbo3" + model.NewId(),
  2493  		Email:    MakeEmail(),
  2494  		DeleteAt: 1,
  2495  	}
  2496  	store.Must(ss.User().Save(u3))
  2497  	defer func() { store.Must(ss.User().PermanentDelete(u3.Id)) }()
  2498  	store.Must(ss.Bot().Save(&model.Bot{
  2499  		UserId:   u3.Id,
  2500  		Username: u3.Username,
  2501  		OwnerId:  u1.Id,
  2502  	}))
  2503  	u3.IsBot = true
  2504  	defer func() { store.Must(ss.Bot().PermanentDelete(u3.Id)) }()
  2505  
  2506  	tid := model.NewId()
  2507  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u1.Id}, -1))
  2508  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u2.Id}, -1))
  2509  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u3.Id}, -1))
  2510  
  2511  	// The users returned from the database will have AuthData as an empty string.
  2512  	nilAuthData := new(string)
  2513  	*nilAuthData = ""
  2514  
  2515  	u1.AuthData = nilAuthData
  2516  	u2.AuthData = nilAuthData
  2517  	u3.AuthData = nilAuthData
  2518  
  2519  	c1 := model.Channel{
  2520  		TeamId:      tid,
  2521  		DisplayName: "NameName",
  2522  		Name:        "zz" + model.NewId() + "b",
  2523  		Type:        model.CHANNEL_OPEN,
  2524  	}
  2525  	c1 = *store.Must(ss.Channel().Save(&c1, -1)).(*model.Channel)
  2526  
  2527  	c2 := model.Channel{
  2528  		TeamId:      tid,
  2529  		DisplayName: "NameName",
  2530  		Name:        "zz" + model.NewId() + "b",
  2531  		Type:        model.CHANNEL_OPEN,
  2532  	}
  2533  	c2 = *store.Must(ss.Channel().Save(&c2, -1)).(*model.Channel)
  2534  
  2535  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
  2536  		ChannelId:   c1.Id,
  2537  		UserId:      u1.Id,
  2538  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  2539  	}))
  2540  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
  2541  		ChannelId:   c2.Id,
  2542  		UserId:      u2.Id,
  2543  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  2544  	}))
  2545  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
  2546  		ChannelId:   c1.Id,
  2547  		UserId:      u3.Id,
  2548  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  2549  	}))
  2550  
  2551  	testCases := []struct {
  2552  		Description string
  2553  		ChannelId   string
  2554  		Term        string
  2555  		Options     *model.UserSearchOptions
  2556  		Expected    []*model.User
  2557  	}{
  2558  		{
  2559  			"search jimb, channel 1",
  2560  			c1.Id,
  2561  			"jimb",
  2562  			&model.UserSearchOptions{
  2563  				AllowFullNames: true,
  2564  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2565  			},
  2566  			[]*model.User{u1},
  2567  		},
  2568  		{
  2569  			"search jimb, allow inactive, channel 1",
  2570  			c1.Id,
  2571  			"jimb",
  2572  			&model.UserSearchOptions{
  2573  				AllowFullNames: true,
  2574  				AllowInactive:  true,
  2575  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2576  			},
  2577  			[]*model.User{u1, u3},
  2578  		},
  2579  		{
  2580  			"search jimb, allow inactive, channel 1, limit 1",
  2581  			c1.Id,
  2582  			"jimb",
  2583  			&model.UserSearchOptions{
  2584  				AllowFullNames: true,
  2585  				AllowInactive:  true,
  2586  				Limit:          1,
  2587  			},
  2588  			[]*model.User{u1},
  2589  		},
  2590  		{
  2591  			"search jimb, channel 2",
  2592  			c2.Id,
  2593  			"jimb",
  2594  			&model.UserSearchOptions{
  2595  				AllowFullNames: true,
  2596  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2597  			},
  2598  			[]*model.User{},
  2599  		},
  2600  		{
  2601  			"search jimb, allow inactive, channel 2",
  2602  			c2.Id,
  2603  			"jimb",
  2604  			&model.UserSearchOptions{
  2605  				AllowFullNames: true,
  2606  				AllowInactive:  true,
  2607  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2608  			},
  2609  			[]*model.User{},
  2610  		},
  2611  	}
  2612  
  2613  	for _, testCase := range testCases {
  2614  		t.Run(testCase.Description, func(t *testing.T) {
  2615  			result := <-ss.User().SearchInChannel(
  2616  				testCase.ChannelId,
  2617  				testCase.Term,
  2618  				testCase.Options,
  2619  			)
  2620  			require.Nil(t, result.Err)
  2621  			assertUsers(t, testCase.Expected, result.Data.([]*model.User))
  2622  		})
  2623  	}
  2624  }
  2625  
  2626  func testUserStoreSearchNotInTeam(t *testing.T, ss store.Store) {
  2627  	u1 := &model.User{
  2628  		Username:  "jimbo1" + model.NewId(),
  2629  		FirstName: "Tim",
  2630  		LastName:  "Bill",
  2631  		Nickname:  "Rob",
  2632  		Email:     "harold" + model.NewId() + "@simulator.amazonses.com",
  2633  	}
  2634  	store.Must(ss.User().Save(u1))
  2635  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
  2636  
  2637  	u2 := &model.User{
  2638  		Username: "jim-bobby" + model.NewId(),
  2639  		Email:    MakeEmail(),
  2640  	}
  2641  	store.Must(ss.User().Save(u2))
  2642  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
  2643  
  2644  	u3 := &model.User{
  2645  		Username: "jimbo3" + model.NewId(),
  2646  		Email:    MakeEmail(),
  2647  		DeleteAt: 1,
  2648  	}
  2649  	store.Must(ss.User().Save(u3))
  2650  	defer func() { store.Must(ss.User().PermanentDelete(u3.Id)) }()
  2651  	store.Must(ss.Bot().Save(&model.Bot{
  2652  		UserId:   u3.Id,
  2653  		Username: u3.Username,
  2654  		OwnerId:  u1.Id,
  2655  	}))
  2656  	u3.IsBot = true
  2657  	defer func() { store.Must(ss.Bot().PermanentDelete(u3.Id)) }()
  2658  
  2659  	u4 := &model.User{
  2660  		Username: "simon" + model.NewId(),
  2661  		Email:    MakeEmail(),
  2662  		DeleteAt: 0,
  2663  	}
  2664  	store.Must(ss.User().Save(u4))
  2665  	defer func() { store.Must(ss.User().PermanentDelete(u4.Id)) }()
  2666  
  2667  	u5 := &model.User{
  2668  		Username:  "yu" + model.NewId(),
  2669  		FirstName: "En",
  2670  		LastName:  "Yu",
  2671  		Nickname:  "enyu",
  2672  		Email:     MakeEmail(),
  2673  	}
  2674  	store.Must(ss.User().Save(u5))
  2675  	defer func() { store.Must(ss.User().PermanentDelete(u5.Id)) }()
  2676  
  2677  	u6 := &model.User{
  2678  		Username:  "underscore" + model.NewId(),
  2679  		FirstName: "Du_",
  2680  		LastName:  "_DE",
  2681  		Nickname:  "lodash",
  2682  		Email:     MakeEmail(),
  2683  	}
  2684  	store.Must(ss.User().Save(u6))
  2685  	defer func() { store.Must(ss.User().PermanentDelete(u6.Id)) }()
  2686  
  2687  	teamId1 := model.NewId()
  2688  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId1, UserId: u1.Id}, -1))
  2689  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId1, UserId: u2.Id}, -1))
  2690  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId1, UserId: u3.Id}, -1))
  2691  	// u4 is not in team 1
  2692  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId1, UserId: u5.Id}, -1))
  2693  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId1, UserId: u6.Id}, -1))
  2694  
  2695  	teamId2 := model.NewId()
  2696  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId2, UserId: u4.Id}, -1))
  2697  
  2698  	// The users returned from the database will have AuthData as an empty string.
  2699  	nilAuthData := new(string)
  2700  	*nilAuthData = ""
  2701  
  2702  	u1.AuthData = nilAuthData
  2703  	u2.AuthData = nilAuthData
  2704  	u3.AuthData = nilAuthData
  2705  	u4.AuthData = nilAuthData
  2706  	u5.AuthData = nilAuthData
  2707  	u6.AuthData = nilAuthData
  2708  
  2709  	testCases := []struct {
  2710  		Description string
  2711  		TeamId      string
  2712  		Term        string
  2713  		Options     *model.UserSearchOptions
  2714  		Expected    []*model.User
  2715  	}{
  2716  		{
  2717  			"search simo, team 1",
  2718  			teamId1,
  2719  			"simo",
  2720  			&model.UserSearchOptions{
  2721  				AllowFullNames: true,
  2722  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2723  			},
  2724  			[]*model.User{u4},
  2725  		},
  2726  
  2727  		{
  2728  			"search jimb, team 1",
  2729  			teamId1,
  2730  			"jimb",
  2731  			&model.UserSearchOptions{
  2732  				AllowFullNames: true,
  2733  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2734  			},
  2735  			[]*model.User{},
  2736  		},
  2737  		{
  2738  			"search jimb, allow inactive, team 1",
  2739  			teamId1,
  2740  			"jimb",
  2741  			&model.UserSearchOptions{
  2742  				AllowFullNames: true,
  2743  				AllowInactive:  true,
  2744  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2745  			},
  2746  			[]*model.User{},
  2747  		},
  2748  		{
  2749  			"search simo, team 2",
  2750  			teamId2,
  2751  			"simo",
  2752  			&model.UserSearchOptions{
  2753  				AllowFullNames: true,
  2754  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2755  			},
  2756  			[]*model.User{},
  2757  		},
  2758  		{
  2759  			"search jimb, team2",
  2760  			teamId2,
  2761  			"jimb",
  2762  			&model.UserSearchOptions{
  2763  				AllowFullNames: true,
  2764  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2765  			},
  2766  			[]*model.User{u1},
  2767  		},
  2768  		{
  2769  			"search jimb, allow inactive, team 2",
  2770  			teamId2,
  2771  			"jimb",
  2772  			&model.UserSearchOptions{
  2773  				AllowFullNames: true,
  2774  				AllowInactive:  true,
  2775  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2776  			},
  2777  			[]*model.User{u1, u3},
  2778  		},
  2779  		{
  2780  			"search jimb, allow inactive, team 2, limit 1",
  2781  			teamId2,
  2782  			"jimb",
  2783  			&model.UserSearchOptions{
  2784  				AllowFullNames: true,
  2785  				AllowInactive:  true,
  2786  				Limit:          1,
  2787  			},
  2788  			[]*model.User{u1},
  2789  		},
  2790  	}
  2791  
  2792  	for _, testCase := range testCases {
  2793  		t.Run(testCase.Description, func(t *testing.T) {
  2794  			result := <-ss.User().SearchNotInTeam(
  2795  				testCase.TeamId,
  2796  				testCase.Term,
  2797  				testCase.Options,
  2798  			)
  2799  			require.Nil(t, result.Err)
  2800  			assertUsers(t, testCase.Expected, result.Data.([]*model.User))
  2801  		})
  2802  	}
  2803  }
  2804  
  2805  func testUserStoreSearchWithoutTeam(t *testing.T, ss store.Store) {
  2806  	u1 := &model.User{
  2807  		Username:  "jimbo1" + model.NewId(),
  2808  		FirstName: "Tim",
  2809  		LastName:  "Bill",
  2810  		Nickname:  "Rob",
  2811  		Email:     "harold" + model.NewId() + "@simulator.amazonses.com",
  2812  	}
  2813  	store.Must(ss.User().Save(u1))
  2814  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
  2815  
  2816  	u2 := &model.User{
  2817  		Username: "jim2-bobby" + model.NewId(),
  2818  		Email:    MakeEmail(),
  2819  	}
  2820  	store.Must(ss.User().Save(u2))
  2821  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
  2822  
  2823  	u3 := &model.User{
  2824  		Username: "jimbo3" + model.NewId(),
  2825  		Email:    MakeEmail(),
  2826  		DeleteAt: 1,
  2827  	}
  2828  	store.Must(ss.User().Save(u3))
  2829  	defer func() { store.Must(ss.User().PermanentDelete(u3.Id)) }()
  2830  	store.Must(ss.Bot().Save(&model.Bot{
  2831  		UserId:   u3.Id,
  2832  		Username: u3.Username,
  2833  		OwnerId:  u1.Id,
  2834  	}))
  2835  	u3.IsBot = true
  2836  	defer func() { store.Must(ss.Bot().PermanentDelete(u3.Id)) }()
  2837  
  2838  	tid := model.NewId()
  2839  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u3.Id}, -1))
  2840  
  2841  	// The users returned from the database will have AuthData as an empty string.
  2842  	nilAuthData := new(string)
  2843  	*nilAuthData = ""
  2844  
  2845  	u1.AuthData = nilAuthData
  2846  	u2.AuthData = nilAuthData
  2847  	u3.AuthData = nilAuthData
  2848  
  2849  	testCases := []struct {
  2850  		Description string
  2851  		Term        string
  2852  		Options     *model.UserSearchOptions
  2853  		Expected    []*model.User
  2854  	}{
  2855  		{
  2856  			"empty string",
  2857  			"",
  2858  			&model.UserSearchOptions{
  2859  				AllowFullNames: true,
  2860  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2861  			},
  2862  			[]*model.User{u2, u1},
  2863  		},
  2864  		{
  2865  			"jim",
  2866  			"jim",
  2867  			&model.UserSearchOptions{
  2868  				AllowFullNames: true,
  2869  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2870  			},
  2871  			[]*model.User{u2, u1},
  2872  		},
  2873  		{
  2874  			"PLT-8354",
  2875  			"* ",
  2876  			&model.UserSearchOptions{
  2877  				AllowFullNames: true,
  2878  				Limit:          model.USER_SEARCH_DEFAULT_LIMIT,
  2879  			},
  2880  			[]*model.User{u2, u1},
  2881  		},
  2882  		{
  2883  			"jim, limit 1",
  2884  			"jim",
  2885  			&model.UserSearchOptions{
  2886  				AllowFullNames: true,
  2887  				Limit:          1,
  2888  			},
  2889  			[]*model.User{u2},
  2890  		},
  2891  	}
  2892  
  2893  	for _, testCase := range testCases {
  2894  		t.Run(testCase.Description, func(t *testing.T) {
  2895  			result := <-ss.User().SearchWithoutTeam(
  2896  				testCase.Term,
  2897  				testCase.Options,
  2898  			)
  2899  			require.Nil(t, result.Err)
  2900  			assertUsers(t, testCase.Expected, result.Data.([]*model.User))
  2901  		})
  2902  	}
  2903  }
  2904  
  2905  func testCount(t *testing.T, ss store.Store) {
  2906  	// Regular
  2907  	teamId := model.NewId()
  2908  	u1 := &model.User{}
  2909  	u1.Email = MakeEmail()
  2910  	store.Must(ss.User().Save(u1))
  2911  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
  2912  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
  2913  
  2914  	// Deleted
  2915  	u2 := &model.User{}
  2916  	u2.Email = MakeEmail()
  2917  	u2.DeleteAt = model.GetMillis()
  2918  	store.Must(ss.User().Save(u2))
  2919  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
  2920  
  2921  	// Bot
  2922  	u3 := store.Must(ss.User().Save(&model.User{
  2923  		Email: MakeEmail(),
  2924  	})).(*model.User)
  2925  	defer func() { store.Must(ss.User().PermanentDelete(u3.Id)) }()
  2926  	store.Must(ss.Bot().Save(&model.Bot{
  2927  		UserId:   u3.Id,
  2928  		Username: u3.Username,
  2929  		OwnerId:  u1.Id,
  2930  	}))
  2931  	u3.IsBot = true
  2932  	defer func() { store.Must(ss.Bot().PermanentDelete(u3.Id)) }()
  2933  
  2934  	result := <-ss.User().Count(model.UserCountOptions{
  2935  		IncludeBotAccounts: false,
  2936  		IncludeDeleted:     false,
  2937  		TeamId:             "",
  2938  	})
  2939  	require.Nil(t, result.Err)
  2940  	require.Equal(t, int64(1), result.Data.(int64))
  2941  
  2942  	result = <-ss.User().Count(model.UserCountOptions{
  2943  		IncludeBotAccounts: true,
  2944  		IncludeDeleted:     false,
  2945  		TeamId:             "",
  2946  	})
  2947  	require.Nil(t, result.Err)
  2948  	require.Equal(t, int64(2), result.Data.(int64))
  2949  
  2950  	result = <-ss.User().Count(model.UserCountOptions{
  2951  		IncludeBotAccounts: false,
  2952  		IncludeDeleted:     true,
  2953  		TeamId:             "",
  2954  	})
  2955  	require.Nil(t, result.Err)
  2956  	require.Equal(t, int64(2), result.Data.(int64))
  2957  
  2958  	result = <-ss.User().Count(model.UserCountOptions{
  2959  		IncludeBotAccounts: true,
  2960  		IncludeDeleted:     true,
  2961  		TeamId:             "",
  2962  	})
  2963  	require.Nil(t, result.Err)
  2964  	require.Equal(t, int64(3), result.Data.(int64))
  2965  
  2966  	result = <-ss.User().Count(model.UserCountOptions{
  2967  		IncludeBotAccounts:  true,
  2968  		IncludeDeleted:      true,
  2969  		ExcludeRegularUsers: true,
  2970  		TeamId:              "",
  2971  	})
  2972  	require.Nil(t, result.Err)
  2973  	require.Equal(t, int64(1), result.Data.(int64))
  2974  
  2975  	result = <-ss.User().Count(model.UserCountOptions{
  2976  		IncludeBotAccounts: true,
  2977  		IncludeDeleted:     true,
  2978  		TeamId:             teamId,
  2979  	})
  2980  	require.Nil(t, result.Err)
  2981  	require.Equal(t, int64(1), result.Data.(int64))
  2982  
  2983  	result = <-ss.User().Count(model.UserCountOptions{
  2984  		IncludeBotAccounts: true,
  2985  		IncludeDeleted:     true,
  2986  		TeamId:             model.NewId(),
  2987  	})
  2988  	require.Nil(t, result.Err)
  2989  	require.Equal(t, int64(0), result.Data.(int64))
  2990  
  2991  }
  2992  
  2993  func testUserStoreAnalyticsGetInactiveUsersCount(t *testing.T, ss store.Store) {
  2994  	u1 := &model.User{}
  2995  	u1.Email = MakeEmail()
  2996  	store.Must(ss.User().Save(u1))
  2997  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
  2998  
  2999  	var count int64
  3000  
  3001  	if result := <-ss.User().AnalyticsGetInactiveUsersCount(); result.Err != nil {
  3002  		t.Fatal(result.Err)
  3003  	} else {
  3004  		count = result.Data.(int64)
  3005  	}
  3006  
  3007  	u2 := &model.User{}
  3008  	u2.Email = MakeEmail()
  3009  	u2.DeleteAt = model.GetMillis()
  3010  	store.Must(ss.User().Save(u2))
  3011  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
  3012  
  3013  	if result := <-ss.User().AnalyticsGetInactiveUsersCount(); result.Err != nil {
  3014  		t.Fatal(result.Err)
  3015  	} else {
  3016  		newCount := result.Data.(int64)
  3017  		if count != newCount-1 {
  3018  			t.Fatal("Expected 1 more inactive users but found otherwise.", count, newCount)
  3019  		}
  3020  	}
  3021  }
  3022  
  3023  func testUserStoreAnalyticsGetSystemAdminCount(t *testing.T, ss store.Store) {
  3024  	var countBefore int64
  3025  	if result := <-ss.User().AnalyticsGetSystemAdminCount(); result.Err != nil {
  3026  		t.Fatal(result.Err)
  3027  	} else {
  3028  		countBefore = result.Data.(int64)
  3029  	}
  3030  
  3031  	u1 := model.User{}
  3032  	u1.Email = MakeEmail()
  3033  	u1.Username = model.NewId()
  3034  	u1.Roles = "system_user system_admin"
  3035  
  3036  	u2 := model.User{}
  3037  	u2.Email = MakeEmail()
  3038  	u2.Username = model.NewId()
  3039  
  3040  	if err := (<-ss.User().Save(&u1)).Err; err != nil {
  3041  		t.Fatal("couldn't save user", err)
  3042  	}
  3043  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
  3044  
  3045  	if err := (<-ss.User().Save(&u2)).Err; err != nil {
  3046  		t.Fatal("couldn't save user", err)
  3047  	}
  3048  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
  3049  
  3050  	if result := <-ss.User().AnalyticsGetSystemAdminCount(); result.Err != nil {
  3051  		t.Fatal(result.Err)
  3052  	} else {
  3053  		// We expect to find 1 more system admin than there was at the start of this test function.
  3054  		if count := result.Data.(int64); count != countBefore+1 {
  3055  			t.Fatal("Did not get the expected number of system admins. Expected, got: ", countBefore+1, count)
  3056  		}
  3057  	}
  3058  }
  3059  
  3060  func testUserStoreGetProfilesNotInTeam(t *testing.T, ss store.Store) {
  3061  	teamId := model.NewId()
  3062  	teamId2 := model.NewId()
  3063  
  3064  	u1 := store.Must(ss.User().Save(&model.User{
  3065  		Email:    MakeEmail(),
  3066  		Username: "u1" + model.NewId(),
  3067  	})).(*model.User)
  3068  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
  3069  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
  3070  
  3071  	// Ensure update at timestamp changes
  3072  	time.Sleep(time.Millisecond * 10)
  3073  
  3074  	u2 := store.Must(ss.User().Save(&model.User{
  3075  		Email:    MakeEmail(),
  3076  		Username: "u2" + model.NewId(),
  3077  	})).(*model.User)
  3078  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
  3079  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId2, UserId: u2.Id}, -1))
  3080  
  3081  	// Ensure update at timestamp changes
  3082  	time.Sleep(time.Millisecond * 10)
  3083  
  3084  	u3 := store.Must(ss.User().Save(&model.User{
  3085  		Email:    MakeEmail(),
  3086  		Username: "u3" + model.NewId(),
  3087  	})).(*model.User)
  3088  	defer func() { store.Must(ss.User().PermanentDelete(u3.Id)) }()
  3089  	store.Must(ss.Bot().Save(&model.Bot{
  3090  		UserId:   u3.Id,
  3091  		Username: u3.Username,
  3092  		OwnerId:  u1.Id,
  3093  	}))
  3094  	u3.IsBot = true
  3095  	defer func() { store.Must(ss.Bot().PermanentDelete(u3.Id)) }()
  3096  
  3097  	var etag1, etag2, etag3 string
  3098  
  3099  	t.Run("etag for profiles not in team 1", func(t *testing.T) {
  3100  		result := <-ss.User().GetEtagForProfilesNotInTeam(teamId)
  3101  		require.Nil(t, result.Err)
  3102  		etag1 = result.Data.(string)
  3103  	})
  3104  
  3105  	t.Run("get not in team 1, offset 0, limit 100000", func(t *testing.T) {
  3106  		result := <-ss.User().GetProfilesNotInTeam(teamId, 0, 100000)
  3107  		require.Nil(t, result.Err)
  3108  		assert.Equal(t, []*model.User{
  3109  			sanitized(u2),
  3110  			sanitized(u3),
  3111  		}, result.Data.([]*model.User))
  3112  	})
  3113  
  3114  	t.Run("get not in team 1, offset 1, limit 1", func(t *testing.T) {
  3115  		result := <-ss.User().GetProfilesNotInTeam(teamId, 1, 1)
  3116  		require.Nil(t, result.Err)
  3117  		assert.Equal(t, []*model.User{
  3118  			sanitized(u3),
  3119  		}, result.Data.([]*model.User))
  3120  	})
  3121  
  3122  	t.Run("get not in team 2, offset 0, limit 100", func(t *testing.T) {
  3123  		result := <-ss.User().GetProfilesNotInTeam(teamId2, 0, 100)
  3124  		require.Nil(t, result.Err)
  3125  		assert.Equal(t, []*model.User{
  3126  			sanitized(u1),
  3127  			sanitized(u3),
  3128  		}, result.Data.([]*model.User))
  3129  	})
  3130  
  3131  	// Ensure update at timestamp changes
  3132  	time.Sleep(time.Millisecond * 10)
  3133  
  3134  	// Add u2 to team 1
  3135  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1))
  3136  	u2.UpdateAt = store.Must(ss.User().UpdateUpdateAt(u2.Id)).(int64)
  3137  
  3138  	t.Run("etag for profiles not in team 1 after update", func(t *testing.T) {
  3139  		result := <-ss.User().GetEtagForProfilesNotInTeam(teamId)
  3140  		require.Nil(t, result.Err)
  3141  		etag2 = result.Data.(string)
  3142  		require.NotEqual(t, etag2, etag1, "etag should have changed")
  3143  	})
  3144  
  3145  	t.Run("get not in team 1, offset 0, limit 100000 after update", func(t *testing.T) {
  3146  		result := <-ss.User().GetProfilesNotInTeam(teamId, 0, 100000)
  3147  		require.Nil(t, result.Err)
  3148  		assert.Equal(t, []*model.User{
  3149  			sanitized(u3),
  3150  		}, result.Data.([]*model.User))
  3151  	})
  3152  
  3153  	// Ensure update at timestamp changes
  3154  	time.Sleep(time.Millisecond * 10)
  3155  
  3156  	store.Must(ss.Team().RemoveMember(teamId, u1.Id))
  3157  	store.Must(ss.Team().RemoveMember(teamId, u2.Id))
  3158  	u1.UpdateAt = store.Must(ss.User().UpdateUpdateAt(u1.Id)).(int64)
  3159  	u2.UpdateAt = store.Must(ss.User().UpdateUpdateAt(u2.Id)).(int64)
  3160  
  3161  	t.Run("etag for profiles not in team 1 after second update", func(t *testing.T) {
  3162  		result := <-ss.User().GetEtagForProfilesNotInTeam(teamId)
  3163  		require.Nil(t, result.Err)
  3164  		etag3 = result.Data.(string)
  3165  		require.NotEqual(t, etag1, etag3, "etag should have changed")
  3166  		require.NotEqual(t, etag2, etag3, "etag should have changed")
  3167  	})
  3168  
  3169  	t.Run("get not in team 1, offset 0, limit 100000 after second update", func(t *testing.T) {
  3170  		result := <-ss.User().GetProfilesNotInTeam(teamId, 0, 100000)
  3171  		require.Nil(t, result.Err)
  3172  		assert.Equal(t, []*model.User{
  3173  			sanitized(u1),
  3174  			sanitized(u2),
  3175  			sanitized(u3),
  3176  		}, result.Data.([]*model.User))
  3177  	})
  3178  
  3179  	// Ensure update at timestamp changes
  3180  	time.Sleep(time.Millisecond * 10)
  3181  
  3182  	u4 := store.Must(ss.User().Save(&model.User{
  3183  		Email:    MakeEmail(),
  3184  		Username: "u4" + model.NewId(),
  3185  	})).(*model.User)
  3186  	defer func() { store.Must(ss.User().PermanentDelete(u4.Id)) }()
  3187  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u4.Id}, -1))
  3188  
  3189  	t.Run("etag for profiles not in team 1 after addition to team", func(t *testing.T) {
  3190  		result := <-ss.User().GetEtagForProfilesNotInTeam(teamId)
  3191  		require.Nil(t, result.Err)
  3192  		etag4 := result.Data.(string)
  3193  		require.Equal(t, etag3, etag4, "etag should not have changed")
  3194  	})
  3195  
  3196  	// Add u3 to team 2
  3197  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId2, UserId: u3.Id}, -1))
  3198  	u3.UpdateAt = store.Must(ss.User().UpdateUpdateAt(u3.Id)).(int64)
  3199  
  3200  	// GetEtagForProfilesNotInTeam produces a new etag every time a member, not
  3201  	// in the team, gets a new UpdateAt value. In the case that an older member
  3202  	// in the set joins a different team, their UpdateAt value changes, thus
  3203  	// creating a new etag (even though the user set doesn't change). A hashing
  3204  	// solution, which only uses UserIds, would solve this issue.
  3205  	t.Run("etag for profiles not in team 1 after u3 added to team 2", func(t *testing.T) {
  3206  		t.Skip()
  3207  		result := <-ss.User().GetEtagForProfilesNotInTeam(teamId)
  3208  		require.Nil(t, result.Err)
  3209  		etag4 := result.Data.(string)
  3210  		require.Equal(t, etag3, etag4, "etag should not have changed")
  3211  	})
  3212  }
  3213  
  3214  func testUserStoreClearAllCustomRoleAssignments(t *testing.T, ss store.Store) {
  3215  	u1 := model.User{
  3216  		Email:    MakeEmail(),
  3217  		Username: model.NewId(),
  3218  		Roles:    "system_user system_admin system_post_all",
  3219  	}
  3220  	u2 := model.User{
  3221  		Email:    MakeEmail(),
  3222  		Username: model.NewId(),
  3223  		Roles:    "system_user custom_role system_admin another_custom_role",
  3224  	}
  3225  	u3 := model.User{
  3226  		Email:    MakeEmail(),
  3227  		Username: model.NewId(),
  3228  		Roles:    "system_user",
  3229  	}
  3230  	u4 := model.User{
  3231  		Email:    MakeEmail(),
  3232  		Username: model.NewId(),
  3233  		Roles:    "custom_only",
  3234  	}
  3235  
  3236  	store.Must(ss.User().Save(&u1))
  3237  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
  3238  	store.Must(ss.User().Save(&u2))
  3239  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
  3240  	store.Must(ss.User().Save(&u3))
  3241  	defer func() { store.Must(ss.User().PermanentDelete(u3.Id)) }()
  3242  	store.Must(ss.User().Save(&u4))
  3243  	defer func() { store.Must(ss.User().PermanentDelete(u4.Id)) }()
  3244  
  3245  	require.Nil(t, (<-ss.User().ClearAllCustomRoleAssignments()).Err)
  3246  
  3247  	r1 := <-ss.User().GetByUsername(u1.Username)
  3248  	require.Nil(t, r1.Err)
  3249  	assert.Equal(t, u1.Roles, r1.Data.(*model.User).Roles)
  3250  
  3251  	r2 := <-ss.User().GetByUsername(u2.Username)
  3252  	require.Nil(t, r2.Err)
  3253  	assert.Equal(t, "system_user system_admin", r2.Data.(*model.User).Roles)
  3254  
  3255  	r3 := <-ss.User().GetByUsername(u3.Username)
  3256  	require.Nil(t, r3.Err)
  3257  	assert.Equal(t, u3.Roles, r3.Data.(*model.User).Roles)
  3258  
  3259  	r4 := <-ss.User().GetByUsername(u4.Username)
  3260  	require.Nil(t, r4.Err)
  3261  	assert.Equal(t, "", r4.Data.(*model.User).Roles)
  3262  }
  3263  
  3264  func testUserStoreGetAllAfter(t *testing.T, ss store.Store) {
  3265  	u1 := store.Must(ss.User().Save(&model.User{
  3266  		Email:    MakeEmail(),
  3267  		Username: model.NewId(),
  3268  		Roles:    "system_user system_admin system_post_all",
  3269  	})).(*model.User)
  3270  	defer func() { store.Must(ss.User().PermanentDelete(u1.Id)) }()
  3271  
  3272  	u2 := store.Must(ss.User().Save(&model.User{
  3273  		Email:    MakeEmail(),
  3274  		Username: "u2" + model.NewId(),
  3275  	})).(*model.User)
  3276  	defer func() { store.Must(ss.User().PermanentDelete(u2.Id)) }()
  3277  	store.Must(ss.Bot().Save(&model.Bot{
  3278  		UserId:   u2.Id,
  3279  		Username: u2.Username,
  3280  		OwnerId:  u1.Id,
  3281  	}))
  3282  	u2.IsBot = true
  3283  	defer func() { store.Must(ss.Bot().PermanentDelete(u2.Id)) }()
  3284  
  3285  	expected := []*model.User{u1, u2}
  3286  	if strings.Compare(u2.Id, u1.Id) < 0 {
  3287  		expected = []*model.User{u2, u1}
  3288  	}
  3289  
  3290  	t.Run("get after lowest possible id", func(t *testing.T) {
  3291  		result := <-ss.User().GetAllAfter(10000, strings.Repeat("0", 26))
  3292  		require.Nil(t, result.Err)
  3293  
  3294  		actual := result.Data.([]*model.User)
  3295  		assert.Equal(t, expected, actual)
  3296  	})
  3297  
  3298  	t.Run("get after first user", func(t *testing.T) {
  3299  		result := <-ss.User().GetAllAfter(10000, expected[0].Id)
  3300  		require.Nil(t, result.Err)
  3301  
  3302  		actual := result.Data.([]*model.User)
  3303  		assert.Equal(t, []*model.User{expected[1]}, actual)
  3304  	})
  3305  
  3306  	t.Run("get after second user", func(t *testing.T) {
  3307  		result := <-ss.User().GetAllAfter(10000, expected[1].Id)
  3308  		require.Nil(t, result.Err)
  3309  
  3310  		actual := result.Data.([]*model.User)
  3311  		assert.Equal(t, []*model.User{}, actual)
  3312  	})
  3313  }
  3314  
  3315  func testUserStoreGetUsersBatchForIndexing(t *testing.T, ss store.Store) {
  3316  	// Set up all the objects needed
  3317  	t1 := store.Must(ss.Team().Save(&model.Team{
  3318  		DisplayName: "Team1",
  3319  		Name:        model.NewId(),
  3320  		Type:        model.TEAM_OPEN,
  3321  	})).(*model.Team)
  3322  	cPub1 := store.Must(ss.Channel().Save(&model.Channel{
  3323  		Name: model.NewId(),
  3324  		Type: model.CHANNEL_OPEN,
  3325  	}, -1)).(*model.Channel)
  3326  	cPub2 := store.Must(ss.Channel().Save(&model.Channel{
  3327  		Name: model.NewId(),
  3328  		Type: model.CHANNEL_OPEN,
  3329  	}, -1)).(*model.Channel)
  3330  	cPriv := store.Must(ss.Channel().Save(&model.Channel{
  3331  		Name: model.NewId(),
  3332  		Type: model.CHANNEL_PRIVATE,
  3333  	}, -1)).(*model.Channel)
  3334  
  3335  	u1 := store.Must(ss.User().Save(&model.User{
  3336  		Email:    MakeEmail(),
  3337  		Username: model.NewId(),
  3338  		CreateAt: model.GetMillis(),
  3339  	})).(*model.User)
  3340  
  3341  	time.Sleep(10 * time.Millisecond)
  3342  
  3343  	u2 := store.Must(ss.User().Save(&model.User{
  3344  		Email:    MakeEmail(),
  3345  		Username: model.NewId(),
  3346  		CreateAt: model.GetMillis(),
  3347  	})).(*model.User)
  3348  	store.Must(ss.Team().SaveMember(&model.TeamMember{
  3349  		UserId: u2.Id,
  3350  		TeamId: t1.Id,
  3351  	}, 100))
  3352  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
  3353  		UserId:      u2.Id,
  3354  		ChannelId:   cPub1.Id,
  3355  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  3356  	}))
  3357  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
  3358  		UserId:      u2.Id,
  3359  		ChannelId:   cPub2.Id,
  3360  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  3361  	}))
  3362  
  3363  	startTime := u2.CreateAt
  3364  	time.Sleep(10 * time.Millisecond)
  3365  
  3366  	u3 := store.Must(ss.User().Save(&model.User{
  3367  		Email:    MakeEmail(),
  3368  		Username: model.NewId(),
  3369  		CreateAt: model.GetMillis(),
  3370  	})).(*model.User)
  3371  	store.Must(ss.Team().SaveMember(&model.TeamMember{
  3372  		UserId:   u3.Id,
  3373  		TeamId:   t1.Id,
  3374  		DeleteAt: model.GetMillis(),
  3375  	}, 100))
  3376  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
  3377  		UserId:      u3.Id,
  3378  		ChannelId:   cPub2.Id,
  3379  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  3380  	}))
  3381  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{
  3382  		UserId:      u3.Id,
  3383  		ChannelId:   cPriv.Id,
  3384  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  3385  	}))
  3386  
  3387  	endTime := u3.CreateAt
  3388  
  3389  	// First and last user should be outside the range
  3390  	res1 := <-ss.User().GetUsersBatchForIndexing(startTime, endTime, 100)
  3391  	assert.Nil(t, res1.Err)
  3392  	res1List := res1.Data.([]*model.UserForIndexing)
  3393  
  3394  	assert.Len(t, res1List, 1)
  3395  	assert.Equal(t, res1List[0].Username, u2.Username)
  3396  	assert.ElementsMatch(t, res1List[0].TeamsIds, []string{t1.Id})
  3397  	assert.ElementsMatch(t, res1List[0].ChannelsIds, []string{cPub1.Id, cPub2.Id})
  3398  
  3399  	// Update startTime to include first user
  3400  	startTime = u1.CreateAt
  3401  	res2 := <-ss.User().GetUsersBatchForIndexing(startTime, endTime, 100)
  3402  	assert.Nil(t, res1.Err)
  3403  	res2List := res2.Data.([]*model.UserForIndexing)
  3404  
  3405  	assert.Len(t, res2List, 2)
  3406  	assert.Equal(t, res2List[0].Username, u1.Username)
  3407  	assert.Equal(t, res2List[0].ChannelsIds, []string{})
  3408  	assert.Equal(t, res2List[0].TeamsIds, []string{})
  3409  	assert.Equal(t, res2List[1].Username, u2.Username)
  3410  
  3411  	// Update endTime to include last user
  3412  	endTime = model.GetMillis()
  3413  	res3 := <-ss.User().GetUsersBatchForIndexing(startTime, endTime, 100)
  3414  	assert.Nil(t, res3.Err)
  3415  	res3List := res3.Data.([]*model.UserForIndexing)
  3416  
  3417  	assert.Len(t, res3List, 3)
  3418  	assert.Equal(t, res3List[0].Username, u1.Username)
  3419  	assert.Equal(t, res3List[1].Username, u2.Username)
  3420  	assert.Equal(t, res3List[2].Username, u3.Username)
  3421  	assert.ElementsMatch(t, res3List[2].TeamsIds, []string{})
  3422  	assert.ElementsMatch(t, res3List[2].ChannelsIds, []string{cPub2.Id})
  3423  
  3424  	// Testing the limit
  3425  	res4 := <-ss.User().GetUsersBatchForIndexing(startTime, endTime, 2)
  3426  	assert.Nil(t, res4.Err)
  3427  	res4List := res4.Data.([]*model.UserForIndexing)
  3428  
  3429  	assert.Len(t, res4List, 2)
  3430  	assert.Equal(t, res4List[0].Username, u1.Username)
  3431  	assert.Equal(t, res4List[1].Username, u2.Username)
  3432  }