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