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 }