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