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