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