github.com/lologarithm/mattermost-server@v5.3.2-0.20181002060438-c82a84ed765b+incompatible/store/storetest/user_store.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package storetest
     5  
     6  import (
     7  	"strings"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/stretchr/testify/require"
    13  
    14  	"github.com/mattermost/mattermost-server/model"
    15  	"github.com/mattermost/mattermost-server/store"
    16  )
    17  
    18  func TestUserStore(t *testing.T, ss store.Store) {
    19  	t.Run("Save", func(t *testing.T) { testUserStoreSave(t, ss) })
    20  	t.Run("Update", func(t *testing.T) { testUserStoreUpdate(t, ss) })
    21  	t.Run("UpdateUpdateAt", func(t *testing.T) { testUserStoreUpdateUpdateAt(t, ss) })
    22  	t.Run("UpdateFailedPasswordAttempts", func(t *testing.T) { testUserStoreUpdateFailedPasswordAttempts(t, ss) })
    23  	t.Run("Get", func(t *testing.T) { testUserStoreGet(t, ss) })
    24  	t.Run("UserCount", func(t *testing.T) { testUserCount(t, ss) })
    25  	t.Run("GetAllUsingAuthService", func(t *testing.T) { testGetAllUsingAuthService(t, ss) })
    26  	t.Run("GetAllProfiles", func(t *testing.T) { testUserStoreGetAllProfiles(t, ss) })
    27  	t.Run("GetProfiles", func(t *testing.T) { testUserStoreGetProfiles(t, ss) })
    28  	t.Run("GetProfilesInChannel", func(t *testing.T) { testUserStoreGetProfilesInChannel(t, ss) })
    29  	t.Run("GetProfilesInChannelByStatus", func(t *testing.T) { testUserStoreGetProfilesInChannelByStatus(t, ss) })
    30  	t.Run("GetProfilesWithoutTeam", func(t *testing.T) { testUserStoreGetProfilesWithoutTeam(t, ss) })
    31  	t.Run("GetAllProfilesInChannel", func(t *testing.T) { testUserStoreGetAllProfilesInChannel(t, ss) })
    32  	t.Run("GetProfilesNotInChannel", func(t *testing.T) { testUserStoreGetProfilesNotInChannel(t, ss) })
    33  	t.Run("GetProfilesByIds", func(t *testing.T) { testUserStoreGetProfilesByIds(t, ss) })
    34  	t.Run("GetProfilesByUsernames", func(t *testing.T) { testUserStoreGetProfilesByUsernames(t, ss) })
    35  	t.Run("GetSystemAdminProfiles", func(t *testing.T) { testUserStoreGetSystemAdminProfiles(t, ss) })
    36  	t.Run("GetByEmail", func(t *testing.T) { testUserStoreGetByEmail(t, ss) })
    37  	t.Run("GetByAuthData", func(t *testing.T) { testUserStoreGetByAuthData(t, ss) })
    38  	t.Run("GetByUsername", func(t *testing.T) { testUserStoreGetByUsername(t, ss) })
    39  	t.Run("GetForLogin", func(t *testing.T) { testUserStoreGetForLogin(t, ss) })
    40  	t.Run("UpdatePassword", func(t *testing.T) { testUserStoreUpdatePassword(t, ss) })
    41  	t.Run("Delete", func(t *testing.T) { testUserStoreDelete(t, ss) })
    42  	t.Run("UpdateAuthData", func(t *testing.T) { testUserStoreUpdateAuthData(t, ss) })
    43  	t.Run("UserUnreadCount", func(t *testing.T) { testUserUnreadCount(t, ss) })
    44  	t.Run("UpdateMfaSecret", func(t *testing.T) { testUserStoreUpdateMfaSecret(t, ss) })
    45  	t.Run("UpdateMfaActive", func(t *testing.T) { testUserStoreUpdateMfaActive(t, ss) })
    46  	t.Run("GetRecentlyActiveUsersForTeam", func(t *testing.T) { testUserStoreGetRecentlyActiveUsersForTeam(t, ss) })
    47  	t.Run("GetNewUsersForTeam", func(t *testing.T) { testUserStoreGetNewUsersForTeam(t, ss) })
    48  	t.Run("Search", func(t *testing.T) { testUserStoreSearch(t, ss) })
    49  	t.Run("SearchWithoutTeam", func(t *testing.T) { testUserStoreSearchWithoutTeam(t, ss) })
    50  	t.Run("AnalyticsGetInactiveUsersCount", func(t *testing.T) { testUserStoreAnalyticsGetInactiveUsersCount(t, ss) })
    51  	t.Run("AnalyticsGetSystemAdminCount", func(t *testing.T) { testUserStoreAnalyticsGetSystemAdminCount(t, ss) })
    52  	t.Run("GetProfilesNotInTeam", func(t *testing.T) { testUserStoreGetProfilesNotInTeam(t, ss) })
    53  	t.Run("ClearAllCustomRoleAssignments", func(t *testing.T) { testUserStoreClearAllCustomRoleAssignments(t, ss) })
    54  	t.Run("GetAllAfter", func(t *testing.T) { testUserStoreGetAllAfter(t, ss) })
    55  }
    56  
    57  func testUserStoreSave(t *testing.T, ss store.Store) {
    58  	teamId := model.NewId()
    59  	maxUsersPerTeam := 50
    60  
    61  	u1 := model.User{}
    62  	u1.Email = MakeEmail()
    63  	u1.Username = model.NewId()
    64  
    65  	if err := (<-ss.User().Save(&u1)).Err; err != nil {
    66  		t.Fatal("couldn't save user", err)
    67  	}
    68  
    69  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, maxUsersPerTeam))
    70  
    71  	if err := (<-ss.User().Save(&u1)).Err; err == nil {
    72  		t.Fatal("shouldn't be able to update user from save")
    73  	}
    74  
    75  	u1.Id = ""
    76  	if err := (<-ss.User().Save(&u1)).Err; err == nil {
    77  		t.Fatal("should be unique email")
    78  	}
    79  
    80  	u1.Email = ""
    81  	if err := (<-ss.User().Save(&u1)).Err; err == nil {
    82  		t.Fatal("should be unique username")
    83  	}
    84  
    85  	u1.Email = strings.Repeat("0123456789", 20)
    86  	u1.Username = ""
    87  	if err := (<-ss.User().Save(&u1)).Err; err == nil {
    88  		t.Fatal("should be unique username")
    89  	}
    90  
    91  	for i := 0; i < 49; i++ {
    92  		u1.Id = ""
    93  		u1.Email = MakeEmail()
    94  		u1.Username = model.NewId()
    95  		if err := (<-ss.User().Save(&u1)).Err; err != nil {
    96  			t.Fatal("couldn't save item", err)
    97  		}
    98  
    99  		store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, maxUsersPerTeam))
   100  	}
   101  
   102  	u1.Id = ""
   103  	u1.Email = MakeEmail()
   104  	u1.Username = model.NewId()
   105  	if err := (<-ss.User().Save(&u1)).Err; err != nil {
   106  		t.Fatal("couldn't save item", err)
   107  	}
   108  
   109  	if err := (<-ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, maxUsersPerTeam)).Err; err == nil {
   110  		t.Fatal("should be the limit")
   111  	}
   112  }
   113  
   114  func testUserStoreUpdate(t *testing.T, ss store.Store) {
   115  	u1 := &model.User{}
   116  	u1.Email = MakeEmail()
   117  	store.Must(ss.User().Save(u1))
   118  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1))
   119  
   120  	u2 := &model.User{}
   121  	u2.Email = MakeEmail()
   122  	u2.AuthService = "ldap"
   123  	store.Must(ss.User().Save(u2))
   124  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}, -1))
   125  
   126  	time.Sleep(100 * time.Millisecond)
   127  
   128  	if err := (<-ss.User().Update(u1, false)).Err; err != nil {
   129  		t.Fatal(err)
   130  	}
   131  
   132  	u1.Id = "missing"
   133  	if err := (<-ss.User().Update(u1, false)).Err; err == nil {
   134  		t.Fatal("Update should have failed because of missing key")
   135  	}
   136  
   137  	u1.Id = model.NewId()
   138  	if err := (<-ss.User().Update(u1, false)).Err; err == nil {
   139  		t.Fatal("Update should have faile because id change")
   140  	}
   141  
   142  	u2.Email = MakeEmail()
   143  	if err := (<-ss.User().Update(u2, false)).Err; err == nil {
   144  		t.Fatal("Update should have failed because you can't modify AD/LDAP fields")
   145  	}
   146  
   147  	u3 := &model.User{}
   148  	u3.Email = MakeEmail()
   149  	oldEmail := u3.Email
   150  	u3.AuthService = "gitlab"
   151  	store.Must(ss.User().Save(u3))
   152  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u3.Id}, -1))
   153  
   154  	u3.Email = MakeEmail()
   155  	if result := <-ss.User().Update(u3, false); result.Err != nil {
   156  		t.Fatal("Update should not have failed")
   157  	} else {
   158  		newUser := result.Data.([2]*model.User)[0]
   159  		if newUser.Email != oldEmail {
   160  			t.Fatal("Email should not have been updated as the update is not trusted")
   161  		}
   162  	}
   163  
   164  	u3.Email = MakeEmail()
   165  	if result := <-ss.User().Update(u3, true); result.Err != nil {
   166  		t.Fatal("Update should not have failed")
   167  	} else {
   168  		newUser := result.Data.([2]*model.User)[0]
   169  		if newUser.Email == oldEmail {
   170  			t.Fatal("Email should have been updated as the update is trusted")
   171  		}
   172  	}
   173  
   174  	if result := <-ss.User().UpdateLastPictureUpdate(u1.Id); result.Err != nil {
   175  		t.Fatal("Update should not have failed")
   176  	}
   177  }
   178  
   179  func testUserStoreUpdateUpdateAt(t *testing.T, ss store.Store) {
   180  	u1 := &model.User{}
   181  	u1.Email = MakeEmail()
   182  	store.Must(ss.User().Save(u1))
   183  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1))
   184  
   185  	time.Sleep(10 * time.Millisecond)
   186  
   187  	if err := (<-ss.User().UpdateUpdateAt(u1.Id)).Err; err != nil {
   188  		t.Fatal(err)
   189  	}
   190  
   191  	if r1 := <-ss.User().Get(u1.Id); r1.Err != nil {
   192  		t.Fatal(r1.Err)
   193  	} else {
   194  		if r1.Data.(*model.User).UpdateAt <= u1.UpdateAt {
   195  			t.Fatal("UpdateAt not updated correctly")
   196  		}
   197  	}
   198  
   199  }
   200  
   201  func testUserStoreUpdateFailedPasswordAttempts(t *testing.T, ss store.Store) {
   202  	u1 := &model.User{}
   203  	u1.Email = MakeEmail()
   204  	store.Must(ss.User().Save(u1))
   205  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1))
   206  
   207  	if err := (<-ss.User().UpdateFailedPasswordAttempts(u1.Id, 3)).Err; err != nil {
   208  		t.Fatal(err)
   209  	}
   210  
   211  	if r1 := <-ss.User().Get(u1.Id); r1.Err != nil {
   212  		t.Fatal(r1.Err)
   213  	} else {
   214  		if r1.Data.(*model.User).FailedAttempts != 3 {
   215  			t.Fatal("FailedAttempts not updated correctly")
   216  		}
   217  	}
   218  
   219  }
   220  
   221  func testUserStoreGet(t *testing.T, ss store.Store) {
   222  	u1 := &model.User{}
   223  	u1.Email = MakeEmail()
   224  	store.Must(ss.User().Save(u1))
   225  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1))
   226  
   227  	if r1 := <-ss.User().Get(u1.Id); r1.Err != nil {
   228  		t.Fatal(r1.Err)
   229  	} else {
   230  		if r1.Data.(*model.User).ToJson() != u1.ToJson() {
   231  			t.Fatal("invalid returned user")
   232  		}
   233  	}
   234  
   235  	if err := (<-ss.User().Get("")).Err; err == nil {
   236  		t.Fatal("Missing id should have failed")
   237  	}
   238  }
   239  
   240  func testUserCount(t *testing.T, ss store.Store) {
   241  	u1 := &model.User{}
   242  	u1.Email = MakeEmail()
   243  	store.Must(ss.User().Save(u1))
   244  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1))
   245  
   246  	if result := <-ss.User().GetTotalUsersCount(); result.Err != nil {
   247  		t.Fatal(result.Err)
   248  	} else {
   249  		count := result.Data.(int64)
   250  		require.False(t, count <= 0, "expected count > 0, got %d", count)
   251  	}
   252  }
   253  
   254  func testGetAllUsingAuthService(t *testing.T, ss store.Store) {
   255  	u1 := &model.User{}
   256  	u1.Email = MakeEmail()
   257  	u1.AuthService = "someservice"
   258  	store.Must(ss.User().Save(u1))
   259  
   260  	u2 := &model.User{}
   261  	u2.Email = MakeEmail()
   262  	u2.AuthService = "someservice"
   263  	store.Must(ss.User().Save(u2))
   264  
   265  	if r1 := <-ss.User().GetAllUsingAuthService(u1.AuthService); r1.Err != nil {
   266  		t.Fatal(r1.Err)
   267  	} else {
   268  		users := r1.Data.([]*model.User)
   269  		if len(users) < 2 {
   270  			t.Fatal("invalid returned users")
   271  		}
   272  	}
   273  }
   274  
   275  func testUserStoreGetAllProfiles(t *testing.T, ss store.Store) {
   276  	u1 := &model.User{}
   277  	u1.Email = MakeEmail()
   278  	store.Must(ss.User().Save(u1))
   279  
   280  	u2 := &model.User{}
   281  	u2.Email = MakeEmail()
   282  	store.Must(ss.User().Save(u2))
   283  
   284  	if r1 := <-ss.User().GetAllProfiles(0, 100); r1.Err != nil {
   285  		t.Fatal(r1.Err)
   286  	} else {
   287  		users := r1.Data.([]*model.User)
   288  		if len(users) < 2 {
   289  			t.Fatal("invalid returned users")
   290  		}
   291  	}
   292  
   293  	if r2 := <-ss.User().GetAllProfiles(0, 1); r2.Err != nil {
   294  		t.Fatal(r2.Err)
   295  	} else {
   296  		users := r2.Data.([]*model.User)
   297  		if len(users) != 1 {
   298  			t.Fatal("invalid returned users, limit did not work")
   299  		}
   300  	}
   301  
   302  	if r2 := <-ss.User().GetAll(); r2.Err != nil {
   303  		t.Fatal(r2.Err)
   304  	} else {
   305  		users := r2.Data.([]*model.User)
   306  		if len(users) < 2 {
   307  			t.Fatal("invalid returned users")
   308  		}
   309  	}
   310  
   311  	etag := ""
   312  	if r2 := <-ss.User().GetEtagForAllProfiles(); r2.Err != nil {
   313  		t.Fatal(r2.Err)
   314  	} else {
   315  		etag = r2.Data.(string)
   316  	}
   317  
   318  	u3 := &model.User{}
   319  	u3.Email = MakeEmail()
   320  	store.Must(ss.User().Save(u3))
   321  
   322  	if r2 := <-ss.User().GetEtagForAllProfiles(); r2.Err != nil {
   323  		t.Fatal(r2.Err)
   324  	} else {
   325  		if etag == r2.Data.(string) {
   326  			t.Fatal("etags should not match")
   327  		}
   328  	}
   329  }
   330  
   331  func testUserStoreGetProfiles(t *testing.T, ss store.Store) {
   332  	teamId := model.NewId()
   333  
   334  	u1 := &model.User{}
   335  	u1.Email = MakeEmail()
   336  	store.Must(ss.User().Save(u1))
   337  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
   338  
   339  	u2 := &model.User{}
   340  	u2.Email = MakeEmail()
   341  	store.Must(ss.User().Save(u2))
   342  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1))
   343  
   344  	if r1 := <-ss.User().GetProfiles(teamId, 0, 100); r1.Err != nil {
   345  		t.Fatal(r1.Err)
   346  	} else {
   347  		users := r1.Data.([]*model.User)
   348  		if len(users) != 2 {
   349  			t.Fatal("invalid returned users")
   350  		}
   351  
   352  		found := false
   353  		for _, u := range users {
   354  			if u.Id == u1.Id {
   355  				found = true
   356  			}
   357  		}
   358  
   359  		if !found {
   360  			t.Fatal("missing user")
   361  		}
   362  	}
   363  
   364  	if r2 := <-ss.User().GetProfiles("123", 0, 100); r2.Err != nil {
   365  		t.Fatal(r2.Err)
   366  	} else {
   367  		if len(r2.Data.([]*model.User)) != 0 {
   368  			t.Fatal("should have returned empty map")
   369  		}
   370  	}
   371  
   372  	etag := ""
   373  	if r2 := <-ss.User().GetEtagForProfiles(teamId); r2.Err != nil {
   374  		t.Fatal(r2.Err)
   375  	} else {
   376  		etag = r2.Data.(string)
   377  	}
   378  
   379  	u3 := &model.User{}
   380  	u3.Email = MakeEmail()
   381  	store.Must(ss.User().Save(u3))
   382  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1))
   383  
   384  	if r2 := <-ss.User().GetEtagForProfiles(teamId); r2.Err != nil {
   385  		t.Fatal(r2.Err)
   386  	} else {
   387  		if etag == r2.Data.(string) {
   388  			t.Fatal("etags should not match")
   389  		}
   390  	}
   391  }
   392  
   393  func testUserStoreGetProfilesInChannel(t *testing.T, ss store.Store) {
   394  	teamId := model.NewId()
   395  
   396  	u1 := &model.User{}
   397  	u1.Email = MakeEmail()
   398  	store.Must(ss.User().Save(u1))
   399  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
   400  
   401  	u2 := &model.User{}
   402  	u2.Email = MakeEmail()
   403  	store.Must(ss.User().Save(u2))
   404  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1))
   405  
   406  	c1 := model.Channel{}
   407  	c1.TeamId = teamId
   408  	c1.DisplayName = "Profiles in channel"
   409  	c1.Name = "profiles-" + model.NewId()
   410  	c1.Type = model.CHANNEL_OPEN
   411  
   412  	c2 := model.Channel{}
   413  	c2.TeamId = teamId
   414  	c2.DisplayName = "Profiles in private"
   415  	c2.Name = "profiles-" + model.NewId()
   416  	c2.Type = model.CHANNEL_PRIVATE
   417  
   418  	store.Must(ss.Channel().Save(&c1, -1))
   419  	store.Must(ss.Channel().Save(&c2, -1))
   420  
   421  	m1 := model.ChannelMember{}
   422  	m1.ChannelId = c1.Id
   423  	m1.UserId = u1.Id
   424  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
   425  
   426  	m2 := model.ChannelMember{}
   427  	m2.ChannelId = c1.Id
   428  	m2.UserId = u2.Id
   429  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
   430  
   431  	m3 := model.ChannelMember{}
   432  	m3.ChannelId = c2.Id
   433  	m3.UserId = u1.Id
   434  	m3.NotifyProps = model.GetDefaultChannelNotifyProps()
   435  
   436  	store.Must(ss.Channel().SaveMember(&m1))
   437  	store.Must(ss.Channel().SaveMember(&m2))
   438  	store.Must(ss.Channel().SaveMember(&m3))
   439  
   440  	if r1 := <-ss.User().GetProfilesInChannel(c1.Id, 0, 100); r1.Err != nil {
   441  		t.Fatal(r1.Err)
   442  	} else {
   443  		users := r1.Data.([]*model.User)
   444  		if len(users) != 2 {
   445  			t.Fatal("invalid returned users")
   446  		}
   447  
   448  		found := false
   449  		for _, u := range users {
   450  			if u.Id == u1.Id {
   451  				found = true
   452  			}
   453  		}
   454  
   455  		if !found {
   456  			t.Fatal("missing user")
   457  		}
   458  	}
   459  
   460  	if r2 := <-ss.User().GetProfilesInChannel(c2.Id, 0, 1); r2.Err != nil {
   461  		t.Fatal(r2.Err)
   462  	} else {
   463  		if len(r2.Data.([]*model.User)) != 1 {
   464  			t.Fatal("should have returned only 1 user")
   465  		}
   466  	}
   467  }
   468  
   469  func testUserStoreGetProfilesInChannelByStatus(t *testing.T, ss store.Store) {
   470  	teamId := model.NewId()
   471  
   472  	u1 := &model.User{}
   473  	u1.Email = MakeEmail()
   474  	store.Must(ss.User().Save(u1))
   475  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
   476  
   477  	u2 := &model.User{}
   478  	u2.Email = MakeEmail()
   479  	store.Must(ss.User().Save(u2))
   480  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1))
   481  
   482  	c1 := model.Channel{}
   483  	c1.TeamId = teamId
   484  	c1.DisplayName = "Profiles in channel"
   485  	c1.Name = "profiles-" + model.NewId()
   486  	c1.Type = model.CHANNEL_OPEN
   487  
   488  	c2 := model.Channel{}
   489  	c2.TeamId = teamId
   490  	c2.DisplayName = "Profiles in private"
   491  	c2.Name = "profiles-" + model.NewId()
   492  	c2.Type = model.CHANNEL_PRIVATE
   493  
   494  	store.Must(ss.Channel().Save(&c1, -1))
   495  	store.Must(ss.Channel().Save(&c2, -1))
   496  
   497  	m1 := model.ChannelMember{}
   498  	m1.ChannelId = c1.Id
   499  	m1.UserId = u1.Id
   500  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
   501  
   502  	m2 := model.ChannelMember{}
   503  	m2.ChannelId = c1.Id
   504  	m2.UserId = u2.Id
   505  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
   506  
   507  	m3 := model.ChannelMember{}
   508  	m3.ChannelId = c2.Id
   509  	m3.UserId = u1.Id
   510  	m3.NotifyProps = model.GetDefaultChannelNotifyProps()
   511  
   512  	store.Must(ss.Channel().SaveMember(&m1))
   513  	store.Must(ss.Channel().SaveMember(&m2))
   514  	store.Must(ss.Channel().SaveMember(&m3))
   515  
   516  	if r1 := <-ss.User().GetProfilesInChannelByStatus(c1.Id, 0, 100); r1.Err != nil {
   517  		t.Fatal(r1.Err)
   518  	} else {
   519  		users := r1.Data.([]*model.User)
   520  		if len(users) != 2 {
   521  			t.Fatal("invalid returned users")
   522  		}
   523  
   524  		found := false
   525  		for _, u := range users {
   526  			if u.Id == u1.Id {
   527  				found = true
   528  			}
   529  		}
   530  
   531  		if !found {
   532  			t.Fatal("missing user")
   533  		}
   534  	}
   535  
   536  	if r2 := <-ss.User().GetProfilesInChannelByStatus(c2.Id, 0, 1); r2.Err != nil {
   537  		t.Fatal(r2.Err)
   538  	} else {
   539  		if len(r2.Data.([]*model.User)) != 1 {
   540  			t.Fatal("should have returned only 1 user")
   541  		}
   542  	}
   543  }
   544  
   545  func testUserStoreGetProfilesWithoutTeam(t *testing.T, ss store.Store) {
   546  	teamId := model.NewId()
   547  
   548  	// These usernames need to appear in the first 100 users for this to work
   549  
   550  	u1 := &model.User{}
   551  	u1.Username = "a000000000" + model.NewId()
   552  	u1.Email = MakeEmail()
   553  	store.Must(ss.User().Save(u1))
   554  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
   555  	defer ss.User().PermanentDelete(u1.Id)
   556  
   557  	u2 := &model.User{}
   558  	u2.Username = "a000000001" + model.NewId()
   559  	u2.Email = MakeEmail()
   560  	store.Must(ss.User().Save(u2))
   561  	defer ss.User().PermanentDelete(u2.Id)
   562  
   563  	if r1 := <-ss.User().GetProfilesWithoutTeam(0, 100); r1.Err != nil {
   564  		t.Fatal(r1.Err)
   565  	} else {
   566  		users := r1.Data.([]*model.User)
   567  
   568  		found1 := false
   569  		found2 := false
   570  		for _, u := range users {
   571  			if u.Id == u1.Id {
   572  				found1 = true
   573  			} else if u.Id == u2.Id {
   574  				found2 = true
   575  			}
   576  		}
   577  
   578  		if found1 {
   579  			t.Fatal("shouldn't have returned user on team")
   580  		} else if !found2 {
   581  			t.Fatal("should've returned user without any teams")
   582  		}
   583  	}
   584  }
   585  
   586  func testUserStoreGetAllProfilesInChannel(t *testing.T, ss store.Store) {
   587  	teamId := model.NewId()
   588  
   589  	u1 := &model.User{}
   590  	u1.Email = MakeEmail()
   591  	store.Must(ss.User().Save(u1))
   592  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
   593  
   594  	u2 := &model.User{}
   595  	u2.Email = MakeEmail()
   596  	store.Must(ss.User().Save(u2))
   597  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1))
   598  
   599  	c1 := model.Channel{}
   600  	c1.TeamId = teamId
   601  	c1.DisplayName = "Profiles in channel"
   602  	c1.Name = "profiles-" + model.NewId()
   603  	c1.Type = model.CHANNEL_OPEN
   604  
   605  	c2 := model.Channel{}
   606  	c2.TeamId = teamId
   607  	c2.DisplayName = "Profiles in private"
   608  	c2.Name = "profiles-" + model.NewId()
   609  	c2.Type = model.CHANNEL_PRIVATE
   610  
   611  	store.Must(ss.Channel().Save(&c1, -1))
   612  	store.Must(ss.Channel().Save(&c2, -1))
   613  
   614  	m1 := model.ChannelMember{}
   615  	m1.ChannelId = c1.Id
   616  	m1.UserId = u1.Id
   617  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
   618  
   619  	m2 := model.ChannelMember{}
   620  	m2.ChannelId = c1.Id
   621  	m2.UserId = u2.Id
   622  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
   623  
   624  	m3 := model.ChannelMember{}
   625  	m3.ChannelId = c2.Id
   626  	m3.UserId = u1.Id
   627  	m3.NotifyProps = model.GetDefaultChannelNotifyProps()
   628  
   629  	store.Must(ss.Channel().SaveMember(&m1))
   630  	store.Must(ss.Channel().SaveMember(&m2))
   631  	store.Must(ss.Channel().SaveMember(&m3))
   632  
   633  	if r1 := <-ss.User().GetAllProfilesInChannel(c1.Id, false); r1.Err != nil {
   634  		t.Fatal(r1.Err)
   635  	} else {
   636  		users := r1.Data.(map[string]*model.User)
   637  		if len(users) != 2 {
   638  			t.Fatal("invalid returned users")
   639  		}
   640  
   641  		if users[u1.Id].Id != u1.Id {
   642  			t.Fatal("invalid returned user")
   643  		}
   644  	}
   645  
   646  	if r2 := <-ss.User().GetAllProfilesInChannel(c2.Id, false); r2.Err != nil {
   647  		t.Fatal(r2.Err)
   648  	} else {
   649  		if len(r2.Data.(map[string]*model.User)) != 1 {
   650  			t.Fatal("should have returned empty map")
   651  		}
   652  	}
   653  
   654  	if r2 := <-ss.User().GetAllProfilesInChannel(c2.Id, true); r2.Err != nil {
   655  		t.Fatal(r2.Err)
   656  	} else {
   657  		if len(r2.Data.(map[string]*model.User)) != 1 {
   658  			t.Fatal("should have returned empty map")
   659  		}
   660  	}
   661  
   662  	if r2 := <-ss.User().GetAllProfilesInChannel(c2.Id, true); r2.Err != nil {
   663  		t.Fatal(r2.Err)
   664  	} else {
   665  		if len(r2.Data.(map[string]*model.User)) != 1 {
   666  			t.Fatal("should have returned empty map")
   667  		}
   668  	}
   669  
   670  	ss.User().InvalidateProfilesInChannelCacheByUser(u1.Id)
   671  	ss.User().InvalidateProfilesInChannelCache(c2.Id)
   672  }
   673  
   674  func testUserStoreGetProfilesNotInChannel(t *testing.T, ss store.Store) {
   675  	teamId := model.NewId()
   676  
   677  	u1 := &model.User{}
   678  	u1.Email = MakeEmail()
   679  	store.Must(ss.User().Save(u1))
   680  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
   681  
   682  	u2 := &model.User{}
   683  	u2.Email = MakeEmail()
   684  	store.Must(ss.User().Save(u2))
   685  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1))
   686  
   687  	c1 := model.Channel{}
   688  	c1.TeamId = teamId
   689  	c1.DisplayName = "Profiles in channel"
   690  	c1.Name = "profiles-" + model.NewId()
   691  	c1.Type = model.CHANNEL_OPEN
   692  
   693  	c2 := model.Channel{}
   694  	c2.TeamId = teamId
   695  	c2.DisplayName = "Profiles in private"
   696  	c2.Name = "profiles-" + model.NewId()
   697  	c2.Type = model.CHANNEL_PRIVATE
   698  
   699  	store.Must(ss.Channel().Save(&c1, -1))
   700  	store.Must(ss.Channel().Save(&c2, -1))
   701  
   702  	if r1 := <-ss.User().GetProfilesNotInChannel(teamId, c1.Id, 0, 100); r1.Err != nil {
   703  		t.Fatal(r1.Err)
   704  	} else {
   705  		users := r1.Data.([]*model.User)
   706  		if len(users) != 2 {
   707  			t.Fatal("invalid returned users")
   708  		}
   709  
   710  		found := false
   711  		for _, u := range users {
   712  			if u.Id == u1.Id {
   713  				found = true
   714  			}
   715  		}
   716  
   717  		if !found {
   718  			t.Fatal("missing user")
   719  		}
   720  	}
   721  
   722  	if r2 := <-ss.User().GetProfilesNotInChannel(teamId, c2.Id, 0, 100); r2.Err != nil {
   723  		t.Fatal(r2.Err)
   724  	} else {
   725  		if len(r2.Data.([]*model.User)) != 2 {
   726  			t.Fatal("invalid returned users")
   727  		}
   728  	}
   729  
   730  	m1 := model.ChannelMember{}
   731  	m1.ChannelId = c1.Id
   732  	m1.UserId = u1.Id
   733  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
   734  
   735  	m2 := model.ChannelMember{}
   736  	m2.ChannelId = c1.Id
   737  	m2.UserId = u2.Id
   738  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
   739  
   740  	m3 := model.ChannelMember{}
   741  	m3.ChannelId = c2.Id
   742  	m3.UserId = u1.Id
   743  	m3.NotifyProps = model.GetDefaultChannelNotifyProps()
   744  
   745  	store.Must(ss.Channel().SaveMember(&m1))
   746  	store.Must(ss.Channel().SaveMember(&m2))
   747  	store.Must(ss.Channel().SaveMember(&m3))
   748  
   749  	if r1 := <-ss.User().GetProfilesNotInChannel(teamId, c1.Id, 0, 100); r1.Err != nil {
   750  		t.Fatal(r1.Err)
   751  	} else {
   752  		users := r1.Data.([]*model.User)
   753  		if len(users) != 0 {
   754  			t.Fatal("invalid returned users")
   755  		}
   756  	}
   757  
   758  	if r2 := <-ss.User().GetProfilesNotInChannel(teamId, c2.Id, 0, 100); r2.Err != nil {
   759  		t.Fatal(r2.Err)
   760  	} else {
   761  		if len(r2.Data.([]*model.User)) != 1 {
   762  			t.Fatal("should have had 1 user not in channel")
   763  		}
   764  	}
   765  }
   766  
   767  func testUserStoreGetProfilesByIds(t *testing.T, ss store.Store) {
   768  	teamId := model.NewId()
   769  
   770  	u1 := &model.User{}
   771  	u1.Email = MakeEmail()
   772  	store.Must(ss.User().Save(u1))
   773  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
   774  
   775  	u2 := &model.User{}
   776  	u2.Email = MakeEmail()
   777  	store.Must(ss.User().Save(u2))
   778  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1))
   779  
   780  	if r1 := <-ss.User().GetProfileByIds([]string{u1.Id}, false); r1.Err != nil {
   781  		t.Fatal(r1.Err)
   782  	} else {
   783  		users := r1.Data.([]*model.User)
   784  		if len(users) != 1 {
   785  			t.Fatal("invalid returned users")
   786  		}
   787  
   788  		found := false
   789  		for _, u := range users {
   790  			if u.Id == u1.Id {
   791  				found = true
   792  			}
   793  		}
   794  
   795  		if !found {
   796  			t.Fatal("missing user")
   797  		}
   798  	}
   799  
   800  	if r1 := <-ss.User().GetProfileByIds([]string{u1.Id}, true); r1.Err != nil {
   801  		t.Fatal(r1.Err)
   802  	} else {
   803  		users := r1.Data.([]*model.User)
   804  		if len(users) != 1 {
   805  			t.Fatal("invalid returned users")
   806  		}
   807  
   808  		found := false
   809  		for _, u := range users {
   810  			if u.Id == u1.Id {
   811  				found = true
   812  			}
   813  		}
   814  
   815  		if !found {
   816  			t.Fatal("missing user")
   817  		}
   818  	}
   819  
   820  	if r1 := <-ss.User().GetProfileByIds([]string{u1.Id, u2.Id}, true); r1.Err != nil {
   821  		t.Fatal(r1.Err)
   822  	} else {
   823  		users := r1.Data.([]*model.User)
   824  		if len(users) != 2 {
   825  			t.Fatal("invalid returned users")
   826  		}
   827  
   828  		found := false
   829  		for _, u := range users {
   830  			if u.Id == u1.Id {
   831  				found = true
   832  			}
   833  		}
   834  
   835  		if !found {
   836  			t.Fatal("missing user")
   837  		}
   838  	}
   839  
   840  	if r1 := <-ss.User().GetProfileByIds([]string{u1.Id, u2.Id}, true); r1.Err != nil {
   841  		t.Fatal(r1.Err)
   842  	} else {
   843  		users := r1.Data.([]*model.User)
   844  		if len(users) != 2 {
   845  			t.Fatal("invalid returned users")
   846  		}
   847  
   848  		found := false
   849  		for _, u := range users {
   850  			if u.Id == u1.Id {
   851  				found = true
   852  			}
   853  		}
   854  
   855  		if !found {
   856  			t.Fatal("missing user")
   857  		}
   858  	}
   859  
   860  	if r1 := <-ss.User().GetProfileByIds([]string{u1.Id, u2.Id}, false); r1.Err != nil {
   861  		t.Fatal(r1.Err)
   862  	} else {
   863  		users := r1.Data.([]*model.User)
   864  		if len(users) != 2 {
   865  			t.Fatal("invalid returned users")
   866  		}
   867  
   868  		found := false
   869  		for _, u := range users {
   870  			if u.Id == u1.Id {
   871  				found = true
   872  			}
   873  		}
   874  
   875  		if !found {
   876  			t.Fatal("missing user")
   877  		}
   878  	}
   879  
   880  	if r1 := <-ss.User().GetProfileByIds([]string{u1.Id}, false); r1.Err != nil {
   881  		t.Fatal(r1.Err)
   882  	} else {
   883  		users := r1.Data.([]*model.User)
   884  		if len(users) != 1 {
   885  			t.Fatal("invalid returned users")
   886  		}
   887  
   888  		found := false
   889  		for _, u := range users {
   890  			if u.Id == u1.Id {
   891  				found = true
   892  			}
   893  		}
   894  
   895  		if !found {
   896  			t.Fatal("missing user")
   897  		}
   898  	}
   899  
   900  	if r2 := <-ss.User().GetProfiles("123", 0, 100); r2.Err != nil {
   901  		t.Fatal(r2.Err)
   902  	} else {
   903  		if len(r2.Data.([]*model.User)) != 0 {
   904  			t.Fatal("should have returned empty array")
   905  		}
   906  	}
   907  }
   908  
   909  func testUserStoreGetProfilesByUsernames(t *testing.T, ss store.Store) {
   910  	teamId := model.NewId()
   911  
   912  	u1 := &model.User{}
   913  	u1.Email = MakeEmail()
   914  	u1.Username = "username1" + model.NewId()
   915  	store.Must(ss.User().Save(u1))
   916  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
   917  
   918  	u2 := &model.User{}
   919  	u2.Email = MakeEmail()
   920  	u2.Username = "username2" + model.NewId()
   921  	store.Must(ss.User().Save(u2))
   922  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1))
   923  
   924  	if r1 := <-ss.User().GetProfilesByUsernames([]string{u1.Username, u2.Username}, teamId); r1.Err != nil {
   925  		t.Fatal(r1.Err)
   926  	} else {
   927  		users := r1.Data.([]*model.User)
   928  		if len(users) != 2 {
   929  			t.Fatal("invalid returned users")
   930  		}
   931  
   932  		if users[0].Id != u1.Id && users[1].Id != u1.Id {
   933  			t.Fatal("invalid returned user 1")
   934  		}
   935  
   936  		if users[0].Id != u2.Id && users[1].Id != u2.Id {
   937  			t.Fatal("invalid returned user 2")
   938  		}
   939  	}
   940  
   941  	if r1 := <-ss.User().GetProfilesByUsernames([]string{u1.Username}, teamId); r1.Err != nil {
   942  		t.Fatal(r1.Err)
   943  	} else {
   944  		users := r1.Data.([]*model.User)
   945  		if len(users) != 1 {
   946  			t.Fatal("invalid returned users")
   947  		}
   948  
   949  		if users[0].Id != u1.Id {
   950  			t.Fatal("invalid returned user")
   951  		}
   952  	}
   953  
   954  	team2Id := model.NewId()
   955  
   956  	u3 := &model.User{}
   957  	u3.Email = MakeEmail()
   958  	u3.Username = "username3" + model.NewId()
   959  	store.Must(ss.User().Save(u3))
   960  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: team2Id, UserId: u3.Id}, -1))
   961  
   962  	if r1 := <-ss.User().GetProfilesByUsernames([]string{u1.Username, u3.Username}, ""); r1.Err != nil {
   963  		t.Fatal(r1.Err)
   964  	} else {
   965  		users := r1.Data.([]*model.User)
   966  		if len(users) != 2 {
   967  			t.Fatal("invalid returned users")
   968  		}
   969  
   970  		if users[0].Id != u1.Id && users[1].Id != u1.Id {
   971  			t.Fatal("invalid returned user 1")
   972  		}
   973  
   974  		if users[0].Id != u3.Id && users[1].Id != u3.Id {
   975  			t.Fatal("invalid returned user 3")
   976  		}
   977  	}
   978  
   979  	if r1 := <-ss.User().GetProfilesByUsernames([]string{u1.Username, u3.Username}, teamId); r1.Err != nil {
   980  		t.Fatal(r1.Err)
   981  	} else {
   982  		users := r1.Data.([]*model.User)
   983  		if len(users) != 1 {
   984  			t.Fatal("invalid returned users")
   985  		}
   986  
   987  		if users[0].Id != u1.Id {
   988  			t.Fatal("invalid returned user")
   989  		}
   990  	}
   991  }
   992  
   993  func testUserStoreGetSystemAdminProfiles(t *testing.T, ss store.Store) {
   994  	teamId := model.NewId()
   995  
   996  	u1 := &model.User{}
   997  	u1.Email = MakeEmail()
   998  	u1.Roles = model.SYSTEM_USER_ROLE_ID + " " + model.SYSTEM_ADMIN_ROLE_ID
   999  	store.Must(ss.User().Save(u1))
  1000  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
  1001  
  1002  	u2 := &model.User{}
  1003  	u2.Email = MakeEmail()
  1004  	store.Must(ss.User().Save(u2))
  1005  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1))
  1006  
  1007  	if r1 := <-ss.User().GetSystemAdminProfiles(); r1.Err != nil {
  1008  		t.Fatal(r1.Err)
  1009  	} else {
  1010  		users := r1.Data.(map[string]*model.User)
  1011  		if len(users) <= 0 {
  1012  			t.Fatal("invalid returned system admin users")
  1013  		}
  1014  	}
  1015  }
  1016  
  1017  func testUserStoreGetByEmail(t *testing.T, ss store.Store) {
  1018  	teamid := model.NewId()
  1019  
  1020  	u1 := &model.User{}
  1021  	u1.Email = MakeEmail()
  1022  	store.Must(ss.User().Save(u1))
  1023  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamid, UserId: u1.Id}, -1))
  1024  
  1025  	if err := (<-ss.User().GetByEmail(u1.Email)).Err; err != nil {
  1026  		t.Fatal(err)
  1027  	}
  1028  
  1029  	if err := (<-ss.User().GetByEmail("")).Err; err == nil {
  1030  		t.Fatal("Should have failed because of missing email")
  1031  	}
  1032  }
  1033  
  1034  func testUserStoreGetByAuthData(t *testing.T, ss store.Store) {
  1035  	teamId := model.NewId()
  1036  
  1037  	auth := "123" + model.NewId()
  1038  
  1039  	u1 := &model.User{}
  1040  	u1.Email = MakeEmail()
  1041  	u1.AuthData = &auth
  1042  	u1.AuthService = "service"
  1043  	store.Must(ss.User().Save(u1))
  1044  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
  1045  
  1046  	if err := (<-ss.User().GetByAuth(u1.AuthData, u1.AuthService)).Err; err != nil {
  1047  		t.Fatal(err)
  1048  	}
  1049  
  1050  	rauth := ""
  1051  	if err := (<-ss.User().GetByAuth(&rauth, "")).Err; err == nil {
  1052  		t.Fatal("Should have failed because of missing auth data")
  1053  	}
  1054  }
  1055  
  1056  func testUserStoreGetByUsername(t *testing.T, ss store.Store) {
  1057  	teamId := model.NewId()
  1058  
  1059  	u1 := &model.User{}
  1060  	u1.Email = MakeEmail()
  1061  	u1.Username = model.NewId()
  1062  	store.Must(ss.User().Save(u1))
  1063  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
  1064  
  1065  	if err := (<-ss.User().GetByUsername(u1.Username)).Err; err != nil {
  1066  		t.Fatal(err)
  1067  	}
  1068  
  1069  	if err := (<-ss.User().GetByUsername("")).Err; err == nil {
  1070  		t.Fatal("Should have failed because of missing username")
  1071  	}
  1072  }
  1073  
  1074  func testUserStoreGetForLogin(t *testing.T, ss store.Store) {
  1075  	auth := model.NewId()
  1076  
  1077  	u1 := &model.User{
  1078  		Email:       MakeEmail(),
  1079  		Username:    model.NewId(),
  1080  		AuthService: model.USER_AUTH_SERVICE_GITLAB,
  1081  		AuthData:    &auth,
  1082  	}
  1083  	store.Must(ss.User().Save(u1))
  1084  
  1085  	auth2 := model.NewId()
  1086  
  1087  	u2 := &model.User{
  1088  		Email:       MakeEmail(),
  1089  		Username:    model.NewId(),
  1090  		AuthService: model.USER_AUTH_SERVICE_LDAP,
  1091  		AuthData:    &auth2,
  1092  	}
  1093  	store.Must(ss.User().Save(u2))
  1094  
  1095  	if result := <-ss.User().GetForLogin(u1.Username, true, true); result.Err != nil {
  1096  		t.Fatal("Should have gotten user by username", result.Err)
  1097  	} else if result.Data.(*model.User).Id != u1.Id {
  1098  		t.Fatal("Should have gotten user1 by username")
  1099  	}
  1100  
  1101  	if result := <-ss.User().GetForLogin(u1.Email, true, true); result.Err != nil {
  1102  		t.Fatal("Should have gotten user by email", result.Err)
  1103  	} else if result.Data.(*model.User).Id != u1.Id {
  1104  		t.Fatal("Should have gotten user1 by email")
  1105  	}
  1106  
  1107  	// prevent getting user when different login methods are disabled
  1108  	if result := <-ss.User().GetForLogin(u1.Username, false, true); result.Err == nil {
  1109  		t.Fatal("Should have failed to get user1 by username")
  1110  	}
  1111  
  1112  	if result := <-ss.User().GetForLogin(u1.Email, true, false); result.Err == nil {
  1113  		t.Fatal("Should have failed to get user1 by email")
  1114  	}
  1115  }
  1116  
  1117  func testUserStoreUpdatePassword(t *testing.T, ss store.Store) {
  1118  	teamId := model.NewId()
  1119  
  1120  	u1 := &model.User{}
  1121  	u1.Email = MakeEmail()
  1122  	store.Must(ss.User().Save(u1))
  1123  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
  1124  
  1125  	hashedPassword := model.HashPassword("newpwd")
  1126  
  1127  	if err := (<-ss.User().UpdatePassword(u1.Id, hashedPassword)).Err; err != nil {
  1128  		t.Fatal(err)
  1129  	}
  1130  
  1131  	if r1 := <-ss.User().GetByEmail(u1.Email); r1.Err != nil {
  1132  		t.Fatal(r1.Err)
  1133  	} else {
  1134  		user := r1.Data.(*model.User)
  1135  		if user.Password != hashedPassword {
  1136  			t.Fatal("Password was not updated correctly")
  1137  		}
  1138  	}
  1139  }
  1140  
  1141  func testUserStoreDelete(t *testing.T, ss store.Store) {
  1142  	u1 := &model.User{}
  1143  	u1.Email = MakeEmail()
  1144  	store.Must(ss.User().Save(u1))
  1145  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1))
  1146  
  1147  	if err := (<-ss.User().PermanentDelete(u1.Id)).Err; err != nil {
  1148  		t.Fatal(err)
  1149  	}
  1150  }
  1151  
  1152  func testUserStoreUpdateAuthData(t *testing.T, ss store.Store) {
  1153  	teamId := model.NewId()
  1154  
  1155  	u1 := &model.User{}
  1156  	u1.Email = MakeEmail()
  1157  	store.Must(ss.User().Save(u1))
  1158  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
  1159  
  1160  	service := "someservice"
  1161  	authData := model.NewId()
  1162  
  1163  	if err := (<-ss.User().UpdateAuthData(u1.Id, service, &authData, "", true)).Err; err != nil {
  1164  		t.Fatal(err)
  1165  	}
  1166  
  1167  	if r1 := <-ss.User().GetByEmail(u1.Email); r1.Err != nil {
  1168  		t.Fatal(r1.Err)
  1169  	} else {
  1170  		user := r1.Data.(*model.User)
  1171  		if user.AuthService != service {
  1172  			t.Fatal("AuthService was not updated correctly")
  1173  		}
  1174  		if *user.AuthData != authData {
  1175  			t.Fatal("AuthData was not updated correctly")
  1176  		}
  1177  		if user.Password != "" {
  1178  			t.Fatal("Password was not cleared properly")
  1179  		}
  1180  	}
  1181  }
  1182  
  1183  func testUserUnreadCount(t *testing.T, ss store.Store) {
  1184  	teamId := model.NewId()
  1185  
  1186  	c1 := model.Channel{}
  1187  	c1.TeamId = teamId
  1188  	c1.DisplayName = "Unread Messages"
  1189  	c1.Name = "unread-messages-" + model.NewId()
  1190  	c1.Type = model.CHANNEL_OPEN
  1191  
  1192  	c2 := model.Channel{}
  1193  	c2.TeamId = teamId
  1194  	c2.DisplayName = "Unread Direct"
  1195  	c2.Name = "unread-direct-" + model.NewId()
  1196  	c2.Type = model.CHANNEL_DIRECT
  1197  
  1198  	u1 := &model.User{}
  1199  	u1.Username = "user1" + model.NewId()
  1200  	u1.Email = MakeEmail()
  1201  	store.Must(ss.User().Save(u1))
  1202  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
  1203  
  1204  	u2 := &model.User{}
  1205  	u2.Email = MakeEmail()
  1206  	u2.Username = "user2" + model.NewId()
  1207  	store.Must(ss.User().Save(u2))
  1208  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1))
  1209  
  1210  	if err := (<-ss.Channel().Save(&c1, -1)).Err; err != nil {
  1211  		t.Fatal("couldn't save item", err)
  1212  	}
  1213  
  1214  	m1 := model.ChannelMember{}
  1215  	m1.ChannelId = c1.Id
  1216  	m1.UserId = u1.Id
  1217  	m1.NotifyProps = model.GetDefaultChannelNotifyProps()
  1218  
  1219  	m2 := model.ChannelMember{}
  1220  	m2.ChannelId = c1.Id
  1221  	m2.UserId = u2.Id
  1222  	m2.NotifyProps = model.GetDefaultChannelNotifyProps()
  1223  
  1224  	store.Must(ss.Channel().SaveMember(&m1))
  1225  	store.Must(ss.Channel().SaveMember(&m2))
  1226  
  1227  	m1.ChannelId = c2.Id
  1228  	m2.ChannelId = c2.Id
  1229  
  1230  	if err := (<-ss.Channel().SaveDirectChannel(&c2, &m1, &m2)).Err; err != nil {
  1231  		t.Fatal("couldn't save direct channel", err)
  1232  	}
  1233  
  1234  	p1 := model.Post{}
  1235  	p1.ChannelId = c1.Id
  1236  	p1.UserId = u1.Id
  1237  	p1.Message = "this is a message for @" + u2.Username
  1238  
  1239  	// Post one message with mention to open channel
  1240  	store.Must(ss.Post().Save(&p1))
  1241  	store.Must(ss.Channel().IncrementMentionCount(c1.Id, u2.Id))
  1242  
  1243  	// Post 2 messages without mention to direct channel
  1244  	p2 := model.Post{}
  1245  	p2.ChannelId = c2.Id
  1246  	p2.UserId = u1.Id
  1247  	p2.Message = "first message"
  1248  	store.Must(ss.Post().Save(&p2))
  1249  	store.Must(ss.Channel().IncrementMentionCount(c2.Id, u2.Id))
  1250  
  1251  	p3 := model.Post{}
  1252  	p3.ChannelId = c2.Id
  1253  	p3.UserId = u1.Id
  1254  	p3.Message = "second message"
  1255  	store.Must(ss.Post().Save(&p3))
  1256  	store.Must(ss.Channel().IncrementMentionCount(c2.Id, u2.Id))
  1257  
  1258  	badge := (<-ss.User().GetUnreadCount(u2.Id)).Data.(int64)
  1259  	if badge != 3 {
  1260  		t.Fatal("should have 3 unread messages")
  1261  	}
  1262  
  1263  	badge = (<-ss.User().GetUnreadCountForChannel(u2.Id, c1.Id)).Data.(int64)
  1264  	if badge != 1 {
  1265  		t.Fatal("should have 1 unread messages for that channel")
  1266  	}
  1267  
  1268  	badge = (<-ss.User().GetUnreadCountForChannel(u2.Id, c2.Id)).Data.(int64)
  1269  	if badge != 2 {
  1270  		t.Fatal("should have 2 unread messages for that channel")
  1271  	}
  1272  }
  1273  
  1274  func testUserStoreUpdateMfaSecret(t *testing.T, ss store.Store) {
  1275  	u1 := model.User{}
  1276  	u1.Email = MakeEmail()
  1277  	store.Must(ss.User().Save(&u1))
  1278  
  1279  	time.Sleep(100 * time.Millisecond)
  1280  
  1281  	if err := (<-ss.User().UpdateMfaSecret(u1.Id, "12345")).Err; err != nil {
  1282  		t.Fatal(err)
  1283  	}
  1284  
  1285  	// should pass, no update will occur though
  1286  	if err := (<-ss.User().UpdateMfaSecret("junk", "12345")).Err; err != nil {
  1287  		t.Fatal(err)
  1288  	}
  1289  }
  1290  
  1291  func testUserStoreUpdateMfaActive(t *testing.T, ss store.Store) {
  1292  	u1 := model.User{}
  1293  	u1.Email = MakeEmail()
  1294  	store.Must(ss.User().Save(&u1))
  1295  
  1296  	time.Sleep(100 * time.Millisecond)
  1297  
  1298  	if err := (<-ss.User().UpdateMfaActive(u1.Id, true)).Err; err != nil {
  1299  		t.Fatal(err)
  1300  	}
  1301  
  1302  	if err := (<-ss.User().UpdateMfaActive(u1.Id, false)).Err; err != nil {
  1303  		t.Fatal(err)
  1304  	}
  1305  
  1306  	// should pass, no update will occur though
  1307  	if err := (<-ss.User().UpdateMfaActive("junk", true)).Err; err != nil {
  1308  		t.Fatal(err)
  1309  	}
  1310  }
  1311  
  1312  func testUserStoreGetRecentlyActiveUsersForTeam(t *testing.T, ss store.Store) {
  1313  	u1 := &model.User{}
  1314  	u1.Email = MakeEmail()
  1315  	store.Must(ss.User().Save(u1))
  1316  	store.Must(ss.Status().SaveOrUpdate(&model.Status{UserId: u1.Id, Status: model.STATUS_ONLINE, Manual: false, LastActivityAt: model.GetMillis(), ActiveChannel: ""}))
  1317  	tid := model.NewId()
  1318  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u1.Id}, -1))
  1319  
  1320  	if r1 := <-ss.User().GetRecentlyActiveUsersForTeam(tid, 0, 100); r1.Err != nil {
  1321  		t.Fatal(r1.Err)
  1322  	}
  1323  }
  1324  
  1325  func testUserStoreGetNewUsersForTeam(t *testing.T, ss store.Store) {
  1326  	u1 := &model.User{}
  1327  	u1.Email = MakeEmail()
  1328  	store.Must(ss.User().Save(u1))
  1329  	store.Must(ss.Status().SaveOrUpdate(&model.Status{UserId: u1.Id, Status: model.STATUS_ONLINE, Manual: false, LastActivityAt: model.GetMillis(), ActiveChannel: ""}))
  1330  	tid := model.NewId()
  1331  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u1.Id}, -1))
  1332  
  1333  	if r1 := <-ss.User().GetNewUsersForTeam(tid, 0, 100); r1.Err != nil {
  1334  		t.Fatal(r1.Err)
  1335  	}
  1336  }
  1337  
  1338  func testUserStoreSearch(t *testing.T, ss store.Store) {
  1339  	u1 := &model.User{}
  1340  	u1.Username = "jimbo" + model.NewId()
  1341  	u1.FirstName = "Tim"
  1342  	u1.LastName = "Bill"
  1343  	u1.Nickname = "Rob"
  1344  	u1.Email = "harold" + model.NewId() + "@simulator.amazonses.com"
  1345  	store.Must(ss.User().Save(u1))
  1346  
  1347  	u2 := &model.User{}
  1348  	u2.Username = "jim-bobby" + model.NewId()
  1349  	u2.Email = MakeEmail()
  1350  	store.Must(ss.User().Save(u2))
  1351  
  1352  	u3 := &model.User{}
  1353  	u3.Username = "jimbo" + model.NewId()
  1354  	u3.Email = MakeEmail()
  1355  	u3.DeleteAt = 1
  1356  	store.Must(ss.User().Save(u3))
  1357  
  1358  	u5 := &model.User{}
  1359  	u5.Username = "yu" + model.NewId()
  1360  	u5.FirstName = "En"
  1361  	u5.LastName = "Yu"
  1362  	u5.Nickname = "enyu"
  1363  	u5.Email = MakeEmail()
  1364  	store.Must(ss.User().Save(u5))
  1365  
  1366  	u6 := &model.User{}
  1367  	u6.Username = "underscore" + model.NewId()
  1368  	u6.FirstName = "Du_"
  1369  	u6.LastName = "_DE"
  1370  	u6.Nickname = "lodash"
  1371  	u6.Email = MakeEmail()
  1372  	store.Must(ss.User().Save(u6))
  1373  
  1374  	tid := model.NewId()
  1375  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u1.Id}, -1))
  1376  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u2.Id}, -1))
  1377  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u3.Id}, -1))
  1378  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u5.Id}, -1))
  1379  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u6.Id}, -1))
  1380  
  1381  	searchOptions := map[string]bool{}
  1382  	searchOptions[store.USER_SEARCH_OPTION_NAMES_ONLY] = true
  1383  
  1384  	if r1 := <-ss.User().Search(tid, "jimb", searchOptions); r1.Err != nil {
  1385  		t.Fatal(r1.Err)
  1386  	} else {
  1387  		profiles := r1.Data.([]*model.User)
  1388  		found1 := false
  1389  		found2 := false
  1390  		for _, profile := range profiles {
  1391  			if profile.Id == u1.Id {
  1392  				found1 = true
  1393  			}
  1394  
  1395  			if profile.Id == u3.Id {
  1396  				found2 = true
  1397  			}
  1398  		}
  1399  
  1400  		if !found1 {
  1401  			t.Fatal("should have found user")
  1402  		}
  1403  
  1404  		if found2 {
  1405  			t.Fatal("should not have found inactive user")
  1406  		}
  1407  	}
  1408  
  1409  	if r1 := <-ss.User().Search(tid, "en", searchOptions); r1.Err != nil {
  1410  		t.Fatal(r1.Err)
  1411  	} else {
  1412  		profiles := r1.Data.([]*model.User)
  1413  		found1 := false
  1414  		for _, profile := range profiles {
  1415  			if profile.Id == u5.Id {
  1416  				found1 = true
  1417  			}
  1418  		}
  1419  
  1420  		if !found1 {
  1421  			t.Fatal("should have found user")
  1422  		}
  1423  	}
  1424  
  1425  	searchOptions[store.USER_SEARCH_OPTION_NAMES_ONLY] = false
  1426  
  1427  	if r1 := <-ss.User().Search(tid, u1.Email, searchOptions); r1.Err != nil {
  1428  		t.Fatal(r1.Err)
  1429  	} else {
  1430  		profiles := r1.Data.([]*model.User)
  1431  		found1 := false
  1432  		for _, profile := range profiles {
  1433  			if profile.Id == u1.Id {
  1434  				found1 = true
  1435  			}
  1436  		}
  1437  
  1438  		if !found1 {
  1439  			t.Fatal("should have found user")
  1440  		}
  1441  	}
  1442  
  1443  	searchOptions[store.USER_SEARCH_OPTION_NAMES_ONLY] = true
  1444  
  1445  	// * should be treated as a space
  1446  	if r1 := <-ss.User().Search(tid, "jimb*", searchOptions); r1.Err != nil {
  1447  		t.Fatal(r1.Err)
  1448  	} else {
  1449  		profiles := r1.Data.([]*model.User)
  1450  		found1 := false
  1451  		found2 := false
  1452  		for _, profile := range profiles {
  1453  			if profile.Id == u1.Id {
  1454  				found1 = true
  1455  			}
  1456  
  1457  			if profile.Id == u3.Id {
  1458  				found2 = true
  1459  			}
  1460  		}
  1461  
  1462  		if !found1 {
  1463  			t.Fatal("should have found user")
  1464  		}
  1465  
  1466  		if found2 {
  1467  			t.Fatal("should not have found inactive user")
  1468  		}
  1469  	}
  1470  
  1471  	if r1 := <-ss.User().Search(tid, "harol", searchOptions); r1.Err != nil {
  1472  		t.Fatal(r1.Err)
  1473  	} else {
  1474  		profiles := r1.Data.([]*model.User)
  1475  		found1 := false
  1476  		for _, profile := range profiles {
  1477  			if profile.Id == u1.Id {
  1478  				found1 = true
  1479  			}
  1480  		}
  1481  
  1482  		if found1 {
  1483  			t.Fatal("should not have found user")
  1484  		}
  1485  	}
  1486  
  1487  	// % should be escaped and searched for.
  1488  	if r1 := <-ss.User().Search(tid, "h%", searchOptions); r1.Err != nil {
  1489  		t.Fatal(r1.Err)
  1490  	} else {
  1491  		profiles := r1.Data.([]*model.User)
  1492  		if len(profiles) != 0 {
  1493  			t.Fatal("shouldn't have found anything")
  1494  		}
  1495  	}
  1496  
  1497  	// "_" should be properly escaped and searched for.
  1498  	if r1 := <-ss.User().Search(tid, "h_", searchOptions); r1.Err != nil {
  1499  		t.Fatal(r1.Err)
  1500  	} else {
  1501  		profiles := r1.Data.([]*model.User)
  1502  		if len(profiles) != 0 {
  1503  			t.Fatal("shouldn't have found anything")
  1504  		}
  1505  	}
  1506  	if r1 := <-ss.User().Search(tid, "Du_", searchOptions); r1.Err != nil {
  1507  		t.Fatal(r1.Err)
  1508  	} else {
  1509  		profiles := r1.Data.([]*model.User)
  1510  		found6 := false
  1511  		for _, profile := range profiles {
  1512  			if profile.Id == u6.Id {
  1513  				found6 = true
  1514  			}
  1515  		}
  1516  
  1517  		if !found6 {
  1518  			t.Fatal("should have found user")
  1519  		}
  1520  	}
  1521  	if r1 := <-ss.User().Search(tid, "_dE", searchOptions); r1.Err != nil {
  1522  		t.Fatal(r1.Err)
  1523  	} else {
  1524  		profiles := r1.Data.([]*model.User)
  1525  		found6 := false
  1526  		for _, profile := range profiles {
  1527  			if profile.Id == u6.Id {
  1528  				found6 = true
  1529  			}
  1530  		}
  1531  
  1532  		if !found6 {
  1533  			t.Fatal("should have found user")
  1534  		}
  1535  	}
  1536  
  1537  	searchOptions[store.USER_SEARCH_OPTION_ALLOW_INACTIVE] = true
  1538  
  1539  	if r1 := <-ss.User().Search(tid, "jimb", searchOptions); r1.Err != nil {
  1540  		t.Fatal(r1.Err)
  1541  	} else {
  1542  		profiles := r1.Data.([]*model.User)
  1543  		found1 := false
  1544  		found2 := false
  1545  		for _, profile := range profiles {
  1546  			if profile.Id == u1.Id {
  1547  				found1 = true
  1548  			}
  1549  
  1550  			if profile.Id == u3.Id {
  1551  				found2 = true
  1552  			}
  1553  		}
  1554  
  1555  		if !found1 {
  1556  			t.Fatal("should have found user")
  1557  		}
  1558  
  1559  		if !found2 {
  1560  			t.Fatal("should have found inactive user")
  1561  		}
  1562  	}
  1563  
  1564  	searchOptions[store.USER_SEARCH_OPTION_ALLOW_INACTIVE] = false
  1565  
  1566  	if r1 := <-ss.User().Search(tid, "jimb", searchOptions); r1.Err != nil {
  1567  		t.Fatal(r1.Err)
  1568  	} else {
  1569  		profiles := r1.Data.([]*model.User)
  1570  		found := false
  1571  		for _, profile := range profiles {
  1572  			if profile.Id == u1.Id {
  1573  				found = true
  1574  				break
  1575  			}
  1576  		}
  1577  
  1578  		if !found {
  1579  			t.Fatal("should have found user")
  1580  		}
  1581  	}
  1582  
  1583  	if r1 := <-ss.User().Search("", "jimb", searchOptions); r1.Err != nil {
  1584  		t.Fatal(r1.Err)
  1585  	} else {
  1586  		profiles := r1.Data.([]*model.User)
  1587  		found := false
  1588  		for _, profile := range profiles {
  1589  			if profile.Id == u1.Id {
  1590  				found = true
  1591  				break
  1592  			}
  1593  		}
  1594  
  1595  		if !found {
  1596  			t.Fatal("should have found user")
  1597  		}
  1598  	}
  1599  
  1600  	if r1 := <-ss.User().Search("", "jim-bobb", searchOptions); r1.Err != nil {
  1601  		t.Fatal(r1.Err)
  1602  	} else {
  1603  		profiles := r1.Data.([]*model.User)
  1604  		found := false
  1605  		for _, profile := range profiles {
  1606  			t.Log(profile.Username)
  1607  			if profile.Id == u2.Id {
  1608  				found = true
  1609  				break
  1610  			}
  1611  		}
  1612  
  1613  		if !found {
  1614  			t.Fatal("should have found user")
  1615  		}
  1616  	}
  1617  
  1618  	if r1 := <-ss.User().Search(tid, "", searchOptions); r1.Err != nil {
  1619  		t.Fatal(r1.Err)
  1620  	}
  1621  
  1622  	c1 := model.Channel{}
  1623  	c1.TeamId = tid
  1624  	c1.DisplayName = "NameName"
  1625  	c1.Name = "zz" + model.NewId() + "b"
  1626  	c1.Type = model.CHANNEL_OPEN
  1627  	c1 = *store.Must(ss.Channel().Save(&c1, -1)).(*model.Channel)
  1628  
  1629  	if r1 := <-ss.User().SearchNotInChannel(tid, c1.Id, "jimb", searchOptions); r1.Err != nil {
  1630  		t.Fatal(r1.Err)
  1631  	} else {
  1632  		profiles := r1.Data.([]*model.User)
  1633  		found := false
  1634  		for _, profile := range profiles {
  1635  			if profile.Id == u1.Id {
  1636  				found = true
  1637  				break
  1638  			}
  1639  		}
  1640  
  1641  		if !found {
  1642  			t.Fatal("should have found user")
  1643  		}
  1644  	}
  1645  
  1646  	if r1 := <-ss.User().SearchNotInChannel("", c1.Id, "jimb", searchOptions); r1.Err != nil {
  1647  		t.Fatal(r1.Err)
  1648  	} else {
  1649  		profiles := r1.Data.([]*model.User)
  1650  		found := false
  1651  		for _, profile := range profiles {
  1652  			if profile.Id == u1.Id {
  1653  				found = true
  1654  				break
  1655  			}
  1656  		}
  1657  
  1658  		if !found {
  1659  			t.Fatal("should have found user")
  1660  		}
  1661  	}
  1662  
  1663  	if r1 := <-ss.User().SearchNotInChannel("junk", c1.Id, "jimb", searchOptions); r1.Err != nil {
  1664  		t.Fatal(r1.Err)
  1665  	} else {
  1666  		profiles := r1.Data.([]*model.User)
  1667  		found := false
  1668  		for _, profile := range profiles {
  1669  			if profile.Id == u1.Id {
  1670  				found = true
  1671  				break
  1672  			}
  1673  		}
  1674  
  1675  		if found {
  1676  			t.Fatal("should not have found user")
  1677  		}
  1678  	}
  1679  
  1680  	if r1 := <-ss.User().SearchInChannel(c1.Id, "jimb", searchOptions); r1.Err != nil {
  1681  		t.Fatal(r1.Err)
  1682  	} else {
  1683  		profiles := r1.Data.([]*model.User)
  1684  		found := false
  1685  		for _, profile := range profiles {
  1686  			if profile.Id == u1.Id {
  1687  				found = true
  1688  				break
  1689  			}
  1690  		}
  1691  
  1692  		if found {
  1693  			t.Fatal("should not have found user")
  1694  		}
  1695  	}
  1696  
  1697  	store.Must(ss.Channel().SaveMember(&model.ChannelMember{ChannelId: c1.Id, UserId: u1.Id, NotifyProps: model.GetDefaultChannelNotifyProps()}))
  1698  
  1699  	if r1 := <-ss.User().SearchInChannel(c1.Id, "jimb", searchOptions); r1.Err != nil {
  1700  		t.Fatal(r1.Err)
  1701  	} else {
  1702  		profiles := r1.Data.([]*model.User)
  1703  		found := false
  1704  		for _, profile := range profiles {
  1705  			if profile.Id == u1.Id {
  1706  				found = true
  1707  				break
  1708  			}
  1709  		}
  1710  
  1711  		if !found {
  1712  			t.Fatal("should have found user")
  1713  		}
  1714  	}
  1715  
  1716  	searchOptions = map[string]bool{}
  1717  
  1718  	if r1 := <-ss.User().Search(tid, "harol", searchOptions); r1.Err != nil {
  1719  		t.Fatal(r1.Err)
  1720  	} else {
  1721  		profiles := r1.Data.([]*model.User)
  1722  		found1 := false
  1723  		for _, profile := range profiles {
  1724  			if profile.Id == u1.Id {
  1725  				found1 = true
  1726  			}
  1727  		}
  1728  
  1729  		if !found1 {
  1730  			t.Fatal("should have found user")
  1731  		}
  1732  	}
  1733  
  1734  	if r1 := <-ss.User().Search(tid, "Tim", searchOptions); r1.Err != nil {
  1735  		t.Fatal(r1.Err)
  1736  	} else {
  1737  		profiles := r1.Data.([]*model.User)
  1738  		found := false
  1739  		for _, profile := range profiles {
  1740  			if profile.Id == u1.Id {
  1741  				found = true
  1742  				break
  1743  			}
  1744  		}
  1745  
  1746  		if !found {
  1747  			t.Fatal("should have found user")
  1748  		}
  1749  	}
  1750  
  1751  	if r1 := <-ss.User().Search(tid, "Bill", searchOptions); r1.Err != nil {
  1752  		t.Fatal(r1.Err)
  1753  	} else {
  1754  		profiles := r1.Data.([]*model.User)
  1755  		found := false
  1756  		for _, profile := range profiles {
  1757  			if profile.Id == u1.Id {
  1758  				found = true
  1759  				break
  1760  			}
  1761  		}
  1762  
  1763  		if !found {
  1764  			t.Fatal("should have found user")
  1765  		}
  1766  	}
  1767  
  1768  	if r1 := <-ss.User().Search(tid, "Rob", searchOptions); r1.Err != nil {
  1769  		t.Fatal(r1.Err)
  1770  	} else {
  1771  		profiles := r1.Data.([]*model.User)
  1772  		found := false
  1773  		for _, profile := range profiles {
  1774  			if profile.Id == u1.Id {
  1775  				found = true
  1776  				break
  1777  			}
  1778  		}
  1779  
  1780  		if !found {
  1781  			t.Fatal("should have found user")
  1782  		}
  1783  	}
  1784  
  1785  	// Search Users not in Team.
  1786  	u4 := &model.User{}
  1787  	u4.Username = "simon" + model.NewId()
  1788  	u4.Email = MakeEmail()
  1789  	u4.DeleteAt = 0
  1790  	store.Must(ss.User().Save(u4))
  1791  
  1792  	if r1 := <-ss.User().SearchNotInTeam(tid, "simo", searchOptions); r1.Err != nil {
  1793  		t.Fatal(r1.Err)
  1794  	} else {
  1795  		profiles := r1.Data.([]*model.User)
  1796  		found := false
  1797  		for _, profile := range profiles {
  1798  			if profile.Id == u4.Id {
  1799  				found = true
  1800  				break
  1801  			}
  1802  		}
  1803  
  1804  		if !found {
  1805  			t.Fatal("should have found user")
  1806  		}
  1807  	}
  1808  
  1809  	if r1 := <-ss.User().SearchNotInTeam(tid, "jimb", searchOptions); r1.Err != nil {
  1810  		t.Fatal(r1.Err)
  1811  	} else {
  1812  		profiles := r1.Data.([]*model.User)
  1813  		found := false
  1814  		for _, profile := range profiles {
  1815  			if profile.Id == u1.Id {
  1816  				found = true
  1817  				break
  1818  			}
  1819  		}
  1820  
  1821  		if found {
  1822  			t.Fatal("should not have found user")
  1823  		}
  1824  	}
  1825  
  1826  	// Check SearchNotInTeam finds previously deleted team members.
  1827  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u4.Id}, -1))
  1828  
  1829  	if r1 := <-ss.User().SearchNotInTeam(tid, "simo", searchOptions); r1.Err != nil {
  1830  		t.Fatal(r1.Err)
  1831  	} else {
  1832  		profiles := r1.Data.([]*model.User)
  1833  		found := false
  1834  		for _, profile := range profiles {
  1835  			if profile.Id == u4.Id {
  1836  				found = true
  1837  				break
  1838  			}
  1839  		}
  1840  
  1841  		if found {
  1842  			t.Fatal("should not have found user")
  1843  		}
  1844  	}
  1845  
  1846  	store.Must(ss.Team().UpdateMember(&model.TeamMember{TeamId: tid, UserId: u4.Id, DeleteAt: model.GetMillis() - 1000}))
  1847  	if r1 := <-ss.User().SearchNotInTeam(tid, "simo", searchOptions); r1.Err != nil {
  1848  		t.Fatal(r1.Err)
  1849  	} else {
  1850  		profiles := r1.Data.([]*model.User)
  1851  		found := false
  1852  		for _, profile := range profiles {
  1853  			if profile.Id == u4.Id {
  1854  				found = true
  1855  				break
  1856  			}
  1857  		}
  1858  
  1859  		if !found {
  1860  			t.Fatal("should have found user")
  1861  		}
  1862  	}
  1863  
  1864  	// Check PLT-8354 - search that ends up with just space for terms doesn't error.
  1865  	r1 := <-ss.User().SearchWithoutTeam("* ", searchOptions)
  1866  	assert.Nil(t, r1.Err)
  1867  }
  1868  
  1869  func testUserStoreSearchWithoutTeam(t *testing.T, ss store.Store) {
  1870  	u1 := &model.User{}
  1871  	u1.Username = "jimbo" + model.NewId()
  1872  	u1.FirstName = "Tim"
  1873  	u1.LastName = "Bill"
  1874  	u1.Nickname = "Rob"
  1875  	u1.Email = "harold" + model.NewId() + "@simulator.amazonses.com"
  1876  	store.Must(ss.User().Save(u1))
  1877  
  1878  	u2 := &model.User{}
  1879  	u2.Username = "jim-bobby" + model.NewId()
  1880  	u2.Email = MakeEmail()
  1881  	store.Must(ss.User().Save(u2))
  1882  
  1883  	u3 := &model.User{}
  1884  	u3.Username = "jimbo" + model.NewId()
  1885  	u3.Email = MakeEmail()
  1886  	u3.DeleteAt = 1
  1887  	store.Must(ss.User().Save(u3))
  1888  
  1889  	tid := model.NewId()
  1890  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u3.Id}, -1))
  1891  
  1892  	searchOptions := map[string]bool{}
  1893  	searchOptions[store.USER_SEARCH_OPTION_NAMES_ONLY] = true
  1894  
  1895  	if r1 := <-ss.User().SearchWithoutTeam("", searchOptions); r1.Err != nil {
  1896  		t.Fatal(r1.Err)
  1897  	}
  1898  
  1899  	if r1 := <-ss.User().SearchWithoutTeam("jim", searchOptions); r1.Err != nil {
  1900  		t.Fatal(r1.Err)
  1901  	} else {
  1902  		profiles := r1.Data.([]*model.User)
  1903  
  1904  		found1 := false
  1905  		found2 := false
  1906  		found3 := false
  1907  
  1908  		for _, profile := range profiles {
  1909  			if profile.Id == u1.Id {
  1910  				found1 = true
  1911  			} else if profile.Id == u2.Id {
  1912  				found2 = true
  1913  			} else if profile.Id == u3.Id {
  1914  				found3 = true
  1915  			}
  1916  		}
  1917  
  1918  		if !found1 {
  1919  			t.Fatal("should have found user1")
  1920  		} else if !found2 {
  1921  			t.Fatal("should have found user2")
  1922  		} else if found3 {
  1923  			t.Fatal("should not have found user3")
  1924  		}
  1925  	}
  1926  }
  1927  
  1928  func testUserStoreAnalyticsGetInactiveUsersCount(t *testing.T, ss store.Store) {
  1929  	u1 := &model.User{}
  1930  	u1.Email = MakeEmail()
  1931  	store.Must(ss.User().Save(u1))
  1932  
  1933  	var count int64
  1934  
  1935  	if result := <-ss.User().AnalyticsGetInactiveUsersCount(); result.Err != nil {
  1936  		t.Fatal(result.Err)
  1937  	} else {
  1938  		count = result.Data.(int64)
  1939  	}
  1940  
  1941  	u2 := &model.User{}
  1942  	u2.Email = MakeEmail()
  1943  	u2.DeleteAt = model.GetMillis()
  1944  	store.Must(ss.User().Save(u2))
  1945  
  1946  	if result := <-ss.User().AnalyticsGetInactiveUsersCount(); result.Err != nil {
  1947  		t.Fatal(result.Err)
  1948  	} else {
  1949  		newCount := result.Data.(int64)
  1950  		if count != newCount-1 {
  1951  			t.Fatal("Expected 1 more inactive users but found otherwise.", count, newCount)
  1952  		}
  1953  	}
  1954  }
  1955  
  1956  func testUserStoreAnalyticsGetSystemAdminCount(t *testing.T, ss store.Store) {
  1957  	var countBefore int64
  1958  	if result := <-ss.User().AnalyticsGetSystemAdminCount(); result.Err != nil {
  1959  		t.Fatal(result.Err)
  1960  	} else {
  1961  		countBefore = result.Data.(int64)
  1962  	}
  1963  
  1964  	u1 := model.User{}
  1965  	u1.Email = MakeEmail()
  1966  	u1.Username = model.NewId()
  1967  	u1.Roles = "system_user system_admin"
  1968  
  1969  	u2 := model.User{}
  1970  	u2.Email = MakeEmail()
  1971  	u2.Username = model.NewId()
  1972  
  1973  	if err := (<-ss.User().Save(&u1)).Err; err != nil {
  1974  		t.Fatal("couldn't save user", err)
  1975  	}
  1976  
  1977  	if err := (<-ss.User().Save(&u2)).Err; err != nil {
  1978  		t.Fatal("couldn't save user", err)
  1979  	}
  1980  
  1981  	if result := <-ss.User().AnalyticsGetSystemAdminCount(); result.Err != nil {
  1982  		t.Fatal(result.Err)
  1983  	} else {
  1984  		// We expect to find 1 more system admin than there was at the start of this test function.
  1985  		if count := result.Data.(int64); count != countBefore+1 {
  1986  			t.Fatal("Did not get the expected number of system admins. Expected, got: ", countBefore+1, count)
  1987  		}
  1988  	}
  1989  }
  1990  
  1991  func testUserStoreGetProfilesNotInTeam(t *testing.T, ss store.Store) {
  1992  	teamId := model.NewId()
  1993  
  1994  	u1 := &model.User{}
  1995  	u1.Email = MakeEmail()
  1996  	store.Must(ss.User().Save(u1))
  1997  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1))
  1998  	store.Must(ss.User().UpdateUpdateAt(u1.Id))
  1999  
  2000  	u2 := &model.User{}
  2001  	u2.Email = MakeEmail()
  2002  	store.Must(ss.User().Save(u2))
  2003  	store.Must(ss.User().UpdateUpdateAt(u2.Id))
  2004  
  2005  	var initialUsersNotInTeam int
  2006  	var etag1, etag2, etag3 string
  2007  
  2008  	if er1 := <-ss.User().GetEtagForProfilesNotInTeam(teamId); er1.Err != nil {
  2009  		t.Fatal(er1.Err)
  2010  	} else {
  2011  		etag1 = er1.Data.(string)
  2012  	}
  2013  
  2014  	if r1 := <-ss.User().GetProfilesNotInTeam(teamId, 0, 100000); r1.Err != nil {
  2015  		t.Fatal(r1.Err)
  2016  	} else {
  2017  		users := r1.Data.([]*model.User)
  2018  		initialUsersNotInTeam = len(users)
  2019  		if initialUsersNotInTeam < 1 {
  2020  			t.Fatalf("Should be at least 1 user not in the team")
  2021  		}
  2022  
  2023  		found := false
  2024  		for _, u := range users {
  2025  			if u.Id == u2.Id {
  2026  				found = true
  2027  			}
  2028  			if u.Id == u1.Id {
  2029  				t.Fatalf("Should not have found user1")
  2030  			}
  2031  		}
  2032  
  2033  		if !found {
  2034  			t.Fatal("missing user2")
  2035  		}
  2036  	}
  2037  
  2038  	time.Sleep(time.Millisecond * 10)
  2039  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1))
  2040  	store.Must(ss.User().UpdateUpdateAt(u2.Id))
  2041  
  2042  	if er2 := <-ss.User().GetEtagForProfilesNotInTeam(teamId); er2.Err != nil {
  2043  		t.Fatal(er2.Err)
  2044  	} else {
  2045  		etag2 = er2.Data.(string)
  2046  		if etag1 == etag2 {
  2047  			t.Fatalf("etag should have changed")
  2048  		}
  2049  	}
  2050  
  2051  	if r2 := <-ss.User().GetProfilesNotInTeam(teamId, 0, 100000); r2.Err != nil {
  2052  		t.Fatal(r2.Err)
  2053  	} else {
  2054  		users := r2.Data.([]*model.User)
  2055  
  2056  		if len(users) != initialUsersNotInTeam-1 {
  2057  			t.Fatalf("Should be one less user not in team")
  2058  		}
  2059  
  2060  		for _, u := range users {
  2061  			if u.Id == u2.Id {
  2062  				t.Fatalf("Should not have found user2")
  2063  			}
  2064  			if u.Id == u1.Id {
  2065  				t.Fatalf("Should not have found user1")
  2066  			}
  2067  		}
  2068  	}
  2069  
  2070  	time.Sleep(time.Millisecond * 10)
  2071  	store.Must(ss.Team().RemoveMember(teamId, u1.Id))
  2072  	store.Must(ss.Team().RemoveMember(teamId, u2.Id))
  2073  	store.Must(ss.User().UpdateUpdateAt(u1.Id))
  2074  	store.Must(ss.User().UpdateUpdateAt(u2.Id))
  2075  
  2076  	if er3 := <-ss.User().GetEtagForProfilesNotInTeam(teamId); er3.Err != nil {
  2077  		t.Fatal(er3.Err)
  2078  	} else {
  2079  		etag3 = er3.Data.(string)
  2080  		t.Log(etag3)
  2081  		if etag1 == etag3 || etag3 == etag2 {
  2082  			t.Fatalf("etag should have changed")
  2083  		}
  2084  	}
  2085  
  2086  	if r3 := <-ss.User().GetProfilesNotInTeam(teamId, 0, 100000); r3.Err != nil {
  2087  		t.Fatal(r3.Err)
  2088  	} else {
  2089  		users := r3.Data.([]*model.User)
  2090  		found1, found2 := false, false
  2091  		for _, u := range users {
  2092  			if u.Id == u2.Id {
  2093  				found2 = true
  2094  			}
  2095  			if u.Id == u1.Id {
  2096  				found1 = true
  2097  			}
  2098  		}
  2099  
  2100  		if !found1 || !found2 {
  2101  			t.Fatal("missing user1 or user2")
  2102  		}
  2103  	}
  2104  
  2105  	time.Sleep(time.Millisecond * 10)
  2106  	u3 := &model.User{}
  2107  	u3.Email = MakeEmail()
  2108  	store.Must(ss.User().Save(u3))
  2109  	store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1))
  2110  	store.Must(ss.User().UpdateUpdateAt(u3.Id))
  2111  
  2112  	if er4 := <-ss.User().GetEtagForProfilesNotInTeam(teamId); er4.Err != nil {
  2113  		t.Fatal(er4.Err)
  2114  	} else {
  2115  		etag4 := er4.Data.(string)
  2116  		t.Log(etag4)
  2117  		if etag4 != etag3 {
  2118  			t.Fatalf("etag should be the same")
  2119  		}
  2120  	}
  2121  }
  2122  
  2123  func testUserStoreClearAllCustomRoleAssignments(t *testing.T, ss store.Store) {
  2124  	u1 := model.User{
  2125  		Email:    MakeEmail(),
  2126  		Username: model.NewId(),
  2127  		Roles:    "system_user system_admin system_post_all",
  2128  	}
  2129  	u2 := model.User{
  2130  		Email:    MakeEmail(),
  2131  		Username: model.NewId(),
  2132  		Roles:    "system_user custom_role system_admin another_custom_role",
  2133  	}
  2134  	u3 := model.User{
  2135  		Email:    MakeEmail(),
  2136  		Username: model.NewId(),
  2137  		Roles:    "system_user",
  2138  	}
  2139  	u4 := model.User{
  2140  		Email:    MakeEmail(),
  2141  		Username: model.NewId(),
  2142  		Roles:    "custom_only",
  2143  	}
  2144  
  2145  	store.Must(ss.User().Save(&u1))
  2146  	store.Must(ss.User().Save(&u2))
  2147  	store.Must(ss.User().Save(&u3))
  2148  	store.Must(ss.User().Save(&u4))
  2149  
  2150  	require.Nil(t, (<-ss.User().ClearAllCustomRoleAssignments()).Err)
  2151  
  2152  	r1 := <-ss.User().GetByUsername(u1.Username)
  2153  	require.Nil(t, r1.Err)
  2154  	assert.Equal(t, u1.Roles, r1.Data.(*model.User).Roles)
  2155  
  2156  	r2 := <-ss.User().GetByUsername(u2.Username)
  2157  	require.Nil(t, r2.Err)
  2158  	assert.Equal(t, "system_user system_admin", r2.Data.(*model.User).Roles)
  2159  
  2160  	r3 := <-ss.User().GetByUsername(u3.Username)
  2161  	require.Nil(t, r3.Err)
  2162  	assert.Equal(t, u3.Roles, r3.Data.(*model.User).Roles)
  2163  
  2164  	r4 := <-ss.User().GetByUsername(u4.Username)
  2165  	require.Nil(t, r4.Err)
  2166  	assert.Equal(t, "", r4.Data.(*model.User).Roles)
  2167  }
  2168  
  2169  func testUserStoreGetAllAfter(t *testing.T, ss store.Store) {
  2170  	u1 := model.User{
  2171  		Email:    MakeEmail(),
  2172  		Username: model.NewId(),
  2173  		Roles:    "system_user system_admin system_post_all",
  2174  	}
  2175  	store.Must(ss.User().Save(&u1))
  2176  
  2177  	r1 := <-ss.User().GetAllAfter(10000, strings.Repeat("0", 26))
  2178  	require.Nil(t, r1.Err)
  2179  
  2180  	d1 := r1.Data.([]*model.User)
  2181  
  2182  	found := false
  2183  	for _, u := range d1 {
  2184  
  2185  		if u.Id == u1.Id {
  2186  			found = true
  2187  			assert.Equal(t, u1.Id, u.Id)
  2188  			assert.Equal(t, u1.Email, u.Email)
  2189  		}
  2190  	}
  2191  	assert.True(t, found)
  2192  
  2193  	r2 := <-ss.User().GetAllAfter(10000, u1.Id)
  2194  	require.Nil(t, r2.Err)
  2195  
  2196  	d2 := r2.Data.([]*model.User)
  2197  	for _, u := range d2 {
  2198  		assert.NotEqual(t, u1.Id, u.Id)
  2199  	}
  2200  }