github.com/xzl8028/xenia-server@v0.0.0-20190809101854-18450a97da63/store/storetest/user_store.go (about)

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