github.com/masterhung0112/hk_server/v5@v5.0.0-20220302090640-ec71aef15e1c/store/storetest/user_store_test.go (about) 1 package storetest 2 3 import ( 4 "context" 5 "strings" 6 "testing" 7 "time" 8 9 "github.com/masterhung0112/hk_server/v5/model" 10 "github.com/masterhung0112/hk_server/v5/store" 11 "github.com/pkg/errors" 12 "github.com/stretchr/testify/suite" 13 ) 14 15 const ( 16 DAY_MILLISECONDS = 24 * 60 * 60 * 1000 17 MONTH_MILLISECONDS = 31 * DAY_MILLISECONDS 18 ) 19 20 // type UserStoreTestSuite struct { 21 // suite.Suite 22 // StoreTestSuite 23 // } 24 25 func sanitized(user *model.User) *model.User { 26 clonedUser := user.DeepCopy() 27 clonedUser.Sanitize(map[string]bool{}) 28 29 return clonedUser 30 } 31 32 // type UserStoreTS struct { 33 // suite.Suite 34 // StoreTestSuite 35 // } 36 37 func (s *UserStoreTS) SetupTest() { 38 users, err := s.Store().User().GetAll() 39 s.Require().Nil(err, "failed cleaning up test users") 40 41 for _, u := range users { 42 err := s.Store().User().PermanentDelete(u.Id) 43 s.Require().Nil(err, "failed cleaning up test user %s", u.Username) 44 } 45 } 46 47 func TestUserStoreTS(t *testing.T) { 48 StoreTestSuiteWithSqlSupplier(t, &UserStoreTS{}, func(t *testing.T, testSuite StoreTestBaseSuite) { 49 suite.Run(t, testSuite) 50 }) 51 } 52 53 func (s *UserStoreTS) cleanupStatusStore() { 54 _, execerr := s.SqlStore().GetMaster().ExecNoTimeout(` DELETE FROM Status `) 55 s.Require().Nil(execerr) 56 } 57 58 func (s *UserStoreTS) TestCount() { 59 teamId := model.NewId() 60 channelId := model.NewId() 61 regularUser := &model.User{} 62 regularUser.Email = MakeEmail() 63 regularUser.Roles = model.SYSTEM_USER_ROLE_ID 64 _, err := s.Store().User().Save(regularUser) 65 s.Require().Nil(err) 66 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(regularUser.Id)) }() 67 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: regularUser.Id, SchemeAdmin: false, SchemeUser: true}, -1) 68 s.Require().Nil(nErr) 69 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{UserId: regularUser.Id, ChannelId: channelId, SchemeAdmin: false, SchemeUser: true, NotifyProps: model.GetDefaultChannelNotifyProps()}) 70 s.Require().Nil(nErr) 71 72 guestUser := &model.User{} 73 guestUser.Email = MakeEmail() 74 guestUser.Roles = model.SYSTEM_GUEST_ROLE_ID 75 _, err = s.Store().User().Save(guestUser) 76 s.Require().Nil(err) 77 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(guestUser.Id)) }() 78 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: guestUser.Id, SchemeAdmin: false, SchemeUser: false, SchemeGuest: true}, -1) 79 s.Require().Nil(nErr) 80 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{UserId: guestUser.Id, ChannelId: channelId, SchemeAdmin: false, SchemeUser: false, SchemeGuest: true, NotifyProps: model.GetDefaultChannelNotifyProps()}) 81 s.Require().Nil(nErr) 82 83 teamAdmin := &model.User{} 84 teamAdmin.Email = MakeEmail() 85 teamAdmin.Roles = model.SYSTEM_USER_ROLE_ID 86 _, err = s.Store().User().Save(teamAdmin) 87 s.Require().Nil(err) 88 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(teamAdmin.Id)) }() 89 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: teamAdmin.Id, SchemeAdmin: true, SchemeUser: true}, -1) 90 s.Require().Nil(nErr) 91 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{UserId: teamAdmin.Id, ChannelId: channelId, SchemeAdmin: true, SchemeUser: true, NotifyProps: model.GetDefaultChannelNotifyProps()}) 92 s.Require().Nil(nErr) 93 94 sysAdmin := &model.User{} 95 sysAdmin.Email = MakeEmail() 96 sysAdmin.Roles = model.SYSTEM_ADMIN_ROLE_ID + " " + model.SYSTEM_USER_ROLE_ID 97 _, err = s.Store().User().Save(sysAdmin) 98 s.Require().Nil(err) 99 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(sysAdmin.Id)) }() 100 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: sysAdmin.Id, SchemeAdmin: false, SchemeUser: true}, -1) 101 s.Require().Nil(nErr) 102 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{UserId: sysAdmin.Id, ChannelId: channelId, SchemeAdmin: true, SchemeUser: true, NotifyProps: model.GetDefaultChannelNotifyProps()}) 103 s.Require().Nil(nErr) 104 105 // Deleted 106 deletedUser := &model.User{} 107 deletedUser.Email = MakeEmail() 108 deletedUser.DeleteAt = model.GetMillis() 109 _, err = s.Store().User().Save(deletedUser) 110 s.Require().Nil(err) 111 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(deletedUser.Id)) }() 112 113 // Bot 114 botUser, err := s.Store().User().Save(&model.User{ 115 Email: MakeEmail(), 116 }) 117 s.Require().Nil(err) 118 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(botUser.Id)) }() 119 _, nErr = s.Store().Bot().Save(&model.Bot{ 120 UserId: botUser.Id, 121 Username: botUser.Username, 122 OwnerId: regularUser.Id, 123 }) 124 s.Require().Nil(nErr) 125 botUser.IsBot = true 126 defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(botUser.Id)) }() 127 128 testCases := []struct { 129 Description string 130 Options model.UserCountOptions 131 Expected int64 132 }{ 133 { 134 "No bot accounts no deleted accounts and no team id", 135 model.UserCountOptions{ 136 IncludeBotAccounts: false, 137 IncludeDeleted: false, 138 TeamId: "", 139 }, 140 4, 141 }, 142 { 143 "Include bot accounts no deleted accounts and no team id", 144 model.UserCountOptions{ 145 IncludeBotAccounts: true, 146 IncludeDeleted: false, 147 TeamId: "", 148 }, 149 5, 150 }, 151 { 152 "Include delete accounts no bots and no team id", 153 model.UserCountOptions{ 154 IncludeBotAccounts: false, 155 IncludeDeleted: true, 156 TeamId: "", 157 }, 158 5, 159 }, 160 { 161 "Include bot accounts and deleted accounts and no team id", 162 model.UserCountOptions{ 163 IncludeBotAccounts: true, 164 IncludeDeleted: true, 165 TeamId: "", 166 }, 167 6, 168 }, 169 { 170 "Include bot accounts, deleted accounts, exclude regular users with no team id", 171 model.UserCountOptions{ 172 IncludeBotAccounts: true, 173 IncludeDeleted: true, 174 ExcludeRegularUsers: true, 175 TeamId: "", 176 }, 177 1, 178 }, 179 { 180 "Include bot accounts and deleted accounts with existing team id", 181 model.UserCountOptions{ 182 IncludeBotAccounts: true, 183 IncludeDeleted: true, 184 TeamId: teamId, 185 }, 186 4, 187 }, 188 { 189 "Include bot accounts and deleted accounts with fake team id", 190 model.UserCountOptions{ 191 IncludeBotAccounts: true, 192 IncludeDeleted: true, 193 TeamId: model.NewId(), 194 }, 195 0, 196 }, 197 { 198 "Include bot accounts and deleted accounts with existing team id and view restrictions allowing team", 199 model.UserCountOptions{ 200 IncludeBotAccounts: true, 201 IncludeDeleted: true, 202 TeamId: teamId, 203 ViewRestrictions: &model.ViewUsersRestrictions{Teams: []string{teamId}}, 204 }, 205 4, 206 }, 207 { 208 "Include bot accounts and deleted accounts with existing team id and view restrictions not allowing current team", 209 model.UserCountOptions{ 210 IncludeBotAccounts: true, 211 IncludeDeleted: true, 212 TeamId: teamId, 213 ViewRestrictions: &model.ViewUsersRestrictions{Teams: []string{model.NewId()}}, 214 }, 215 0, 216 }, 217 { 218 "Filter by system admins only", 219 model.UserCountOptions{ 220 TeamId: teamId, 221 Roles: []string{model.SYSTEM_ADMIN_ROLE_ID}, 222 }, 223 1, 224 }, 225 { 226 "Filter by system users only", 227 model.UserCountOptions{ 228 TeamId: teamId, 229 Roles: []string{model.SYSTEM_USER_ROLE_ID}, 230 }, 231 2, 232 }, 233 { 234 "Filter by system guests only", 235 model.UserCountOptions{ 236 TeamId: teamId, 237 Roles: []string{model.SYSTEM_GUEST_ROLE_ID}, 238 }, 239 1, 240 }, 241 { 242 "Filter by system admins and system users", 243 model.UserCountOptions{ 244 TeamId: teamId, 245 Roles: []string{model.SYSTEM_ADMIN_ROLE_ID, model.SYSTEM_USER_ROLE_ID}, 246 }, 247 3, 248 }, 249 { 250 "Filter by system admins, system user and system guests", 251 model.UserCountOptions{ 252 TeamId: teamId, 253 Roles: []string{model.SYSTEM_ADMIN_ROLE_ID, model.SYSTEM_USER_ROLE_ID, model.SYSTEM_GUEST_ROLE_ID}, 254 }, 255 4, 256 }, 257 { 258 "Filter by team admins", 259 model.UserCountOptions{ 260 TeamId: teamId, 261 TeamRoles: []string{model.TEAM_ADMIN_ROLE_ID}, 262 }, 263 1, 264 }, 265 { 266 "Filter by team members", 267 model.UserCountOptions{ 268 TeamId: teamId, 269 TeamRoles: []string{model.TEAM_USER_ROLE_ID}, 270 }, 271 1, 272 }, 273 { 274 "Filter by team guests", 275 model.UserCountOptions{ 276 TeamId: teamId, 277 TeamRoles: []string{model.TEAM_GUEST_ROLE_ID}, 278 }, 279 1, 280 }, 281 { 282 "Filter by team guests and any system role", 283 model.UserCountOptions{ 284 TeamId: teamId, 285 TeamRoles: []string{model.TEAM_GUEST_ROLE_ID}, 286 Roles: []string{model.SYSTEM_ADMIN_ROLE_ID}, 287 }, 288 2, 289 }, 290 { 291 "Filter by channel members", 292 model.UserCountOptions{ 293 ChannelId: channelId, 294 ChannelRoles: []string{model.CHANNEL_USER_ROLE_ID}, 295 }, 296 1, 297 }, 298 { 299 "Filter by channel members and system admins", 300 model.UserCountOptions{ 301 ChannelId: channelId, 302 Roles: []string{model.SYSTEM_ADMIN_ROLE_ID}, 303 ChannelRoles: []string{model.CHANNEL_USER_ROLE_ID}, 304 }, 305 2, 306 }, 307 { 308 "Filter by channel members and system admins and channel admins", 309 model.UserCountOptions{ 310 ChannelId: channelId, 311 Roles: []string{model.SYSTEM_ADMIN_ROLE_ID}, 312 ChannelRoles: []string{model.CHANNEL_USER_ROLE_ID, model.CHANNEL_ADMIN_ROLE_ID}, 313 }, 314 3, 315 }, 316 { 317 "Filter by channel guests", 318 model.UserCountOptions{ 319 ChannelId: channelId, 320 ChannelRoles: []string{model.CHANNEL_GUEST_ROLE_ID}, 321 }, 322 1, 323 }, 324 { 325 "Filter by channel guests and any system role", 326 model.UserCountOptions{ 327 ChannelId: channelId, 328 ChannelRoles: []string{model.CHANNEL_GUEST_ROLE_ID}, 329 Roles: []string{model.SYSTEM_ADMIN_ROLE_ID}, 330 }, 331 2, 332 }, 333 } 334 for _, testCase := range testCases { 335 s.T().Run(testCase.Description, func(t *testing.T) { 336 count, err := s.Store().User().Count(testCase.Options) 337 s.Require().Nil(err) 338 s.Require().Equal(testCase.Expected, count) 339 }) 340 } 341 } 342 343 func (s *UserStoreTS) TestSave() { 344 teamId := model.NewId() 345 maxUsersPerTeam := 50 346 347 u1 := model.User{ 348 Email: MakeEmail(), 349 Username: model.NewId(), 350 } 351 352 _, err := s.Store().User().Save(&u1) 353 s.Require().Nil(err, "couldn't save user") 354 355 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 356 357 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, maxUsersPerTeam) 358 s.Require().Nil(nErr) 359 360 _, err = s.Store().User().Save(&u1) 361 s.Require().NotNil(err, "shouldn't be able to update user from save") 362 363 u2 := model.User{ 364 Email: u1.Email, 365 Username: model.NewId(), 366 } 367 _, err = s.Store().User().Save(&u2) 368 s.Require().NotNil(err, "should be unique email") 369 370 u2.Email = MakeEmail() 371 u2.Username = u1.Username 372 _, err = s.Store().User().Save(&u2) 373 s.Require().NotNil(err, "should be unique username") 374 375 u2.Username = "" 376 _, err = s.Store().User().Save(&u2) 377 s.Require().NotNil(err, "should be unique username") 378 379 for i := 0; i < 49; i++ { 380 u := model.User{ 381 Email: MakeEmail(), 382 Username: model.NewId(), 383 } 384 _, err = s.Store().User().Save(&u) 385 s.Require().Nil(err, "couldn't save item") 386 387 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u.Id)) }() 388 389 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u.Id}, maxUsersPerTeam) 390 s.Require().Nil(nErr) 391 } 392 393 u2.Id = "" 394 u2.Email = MakeEmail() 395 u2.Username = model.NewId() 396 _, err = s.Store().User().Save(&u2) 397 s.Require().Nil(err, "couldn't save item") 398 399 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }() 400 401 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, maxUsersPerTeam) 402 s.Require().NotNil(nErr, "should be the limit") 403 } 404 405 func (s *UserStoreTS) TestUpdate() { 406 u1 := &model.User{ 407 Email: MakeEmail(), 408 } 409 _, err := s.Store().User().Save(u1) 410 s.Require().Nil(err) 411 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 412 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1) 413 s.Require().Nil(nErr) 414 415 u2 := &model.User{ 416 Email: MakeEmail(), 417 AuthService: "ldap", 418 } 419 _, err = s.Store().User().Save(u2) 420 s.Require().Nil(err) 421 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }() 422 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}, -1) 423 s.Require().Nil(nErr) 424 425 _, err = s.Store().User().Update(u1, false) 426 s.Require().Nil(err) 427 428 missing := &model.User{} 429 _, err = s.Store().User().Update(missing, false) 430 s.Require().NotNil(err, "Update should have failed because of missing key") 431 432 newId := &model.User{ 433 Id: model.NewId(), 434 } 435 _, err = s.Store().User().Update(newId, false) 436 s.Require().NotNil(err, "Update should have failed because id change") 437 438 u2.Email = MakeEmail() 439 _, err = s.Store().User().Update(u2, false) 440 s.Require().NotNil(err, "Update should have failed because you can't modify AD/LDAP fields") 441 442 u3 := &model.User{ 443 Email: MakeEmail(), 444 AuthService: "gitlab", 445 } 446 oldEmail := u3.Email 447 _, err = s.Store().User().Save(u3) 448 s.Require().Nil(err) 449 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }() 450 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u3.Id}, -1) 451 s.Require().Nil(nErr) 452 453 u3.Email = MakeEmail() 454 userUpdate, err := s.Store().User().Update(u3, false) 455 s.Require().Nil(err, "Update should not have failed") 456 s.Assert().Equal(oldEmail, userUpdate.New.Email, "Email should not have been updated as the update is not trusted") 457 458 u3.Email = MakeEmail() 459 userUpdate, err = s.Store().User().Update(u3, true) 460 s.Require().Nil(err, "Update should not have failed") 461 s.Assert().NotEqual(oldEmail, userUpdate.New.Email, "Email should have been updated as the update is trusted") 462 463 err = s.Store().User().UpdateLastPictureUpdate(u1.Id) 464 s.Require().Nil(err, "Update should not have failed") 465 } 466 467 func (s *UserStoreTS) TestResetLastPictureUpdate() { 468 469 u1 := &model.User{} 470 u1.Email = MakeEmail() 471 _, err := s.Store().User().Save(u1) 472 s.Require().NoError(err) 473 defer func() { s.Require().NoError(s.Store().User().PermanentDelete(u1.Id)) }() 474 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1) 475 s.Require().NoError(nErr) 476 477 err = s.Store().User().UpdateLastPictureUpdate(u1.Id) 478 s.Require().NoError(err) 479 480 user, err := s.Store().User().Get(context.Background(), u1.Id) 481 s.Require().NoError(err) 482 483 s.Assert().NotZero(user.LastPictureUpdate) 484 s.Assert().NotZero(user.UpdateAt) 485 486 // Ensure update at timestamp changes 487 time.Sleep(time.Millisecond) 488 489 err = s.Store().User().ResetLastPictureUpdate(u1.Id) 490 s.Require().NoError(err) 491 492 s.Store().User().InvalidateProfileCacheForUser(u1.Id) 493 494 user2, err := s.Store().User().Get(context.Background(), u1.Id) 495 s.Require().NoError(err) 496 497 s.Assert().True(user2.UpdateAt > user.UpdateAt) 498 s.Assert().Zero(user2.LastPictureUpdate) 499 } 500 501 func (s *UserStoreTS) TestUpdatePassword() { 502 teamId := model.NewId() 503 504 u1 := &model.User{} 505 u1.Email = MakeEmail() 506 _, err := s.Store().User().Save(u1) 507 s.Require().Nil(err) 508 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 509 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1) 510 s.Require().Nil(nErr) 511 512 hashedPassword := model.HashPassword("newpwd") 513 514 err = s.Store().User().UpdatePassword(u1.Id, hashedPassword) 515 s.Require().Nil(err) 516 517 user, err := s.Store().User().GetByEmail(u1.Email) 518 s.Require().Nil(err) 519 s.Require().Equal(user.Password, hashedPassword, "Password was not updated correctly") 520 } 521 522 func (s *UserStoreTS) TestUpdateUpdateAt() { 523 u1 := &model.User{} 524 u1.Email = MakeEmail() 525 _, err := s.Store().User().Save(u1) 526 s.Require().Nil(err) 527 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 528 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1) 529 s.Require().Nil(nErr) 530 531 _, err = s.Store().User().UpdateUpdateAt(u1.Id) 532 s.Require().Nil(err) 533 534 user, err := s.Store().User().Get(context.Background(), u1.Id) 535 s.Require().Nil(err) 536 s.Require().Less(u1.UpdateAt, user.UpdateAt, "UpdateAt not updated correctly") 537 } 538 539 func (s *UserStoreTS) TestUpdateAuthData() { 540 teamId := model.NewId() 541 542 u1 := &model.User{} 543 u1.Email = MakeEmail() 544 _, err := s.Store().User().Save(u1) 545 s.Require().Nil(err) 546 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 547 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1) 548 s.Require().Nil(nErr) 549 550 service := "someservice" 551 authData := model.NewId() 552 553 _, err = s.Store().User().UpdateAuthData(u1.Id, service, &authData, "", true) 554 s.Require().Nil(err) 555 556 user, err := s.Store().User().GetByEmail(u1.Email) 557 s.Require().Nil(err) 558 s.Require().Equal(service, user.AuthService, "AuthService was not updated correctly") 559 s.Require().Equal(authData, *user.AuthData, "AuthData was not updated correctly") 560 s.Require().Equal("", user.Password, "Password was not cleared properly") 561 } 562 563 func (s *UserStoreTS) TestUpdateMfaSecret() { 564 u1 := model.User{} 565 u1.Email = MakeEmail() 566 _, err := s.Store().User().Save(&u1) 567 s.Require().Nil(err) 568 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 569 570 err = s.Store().User().UpdateMfaSecret(u1.Id, "12345") 571 s.Require().Nil(err) 572 573 // should pass, no update will occur though 574 err = s.Store().User().UpdateMfaSecret("junk", "12345") 575 s.Require().Nil(err) 576 } 577 578 func (s *UserStoreTS) TestUpdateMfaActive() { 579 u1 := model.User{} 580 u1.Email = MakeEmail() 581 _, err := s.Store().User().Save(&u1) 582 s.Require().Nil(err) 583 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 584 585 time.Sleep(time.Millisecond) 586 587 err = s.Store().User().UpdateMfaActive(u1.Id, true) 588 s.Require().Nil(err) 589 590 err = s.Store().User().UpdateMfaActive(u1.Id, false) 591 s.Require().Nil(err) 592 593 // should pass, no update will occur though 594 err = s.Store().User().UpdateMfaActive("junk", true) 595 s.Require().Nil(err) 596 } 597 598 func (s *UserStoreTS) TestGetProfilesInChannel() { 599 teamId := model.NewId() 600 601 u1, err := s.Store().User().Save(&model.User{ 602 Email: MakeEmail(), 603 Username: "u1" + model.NewId(), 604 }) 605 s.Require().Nil(err) 606 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 607 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1) 608 s.Require().Nil(nErr) 609 610 u2, err := s.Store().User().Save(&model.User{ 611 Email: MakeEmail(), 612 Username: "u2" + model.NewId(), 613 }) 614 s.Require().Nil(err) 615 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }() 616 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1) 617 s.Require().Nil(nErr) 618 619 u3, err := s.Store().User().Save(&model.User{ 620 Email: MakeEmail(), 621 Username: "u3" + model.NewId(), 622 }) 623 s.Require().Nil(err) 624 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }() 625 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1) 626 s.Require().Nil(nErr) 627 _, nErr = s.Store().Bot().Save(&model.Bot{ 628 UserId: u3.Id, 629 Username: u3.Username, 630 OwnerId: u1.Id, 631 }) 632 s.Require().Nil(nErr) 633 u3.IsBot = true 634 defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }() 635 636 u4, err := s.Store().User().Save(&model.User{ 637 Email: MakeEmail(), 638 Username: "u4" + model.NewId(), 639 }) 640 s.Require().Nil(err) 641 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u4.Id)) }() 642 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u4.Id}, -1) 643 s.Require().Nil(nErr) 644 645 ch1 := &model.Channel{ 646 TeamId: teamId, 647 DisplayName: "Profiles in channel", 648 Name: "profiles-" + model.NewId(), 649 Type: model.CHANNEL_OPEN, 650 } 651 c1, nErr := s.Store().Channel().Save(ch1, -1) 652 s.Require().Nil(nErr) 653 654 ch2 := &model.Channel{ 655 TeamId: teamId, 656 DisplayName: "Profiles in private", 657 Name: "profiles-" + model.NewId(), 658 Type: model.CHANNEL_PRIVATE, 659 } 660 c2, nErr := s.Store().Channel().Save(ch2, -1) 661 s.Require().Nil(nErr) 662 663 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ 664 ChannelId: c1.Id, 665 UserId: u1.Id, 666 NotifyProps: model.GetDefaultChannelNotifyProps(), 667 }) 668 s.Require().Nil(nErr) 669 670 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ 671 ChannelId: c1.Id, 672 UserId: u2.Id, 673 NotifyProps: model.GetDefaultChannelNotifyProps(), 674 }) 675 s.Require().Nil(nErr) 676 677 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ 678 ChannelId: c1.Id, 679 UserId: u3.Id, 680 NotifyProps: model.GetDefaultChannelNotifyProps(), 681 }) 682 s.Require().Nil(nErr) 683 684 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ 685 ChannelId: c1.Id, 686 UserId: u4.Id, 687 NotifyProps: model.GetDefaultChannelNotifyProps(), 688 }) 689 s.Require().Nil(nErr) 690 691 u4.DeleteAt = 1 692 _, err = s.Store().User().Update(u4, true) 693 s.Require().Nil(err) 694 695 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ 696 ChannelId: c2.Id, 697 UserId: u1.Id, 698 NotifyProps: model.GetDefaultChannelNotifyProps(), 699 }) 700 s.Require().Nil(nErr) 701 702 s.T().Run("get all users in channel 1, offset 0, limit 100", func(t *testing.T) { 703 users, err := s.Store().User().GetProfilesInChannel(&model.UserGetOptions{ 704 InChannelId: c1.Id, 705 Page: 0, 706 PerPage: 100, 707 }) 708 s.Require().Nil(err) 709 s.Assert().Equal([]*model.User{sanitized(u1), sanitized(u2), sanitized(u3), sanitized(u4)}, users) 710 }) 711 712 s.T().Run("get only active users in channel 1, offset 0, limit 100", func(t *testing.T) { 713 users, err := s.Store().User().GetProfilesInChannel(&model.UserGetOptions{ 714 InChannelId: c1.Id, 715 Page: 0, 716 PerPage: 100, 717 Active: true, 718 }) 719 s.Require().Nil(err) 720 s.Assert().Equal([]*model.User{sanitized(u1), sanitized(u2), sanitized(u3)}, users) 721 }) 722 723 s.T().Run("get inactive users in channel 1, offset 0, limit 100", func(t *testing.T) { 724 users, err := s.Store().User().GetProfilesInChannel(&model.UserGetOptions{ 725 InChannelId: c1.Id, 726 Page: 0, 727 PerPage: 100, 728 Inactive: true, 729 }) 730 s.Require().Nil(err) 731 s.Assert().Equal([]*model.User{sanitized(u4)}, users) 732 }) 733 734 s.T().Run("get in channel 1, offset 1, limit 2", func(t *testing.T) { 735 users, err := s.Store().User().GetProfilesInChannel(&model.UserGetOptions{ 736 InChannelId: c1.Id, 737 Page: 1, 738 PerPage: 1, 739 }) 740 s.Require().Nil(err) 741 users_p2, err2 := s.Store().User().GetProfilesInChannel(&model.UserGetOptions{ 742 InChannelId: c1.Id, 743 Page: 2, 744 PerPage: 1, 745 }) 746 s.Require().Nil(err2) 747 users = append(users, users_p2...) 748 s.Assert().Equal([]*model.User{sanitized(u2), sanitized(u3)}, users) 749 }) 750 751 s.T().Run("get in channel 2, offset 0, limit 1", func(t *testing.T) { 752 users, err := s.Store().User().GetProfilesInChannel(&model.UserGetOptions{ 753 InChannelId: c2.Id, 754 Page: 0, 755 PerPage: 1, 756 }) 757 s.Require().Nil(err) 758 s.Assert().Equal([]*model.User{sanitized(u1)}, users) 759 }) 760 } 761 762 func (s *UserStoreTS) TestProfilesInChannelByStatus() { 763 764 s.cleanupStatusStore() 765 766 teamId := model.NewId() 767 768 u1, err := s.Store().User().Save(&model.User{ 769 Email: MakeEmail(), 770 Username: "u1" + model.NewId(), 771 }) 772 s.Require().Nil(err) 773 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 774 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1) 775 s.Require().Nil(nErr) 776 777 u2, err := s.Store().User().Save(&model.User{ 778 Email: MakeEmail(), 779 Username: "u2" + model.NewId(), 780 }) 781 s.Require().Nil(err) 782 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }() 783 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1) 784 s.Require().Nil(nErr) 785 786 u3, err := s.Store().User().Save(&model.User{ 787 Email: MakeEmail(), 788 Username: "u3" + model.NewId(), 789 }) 790 s.Require().Nil(err) 791 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }() 792 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1) 793 s.Require().Nil(nErr) 794 _, nErr = s.Store().Bot().Save(&model.Bot{ 795 UserId: u3.Id, 796 Username: u3.Username, 797 OwnerId: u1.Id, 798 }) 799 s.Require().Nil(nErr) 800 u3.IsBot = true 801 defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }() 802 803 u4, err := s.Store().User().Save(&model.User{ 804 Email: MakeEmail(), 805 Username: "u4" + model.NewId(), 806 }) 807 s.Require().Nil(err) 808 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u4.Id)) }() 809 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u4.Id}, -1) 810 s.Require().Nil(nErr) 811 812 ch1 := &model.Channel{ 813 TeamId: teamId, 814 DisplayName: "Profiles in channel", 815 Name: "profiles-" + model.NewId(), 816 Type: model.CHANNEL_OPEN, 817 } 818 c1, nErr := s.Store().Channel().Save(ch1, -1) 819 s.Require().Nil(nErr) 820 821 ch2 := &model.Channel{ 822 TeamId: teamId, 823 DisplayName: "Profiles in private", 824 Name: "profiles-" + model.NewId(), 825 Type: model.CHANNEL_PRIVATE, 826 } 827 c2, nErr := s.Store().Channel().Save(ch2, -1) 828 s.Require().Nil(nErr) 829 830 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ 831 ChannelId: c1.Id, 832 UserId: u1.Id, 833 NotifyProps: model.GetDefaultChannelNotifyProps(), 834 }) 835 s.Require().Nil(nErr) 836 837 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ 838 ChannelId: c1.Id, 839 UserId: u2.Id, 840 NotifyProps: model.GetDefaultChannelNotifyProps(), 841 }) 842 s.Require().Nil(nErr) 843 844 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ 845 ChannelId: c1.Id, 846 UserId: u3.Id, 847 NotifyProps: model.GetDefaultChannelNotifyProps(), 848 }) 849 s.Require().Nil(nErr) 850 851 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ 852 ChannelId: c1.Id, 853 UserId: u4.Id, 854 NotifyProps: model.GetDefaultChannelNotifyProps(), 855 }) 856 s.Require().Nil(nErr) 857 858 u4.DeleteAt = 1 859 _, err = s.Store().User().Update(u4, true) 860 s.Require().Nil(err) 861 862 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ 863 ChannelId: c2.Id, 864 UserId: u1.Id, 865 NotifyProps: model.GetDefaultChannelNotifyProps(), 866 }) 867 s.Require().Nil(nErr) 868 s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{ 869 UserId: u1.Id, 870 Status: model.STATUS_DND, 871 })) 872 s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{ 873 UserId: u2.Id, 874 Status: model.STATUS_AWAY, 875 })) 876 s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{ 877 UserId: u3.Id, 878 Status: model.STATUS_ONLINE, 879 })) 880 881 s.T().Run("get all users in channel 1, offset 0, limit 100", func(t *testing.T) { 882 users, err := s.Store().User().GetProfilesInChannel(&model.UserGetOptions{ 883 InChannelId: c1.Id, 884 Page: 0, 885 PerPage: 100, 886 }) 887 s.Require().Nil(err) 888 s.Assert().Equal([]*model.User{sanitized(u1), sanitized(u2), sanitized(u3), sanitized(u4)}, users) 889 }) 890 891 s.T().Run("get active in channel 1 by status, offset 0, limit 100", func(t *testing.T) { 892 users, err := s.Store().User().GetProfilesInChannelByStatus(&model.UserGetOptions{ 893 InChannelId: c1.Id, 894 Page: 0, 895 PerPage: 100, 896 Active: true, 897 }) 898 s.Require().Nil(err) 899 s.Assert().Equal([]*model.User{sanitized(u3), sanitized(u2), sanitized(u1)}, users) 900 }) 901 902 s.T().Run("get inactive users in channel 1, offset 0, limit 100", func(t *testing.T) { 903 users, err := s.Store().User().GetProfilesInChannel(&model.UserGetOptions{ 904 InChannelId: c1.Id, 905 Page: 0, 906 PerPage: 100, 907 Inactive: true, 908 }) 909 s.Require().Nil(err) 910 s.Assert().Equal([]*model.User{sanitized(u4)}, users) 911 }) 912 913 s.T().Run("get in channel 2 by status, offset 0, limit 1", func(t *testing.T) { 914 users, err := s.Store().User().GetProfilesInChannelByStatus(&model.UserGetOptions{ 915 InChannelId: c2.Id, 916 Page: 0, 917 PerPage: 1, 918 }) 919 s.Require().Nil(err) 920 s.Assert().Equal([]*model.User{sanitized(u1)}, users) 921 }) 922 } 923 924 func (s *UserStoreTS) TestGetProfilesWithoutTeam() { 925 teamId := model.NewId() 926 927 u1, err := s.Store().User().Save(&model.User{ 928 Email: MakeEmail(), 929 Username: "u1" + model.NewId(), 930 }) 931 s.Require().Nil(err) 932 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 933 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1) 934 s.Require().Nil(nErr) 935 936 u2, err := s.Store().User().Save(&model.User{ 937 Email: MakeEmail(), 938 Username: "u2" + model.NewId(), 939 }) 940 s.Require().Nil(err) 941 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }() 942 943 u3, err := s.Store().User().Save(&model.User{ 944 Email: MakeEmail(), 945 Username: "u3" + model.NewId(), 946 DeleteAt: 1, 947 Roles: "system_admin", 948 }) 949 s.Require().Nil(err) 950 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }() 951 _, nErr = s.Store().Bot().Save(&model.Bot{ 952 UserId: u3.Id, 953 Username: u3.Username, 954 OwnerId: u1.Id, 955 }) 956 s.Require().Nil(nErr) 957 u3.IsBot = true 958 defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }() 959 960 s.T().Run("get, page 0, per_page 100", func(t *testing.T) { 961 users, err := s.Store().User().GetProfilesWithoutTeam(&model.UserGetOptions{Page: 0, PerPage: 100}) 962 s.Require().Nil(err) 963 s.Assert().Equal([]*model.User{sanitized(u2), sanitized(u3)}, users) 964 }) 965 966 s.T().Run("get, page 1, per_page 1", func(t *testing.T) { 967 users, err := s.Store().User().GetProfilesWithoutTeam(&model.UserGetOptions{Page: 1, PerPage: 1}) 968 s.Require().Nil(err) 969 s.Assert().Equal([]*model.User{sanitized(u3)}, users) 970 }) 971 972 s.T().Run("get, page 2, per_page 1", func(t *testing.T) { 973 users, err := s.Store().User().GetProfilesWithoutTeam(&model.UserGetOptions{Page: 2, PerPage: 1}) 974 s.Require().Nil(err) 975 s.Assert().Equal([]*model.User{}, users) 976 }) 977 978 s.T().Run("get, page 0, per_page 100, inactive", func(t *testing.T) { 979 users, err := s.Store().User().GetProfilesWithoutTeam(&model.UserGetOptions{Page: 0, PerPage: 100, Inactive: true}) 980 s.Require().Nil(err) 981 s.Assert().Equal([]*model.User{sanitized(u3)}, users) 982 }) 983 984 s.T().Run("get, page 0, per_page 100, role", func(t *testing.T) { 985 users, err := s.Store().User().GetProfilesWithoutTeam(&model.UserGetOptions{Page: 0, PerPage: 100, Role: "system_admin"}) 986 s.Require().Nil(err) 987 s.Assert().Equal([]*model.User{sanitized(u3)}, users) 988 }) 989 } 990 991 func (s *UserStoreTS) TestGetProfilesByUsernames() { 992 teamId := model.NewId() 993 team2Id := model.NewId() 994 995 u1, err := s.Store().User().Save(&model.User{ 996 Email: MakeEmail(), 997 Username: "u1" + model.NewId(), 998 }) 999 s.Require().Nil(err) 1000 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 1001 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1) 1002 s.Require().Nil(nErr) 1003 1004 u2, err := s.Store().User().Save(&model.User{ 1005 Email: MakeEmail(), 1006 Username: "u2" + model.NewId(), 1007 }) 1008 s.Require().Nil(err) 1009 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }() 1010 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1) 1011 s.Require().Nil(nErr) 1012 1013 u3, err := s.Store().User().Save(&model.User{ 1014 Email: MakeEmail(), 1015 Username: "u3" + model.NewId(), 1016 }) 1017 s.Require().Nil(err) 1018 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }() 1019 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: team2Id, UserId: u3.Id}, -1) 1020 s.Require().Nil(nErr) 1021 _, nErr = s.Store().Bot().Save(&model.Bot{ 1022 UserId: u3.Id, 1023 Username: u3.Username, 1024 OwnerId: u1.Id, 1025 }) 1026 s.Require().Nil(nErr) 1027 u3.IsBot = true 1028 defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }() 1029 1030 s.T().Run("get by u1 and u2 usernames, team id 1", func(t *testing.T) { 1031 users, err := s.Store().User().GetProfilesByUsernames([]string{u1.Username, u2.Username}, &model.ViewUsersRestrictions{Teams: []string{teamId}}) 1032 s.Require().Nil(err) 1033 s.Assert().Equal([]*model.User{u1, u2}, users) 1034 }) 1035 1036 s.T().Run("get by u1 username, team id 1", func(t *testing.T) { 1037 users, err := s.Store().User().GetProfilesByUsernames([]string{u1.Username}, &model.ViewUsersRestrictions{Teams: []string{teamId}}) 1038 s.Require().Nil(err) 1039 s.Assert().Equal([]*model.User{u1}, users) 1040 }) 1041 1042 s.T().Run("get by u1 and u3 usernames, no team id", func(t *testing.T) { 1043 users, err := s.Store().User().GetProfilesByUsernames([]string{u1.Username, u3.Username}, nil) 1044 s.Require().Nil(err) 1045 s.Assert().Equal([]*model.User{u1, u3}, users) 1046 }) 1047 1048 s.T().Run("get by u1 and u3 usernames, team id 1", func(t *testing.T) { 1049 users, err := s.Store().User().GetProfilesByUsernames([]string{u1.Username, u3.Username}, &model.ViewUsersRestrictions{Teams: []string{teamId}}) 1050 s.Require().Nil(err) 1051 s.Assert().Equal([]*model.User{u1}, users) 1052 }) 1053 1054 s.T().Run("get by u1 and u3 usernames, team id 2", func(t *testing.T) { 1055 users, err := s.Store().User().GetProfilesByUsernames([]string{u1.Username, u3.Username}, &model.ViewUsersRestrictions{Teams: []string{team2Id}}) 1056 s.Require().Nil(err) 1057 s.Assert().Equal([]*model.User{u3}, users) 1058 }) 1059 } 1060 1061 // type UserStoreGetAllProfilesTS struct { 1062 // suite.Suite 1063 // StoreTestSuite 1064 1065 // u1 *model.User 1066 // u2 *model.User 1067 // u3 *model.User 1068 // u4 *model.User 1069 // u5 *model.User 1070 // u6 *model.User 1071 // u7 *model.User 1072 // } 1073 1074 func TestUserStoreGetAllProfilesTS(t *testing.T) { 1075 StoreTestSuiteWithSqlSupplier(t, &UserStoreGetAllProfilesTS{}, func(t *testing.T, testSuite StoreTestBaseSuite) { 1076 suite.Run(t, testSuite) 1077 }) 1078 } 1079 1080 func (s *UserStoreGetAllProfilesTS) SetupSuite() { 1081 // Clean all user first 1082 users, err := s.Store().User().GetAll() 1083 s.Require().Nil(err, "failed cleaning up test users") 1084 1085 for _, u := range users { 1086 err := s.Store().User().PermanentDelete(u.Id) 1087 s.Require().Nil(err, "failed cleaning up test user %s", u.Username) 1088 } 1089 1090 u1, err := s.Store().User().Save(&model.User{ 1091 Email: MakeEmail(), 1092 Username: "u1" + model.NewId(), 1093 }) 1094 s.Require().Nil(err) 1095 s.u1 = u1 1096 1097 u2, err := s.Store().User().Save(&model.User{ 1098 Email: MakeEmail(), 1099 Username: "u2" + model.NewId(), 1100 }) 1101 s.Require().Nil(err) 1102 s.u2 = u2 1103 1104 u3, err := s.Store().User().Save(&model.User{ 1105 Email: MakeEmail(), 1106 Username: "u3" + model.NewId(), 1107 }) 1108 s.Require().Nil(err) 1109 s.u3 = u3 1110 1111 _, nErr := s.Store().Bot().Save(&model.Bot{ 1112 UserId: u3.Id, 1113 Username: u3.Username, 1114 OwnerId: u1.Id, 1115 }) 1116 s.Require().Nil(nErr) 1117 u3.IsBot = true 1118 1119 u4, err := s.Store().User().Save(&model.User{ 1120 Email: MakeEmail(), 1121 Username: "u4" + model.NewId(), 1122 Roles: "system_user some-other-role", 1123 }) 1124 s.Require().Nil(err) 1125 s.u4 = u4 1126 1127 u5, err := s.Store().User().Save(&model.User{ 1128 Email: MakeEmail(), 1129 Username: "u5" + model.NewId(), 1130 Roles: "system_admin", 1131 }) 1132 s.Require().Nil(err) 1133 s.u5 = u5 1134 1135 u6, err := s.Store().User().Save(&model.User{ 1136 Email: MakeEmail(), 1137 Username: "u6" + model.NewId(), 1138 DeleteAt: model.GetMillis(), 1139 Roles: "system_admin", 1140 }) 1141 s.Require().Nil(err) 1142 s.u6 = u6 1143 1144 u7, err := s.Store().User().Save(&model.User{ 1145 Email: MakeEmail(), 1146 Username: "u7" + model.NewId(), 1147 DeleteAt: model.GetMillis(), 1148 }) 1149 s.Require().Nil(err) 1150 s.u7 = u7 1151 } 1152 1153 func (s *UserStoreGetAllProfilesTS) TearDownSuite() { 1154 s.Require().Nil(s.Store().User().PermanentDelete(s.u1.Id)) 1155 s.Require().Nil(s.Store().User().PermanentDelete(s.u2.Id)) 1156 s.Require().Nil(s.Store().User().PermanentDelete(s.u3.Id)) 1157 s.Require().Nil(s.Store().User().PermanentDelete(s.u4.Id)) 1158 s.Require().Nil(s.Store().User().PermanentDelete(s.u5.Id)) 1159 s.Require().Nil(s.Store().User().PermanentDelete(s.u6.Id)) 1160 s.Require().Nil(s.Store().User().PermanentDelete(s.u7.Id)) 1161 } 1162 1163 func (s *UserStoreGetAllProfilesTS) TestGetOffset0Limit100() { 1164 options := &model.UserGetOptions{Page: 0, PerPage: 100} 1165 actual, err := s.Store().User().GetAllProfiles(options) 1166 s.Require().Nil(err) 1167 1168 s.Require().Equal([]*model.User{ 1169 sanitized(s.u1), 1170 sanitized(s.u2), 1171 sanitized(s.u3), 1172 sanitized(s.u4), 1173 sanitized(s.u5), 1174 sanitized(s.u6), 1175 sanitized(s.u7), 1176 }, actual) 1177 } 1178 1179 func (s *UserStoreGetAllProfilesTS) TestGetOffset0Limit1() { 1180 actual, err := s.Store().User().GetAllProfiles(&model.UserGetOptions{ 1181 Page: 0, 1182 PerPage: 1, 1183 }) 1184 s.Require().Nil(err) 1185 s.Require().Equal([]*model.User{ 1186 sanitized(s.u1), 1187 }, actual) 1188 } 1189 1190 func (s *UserStoreGetAllProfilesTS) TestGetAll() { 1191 actual, err := s.Store().User().GetAll() 1192 s.Require().Nil(err) 1193 s.Require().Equal([]*model.User{ 1194 s.u1, 1195 s.u2, 1196 s.u3, 1197 s.u4, 1198 s.u5, 1199 s.u6, 1200 s.u7, 1201 }, actual) 1202 } 1203 1204 // etag changes for all after user creation 1205 func (s *UserStoreGetAllProfilesTS) TestEtagChangesForAllAfterUserCreation() { 1206 etag := s.Store().User().GetEtagForAllProfiles() 1207 1208 uNew := &model.User{} 1209 uNew.Email = MakeEmail() 1210 _, err := s.Store().User().Save(uNew) 1211 s.Require().Nil(err) 1212 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(uNew.Id)) }() 1213 1214 updatedEtag := s.Store().User().GetEtagForAllProfiles() 1215 s.Require().NotEqual(etag, updatedEtag) 1216 } 1217 1218 func (s *UserStoreGetAllProfilesTS) TestFilterToSystemAdminRole() { 1219 actual, err := s.Store().User().GetAllProfiles(&model.UserGetOptions{ 1220 Page: 0, 1221 PerPage: 10, 1222 Role: "system_admin", 1223 }) 1224 s.Require().Nil(err) 1225 s.Require().Equal([]*model.User{ 1226 sanitized(s.u5), 1227 sanitized(s.u6), 1228 }, actual) 1229 } 1230 1231 func (s *UserStoreGetAllProfilesTS) TestFilterToSystemAdminRoleInactive() { 1232 actual, err := s.Store().User().GetAllProfiles(&model.UserGetOptions{ 1233 Page: 0, 1234 PerPage: 10, 1235 Role: "system_admin", 1236 Inactive: true, 1237 }) 1238 s.Require().Nil(err) 1239 s.Require().Equal([]*model.User{ 1240 sanitized(s.u6), 1241 }, actual) 1242 } 1243 1244 func (s *UserStoreGetAllProfilesTS) TestFilterToInactive() { 1245 actual, err := s.Store().User().GetAllProfiles(&model.UserGetOptions{ 1246 Page: 0, 1247 PerPage: 10, 1248 Inactive: true, 1249 }) 1250 s.Require().Nil(err) 1251 s.Require().Equal([]*model.User{ 1252 sanitized(s.u6), 1253 sanitized(s.u7), 1254 }, actual) 1255 } 1256 1257 func (s *UserStoreGetAllProfilesTS) TestFilterToActive() { 1258 actual, err := s.Store().User().GetAllProfiles(&model.UserGetOptions{ 1259 Page: 0, 1260 PerPage: 10, 1261 Active: true, 1262 }) 1263 s.Require().Nil(err) 1264 s.Require().Equal([]*model.User{ 1265 sanitized(s.u1), 1266 sanitized(s.u2), 1267 sanitized(s.u3), 1268 sanitized(s.u4), 1269 sanitized(s.u5), 1270 }, actual) 1271 } 1272 1273 func (s *UserStoreGetAllProfilesTS) TestTryToFilterToActiveAndInactive() { 1274 actual, err := s.Store().User().GetAllProfiles(&model.UserGetOptions{ 1275 Page: 0, 1276 PerPage: 10, 1277 Inactive: true, 1278 Active: true, 1279 }) 1280 s.Require().Nil(err) 1281 s.Require().Equal([]*model.User{ 1282 sanitized(s.u6), 1283 sanitized(s.u7), 1284 }, actual) 1285 } 1286 1287 // type UserStoreGetProfilesTS struct { 1288 // suite.Suite 1289 // StoreTestSuite 1290 1291 // u1 *model.User 1292 // u2 *model.User 1293 // u3 *model.User 1294 // u4 *model.User 1295 // u5 *model.User 1296 // u6 *model.User 1297 // u7 *model.User 1298 // teamId string 1299 // } 1300 1301 func TestUserStoreGetProfilesTS(t *testing.T) { 1302 StoreTestSuiteWithSqlSupplier(t, &UserStoreGetProfilesTS{}, func(t *testing.T, testSuite StoreTestBaseSuite) { 1303 suite.Run(t, testSuite) 1304 }) 1305 } 1306 1307 func (s *UserStoreGetProfilesTS) SetupSuite() { 1308 teamId := model.NewId() 1309 s.teamId = teamId 1310 1311 u1, err := s.Store().User().Save(&model.User{ 1312 Email: MakeEmail(), 1313 Username: "u1" + model.NewId(), 1314 }) 1315 s.Require().Nil(err) 1316 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1) 1317 s.Require().Nil(nErr) 1318 s.u1 = u1 1319 1320 u2, err := s.Store().User().Save(&model.User{ 1321 Email: MakeEmail(), 1322 Username: "u2" + model.NewId(), 1323 }) 1324 s.Require().Nil(err) 1325 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1) 1326 s.Require().Nil(nErr) 1327 s.u2 = u2 1328 1329 u3, err := s.Store().User().Save(&model.User{ 1330 Email: MakeEmail(), 1331 Username: "u3" + model.NewId(), 1332 }) 1333 s.Require().Nil(err) 1334 _, nErr = s.Store().Bot().Save(&model.Bot{ 1335 UserId: u3.Id, 1336 Username: u3.Username, 1337 OwnerId: u1.Id, 1338 }) 1339 s.Require().Nil(nErr) 1340 s.u3 = u3 1341 s.u3.IsBot = true 1342 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1) 1343 s.Require().Nil(nErr) 1344 1345 u4, err := s.Store().User().Save(&model.User{ 1346 Email: MakeEmail(), 1347 Username: "u4" + model.NewId(), 1348 Roles: "system_admin", 1349 }) 1350 s.Require().Nil(err) 1351 defer func() {}() 1352 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u4.Id}, -1) 1353 s.Require().Nil(nErr) 1354 s.u4 = u4 1355 1356 u5, err := s.Store().User().Save(&model.User{ 1357 Email: MakeEmail(), 1358 Username: "u5" + model.NewId(), 1359 DeleteAt: model.GetMillis(), 1360 }) 1361 s.Require().Nil(err) 1362 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u5.Id}, -1) 1363 s.Require().Nil(nErr) 1364 s.u5 = u5 1365 } 1366 1367 func (s *UserStoreGetProfilesTS) TearDownSuite() { 1368 s.Require().Nil(s.Store().User().PermanentDelete(s.u1.Id)) 1369 s.Require().Nil(s.Store().User().PermanentDelete(s.u2.Id)) 1370 s.Require().Nil(s.Store().User().PermanentDelete(s.u3.Id)) 1371 s.Require().Nil(s.Store().Bot().PermanentDelete(s.u3.Id)) 1372 s.Require().Nil(s.Store().User().PermanentDelete(s.u4.Id)) 1373 s.Require().Nil(s.Store().User().PermanentDelete(s.u5.Id)) 1374 } 1375 1376 // get page 0, perPage 100 1377 func (s *UserStoreGetProfilesTS) TestGetPage0PerPage100() { 1378 actual, err := s.Store().User().GetProfiles(&model.UserGetOptions{ 1379 InTeamId: s.teamId, 1380 Page: 0, 1381 PerPage: 100, 1382 }) 1383 s.Require().Nil(err) 1384 1385 s.Require().Equal([]*model.User{ 1386 sanitized(s.u1), 1387 sanitized(s.u2), 1388 sanitized(s.u3), 1389 sanitized(s.u4), 1390 sanitized(s.u5), 1391 }, actual) 1392 } 1393 1394 // get page 0, perPage 1 1395 func (s *UserStoreGetProfilesTS) TestGetPage0PerPage1() { 1396 actual, err := s.Store().User().GetProfiles(&model.UserGetOptions{ 1397 InTeamId: s.teamId, 1398 Page: 0, 1399 PerPage: 1, 1400 }) 1401 s.Require().Nil(err) 1402 s.Require().Equal([]*model.User{sanitized(s.u1)}, actual) 1403 } 1404 1405 // get unknown team id 1406 func (s *UserStoreGetProfilesTS) TestGetUnknownTeamId() { 1407 actual, err := s.Store().User().GetProfiles(&model.UserGetOptions{ 1408 InTeamId: "123", 1409 Page: 0, 1410 PerPage: 100, 1411 }) 1412 s.Require().Nil(err) 1413 s.Require().Equal([]*model.User{}, actual) 1414 } 1415 1416 // etag changes for all after user creation 1417 func (s *UserStoreGetProfilesTS) TestEtagChangesForAllAfterUserCreation() { 1418 etag := s.Store().User().GetEtagForProfiles(s.teamId) 1419 uNew := &model.User{} 1420 uNew.Email = MakeEmail() 1421 _, err := s.Store().User().Save(uNew) 1422 s.Require().Nil(err) 1423 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(uNew.Id)) }() 1424 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: s.teamId, UserId: uNew.Id}, -1) 1425 s.Require().Nil(nErr) 1426 updatedEtag := s.Store().User().GetEtagForProfiles(s.teamId) 1427 s.Require().NotEqual(etag, updatedEtag) 1428 } 1429 1430 // filter to system_admin role 1431 func (s *UserStoreGetProfilesTS) TestFilterToSystemAdminRole() { 1432 actual, err := s.Store().User().GetProfiles(&model.UserGetOptions{ 1433 InTeamId: s.teamId, 1434 Page: 0, 1435 PerPage: 10, 1436 Role: "system_admin", 1437 }) 1438 s.Require().Nil(err) 1439 s.Require().Equal([]*model.User{ 1440 sanitized(s.u4), 1441 }, actual) 1442 } 1443 1444 // filter to inactive 1445 func (s *UserStoreGetProfilesTS) TestFilterToInActive() { 1446 actual, err := s.Store().User().GetProfiles(&model.UserGetOptions{ 1447 InTeamId: s.teamId, 1448 Page: 0, 1449 PerPage: 10, 1450 Inactive: true, 1451 }) 1452 s.Require().Nil(err) 1453 s.Require().Equal([]*model.User{ 1454 sanitized(s.u5), 1455 }, actual) 1456 } 1457 1458 // filter to active 1459 func (s *UserStoreGetProfilesTS) TestFilterToActive() { 1460 actual, err := s.Store().User().GetProfiles(&model.UserGetOptions{ 1461 InTeamId: s.teamId, 1462 Page: 0, 1463 PerPage: 10, 1464 Active: true, 1465 }) 1466 s.Require().Nil(err) 1467 s.Require().Equal([]*model.User{ 1468 sanitized(s.u1), 1469 sanitized(s.u2), 1470 sanitized(s.u3), 1471 sanitized(s.u4), 1472 }, actual) 1473 } 1474 1475 // try to filter to active and inactive 1476 func (s *UserStoreGetProfilesTS) TestFilterToActiveAndInactive() { 1477 actual, err := s.Store().User().GetProfiles(&model.UserGetOptions{ 1478 InTeamId: s.teamId, 1479 Page: 0, 1480 PerPage: 10, 1481 Inactive: true, 1482 Active: true, 1483 }) 1484 s.Require().Nil(err) 1485 s.Require().Equal([]*model.User{ 1486 sanitized(s.u5), 1487 }, actual) 1488 } 1489 1490 // type UserStoreGetProfilesByIdsTS struct { 1491 // suite.Suite 1492 // StoreTestSuite 1493 1494 // u1 *model.User 1495 // u2 *model.User 1496 // u3 *model.User 1497 // u4 *model.User 1498 // u5 *model.User 1499 // u6 *model.User 1500 // u7 *model.User 1501 // teamId string 1502 // } 1503 1504 func TestUserStoreGetProfilesByIdsTS(t *testing.T) { 1505 StoreTestSuiteWithSqlSupplier(t, &UserStoreGetProfilesByIdsTS{}, func(t *testing.T, testSuite StoreTestBaseSuite) { 1506 suite.Run(t, testSuite) 1507 }) 1508 } 1509 1510 func (s *UserStoreGetProfilesByIdsTS) SetupSuite() { 1511 teamId := model.NewId() 1512 s.teamId = teamId 1513 1514 u1, err := s.Store().User().Save(&model.User{ 1515 Email: MakeEmail(), 1516 Username: "u1" + model.NewId(), 1517 }) 1518 s.Require().Nil(err) 1519 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1) 1520 s.Require().Nil(nErr) 1521 s.u1 = u1 1522 1523 u2, err := s.Store().User().Save(&model.User{ 1524 Email: MakeEmail(), 1525 Username: "u2" + model.NewId(), 1526 }) 1527 s.Require().Nil(err) 1528 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1) 1529 s.Require().Nil(nErr) 1530 s.u2 = u2 1531 1532 time.Sleep(time.Millisecond) 1533 u3, err := s.Store().User().Save(&model.User{ 1534 Email: MakeEmail(), 1535 Username: "u3" + model.NewId(), 1536 }) 1537 s.Require().Nil(err) 1538 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1) 1539 s.Require().Nil(nErr) 1540 _, nErr = s.Store().Bot().Save(&model.Bot{ 1541 UserId: u3.Id, 1542 Username: u3.Username, 1543 OwnerId: u1.Id, 1544 }) 1545 s.Require().Nil(nErr) 1546 u3.IsBot = true 1547 s.u3 = u3 1548 1549 u4, err := s.Store().User().Save(&model.User{ 1550 Email: MakeEmail(), 1551 Username: "u4" + model.NewId(), 1552 }) 1553 s.Require().Nil(err) 1554 s.u4 = u4 1555 } 1556 1557 func (s *UserStoreGetProfilesByIdsTS) TearDownSuite() { 1558 s.Require().Nil(s.Store().User().PermanentDelete(s.u1.Id)) 1559 s.Require().Nil(s.Store().User().PermanentDelete(s.u2.Id)) 1560 s.Require().Nil(s.Store().User().PermanentDelete(s.u3.Id)) 1561 s.Require().Nil(s.Store().User().PermanentDelete(s.u4.Id)) 1562 } 1563 1564 // get u1 by id, no caching 1565 func (s *UserStoreGetProfilesByIdsTS) TestGetU1ByIdNoCaching() { 1566 users, err := s.Store().User().GetProfileByIds(context.Background(), []string{s.u1.Id}, nil, false) 1567 s.Require().Nil(err) 1568 s.Assert().Equal([]*model.User{s.u1}, users) 1569 } 1570 1571 func (s *UserStoreGetProfilesByIdsTS) TestGetU1ByIdCaching() { 1572 users, err := s.Store().User().GetProfileByIds(context.Background(), []string{s.u1.Id}, nil, true) 1573 s.Require().Nil(err) 1574 s.Assert().Equal([]*model.User{s.u1}, users) 1575 } 1576 1577 // get u1, u2, u3 by id, no caching 1578 func (s *UserStoreGetProfilesByIdsTS) TestGetU1U2U3ByIdNoCaching() { 1579 users, err := s.Store().User().GetProfileByIds(context.Background(), []string{s.u1.Id, s.u2.Id, s.u3.Id}, nil, false) 1580 s.Require().Nil(err) 1581 s.Assert().Equal([]*model.User{s.u1, s.u2, s.u3}, users) 1582 } 1583 1584 // get u1, u2, u3 by id, caching 1585 func (s *UserStoreGetProfilesByIdsTS) TestGetU1U2U3ByIdCaching() { 1586 users, err := s.Store().User().GetProfileByIds(context.Background(), []string{s.u1.Id, s.u2.Id, s.u3.Id}, nil, true) 1587 s.Require().Nil(err) 1588 s.Assert().Equal([]*model.User{s.u1, s.u2, s.u3}, users) 1589 } 1590 1591 // get unknown id, caching 1592 func (s *UserStoreGetProfilesByIdsTS) TestGetUnknownByIdCaching() { 1593 users, err := s.Store().User().GetProfileByIds(context.Background(), []string{"123"}, nil, true) 1594 s.Require().Nil(err) 1595 s.Assert().Equal([]*model.User{}, users) 1596 } 1597 1598 // should only return users with UpdateAt greater than the since time 1599 func (s *UserStoreGetProfilesByIdsTS) TestReturnUsersUpdateAtGreater() { 1600 users, err := s.Store().User().GetProfileByIds(context.Background(), []string{s.u1.Id, s.u2.Id, s.u3.Id, s.u4.Id}, &store.UserGetByIdsOpts{ 1601 Since: s.u2.CreateAt, 1602 }, true) 1603 s.Require().Nil(err) 1604 s.Assert().Equal([]*model.User{s.u3, s.u4}, users) 1605 } 1606 1607 func (s *UserStoreTS) TestGetProfileByGroupChannelIdsForUser() { 1608 u1, err := s.Store().User().Save(&model.User{ 1609 Email: MakeEmail(), 1610 Username: "u1" + model.NewId(), 1611 }) 1612 s.Require().Nil(err) 1613 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 1614 1615 u2, err := s.Store().User().Save(&model.User{ 1616 Email: MakeEmail(), 1617 Username: "u2" + model.NewId(), 1618 }) 1619 s.Require().Nil(err) 1620 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }() 1621 1622 u3, err := s.Store().User().Save(&model.User{ 1623 Email: MakeEmail(), 1624 Username: "u3" + model.NewId(), 1625 }) 1626 s.Require().Nil(err) 1627 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }() 1628 1629 u4, err := s.Store().User().Save(&model.User{ 1630 Email: MakeEmail(), 1631 Username: "u4" + model.NewId(), 1632 }) 1633 s.Require().Nil(err) 1634 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u4.Id)) }() 1635 1636 gc1, nErr := s.Store().Channel().Save(&model.Channel{ 1637 DisplayName: "Profiles in private", 1638 Name: "profiles-" + model.NewId(), 1639 Type: model.CHANNEL_GROUP, 1640 }, -1) 1641 s.Require().Nil(nErr) 1642 1643 for _, uId := range []string{u1.Id, u2.Id, u3.Id} { 1644 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ 1645 ChannelId: gc1.Id, 1646 UserId: uId, 1647 NotifyProps: model.GetDefaultChannelNotifyProps(), 1648 }) 1649 s.Require().Nil(nErr) 1650 } 1651 1652 gc2, nErr := s.Store().Channel().Save(&model.Channel{ 1653 DisplayName: "Profiles in private", 1654 Name: "profiles-" + model.NewId(), 1655 Type: model.CHANNEL_GROUP, 1656 }, -1) 1657 s.Require().Nil(nErr) 1658 1659 for _, uId := range []string{u1.Id, u3.Id, u4.Id} { 1660 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ 1661 ChannelId: gc2.Id, 1662 UserId: uId, 1663 NotifyProps: model.GetDefaultChannelNotifyProps(), 1664 }) 1665 s.Require().Nil(nErr) 1666 } 1667 1668 testCases := []struct { 1669 Name string 1670 UserId string 1671 ChannelIds []string 1672 ExpectedUserIdsByChannel map[string][]string 1673 EnsureChannelsNotInResults []string 1674 }{ 1675 { 1676 Name: "Get group 1 as user 1", 1677 UserId: u1.Id, 1678 ChannelIds: []string{gc1.Id}, 1679 ExpectedUserIdsByChannel: map[string][]string{ 1680 gc1.Id: {u2.Id, u3.Id}, 1681 }, 1682 EnsureChannelsNotInResults: []string{}, 1683 }, 1684 { 1685 Name: "Get groups 1 and 2 as user 1", 1686 UserId: u1.Id, 1687 ChannelIds: []string{gc1.Id, gc2.Id}, 1688 ExpectedUserIdsByChannel: map[string][]string{ 1689 gc1.Id: {u2.Id, u3.Id}, 1690 gc2.Id: {u3.Id, u4.Id}, 1691 }, 1692 EnsureChannelsNotInResults: []string{}, 1693 }, 1694 { 1695 Name: "Get groups 1 and 2 as user 2", 1696 UserId: u2.Id, 1697 ChannelIds: []string{gc1.Id, gc2.Id}, 1698 ExpectedUserIdsByChannel: map[string][]string{ 1699 gc1.Id: {u1.Id, u3.Id}, 1700 }, 1701 EnsureChannelsNotInResults: []string{gc2.Id}, 1702 }, 1703 } 1704 1705 for _, tc := range testCases { 1706 s.T().Run(tc.Name, func(t *testing.T) { 1707 res, err := s.Store().User().GetProfileByGroupChannelIdsForUser(tc.UserId, tc.ChannelIds) 1708 s.Require().Nil(err) 1709 1710 for channelId, expectedUsers := range tc.ExpectedUserIdsByChannel { 1711 users, ok := res[channelId] 1712 s.Require().True(ok) 1713 1714 var userIds []string 1715 for _, user := range users { 1716 userIds = append(userIds, user.Id) 1717 } 1718 s.Require().ElementsMatch(expectedUsers, userIds) 1719 } 1720 1721 for _, channelId := range tc.EnsureChannelsNotInResults { 1722 _, ok := res[channelId] 1723 s.Require().False(ok) 1724 } 1725 }) 1726 } 1727 } 1728 1729 func (s *UserStoreTS) TestGetByEmail() { 1730 teamId := model.NewId() 1731 1732 u1, err := s.Store().User().Save(&model.User{ 1733 Email: MakeEmail(), 1734 Username: "u1" + model.NewId(), 1735 }) 1736 s.Require().Nil(err) 1737 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 1738 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1) 1739 s.Require().Nil(nErr) 1740 1741 u2, err := s.Store().User().Save(&model.User{ 1742 Email: MakeEmail(), 1743 Username: "u2" + model.NewId(), 1744 }) 1745 s.Require().Nil(err) 1746 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }() 1747 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1) 1748 s.Require().Nil(nErr) 1749 1750 u3, err := s.Store().User().Save(&model.User{ 1751 Email: MakeEmail(), 1752 Username: "u3" + model.NewId(), 1753 }) 1754 s.Require().Nil(err) 1755 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }() 1756 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1) 1757 s.Require().Nil(nErr) 1758 _, nErr = s.Store().Bot().Save(&model.Bot{ 1759 UserId: u3.Id, 1760 Username: u3.Username, 1761 OwnerId: u1.Id, 1762 }) 1763 s.Require().Nil(nErr) 1764 u3.IsBot = true 1765 defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }() 1766 1767 s.T().Run("get u1 by email", func(t *testing.T) { 1768 u, err := s.Store().User().GetByEmail(u1.Email) 1769 s.Require().Nil(err) 1770 s.Assert().Equal(u1, u) 1771 }) 1772 1773 s.T().Run("get u2 by email", func(t *testing.T) { 1774 u, err := s.Store().User().GetByEmail(u2.Email) 1775 s.Require().Nil(err) 1776 s.Assert().Equal(u2, u) 1777 }) 1778 1779 s.T().Run("get u3 by email", func(t *testing.T) { 1780 u, err := s.Store().User().GetByEmail(u3.Email) 1781 s.Require().Nil(err) 1782 s.Assert().Equal(u3, u) 1783 }) 1784 1785 s.T().Run("get by empty email", func(t *testing.T) { 1786 _, err := s.Store().User().GetByEmail("") 1787 s.Require().NotNil(err) 1788 }) 1789 1790 s.T().Run("get by unknown", func(t *testing.T) { 1791 _, err := s.Store().User().GetByEmail("unknown") 1792 s.Require().NotNil(err) 1793 }) 1794 } 1795 1796 func (s *UserStoreTS) TestGetByAuthData() { 1797 teamId := model.NewId() 1798 auth1 := model.NewId() 1799 auth3 := model.NewId() 1800 1801 u1, err := s.Store().User().Save(&model.User{ 1802 Email: MakeEmail(), 1803 Username: "u1" + model.NewId(), 1804 AuthData: &auth1, 1805 AuthService: "service", 1806 }) 1807 s.Require().Nil(err) 1808 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 1809 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1) 1810 s.Require().Nil(nErr) 1811 1812 u2, err := s.Store().User().Save(&model.User{ 1813 Email: MakeEmail(), 1814 Username: "u2" + model.NewId(), 1815 }) 1816 s.Require().Nil(err) 1817 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }() 1818 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1) 1819 s.Require().Nil(nErr) 1820 1821 u3, err := s.Store().User().Save(&model.User{ 1822 Email: MakeEmail(), 1823 Username: "u3" + model.NewId(), 1824 AuthData: &auth3, 1825 AuthService: "service2", 1826 }) 1827 s.Require().Nil(err) 1828 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }() 1829 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1) 1830 s.Require().Nil(nErr) 1831 _, nErr = s.Store().Bot().Save(&model.Bot{ 1832 UserId: u3.Id, 1833 Username: u3.Username, 1834 OwnerId: u1.Id, 1835 }) 1836 s.Require().Nil(nErr) 1837 u3.IsBot = true 1838 defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }() 1839 1840 s.T().Run("get by u1 auth", func(t *testing.T) { 1841 u, err := s.Store().User().GetByAuth(u1.AuthData, u1.AuthService) 1842 s.Require().Nil(err) 1843 s.Assert().Equal(u1, u) 1844 }) 1845 1846 s.T().Run("get by u3 auth", func(t *testing.T) { 1847 u, err := s.Store().User().GetByAuth(u3.AuthData, u3.AuthService) 1848 s.Require().Nil(err) 1849 s.Assert().Equal(u3, u) 1850 }) 1851 1852 s.T().Run("get by u1 auth, unknown service", func(t *testing.T) { 1853 _, err := s.Store().User().GetByAuth(u1.AuthData, "unknown") 1854 s.Require().NotNil(err) 1855 var nfErr *store.ErrNotFound 1856 s.Require().True(errors.As(err, &nfErr)) 1857 }) 1858 1859 s.T().Run("get by unknown auth, u1 service", func(t *testing.T) { 1860 unknownAuth := "" 1861 _, err := s.Store().User().GetByAuth(&unknownAuth, u1.AuthService) 1862 s.Require().NotNil(err) 1863 var invErr *store.ErrInvalidInput 1864 s.Require().True(errors.As(err, &invErr)) 1865 }) 1866 1867 s.T().Run("get by unknown auth, unknown service", func(t *testing.T) { 1868 unknownAuth := "" 1869 _, err := s.Store().User().GetByAuth(&unknownAuth, "unknown") 1870 s.Require().NotNil(err) 1871 var invErr *store.ErrInvalidInput 1872 s.Require().True(errors.As(err, &invErr)) 1873 }) 1874 } 1875 1876 func (s *UserStoreTS) TestGetByUsername() { 1877 teamId := model.NewId() 1878 1879 u1, err := s.Store().User().Save(&model.User{ 1880 Email: MakeEmail(), 1881 Username: "u1" + model.NewId(), 1882 }) 1883 s.Require().Nil(err) 1884 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 1885 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1) 1886 s.Require().Nil(nErr) 1887 1888 u2, err := s.Store().User().Save(&model.User{ 1889 Email: MakeEmail(), 1890 Username: "u2" + model.NewId(), 1891 }) 1892 s.Require().Nil(err) 1893 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }() 1894 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1) 1895 s.Require().Nil(nErr) 1896 1897 u3, err := s.Store().User().Save(&model.User{ 1898 Email: MakeEmail(), 1899 Username: "u3" + model.NewId(), 1900 }) 1901 s.Require().Nil(err) 1902 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }() 1903 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1) 1904 s.Require().Nil(nErr) 1905 _, nErr = s.Store().Bot().Save(&model.Bot{ 1906 UserId: u3.Id, 1907 Username: u3.Username, 1908 OwnerId: u1.Id, 1909 }) 1910 s.Require().Nil(nErr) 1911 u3.IsBot = true 1912 defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }() 1913 1914 s.T().Run("get u1 by username", func(t *testing.T) { 1915 result, err := s.Store().User().GetByUsername(u1.Username) 1916 s.Require().Nil(err) 1917 s.Assert().Equal(u1, result) 1918 }) 1919 1920 s.T().Run("get u2 by username", func(t *testing.T) { 1921 result, err := s.Store().User().GetByUsername(u2.Username) 1922 s.Require().Nil(err) 1923 s.Assert().Equal(u2, result) 1924 }) 1925 1926 s.T().Run("get u3 by username", func(t *testing.T) { 1927 result, err := s.Store().User().GetByUsername(u3.Username) 1928 s.Require().Nil(err) 1929 s.Assert().Equal(u3, result) 1930 }) 1931 1932 s.T().Run("get by empty username", func(t *testing.T) { 1933 _, err := s.Store().User().GetByUsername("") 1934 s.Require().NotNil(err) 1935 var nfErr *store.ErrNotFound 1936 s.Require().True(errors.As(err, &nfErr)) 1937 }) 1938 1939 s.T().Run("get by unknown", func(t *testing.T) { 1940 _, err := s.Store().User().GetByUsername("unknown") 1941 s.Require().NotNil(err) 1942 var nfErr *store.ErrNotFound 1943 s.Require().True(errors.As(err, &nfErr)) 1944 }) 1945 } 1946 1947 func (s *UserStoreTS) TestGetForLogin() { 1948 teamId := model.NewId() 1949 auth := model.NewId() 1950 auth2 := model.NewId() 1951 auth3 := model.NewId() 1952 1953 u1, err := s.Store().User().Save(&model.User{ 1954 Email: MakeEmail(), 1955 Username: "u1" + model.NewId(), 1956 AuthService: model.USER_AUTH_SERVICE_GITLAB, 1957 AuthData: &auth, 1958 }) 1959 1960 s.Require().Nil(err) 1961 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 1962 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1) 1963 s.Require().Nil(nErr) 1964 1965 u2, err := s.Store().User().Save(&model.User{ 1966 Email: MakeEmail(), 1967 Username: "u2" + model.NewId(), 1968 AuthService: model.USER_AUTH_SERVICE_LDAP, 1969 AuthData: &auth2, 1970 }) 1971 s.Require().Nil(err) 1972 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }() 1973 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1) 1974 s.Require().Nil(nErr) 1975 1976 u3, err := s.Store().User().Save(&model.User{ 1977 Email: MakeEmail(), 1978 Username: "u3" + model.NewId(), 1979 AuthService: model.USER_AUTH_SERVICE_LDAP, 1980 AuthData: &auth3, 1981 }) 1982 s.Require().Nil(err) 1983 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }() 1984 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1) 1985 s.Require().Nil(nErr) 1986 _, nErr = s.Store().Bot().Save(&model.Bot{ 1987 UserId: u3.Id, 1988 Username: u3.Username, 1989 OwnerId: u1.Id, 1990 }) 1991 s.Require().Nil(nErr) 1992 u3.IsBot = true 1993 defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }() 1994 1995 s.T().Run("get u1 by username, allow both", func(t *testing.T) { 1996 user, err := s.Store().User().GetForLogin(u1.Username, true, true) 1997 s.Require().Nil(err) 1998 s.Assert().Equal(u1, user) 1999 }) 2000 2001 s.T().Run("get u1 by username, check for case issues", func(t *testing.T) { 2002 user, err := s.Store().User().GetForLogin(strings.ToUpper(u1.Username), true, true) 2003 s.Require().Nil(err) 2004 s.Assert().Equal(u1, user) 2005 }) 2006 2007 s.T().Run("get u1 by username, allow only email", func(t *testing.T) { 2008 _, err := s.Store().User().GetForLogin(u1.Username, false, true) 2009 s.Require().NotNil(err) 2010 s.Require().Equal("user not found", err.Error()) 2011 }) 2012 2013 s.T().Run("get u1 by email, allow both", func(t *testing.T) { 2014 user, err := s.Store().User().GetForLogin(u1.Email, true, true) 2015 s.Require().Nil(err) 2016 s.Assert().Equal(u1, user) 2017 }) 2018 2019 s.T().Run("get u1 by email, check for case issues", func(t *testing.T) { 2020 user, err := s.Store().User().GetForLogin(strings.ToUpper(u1.Email), true, true) 2021 s.Require().Nil(err) 2022 s.Assert().Equal(u1, user) 2023 }) 2024 2025 s.T().Run("get u1 by email, allow only username", func(t *testing.T) { 2026 _, err := s.Store().User().GetForLogin(u1.Email, true, false) 2027 s.Require().NotNil(err) 2028 s.Require().Equal("user not found", err.Error()) 2029 }) 2030 2031 s.T().Run("get u2 by username, allow both", func(t *testing.T) { 2032 user, err := s.Store().User().GetForLogin(u2.Username, true, true) 2033 s.Require().Nil(err) 2034 s.Assert().Equal(u2, user) 2035 }) 2036 2037 s.T().Run("get u2 by email, allow both", func(t *testing.T) { 2038 user, err := s.Store().User().GetForLogin(u2.Email, true, true) 2039 s.Require().Nil(err) 2040 s.Assert().Equal(u2, user) 2041 }) 2042 2043 s.T().Run("get u2 by username, allow neither", func(t *testing.T) { 2044 _, err := s.Store().User().GetForLogin(u2.Username, false, false) 2045 s.Require().NotNil(err) 2046 s.Require().Equal("sign in with username and email are disabled", err.Error()) 2047 }) 2048 } 2049 2050 func (s *UserStoreTS) TestGetAllUsingAuthService() { 2051 teamId := model.NewId() 2052 2053 u1, err := s.Store().User().Save(&model.User{ 2054 Email: MakeEmail(), 2055 Username: "u1" + model.NewId(), 2056 AuthService: "service", 2057 }) 2058 s.Require().Nil(err) 2059 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 2060 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1) 2061 s.Require().Nil(nErr) 2062 2063 u2, err := s.Store().User().Save(&model.User{ 2064 Email: MakeEmail(), 2065 Username: "u2" + model.NewId(), 2066 AuthService: "service", 2067 }) 2068 s.Require().Nil(err) 2069 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }() 2070 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1) 2071 s.Require().Nil(nErr) 2072 2073 u3, err := s.Store().User().Save(&model.User{ 2074 Email: MakeEmail(), 2075 Username: "u3" + model.NewId(), 2076 AuthService: "service2", 2077 }) 2078 s.Require().Nil(err) 2079 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }() 2080 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1) 2081 s.Require().Nil(nErr) 2082 _, nErr = s.Store().Bot().Save(&model.Bot{ 2083 UserId: u3.Id, 2084 Username: u3.Username, 2085 OwnerId: u1.Id, 2086 }) 2087 s.Require().Nil(nErr) 2088 u3.IsBot = true 2089 defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }() 2090 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }() 2091 2092 s.T().Run("get by unknown auth service", func(t *testing.T) { 2093 users, err := s.Store().User().GetAllUsingAuthService("unknown") 2094 s.Require().Nil(err) 2095 s.Assert().Equal([]*model.User{}, users) 2096 }) 2097 2098 s.T().Run("get by auth service", func(t *testing.T) { 2099 users, err := s.Store().User().GetAllUsingAuthService("service") 2100 s.Require().Nil(err) 2101 s.Assert().Equal([]*model.User{u1, u2}, users) 2102 }) 2103 2104 s.T().Run("get by other auth service", func(t *testing.T) { 2105 users, err := s.Store().User().GetAllUsingAuthService("service2") 2106 s.Require().Nil(err) 2107 s.Assert().Equal([]*model.User{u3}, users) 2108 }) 2109 } 2110 2111 func (s *UserStoreTS) TestUpdateFailedPasswordAttempts() { 2112 u1 := &model.User{} 2113 u1.Email = MakeEmail() 2114 _, err := s.Store().User().Save(u1) 2115 s.Require().Nil(err) 2116 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 2117 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1) 2118 s.Require().Nil(nErr) 2119 2120 err = s.Store().User().UpdateFailedPasswordAttempts(u1.Id, 3) 2121 s.Require().Nil(err) 2122 2123 user, err := s.Store().User().Get(context.Background(), u1.Id) 2124 s.Require().Nil(err) 2125 s.Require().Equal(3, user.FailedAttempts, "FailedAttempts not updated correctly") 2126 } 2127 2128 func (s *UserStoreTS) TestUserStoreGetSystemAdminProfiles() { 2129 teamId := model.NewId() 2130 2131 u1, err := s.Store().User().Save(&model.User{ 2132 Email: MakeEmail(), 2133 Roles: model.SYSTEM_USER_ROLE_ID + " " + model.SYSTEM_ADMIN_ROLE_ID, 2134 Username: "u1" + model.NewId(), 2135 }) 2136 s.Require().Nil(err) 2137 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 2138 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1) 2139 s.Require().Nil(nErr) 2140 2141 u2, err := s.Store().User().Save(&model.User{ 2142 Email: MakeEmail(), 2143 Username: "u2" + model.NewId(), 2144 }) 2145 s.Require().Nil(err) 2146 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }() 2147 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1) 2148 s.Require().Nil(nErr) 2149 2150 u3, err := s.Store().User().Save(&model.User{ 2151 Email: MakeEmail(), 2152 Roles: model.SYSTEM_USER_ROLE_ID + " " + model.SYSTEM_ADMIN_ROLE_ID, 2153 Username: "u3" + model.NewId(), 2154 }) 2155 s.Require().Nil(err) 2156 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }() 2157 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1) 2158 s.Require().Nil(nErr) 2159 _, nErr = s.Store().Bot().Save(&model.Bot{ 2160 UserId: u3.Id, 2161 Username: u3.Username, 2162 OwnerId: u1.Id, 2163 }) 2164 s.Require().Nil(nErr) 2165 u3.IsBot = true 2166 defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }() 2167 2168 s.T().Run("all system admin profiles", func(t *testing.T) { 2169 result, userError := s.Store().User().GetSystemAdminProfiles() 2170 s.Require().Nil(userError) 2171 s.Assert().Equal(map[string]*model.User{ 2172 u1.Id: sanitized(u1), 2173 u3.Id: sanitized(u3), 2174 }, result) 2175 }) 2176 } 2177 2178 func (s *UserStoreTS) TestAnalyticsActiveCount() { 2179 s.cleanupStatusStore() 2180 2181 // Create 5 users statuses u0, u1, u2, u3, u4. 2182 // u4 is also a bot 2183 u0, err := s.Store().User().Save(&model.User{ 2184 Email: MakeEmail(), 2185 Username: "u0" + model.NewId(), 2186 }) 2187 s.Require().Nil(err) 2188 u1, err := s.Store().User().Save(&model.User{ 2189 Email: MakeEmail(), 2190 Username: "u1" + model.NewId(), 2191 }) 2192 s.Require().Nil(err) 2193 u2, err := s.Store().User().Save(&model.User{ 2194 Email: MakeEmail(), 2195 Username: "u2" + model.NewId(), 2196 }) 2197 s.Require().Nil(err) 2198 u3, err := s.Store().User().Save(&model.User{ 2199 Email: MakeEmail(), 2200 Username: "u3" + model.NewId(), 2201 }) 2202 s.Require().Nil(err) 2203 u4, err := s.Store().User().Save(&model.User{ 2204 Email: MakeEmail(), 2205 Username: "u4" + model.NewId(), 2206 }) 2207 s.Require().Nil(err) 2208 defer func() { 2209 s.Require().Nil(s.Store().User().PermanentDelete(u0.Id)) 2210 s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) 2211 s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) 2212 s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) 2213 s.Require().Nil(s.Store().User().PermanentDelete(u4.Id)) 2214 }() 2215 2216 _, nErr := s.Store().Bot().Save(&model.Bot{ 2217 UserId: u4.Id, 2218 Username: u4.Username, 2219 OwnerId: u1.Id, 2220 }) 2221 s.Require().Nil(nErr) 2222 2223 millis := model.GetMillis() 2224 millisTwoDaysAgo := model.GetMillis() - (2 * DAY_MILLISECONDS) 2225 millisTwoMonthsAgo := model.GetMillis() - (2 * MONTH_MILLISECONDS) 2226 2227 // u0 last activity status is two months ago. 2228 // u1 last activity status is two days ago. 2229 // u2, u3, u4 last activity is within last day 2230 s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{UserId: u0.Id, Status: model.STATUS_OFFLINE, LastActivityAt: millisTwoMonthsAgo})) 2231 s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{UserId: u1.Id, Status: model.STATUS_OFFLINE, LastActivityAt: millisTwoDaysAgo})) 2232 s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{UserId: u2.Id, Status: model.STATUS_OFFLINE, LastActivityAt: millis})) 2233 s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{UserId: u3.Id, Status: model.STATUS_OFFLINE, LastActivityAt: millis})) 2234 s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{UserId: u4.Id, Status: model.STATUS_OFFLINE, LastActivityAt: millis})) 2235 2236 // Daily counts (without bots) 2237 count, err := s.Store().User().AnalyticsActiveCount(DAY_MILLISECONDS, model.UserCountOptions{IncludeBotAccounts: false, IncludeDeleted: true}) 2238 s.Require().Nil(err) 2239 s.Assert().Equal(int64(2), count) 2240 2241 // Daily counts (with bots) 2242 count, err = s.Store().User().AnalyticsActiveCount(DAY_MILLISECONDS, model.UserCountOptions{IncludeBotAccounts: true, IncludeDeleted: true}) 2243 s.Require().Nil(err) 2244 s.Assert().Equal(int64(3), count) 2245 2246 // Monthly counts (without bots) 2247 count, err = s.Store().User().AnalyticsActiveCount(MONTH_MILLISECONDS, model.UserCountOptions{IncludeBotAccounts: false, IncludeDeleted: true}) 2248 s.Require().Nil(err) 2249 s.Assert().Equal(int64(3), count) 2250 2251 // Monthly counts - (with bots) 2252 count, err = s.Store().User().AnalyticsActiveCount(MONTH_MILLISECONDS, model.UserCountOptions{IncludeBotAccounts: true, IncludeDeleted: true}) 2253 s.Require().Nil(err) 2254 s.Assert().Equal(int64(4), count) 2255 2256 // Monthly counts - (with bots, excluding deleted) 2257 count, err = s.Store().User().AnalyticsActiveCount(MONTH_MILLISECONDS, model.UserCountOptions{IncludeBotAccounts: true, IncludeDeleted: false}) 2258 s.Require().Nil(err) 2259 s.Assert().Equal(int64(4), count) 2260 } 2261 2262 func (s *UserStoreTS) TestAnalyticsActiveCountForPeriod() { 2263 2264 s.cleanupStatusStore() 2265 2266 // Create 5 users statuses u0, u1, u2, u3, u4. 2267 // u4 is also a bot 2268 u0, err := s.Store().User().Save(&model.User{ 2269 Email: MakeEmail(), 2270 Username: "u0" + model.NewId(), 2271 }) 2272 s.Require().Nil(err) 2273 u1, err := s.Store().User().Save(&model.User{ 2274 Email: MakeEmail(), 2275 Username: "u1" + model.NewId(), 2276 }) 2277 s.Require().Nil(err) 2278 u2, err := s.Store().User().Save(&model.User{ 2279 Email: MakeEmail(), 2280 Username: "u2" + model.NewId(), 2281 }) 2282 s.Require().Nil(err) 2283 u3, err := s.Store().User().Save(&model.User{ 2284 Email: MakeEmail(), 2285 Username: "u3" + model.NewId(), 2286 }) 2287 s.Require().Nil(err) 2288 u4, err := s.Store().User().Save(&model.User{ 2289 Email: MakeEmail(), 2290 Username: "u4" + model.NewId(), 2291 }) 2292 s.Require().Nil(err) 2293 defer func() { 2294 s.Require().Nil(s.Store().User().PermanentDelete(u0.Id)) 2295 s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) 2296 s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) 2297 s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) 2298 s.Require().Nil(s.Store().User().PermanentDelete(u4.Id)) 2299 }() 2300 2301 _, nErr := s.Store().Bot().Save(&model.Bot{ 2302 UserId: u4.Id, 2303 Username: u4.Username, 2304 OwnerId: u1.Id, 2305 }) 2306 s.Require().Nil(nErr) 2307 2308 millis := model.GetMillis() 2309 millisTwoDaysAgo := model.GetMillis() - (2 * DAY_MILLISECONDS) 2310 millisTwoMonthsAgo := model.GetMillis() - (2 * MONTH_MILLISECONDS) 2311 2312 // u0 last activity status is two months ago. 2313 // u1 last activity status is one month ago 2314 // u2 last activiy is two days ago 2315 // u2 last activity is one day ago 2316 // u3 last activity is within last day 2317 // u4 last activity is within last day 2318 s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{UserId: u0.Id, Status: model.STATUS_OFFLINE, LastActivityAt: millisTwoMonthsAgo})) 2319 s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{UserId: u1.Id, Status: model.STATUS_OFFLINE, LastActivityAt: millisTwoMonthsAgo + MONTH_MILLISECONDS})) 2320 s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{UserId: u2.Id, Status: model.STATUS_OFFLINE, LastActivityAt: millisTwoDaysAgo})) 2321 s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{UserId: u3.Id, Status: model.STATUS_OFFLINE, LastActivityAt: millisTwoDaysAgo + DAY_MILLISECONDS})) 2322 s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{UserId: u4.Id, Status: model.STATUS_OFFLINE, LastActivityAt: millis})) 2323 2324 // Two months to two days (without bots) 2325 count, nerr := s.Store().User().AnalyticsActiveCountForPeriod(millisTwoMonthsAgo, millisTwoDaysAgo, model.UserCountOptions{IncludeBotAccounts: false, IncludeDeleted: false}) 2326 s.Require().Nil(nerr) 2327 s.Assert().Equal(int64(2), count) 2328 2329 // Two months to two days (without bots) 2330 count, nerr = s.Store().User().AnalyticsActiveCountForPeriod(millisTwoMonthsAgo, millisTwoDaysAgo, model.UserCountOptions{IncludeBotAccounts: false, IncludeDeleted: true}) 2331 s.Require().Nil(nerr) 2332 s.Assert().Equal(int64(2), count) 2333 2334 // Two days to present - (with bots) 2335 count, nerr = s.Store().User().AnalyticsActiveCountForPeriod(millisTwoDaysAgo, millis, model.UserCountOptions{IncludeBotAccounts: true, IncludeDeleted: false}) 2336 s.Require().Nil(nerr) 2337 s.Assert().Equal(int64(2), count) 2338 2339 // Two days to present - (with bots, excluding deleted) 2340 count, nerr = s.Store().User().AnalyticsActiveCountForPeriod(millisTwoDaysAgo, millis, model.UserCountOptions{IncludeBotAccounts: true, IncludeDeleted: true}) 2341 s.Require().Nil(nerr) 2342 s.Assert().Equal(int64(2), count) 2343 } 2344 2345 func (s *UserStoreTS) TestAnalyticsGetInactiveUsersCount() { 2346 u1 := &model.User{} 2347 u1.Email = MakeEmail() 2348 _, err := s.Store().User().Save(u1) 2349 s.Require().Nil(err) 2350 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 2351 2352 count, err := s.Store().User().AnalyticsGetInactiveUsersCount() 2353 s.Require().Nil(err) 2354 2355 u2 := &model.User{} 2356 u2.Email = MakeEmail() 2357 u2.DeleteAt = model.GetMillis() 2358 _, err = s.Store().User().Save(u2) 2359 s.Require().Nil(err) 2360 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }() 2361 2362 newCount, err := s.Store().User().AnalyticsGetInactiveUsersCount() 2363 s.Require().Nil(err) 2364 s.Require().Equal(count, newCount-1, "Expected 1 more inactive users but found otherwise.") 2365 } 2366 2367 func (s *UserStoreTS) TestAnalyticsGetSystemAdminCount() { 2368 countBefore, err := s.Store().User().AnalyticsGetSystemAdminCount() 2369 s.Require().Nil(err) 2370 2371 u1 := model.User{} 2372 u1.Email = MakeEmail() 2373 u1.Username = model.NewId() 2374 u1.Roles = "system_user system_admin" 2375 2376 u2 := model.User{} 2377 u2.Email = MakeEmail() 2378 u2.Username = model.NewId() 2379 2380 _, nErr := s.Store().User().Save(&u1) 2381 s.Require().Nil(nErr, "couldn't save user") 2382 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 2383 2384 _, nErr = s.Store().User().Save(&u2) 2385 s.Require().Nil(nErr, "couldn't save user") 2386 2387 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }() 2388 2389 result, err := s.Store().User().AnalyticsGetSystemAdminCount() 2390 s.Require().Nil(err) 2391 s.Require().Equal(countBefore+1, result, "Did not get the expected number of system admins.") 2392 2393 } 2394 2395 func (s *UserStoreTS) TestAnalyticsGetGuestCount() { 2396 countBefore, err := s.Store().User().AnalyticsGetGuestCount() 2397 s.Require().Nil(err) 2398 2399 u1 := model.User{} 2400 u1.Email = MakeEmail() 2401 u1.Username = model.NewId() 2402 u1.Roles = "system_user system_admin" 2403 2404 u2 := model.User{} 2405 u2.Email = MakeEmail() 2406 u2.Username = model.NewId() 2407 u2.Roles = "system_user" 2408 2409 u3 := model.User{} 2410 u3.Email = MakeEmail() 2411 u3.Username = model.NewId() 2412 u3.Roles = "system_guest" 2413 2414 _, nErr := s.Store().User().Save(&u1) 2415 s.Require().Nil(nErr, "couldn't save user") 2416 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 2417 2418 _, nErr = s.Store().User().Save(&u2) 2419 s.Require().Nil(nErr, "couldn't save user") 2420 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }() 2421 2422 _, nErr = s.Store().User().Save(&u3) 2423 s.Require().Nil(nErr, "couldn't save user") 2424 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }() 2425 2426 result, err := s.Store().User().AnalyticsGetGuestCount() 2427 s.Require().Nil(err) 2428 s.Require().Equal(countBefore+1, result, "Did not get the expected number of guests.") 2429 } 2430 2431 func (s *UserStoreTS) TestAnalyticsGetExternalUsers() { 2432 localHostDomain := "mattermost.com" 2433 result, err := s.Store().User().AnalyticsGetExternalUsers(localHostDomain) 2434 s.Require().Nil(err) 2435 s.Assert().False(result) 2436 2437 u1 := model.User{} 2438 u1.Email = "a@mattermost.com" 2439 u1.Username = model.NewId() 2440 u1.Roles = "system_user system_admin" 2441 2442 u2 := model.User{} 2443 u2.Email = "b@example.com" 2444 u2.Username = model.NewId() 2445 u2.Roles = "system_user" 2446 2447 u3 := model.User{} 2448 u3.Email = "c@test.com" 2449 u3.Username = model.NewId() 2450 u3.Roles = "system_guest" 2451 2452 _, err = s.Store().User().Save(&u1) 2453 s.Require().Nil(err, "couldn't save user") 2454 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 2455 2456 _, err = s.Store().User().Save(&u2) 2457 s.Require().Nil(err, "couldn't save user") 2458 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }() 2459 2460 _, err = s.Store().User().Save(&u3) 2461 s.Require().Nil(err, "couldn't save user") 2462 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }() 2463 2464 result, err = s.Store().User().AnalyticsGetExternalUsers(localHostDomain) 2465 s.Require().Nil(err) 2466 s.Assert().True(result) 2467 } 2468 2469 func (s *UserStoreTS) TestUserUnreadCount() { 2470 teamId := model.NewId() 2471 2472 c1 := model.Channel{} 2473 c1.TeamId = teamId 2474 c1.DisplayName = "Unread Messages" 2475 c1.Name = "unread-messages-" + model.NewId() 2476 c1.Type = model.CHANNEL_OPEN 2477 2478 c2 := model.Channel{} 2479 c2.TeamId = teamId 2480 c2.DisplayName = "Unread Direct" 2481 c2.Name = "unread-direct-" + model.NewId() 2482 c2.Type = model.CHANNEL_DIRECT 2483 2484 u1 := &model.User{} 2485 u1.Username = "user1" + model.NewId() 2486 u1.Email = MakeEmail() 2487 _, err := s.Store().User().Save(u1) 2488 s.Require().Nil(err) 2489 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 2490 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1) 2491 s.Require().Nil(nErr) 2492 2493 u2 := &model.User{} 2494 u2.Email = MakeEmail() 2495 u2.Username = "user2" + model.NewId() 2496 _, err = s.Store().User().Save(u2) 2497 s.Require().Nil(err) 2498 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }() 2499 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1) 2500 s.Require().Nil(nErr) 2501 2502 _, nErr = s.Store().Channel().Save(&c1, -1) 2503 s.Require().Nil(nErr, "couldn't save item") 2504 2505 m1 := model.ChannelMember{} 2506 m1.ChannelId = c1.Id 2507 m1.UserId = u1.Id 2508 m1.NotifyProps = model.GetDefaultChannelNotifyProps() 2509 2510 m2 := model.ChannelMember{} 2511 m2.ChannelId = c1.Id 2512 m2.UserId = u2.Id 2513 m2.NotifyProps = model.GetDefaultChannelNotifyProps() 2514 2515 _, nErr = s.Store().Channel().SaveMember(&m2) 2516 s.Require().Nil(nErr) 2517 2518 m1.ChannelId = c2.Id 2519 m2.ChannelId = c2.Id 2520 2521 _, nErr = s.Store().Channel().SaveDirectChannel(&c2, &m1, &m2) 2522 s.Require().Nil(nErr, "couldn't save direct channel") 2523 2524 p1 := model.Post{} 2525 p1.ChannelId = c1.Id 2526 p1.UserId = u1.Id 2527 p1.Message = "this is a message for @" + u2.Username 2528 2529 // Post one message with mention to open channel 2530 _, nErr = s.Store().Post().Save(&p1) 2531 s.Require().Nil(nErr) 2532 nErr = s.Store().Channel().IncrementMentionCount(c1.Id, u2.Id, false, false) 2533 s.Require().Nil(nErr) 2534 2535 // Post 2 messages without mention to direct channel 2536 p2 := model.Post{} 2537 p2.ChannelId = c2.Id 2538 p2.UserId = u1.Id 2539 p2.Message = "first message" 2540 2541 _, nErr = s.Store().Post().Save(&p2) 2542 s.Require().Nil(nErr) 2543 nErr = s.Store().Channel().IncrementMentionCount(c2.Id, u2.Id, false, false) 2544 s.Require().Nil(nErr) 2545 2546 p3 := model.Post{} 2547 p3.ChannelId = c2.Id 2548 p3.UserId = u1.Id 2549 p3.Message = "second message" 2550 _, nErr = s.Store().Post().Save(&p3) 2551 s.Require().Nil(nErr) 2552 2553 nErr = s.Store().Channel().IncrementMentionCount(c2.Id, u2.Id, false, false) 2554 s.Require().Nil(nErr) 2555 2556 badge, unreadCountErr := s.Store().User().GetUnreadCount(u2.Id) 2557 s.Require().Nil(unreadCountErr) 2558 s.Require().Equal(int64(3), badge, "should have 3 unread messages") 2559 2560 badge, unreadCountErr = s.Store().User().GetUnreadCountForChannel(u2.Id, c1.Id) 2561 s.Require().Nil(unreadCountErr) 2562 s.Require().Equal(int64(1), badge, "should have 1 unread messages for that channel") 2563 2564 badge, unreadCountErr = s.Store().User().GetUnreadCountForChannel(u2.Id, c2.Id) 2565 s.Require().Nil(unreadCountErr) 2566 s.Require().Equal(int64(2), badge, "should have 2 unread messages for that channel") 2567 } 2568 2569 func (s *UserStoreTS) TestGetRecentlyActiveUsersForTeam() { 2570 2571 s.cleanupStatusStore() 2572 2573 teamId := model.NewId() 2574 2575 u1, err := s.Store().User().Save(&model.User{ 2576 Email: MakeEmail(), 2577 Username: "u1" + model.NewId(), 2578 }) 2579 s.Require().Nil(err) 2580 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 2581 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1) 2582 s.Require().Nil(nErr) 2583 2584 u2, err := s.Store().User().Save(&model.User{ 2585 Email: MakeEmail(), 2586 Username: "u2" + model.NewId(), 2587 }) 2588 s.Require().Nil(err) 2589 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }() 2590 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1) 2591 s.Require().Nil(nErr) 2592 2593 u3, err := s.Store().User().Save(&model.User{ 2594 Email: MakeEmail(), 2595 Username: "u3" + model.NewId(), 2596 }) 2597 s.Require().Nil(err) 2598 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }() 2599 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1) 2600 s.Require().Nil(nErr) 2601 _, nErr = s.Store().Bot().Save(&model.Bot{ 2602 UserId: u3.Id, 2603 Username: u3.Username, 2604 OwnerId: u1.Id, 2605 }) 2606 s.Require().Nil(nErr) 2607 u3.IsBot = true 2608 defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }() 2609 2610 millis := model.GetMillis() 2611 u3.LastActivityAt = millis 2612 u2.LastActivityAt = millis - 1 2613 u1.LastActivityAt = millis - 1 2614 2615 s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{UserId: u1.Id, Status: model.STATUS_ONLINE, Manual: false, LastActivityAt: u1.LastActivityAt, ActiveChannel: ""})) 2616 s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{UserId: u2.Id, Status: model.STATUS_ONLINE, Manual: false, LastActivityAt: u2.LastActivityAt, ActiveChannel: ""})) 2617 s.Require().Nil(s.Store().Status().SaveOrUpdate(&model.Status{UserId: u3.Id, Status: model.STATUS_ONLINE, Manual: false, LastActivityAt: u3.LastActivityAt, ActiveChannel: ""})) 2618 2619 s.T().Run("get team 1, offset 0, limit 100", func(t *testing.T) { 2620 users, err := s.Store().User().GetRecentlyActiveUsersForTeam(teamId, 0, 100, nil) 2621 s.Require().Nil(err) 2622 s.Assert().Equal([]*model.User{ 2623 sanitized(u3), 2624 sanitized(u1), 2625 sanitized(u2), 2626 }, users) 2627 }) 2628 2629 s.T().Run("get team 1, offset 0, limit 1", func(t *testing.T) { 2630 users, err := s.Store().User().GetRecentlyActiveUsersForTeam(teamId, 0, 1, nil) 2631 s.Require().Nil(err) 2632 s.Assert().Equal([]*model.User{ 2633 sanitized(u3), 2634 }, users) 2635 }) 2636 2637 s.T().Run("get team 1, offset 2, limit 1", func(t *testing.T) { 2638 users, err := s.Store().User().GetRecentlyActiveUsersForTeam(teamId, 2, 1, nil) 2639 s.Require().Nil(err) 2640 s.Assert().Equal([]*model.User{ 2641 sanitized(u2), 2642 }, users) 2643 }) 2644 } 2645 2646 func (s *UserStoreTS) TestGetNewUsersForTeam() { 2647 teamId := model.NewId() 2648 teamId2 := model.NewId() 2649 2650 u1, err := s.Store().User().Save(&model.User{ 2651 Email: MakeEmail(), 2652 Username: "Yuka", 2653 }) 2654 s.Require().Nil(err) 2655 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 2656 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1) 2657 s.Require().Nil(nErr) 2658 2659 u2, err := s.Store().User().Save(&model.User{ 2660 Email: MakeEmail(), 2661 Username: "Leia", 2662 }) 2663 s.Require().Nil(err) 2664 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }() 2665 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1) 2666 s.Require().Nil(nErr) 2667 2668 u3, err := s.Store().User().Save(&model.User{ 2669 Email: MakeEmail(), 2670 Username: "Ali", 2671 }) 2672 s.Require().Nil(err) 2673 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }() 2674 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1) 2675 s.Require().Nil(nErr) 2676 _, nErr = s.Store().Bot().Save(&model.Bot{ 2677 UserId: u3.Id, 2678 Username: u3.Username, 2679 OwnerId: u1.Id, 2680 }) 2681 s.Require().Nil(nErr) 2682 u3.IsBot = true 2683 defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }() 2684 2685 u4, err := s.Store().User().Save(&model.User{ 2686 Email: MakeEmail(), 2687 Username: "u4" + model.NewId(), 2688 }) 2689 s.Require().Nil(err) 2690 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u4.Id)) }() 2691 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId2, UserId: u4.Id}, -1) 2692 s.Require().Nil(nErr) 2693 2694 s.T().Run("get team 1, offset 0, limit 100", func(t *testing.T) { 2695 result, err := s.Store().User().GetNewUsersForTeam(teamId, 0, 100, nil) 2696 s.Require().Nil(err) 2697 s.Assert().Equal([]*model.User{ 2698 sanitized(u3), 2699 sanitized(u2), 2700 sanitized(u1), 2701 }, result) 2702 }) 2703 2704 s.T().Run("get team 1, offset 0, limit 1", func(t *testing.T) { 2705 result, err := s.Store().User().GetNewUsersForTeam(teamId, 0, 1, nil) 2706 s.Require().Nil(err) 2707 s.Assert().Equal([]*model.User{ 2708 sanitized(u3), 2709 }, result) 2710 }) 2711 2712 s.T().Run("get team 1, offset 2, limit 1", func(t *testing.T) { 2713 result, err := s.Store().User().GetNewUsersForTeam(teamId, 2, 1, nil) 2714 s.Require().Nil(err) 2715 s.Assert().Equal([]*model.User{ 2716 sanitized(u1), 2717 }, result) 2718 }) 2719 2720 s.T().Run("get team 2, offset 0, limit 100", func(t *testing.T) { 2721 result, err := s.Store().User().GetNewUsersForTeam(teamId2, 0, 100, nil) 2722 s.Require().Nil(err) 2723 s.Assert().Equal([]*model.User{ 2724 sanitized(u4), 2725 }, result) 2726 }) 2727 } 2728 2729 func (s *UserStoreTS) assertUsers(expected, actual []*model.User) { 2730 expectedUsernames := make([]string, 0, len(expected)) 2731 for _, user := range expected { 2732 expectedUsernames = append(expectedUsernames, user.Username) 2733 } 2734 2735 actualUsernames := make([]string, 0, len(actual)) 2736 for _, user := range actual { 2737 actualUsernames = append(actualUsernames, user.Username) 2738 } 2739 2740 if s.Assert().Equal(expectedUsernames, actualUsernames) { 2741 s.Assert().Equal(expected, actual) 2742 } 2743 } 2744 2745 func (s *UserStoreTS) TestSearch() { 2746 u1 := &model.User{ 2747 Username: "jimbo1" + model.NewId(), 2748 FirstName: "Tim", 2749 LastName: "Bill", 2750 Nickname: "Rob", 2751 Email: "harold" + model.NewId() + "@simulator.amazonses.com", 2752 Roles: "system_user system_admin", 2753 } 2754 _, err := s.Store().User().Save(u1) 2755 s.Require().Nil(err) 2756 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 2757 2758 u2 := &model.User{ 2759 Username: "jim2-bobby" + model.NewId(), 2760 Email: MakeEmail(), 2761 Roles: "system_user system_user_manager", 2762 } 2763 _, err = s.Store().User().Save(u2) 2764 s.Require().Nil(err) 2765 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }() 2766 2767 u3 := &model.User{ 2768 Username: "jimbo3" + model.NewId(), 2769 Email: MakeEmail(), 2770 Roles: "system_guest", 2771 } 2772 _, err = s.Store().User().Save(u3) 2773 s.Require().Nil(err) 2774 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }() 2775 2776 // The users returned from the database will have AuthData as an empty string. 2777 nilAuthData := new(string) 2778 *nilAuthData = "" 2779 u1.AuthData = nilAuthData 2780 u2.AuthData = nilAuthData 2781 u3.AuthData = nilAuthData 2782 2783 t1id := model.NewId() 2784 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: t1id, UserId: u1.Id, SchemeAdmin: true, SchemeUser: true}, -1) 2785 s.Require().Nil(nErr) 2786 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: t1id, UserId: u2.Id, SchemeAdmin: true, SchemeUser: true}, -1) 2787 s.Require().Nil(nErr) 2788 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: t1id, UserId: u3.Id, SchemeAdmin: false, SchemeUser: false, SchemeGuest: true}, -1) 2789 s.Require().Nil(nErr) 2790 2791 testCases := []struct { 2792 Description string 2793 TeamId string 2794 Term string 2795 Options *model.UserSearchOptions 2796 Expected []*model.User 2797 }{ 2798 { 2799 "search jimb, team 1", 2800 t1id, 2801 "jimb", 2802 &model.UserSearchOptions{ 2803 AllowFullNames: true, 2804 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2805 }, 2806 []*model.User{u1, u3}, 2807 }, 2808 { 2809 "search jimb, team 1 with team guest and team admin filters without sys admin filter", 2810 t1id, 2811 "jimb", 2812 &model.UserSearchOptions{ 2813 AllowFullNames: true, 2814 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2815 TeamRoles: []string{model.TEAM_GUEST_ROLE_ID, model.TEAM_ADMIN_ROLE_ID}, 2816 }, 2817 []*model.User{u3}, 2818 }, 2819 { 2820 "search jimb, team 1 with team admin filter and sys admin filter", 2821 t1id, 2822 "jimb", 2823 &model.UserSearchOptions{ 2824 AllowFullNames: true, 2825 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2826 Roles: []string{model.SYSTEM_ADMIN_ROLE_ID}, 2827 TeamRoles: []string{model.TEAM_ADMIN_ROLE_ID}, 2828 }, 2829 []*model.User{u1}, 2830 }, 2831 { 2832 "search jim, team 1 with team admin filter", 2833 t1id, 2834 "jim", 2835 &model.UserSearchOptions{ 2836 AllowFullNames: true, 2837 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2838 TeamRoles: []string{model.TEAM_ADMIN_ROLE_ID}, 2839 }, 2840 []*model.User{u2}, 2841 }, 2842 { 2843 "search jim, team 1 with team admin and team guest filter", 2844 t1id, 2845 "jim", 2846 &model.UserSearchOptions{ 2847 AllowFullNames: true, 2848 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2849 TeamRoles: []string{model.TEAM_ADMIN_ROLE_ID, model.TEAM_GUEST_ROLE_ID}, 2850 }, 2851 []*model.User{u2, u3}, 2852 }, 2853 { 2854 "search jim, team 1 with team admin and system admin filters", 2855 t1id, 2856 "jim", 2857 &model.UserSearchOptions{ 2858 AllowFullNames: true, 2859 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2860 Roles: []string{model.SYSTEM_ADMIN_ROLE_ID}, 2861 TeamRoles: []string{model.TEAM_ADMIN_ROLE_ID}, 2862 }, 2863 []*model.User{u2, u1}, 2864 }, 2865 { 2866 "search jim, team 1 with system guest filter", 2867 t1id, 2868 "jim", 2869 &model.UserSearchOptions{ 2870 AllowFullNames: true, 2871 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2872 Roles: []string{model.SYSTEM_GUEST_ROLE_ID}, 2873 TeamRoles: []string{}, 2874 }, 2875 []*model.User{u3}, 2876 }, 2877 } 2878 2879 for _, testCase := range testCases { 2880 s.T().Run(testCase.Description, func(t *testing.T) { 2881 users, err := s.Store().User().Search( 2882 testCase.TeamId, 2883 testCase.Term, 2884 testCase.Options, 2885 ) 2886 s.Require().Nil(err) 2887 s.assertUsers(testCase.Expected, users) 2888 }) 2889 } 2890 } 2891 2892 func (s *UserStoreTS) TestSearchNotInChannel() { 2893 u1 := &model.User{ 2894 Username: "jimbo1" + model.NewId(), 2895 FirstName: "Tim", 2896 LastName: "Bill", 2897 Nickname: "Rob", 2898 Email: "harold" + model.NewId() + "@simulator.amazonses.com", 2899 } 2900 _, err := s.Store().User().Save(u1) 2901 s.Require().Nil(err) 2902 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 2903 2904 u2 := &model.User{ 2905 Username: "jim2-bobby" + model.NewId(), 2906 Email: MakeEmail(), 2907 } 2908 _, err = s.Store().User().Save(u2) 2909 s.Require().Nil(err) 2910 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }() 2911 2912 u3 := &model.User{ 2913 Username: "jimbo3" + model.NewId(), 2914 Email: MakeEmail(), 2915 DeleteAt: 1, 2916 } 2917 _, err = s.Store().User().Save(u3) 2918 s.Require().Nil(err) 2919 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }() 2920 _, nErr := s.Store().Bot().Save(&model.Bot{ 2921 UserId: u3.Id, 2922 Username: u3.Username, 2923 OwnerId: u1.Id, 2924 }) 2925 s.Require().Nil(nErr) 2926 u3.IsBot = true 2927 defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }() 2928 2929 tid := model.NewId() 2930 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u1.Id}, -1) 2931 s.Require().Nil(nErr) 2932 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u2.Id}, -1) 2933 s.Require().Nil(nErr) 2934 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u3.Id}, -1) 2935 s.Require().Nil(nErr) 2936 2937 // The users returned from the database will have AuthData as an empty string. 2938 nilAuthData := new(string) 2939 *nilAuthData = "" 2940 2941 u1.AuthData = nilAuthData 2942 u2.AuthData = nilAuthData 2943 u3.AuthData = nilAuthData 2944 2945 ch1 := model.Channel{ 2946 TeamId: tid, 2947 DisplayName: "NameName", 2948 Name: "zz" + model.NewId() + "b", 2949 Type: model.CHANNEL_OPEN, 2950 } 2951 c1, nErr := s.Store().Channel().Save(&ch1, -1) 2952 s.Require().Nil(nErr) 2953 2954 ch2 := model.Channel{ 2955 TeamId: tid, 2956 DisplayName: "NameName", 2957 Name: "zz" + model.NewId() + "b", 2958 Type: model.CHANNEL_OPEN, 2959 } 2960 c2, nErr := s.Store().Channel().Save(&ch2, -1) 2961 s.Require().Nil(nErr) 2962 2963 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ 2964 ChannelId: c2.Id, 2965 UserId: u1.Id, 2966 NotifyProps: model.GetDefaultChannelNotifyProps(), 2967 }) 2968 s.Require().Nil(nErr) 2969 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ 2970 ChannelId: c1.Id, 2971 UserId: u3.Id, 2972 NotifyProps: model.GetDefaultChannelNotifyProps(), 2973 }) 2974 s.Require().Nil(nErr) 2975 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ 2976 ChannelId: c2.Id, 2977 UserId: u2.Id, 2978 NotifyProps: model.GetDefaultChannelNotifyProps(), 2979 }) 2980 s.Require().Nil(nErr) 2981 2982 testCases := []struct { 2983 Description string 2984 TeamId string 2985 ChannelId string 2986 Term string 2987 Options *model.UserSearchOptions 2988 Expected []*model.User 2989 }{ 2990 { 2991 "search jimb, channel 1", 2992 tid, 2993 c1.Id, 2994 "jimb", 2995 &model.UserSearchOptions{ 2996 AllowFullNames: true, 2997 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2998 }, 2999 []*model.User{u1}, 3000 }, 3001 { 3002 "search jimb, allow inactive, channel 1", 3003 tid, 3004 c1.Id, 3005 "jimb", 3006 &model.UserSearchOptions{ 3007 AllowFullNames: true, 3008 AllowInactive: true, 3009 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3010 }, 3011 []*model.User{u1}, 3012 }, 3013 { 3014 "search jimb, channel 1, no team id", 3015 "", 3016 c1.Id, 3017 "jimb", 3018 &model.UserSearchOptions{ 3019 AllowFullNames: true, 3020 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3021 }, 3022 []*model.User{u1}, 3023 }, 3024 { 3025 "search jimb, channel 1, junk team id", 3026 "junk", 3027 c1.Id, 3028 "jimb", 3029 &model.UserSearchOptions{ 3030 AllowFullNames: true, 3031 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3032 }, 3033 []*model.User{}, 3034 }, 3035 { 3036 "search jimb, channel 2", 3037 tid, 3038 c2.Id, 3039 "jimb", 3040 &model.UserSearchOptions{ 3041 AllowFullNames: true, 3042 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3043 }, 3044 []*model.User{}, 3045 }, 3046 { 3047 "search jimb, allow inactive, channel 2", 3048 tid, 3049 c2.Id, 3050 "jimb", 3051 &model.UserSearchOptions{ 3052 AllowFullNames: true, 3053 AllowInactive: true, 3054 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3055 }, 3056 []*model.User{u3}, 3057 }, 3058 { 3059 "search jimb, channel 2, no team id", 3060 "", 3061 c2.Id, 3062 "jimb", 3063 &model.UserSearchOptions{ 3064 AllowFullNames: true, 3065 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3066 }, 3067 []*model.User{}, 3068 }, 3069 { 3070 "search jimb, channel 2, junk team id", 3071 "junk", 3072 c2.Id, 3073 "jimb", 3074 &model.UserSearchOptions{ 3075 AllowFullNames: true, 3076 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3077 }, 3078 []*model.User{}, 3079 }, 3080 { 3081 "search jim, channel 1", 3082 tid, 3083 c1.Id, 3084 "jim", 3085 &model.UserSearchOptions{ 3086 AllowFullNames: true, 3087 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3088 }, 3089 []*model.User{u2, u1}, 3090 }, 3091 { 3092 "search jim, channel 1, limit 1", 3093 tid, 3094 c1.Id, 3095 "jim", 3096 &model.UserSearchOptions{ 3097 AllowFullNames: true, 3098 Limit: 1, 3099 }, 3100 []*model.User{u2}, 3101 }, 3102 } 3103 3104 for _, testCase := range testCases { 3105 s.T().Run(testCase.Description, func(t *testing.T) { 3106 users, err := s.Store().User().SearchNotInChannel( 3107 testCase.TeamId, 3108 testCase.ChannelId, 3109 testCase.Term, 3110 testCase.Options, 3111 ) 3112 s.Require().Nil(err) 3113 s.assertUsers(testCase.Expected, users) 3114 }) 3115 } 3116 } 3117 3118 func (s *UserStoreTS) TestSearchInChannel() { 3119 u1 := &model.User{ 3120 Username: "jimbo1" + model.NewId(), 3121 FirstName: "Tim", 3122 LastName: "Bill", 3123 Nickname: "Rob", 3124 Email: "harold" + model.NewId() + "@simulator.amazonses.com", 3125 Roles: "system_user system_admin", 3126 } 3127 _, err := s.Store().User().Save(u1) 3128 s.Require().Nil(err) 3129 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 3130 3131 u2 := &model.User{ 3132 Username: "jim-bobby" + model.NewId(), 3133 Email: MakeEmail(), 3134 Roles: "system_user", 3135 } 3136 _, err = s.Store().User().Save(u2) 3137 s.Require().Nil(err) 3138 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }() 3139 3140 u3 := &model.User{ 3141 Username: "jimbo3" + model.NewId(), 3142 Email: MakeEmail(), 3143 DeleteAt: 1, 3144 Roles: "system_user", 3145 } 3146 _, err = s.Store().User().Save(u3) 3147 s.Require().Nil(err) 3148 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }() 3149 _, nErr := s.Store().Bot().Save(&model.Bot{ 3150 UserId: u3.Id, 3151 Username: u3.Username, 3152 OwnerId: u1.Id, 3153 }) 3154 s.Require().Nil(nErr) 3155 u3.IsBot = true 3156 defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }() 3157 3158 tid := model.NewId() 3159 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u1.Id}, -1) 3160 s.Require().Nil(nErr) 3161 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u2.Id}, -1) 3162 s.Require().Nil(nErr) 3163 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u3.Id}, -1) 3164 s.Require().Nil(nErr) 3165 3166 // The users returned from the database will have AuthData as an empty string. 3167 nilAuthData := new(string) 3168 *nilAuthData = "" 3169 3170 u1.AuthData = nilAuthData 3171 u2.AuthData = nilAuthData 3172 u3.AuthData = nilAuthData 3173 3174 ch1 := model.Channel{ 3175 TeamId: tid, 3176 DisplayName: "NameName", 3177 Name: "zz" + model.NewId() + "b", 3178 Type: model.CHANNEL_OPEN, 3179 } 3180 c1, nErr := s.Store().Channel().Save(&ch1, -1) 3181 s.Require().Nil(nErr) 3182 3183 ch2 := model.Channel{ 3184 TeamId: tid, 3185 DisplayName: "NameName", 3186 Name: "zz" + model.NewId() + "b", 3187 Type: model.CHANNEL_OPEN, 3188 } 3189 c2, nErr := s.Store().Channel().Save(&ch2, -1) 3190 s.Require().Nil(nErr) 3191 3192 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ 3193 ChannelId: c1.Id, 3194 UserId: u1.Id, 3195 NotifyProps: model.GetDefaultChannelNotifyProps(), 3196 SchemeAdmin: true, 3197 SchemeUser: true, 3198 }) 3199 s.Require().Nil(nErr) 3200 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ 3201 ChannelId: c2.Id, 3202 UserId: u2.Id, 3203 NotifyProps: model.GetDefaultChannelNotifyProps(), 3204 SchemeAdmin: false, 3205 SchemeUser: true, 3206 }) 3207 s.Require().Nil(nErr) 3208 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ 3209 ChannelId: c1.Id, 3210 UserId: u3.Id, 3211 NotifyProps: model.GetDefaultChannelNotifyProps(), 3212 SchemeAdmin: false, 3213 SchemeUser: true, 3214 }) 3215 s.Require().Nil(nErr) 3216 3217 testCases := []struct { 3218 Description string 3219 ChannelId string 3220 Term string 3221 Options *model.UserSearchOptions 3222 Expected []*model.User 3223 }{ 3224 { 3225 "search jimb, channel 1", 3226 c1.Id, 3227 "jimb", 3228 &model.UserSearchOptions{ 3229 AllowFullNames: true, 3230 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3231 }, 3232 []*model.User{u1}, 3233 }, 3234 { 3235 "search jimb, allow inactive, channel 1", 3236 c1.Id, 3237 "jimb", 3238 &model.UserSearchOptions{ 3239 AllowFullNames: true, 3240 AllowInactive: true, 3241 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3242 }, 3243 []*model.User{u1, u3}, 3244 }, 3245 { 3246 "search jimb, allow inactive, channel 1, limit 1", 3247 c1.Id, 3248 "jimb", 3249 &model.UserSearchOptions{ 3250 AllowFullNames: true, 3251 AllowInactive: true, 3252 Limit: 1, 3253 }, 3254 []*model.User{u1}, 3255 }, 3256 { 3257 "search jimb, channel 2", 3258 c2.Id, 3259 "jimb", 3260 &model.UserSearchOptions{ 3261 AllowFullNames: true, 3262 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3263 }, 3264 []*model.User{}, 3265 }, 3266 { 3267 "search jimb, allow inactive, channel 2", 3268 c2.Id, 3269 "jimb", 3270 &model.UserSearchOptions{ 3271 AllowFullNames: true, 3272 AllowInactive: true, 3273 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3274 }, 3275 []*model.User{}, 3276 }, 3277 { 3278 "search jim, allow inactive, channel 1 with system admin filter", 3279 c1.Id, 3280 "jim", 3281 &model.UserSearchOptions{ 3282 AllowFullNames: true, 3283 AllowInactive: true, 3284 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3285 Roles: []string{model.SYSTEM_ADMIN_ROLE_ID}, 3286 }, 3287 []*model.User{u1}, 3288 }, 3289 { 3290 "search jim, allow inactive, channel 1 with system admin and system user filter", 3291 c1.Id, 3292 "jim", 3293 &model.UserSearchOptions{ 3294 AllowFullNames: true, 3295 AllowInactive: true, 3296 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3297 Roles: []string{model.SYSTEM_ADMIN_ROLE_ID, model.SYSTEM_USER_ROLE_ID}, 3298 }, 3299 []*model.User{u1, u3}, 3300 }, 3301 { 3302 "search jim, allow inactive, channel 1 with channel user filter", 3303 c1.Id, 3304 "jim", 3305 &model.UserSearchOptions{ 3306 AllowFullNames: true, 3307 AllowInactive: true, 3308 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3309 ChannelRoles: []string{model.CHANNEL_USER_ROLE_ID}, 3310 }, 3311 []*model.User{u3}, 3312 }, 3313 { 3314 "search jim, allow inactive, channel 1 with channel user and channel admin filter", 3315 c1.Id, 3316 "jim", 3317 &model.UserSearchOptions{ 3318 AllowFullNames: true, 3319 AllowInactive: true, 3320 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3321 ChannelRoles: []string{model.CHANNEL_USER_ROLE_ID, model.CHANNEL_ADMIN_ROLE_ID}, 3322 }, 3323 []*model.User{u3}, 3324 }, 3325 { 3326 "search jim, allow inactive, channel 2 with channel user filter", 3327 c2.Id, 3328 "jim", 3329 &model.UserSearchOptions{ 3330 AllowFullNames: true, 3331 AllowInactive: true, 3332 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3333 ChannelRoles: []string{model.CHANNEL_USER_ROLE_ID}, 3334 }, 3335 []*model.User{u2}, 3336 }, 3337 } 3338 3339 for _, testCase := range testCases { 3340 s.T().Run(testCase.Description, func(t *testing.T) { 3341 users, err := s.Store().User().SearchInChannel( 3342 testCase.ChannelId, 3343 testCase.Term, 3344 testCase.Options, 3345 ) 3346 s.Require().Nil(err) 3347 s.assertUsers(testCase.Expected, users) 3348 }) 3349 } 3350 } 3351 3352 func (s *UserStoreTS) TestSearchNotInTeam() { 3353 u1 := &model.User{ 3354 Username: "jimbo1" + model.NewId(), 3355 FirstName: "Tim", 3356 LastName: "Bill", 3357 Nickname: "Rob", 3358 Email: "harold" + model.NewId() + "@simulator.amazonses.com", 3359 } 3360 _, err := s.Store().User().Save(u1) 3361 s.Require().Nil(err) 3362 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 3363 3364 u2 := &model.User{ 3365 Username: "jim-bobby" + model.NewId(), 3366 Email: MakeEmail(), 3367 } 3368 _, err = s.Store().User().Save(u2) 3369 s.Require().Nil(err) 3370 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }() 3371 3372 u3 := &model.User{ 3373 Username: "jimbo3" + model.NewId(), 3374 Email: MakeEmail(), 3375 DeleteAt: 1, 3376 } 3377 _, err = s.Store().User().Save(u3) 3378 s.Require().Nil(err) 3379 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }() 3380 _, nErr := s.Store().Bot().Save(&model.Bot{ 3381 UserId: u3.Id, 3382 Username: u3.Username, 3383 OwnerId: u1.Id, 3384 }) 3385 s.Require().Nil(nErr) 3386 u3.IsBot = true 3387 defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }() 3388 3389 u4 := &model.User{ 3390 Username: "simon" + model.NewId(), 3391 Email: MakeEmail(), 3392 DeleteAt: 0, 3393 } 3394 _, err = s.Store().User().Save(u4) 3395 s.Require().Nil(err) 3396 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u4.Id)) }() 3397 3398 u5 := &model.User{ 3399 Username: "yu" + model.NewId(), 3400 FirstName: "En", 3401 LastName: "Yu", 3402 Nickname: "enyu", 3403 Email: MakeEmail(), 3404 } 3405 _, err = s.Store().User().Save(u5) 3406 s.Require().Nil(err) 3407 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u5.Id)) }() 3408 3409 u6 := &model.User{ 3410 Username: "underscore" + model.NewId(), 3411 FirstName: "Du_", 3412 LastName: "_DE", 3413 Nickname: "lodash", 3414 Email: MakeEmail(), 3415 } 3416 _, err = s.Store().User().Save(u6) 3417 s.Require().Nil(err) 3418 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u6.Id)) }() 3419 3420 teamId1 := model.NewId() 3421 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId1, UserId: u1.Id}, -1) 3422 s.Require().Nil(nErr) 3423 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId1, UserId: u2.Id}, -1) 3424 s.Require().Nil(nErr) 3425 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId1, UserId: u3.Id}, -1) 3426 s.Require().Nil(nErr) 3427 // u4 is not in team 1 3428 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId1, UserId: u5.Id}, -1) 3429 s.Require().Nil(nErr) 3430 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId1, UserId: u6.Id}, -1) 3431 s.Require().Nil(nErr) 3432 3433 teamId2 := model.NewId() 3434 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId2, UserId: u4.Id}, -1) 3435 s.Require().Nil(nErr) 3436 3437 // The users returned from the database will have AuthData as an empty string. 3438 nilAuthData := new(string) 3439 *nilAuthData = "" 3440 3441 u1.AuthData = nilAuthData 3442 u2.AuthData = nilAuthData 3443 u3.AuthData = nilAuthData 3444 u4.AuthData = nilAuthData 3445 u5.AuthData = nilAuthData 3446 u6.AuthData = nilAuthData 3447 3448 testCases := []struct { 3449 Description string 3450 TeamId string 3451 Term string 3452 Options *model.UserSearchOptions 3453 Expected []*model.User 3454 }{ 3455 { 3456 "search simo, team 1", 3457 teamId1, 3458 "simo", 3459 &model.UserSearchOptions{ 3460 AllowFullNames: true, 3461 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3462 }, 3463 []*model.User{u4}, 3464 }, 3465 3466 { 3467 "search jimb, team 1", 3468 teamId1, 3469 "jimb", 3470 &model.UserSearchOptions{ 3471 AllowFullNames: true, 3472 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3473 }, 3474 []*model.User{}, 3475 }, 3476 { 3477 "search jimb, allow inactive, team 1", 3478 teamId1, 3479 "jimb", 3480 &model.UserSearchOptions{ 3481 AllowFullNames: true, 3482 AllowInactive: true, 3483 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3484 }, 3485 []*model.User{}, 3486 }, 3487 { 3488 "search simo, team 2", 3489 teamId2, 3490 "simo", 3491 &model.UserSearchOptions{ 3492 AllowFullNames: true, 3493 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3494 }, 3495 []*model.User{}, 3496 }, 3497 { 3498 "search jimb, team2", 3499 teamId2, 3500 "jimb", 3501 &model.UserSearchOptions{ 3502 AllowFullNames: true, 3503 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3504 }, 3505 []*model.User{u1}, 3506 }, 3507 { 3508 "search jimb, allow inactive, team 2", 3509 teamId2, 3510 "jimb", 3511 &model.UserSearchOptions{ 3512 AllowFullNames: true, 3513 AllowInactive: true, 3514 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3515 }, 3516 []*model.User{u1, u3}, 3517 }, 3518 { 3519 "search jimb, allow inactive, team 2, limit 1", 3520 teamId2, 3521 "jimb", 3522 &model.UserSearchOptions{ 3523 AllowFullNames: true, 3524 AllowInactive: true, 3525 Limit: 1, 3526 }, 3527 []*model.User{u1}, 3528 }, 3529 } 3530 3531 for _, testCase := range testCases { 3532 s.T().Run(testCase.Description, func(t *testing.T) { 3533 users, err := s.Store().User().SearchNotInTeam( 3534 testCase.TeamId, 3535 testCase.Term, 3536 testCase.Options, 3537 ) 3538 s.Require().Nil(err) 3539 s.assertUsers(testCase.Expected, users) 3540 }) 3541 } 3542 } 3543 3544 func (s *UserStoreTS) TestSearchWithoutTeam() { 3545 u1 := &model.User{ 3546 Username: "jimbo1" + model.NewId(), 3547 FirstName: "Tim", 3548 LastName: "Bill", 3549 Nickname: "Rob", 3550 Email: "harold" + model.NewId() + "@simulator.amazonses.com", 3551 } 3552 _, err := s.Store().User().Save(u1) 3553 s.Require().Nil(err) 3554 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 3555 3556 u2 := &model.User{ 3557 Username: "jim2-bobby" + model.NewId(), 3558 Email: MakeEmail(), 3559 } 3560 _, err = s.Store().User().Save(u2) 3561 s.Require().Nil(err) 3562 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }() 3563 3564 u3 := &model.User{ 3565 Username: "jimbo3" + model.NewId(), 3566 Email: MakeEmail(), 3567 DeleteAt: 1, 3568 } 3569 _, err = s.Store().User().Save(u3) 3570 s.Require().Nil(err) 3571 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }() 3572 _, nErr := s.Store().Bot().Save(&model.Bot{ 3573 UserId: u3.Id, 3574 Username: u3.Username, 3575 OwnerId: u1.Id, 3576 }) 3577 s.Require().Nil(nErr) 3578 u3.IsBot = true 3579 defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }() 3580 3581 tid := model.NewId() 3582 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u3.Id}, -1) 3583 s.Require().Nil(nErr) 3584 3585 // The users returned from the database will have AuthData as an empty string. 3586 nilAuthData := new(string) 3587 *nilAuthData = "" 3588 3589 u1.AuthData = nilAuthData 3590 u2.AuthData = nilAuthData 3591 u3.AuthData = nilAuthData 3592 3593 testCases := []struct { 3594 Description string 3595 Term string 3596 Options *model.UserSearchOptions 3597 Expected []*model.User 3598 }{ 3599 { 3600 "empty string", 3601 "", 3602 &model.UserSearchOptions{ 3603 AllowFullNames: true, 3604 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3605 }, 3606 []*model.User{u2, u1}, 3607 }, 3608 { 3609 "jim", 3610 "jim", 3611 &model.UserSearchOptions{ 3612 AllowFullNames: true, 3613 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3614 }, 3615 []*model.User{u2, u1}, 3616 }, 3617 { 3618 "PLT-8354", 3619 "* ", 3620 &model.UserSearchOptions{ 3621 AllowFullNames: true, 3622 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3623 }, 3624 []*model.User{u2, u1}, 3625 }, 3626 { 3627 "jim, limit 1", 3628 "jim", 3629 &model.UserSearchOptions{ 3630 AllowFullNames: true, 3631 Limit: 1, 3632 }, 3633 []*model.User{u2}, 3634 }, 3635 } 3636 3637 for _, testCase := range testCases { 3638 s.T().Run(testCase.Description, func(t *testing.T) { 3639 users, err := s.Store().User().SearchWithoutTeam( 3640 testCase.Term, 3641 testCase.Options, 3642 ) 3643 s.Require().Nil(err) 3644 s.assertUsers(testCase.Expected, users) 3645 }) 3646 } 3647 } 3648 3649 func (s *UserStoreTS) TestSearchInGroup() { 3650 u1 := &model.User{ 3651 Username: "jimbo1" + model.NewId(), 3652 FirstName: "Tim", 3653 LastName: "Bill", 3654 Nickname: "Rob", 3655 Email: "harold" + model.NewId() + "@simulator.amazonses.com", 3656 } 3657 _, err := s.Store().User().Save(u1) 3658 s.Require().Nil(err) 3659 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 3660 3661 u2 := &model.User{ 3662 Username: "jim-bobby" + model.NewId(), 3663 Email: MakeEmail(), 3664 } 3665 _, err = s.Store().User().Save(u2) 3666 s.Require().Nil(err) 3667 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }() 3668 3669 u3 := &model.User{ 3670 Username: "jimbo3" + model.NewId(), 3671 Email: MakeEmail(), 3672 DeleteAt: 1, 3673 } 3674 _, err = s.Store().User().Save(u3) 3675 s.Require().Nil(err) 3676 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }() 3677 3678 // The users returned from the database will have AuthData as an empty string. 3679 nilAuthData := model.NewString("") 3680 3681 u1.AuthData = nilAuthData 3682 u2.AuthData = nilAuthData 3683 u3.AuthData = nilAuthData 3684 3685 g1 := &model.Group{ 3686 Name: model.NewString(model.NewId()), 3687 DisplayName: model.NewId(), 3688 Description: model.NewId(), 3689 Source: model.GroupSourceLdap, 3690 RemoteId: model.NewId(), 3691 } 3692 _, err = s.Store().Group().Create(g1) 3693 s.Require().Nil(err) 3694 3695 g2 := &model.Group{ 3696 Name: model.NewString(model.NewId()), 3697 DisplayName: model.NewId(), 3698 Description: model.NewId(), 3699 Source: model.GroupSourceLdap, 3700 RemoteId: model.NewId(), 3701 } 3702 _, err = s.Store().Group().Create(g2) 3703 s.Require().Nil(err) 3704 3705 _, err = s.Store().Group().UpsertMember(g1.Id, u1.Id) 3706 s.Require().Nil(err) 3707 3708 _, err = s.Store().Group().UpsertMember(g2.Id, u2.Id) 3709 s.Require().Nil(err) 3710 3711 _, err = s.Store().Group().UpsertMember(g1.Id, u3.Id) 3712 s.Require().Nil(err) 3713 3714 testCases := []struct { 3715 Description string 3716 GroupId string 3717 Term string 3718 Options *model.UserSearchOptions 3719 Expected []*model.User 3720 }{ 3721 { 3722 "search jimb, group 1", 3723 g1.Id, 3724 "jimb", 3725 &model.UserSearchOptions{ 3726 AllowFullNames: true, 3727 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3728 }, 3729 []*model.User{u1}, 3730 }, 3731 { 3732 "search jimb, group 1, allow inactive", 3733 g1.Id, 3734 "jimb", 3735 &model.UserSearchOptions{ 3736 AllowFullNames: true, 3737 AllowInactive: true, 3738 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3739 }, 3740 []*model.User{u1, u3}, 3741 }, 3742 { 3743 "search jimb, group 1, limit 1", 3744 g1.Id, 3745 "jimb", 3746 &model.UserSearchOptions{ 3747 AllowFullNames: true, 3748 AllowInactive: true, 3749 Limit: 1, 3750 }, 3751 []*model.User{u1}, 3752 }, 3753 { 3754 "search jimb, group 2", 3755 g2.Id, 3756 "jimb", 3757 &model.UserSearchOptions{ 3758 AllowFullNames: true, 3759 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3760 }, 3761 []*model.User{}, 3762 }, 3763 { 3764 "search jimb, allow inactive, group 2", 3765 g2.Id, 3766 "jimb", 3767 &model.UserSearchOptions{ 3768 AllowFullNames: true, 3769 AllowInactive: true, 3770 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3771 }, 3772 []*model.User{}, 3773 }, 3774 } 3775 3776 for _, testCase := range testCases { 3777 s.T().Run(testCase.Description, func(t *testing.T) { 3778 users, err := s.Store().User().SearchInGroup( 3779 testCase.GroupId, 3780 testCase.Term, 3781 testCase.Options, 3782 ) 3783 s.Require().Nil(err) 3784 s.assertUsers(testCase.Expected, users) 3785 }) 3786 } 3787 } 3788 3789 func (s *UserStoreTS) TestGetUsersBatchForIndexing() { 3790 // Set up all the objects needed 3791 t1, err := s.Store().Team().Save(&model.Team{ 3792 DisplayName: "Team1", 3793 Name: "zz" + model.NewId(), 3794 Type: model.TEAM_OPEN, 3795 }) 3796 s.Require().Nil(err) 3797 3798 ch1 := &model.Channel{ 3799 Name: model.NewId(), 3800 Type: model.CHANNEL_OPEN, 3801 } 3802 cPub1, nErr := s.Store().Channel().Save(ch1, -1) 3803 s.Require().Nil(nErr) 3804 3805 ch2 := &model.Channel{ 3806 Name: model.NewId(), 3807 Type: model.CHANNEL_OPEN, 3808 } 3809 cPub2, nErr := s.Store().Channel().Save(ch2, -1) 3810 s.Require().Nil(nErr) 3811 3812 ch3 := &model.Channel{ 3813 Name: model.NewId(), 3814 Type: model.CHANNEL_PRIVATE, 3815 } 3816 3817 cPriv, nErr := s.Store().Channel().Save(ch3, -1) 3818 s.Require().Nil(nErr) 3819 3820 u1, err := s.Store().User().Save(&model.User{ 3821 Email: MakeEmail(), 3822 Username: model.NewId(), 3823 CreateAt: model.GetMillis(), 3824 }) 3825 s.Require().Nil(err) 3826 3827 time.Sleep(time.Millisecond) 3828 3829 u2, err := s.Store().User().Save(&model.User{ 3830 Email: MakeEmail(), 3831 Username: model.NewId(), 3832 CreateAt: model.GetMillis(), 3833 }) 3834 s.Require().Nil(err) 3835 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{ 3836 UserId: u2.Id, 3837 TeamId: t1.Id, 3838 }, 100) 3839 s.Require().Nil(nErr) 3840 _, err = s.Store().Channel().SaveMember(&model.ChannelMember{ 3841 UserId: u2.Id, 3842 ChannelId: cPub1.Id, 3843 NotifyProps: model.GetDefaultChannelNotifyProps(), 3844 }) 3845 s.Require().Nil(err) 3846 _, err = s.Store().Channel().SaveMember(&model.ChannelMember{ 3847 UserId: u2.Id, 3848 ChannelId: cPub2.Id, 3849 NotifyProps: model.GetDefaultChannelNotifyProps(), 3850 }) 3851 s.Require().Nil(err) 3852 3853 startTime := u2.CreateAt 3854 time.Sleep(time.Millisecond) 3855 3856 u3, err := s.Store().User().Save(&model.User{ 3857 Email: MakeEmail(), 3858 Username: model.NewId(), 3859 CreateAt: model.GetMillis(), 3860 }) 3861 s.Require().Nil(err) 3862 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{ 3863 UserId: u3.Id, 3864 TeamId: t1.Id, 3865 DeleteAt: model.GetMillis(), 3866 }, 100) 3867 s.Require().Nil(nErr) 3868 _, err = s.Store().Channel().SaveMember(&model.ChannelMember{ 3869 UserId: u3.Id, 3870 ChannelId: cPub2.Id, 3871 NotifyProps: model.GetDefaultChannelNotifyProps(), 3872 }) 3873 s.Require().Nil(err) 3874 _, err = s.Store().Channel().SaveMember(&model.ChannelMember{ 3875 UserId: u3.Id, 3876 ChannelId: cPriv.Id, 3877 NotifyProps: model.GetDefaultChannelNotifyProps(), 3878 }) 3879 s.Require().Nil(err) 3880 3881 endTime := u3.CreateAt 3882 3883 // First and last user should be outside the range 3884 res1List, err := s.Store().User().GetUsersBatchForIndexing(startTime, endTime, 100) 3885 s.Require().Nil(err) 3886 3887 s.Assert().Len(res1List, 1) 3888 s.Assert().Equal(res1List[0].Username, u2.Username) 3889 s.Assert().ElementsMatch(res1List[0].TeamsIds, []string{t1.Id}) 3890 s.Assert().ElementsMatch(res1List[0].ChannelsIds, []string{cPub1.Id, cPub2.Id}) 3891 3892 // Update startTime to include first user 3893 startTime = u1.CreateAt 3894 res2List, err := s.Store().User().GetUsersBatchForIndexing(startTime, endTime, 100) 3895 s.Require().Nil(err) 3896 3897 s.Assert().Len(res2List, 2) 3898 s.Assert().Equal(res2List[0].Username, u1.Username) 3899 s.Assert().Equal(res2List[0].ChannelsIds, []string{}) 3900 s.Assert().Equal(res2List[0].TeamsIds, []string{}) 3901 s.Assert().Equal(res2List[1].Username, u2.Username) 3902 3903 // Update endTime to include last user 3904 endTime = model.GetMillis() 3905 res3List, err := s.Store().User().GetUsersBatchForIndexing(startTime, endTime, 100) 3906 s.Require().Nil(err) 3907 3908 s.Assert().Len(res3List, 3) 3909 s.Assert().Equal(res3List[0].Username, u1.Username) 3910 s.Assert().Equal(res3List[1].Username, u2.Username) 3911 s.Assert().Equal(res3List[2].Username, u3.Username) 3912 s.Assert().ElementsMatch(res3List[2].TeamsIds, []string{}) 3913 s.Assert().ElementsMatch(res3List[2].ChannelsIds, []string{cPub2.Id}) 3914 3915 // Testing the limit 3916 res4List, err := s.Store().User().GetUsersBatchForIndexing(startTime, endTime, 2) 3917 s.Require().Nil(err) 3918 3919 s.Assert().Len(res4List, 2) 3920 s.Assert().Equal(res4List[0].Username, u1.Username) 3921 s.Assert().Equal(res4List[1].Username, u2.Username) 3922 } 3923 3924 func (s *UserStoreTS) TestGetTeamGroupUsers() { 3925 // create team 3926 id := model.NewId() 3927 team, err := s.Store().Team().Save(&model.Team{ 3928 DisplayName: "dn_" + id, 3929 Name: "n-" + id, 3930 Email: id + "@test.com", 3931 Type: model.TEAM_INVITE, 3932 }) 3933 s.Require().Nil(err) 3934 s.Require().NotNil(team) 3935 3936 // create users 3937 var testUsers []*model.User 3938 for i := 0; i < 3; i++ { 3939 id = model.NewId() 3940 user, userErr := s.Store().User().Save(&model.User{ 3941 Email: id + "@test.com", 3942 Username: "un_" + id, 3943 Nickname: "nn_" + id, 3944 FirstName: "f_" + id, 3945 LastName: "l_" + id, 3946 Password: "Password1", 3947 }) 3948 s.Require().Nil(userErr) 3949 s.Require().NotNil(user) 3950 testUsers = append(testUsers, user) 3951 } 3952 s.Require().Len(testUsers, 3, "testUsers length doesn't meet required length") 3953 userGroupA, userGroupB, userNoGroup := testUsers[0], testUsers[1], testUsers[2] 3954 3955 // add non-group-member to the team (to prove that the query isn't just returning all members) 3956 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{ 3957 TeamId: team.Id, 3958 UserId: userNoGroup.Id, 3959 }, 999) 3960 s.Require().Nil(nErr) 3961 3962 // create groups 3963 var testGroups []*model.Group 3964 for i := 0; i < 2; i++ { 3965 id = model.NewId() 3966 3967 var group *model.Group 3968 group, err = s.Store().Group().Create(&model.Group{ 3969 Name: model.NewString("n_" + id), 3970 DisplayName: "dn_" + id, 3971 Source: model.GroupSourceLdap, 3972 RemoteId: "ri_" + id, 3973 }) 3974 s.Require().Nil(err) 3975 s.Require().NotNil(group) 3976 testGroups = append(testGroups, group) 3977 } 3978 s.Require().Len(testGroups, 2, "testGroups length doesn't meet required length") 3979 groupA, groupB := testGroups[0], testGroups[1] 3980 3981 // add members to groups 3982 _, err = s.Store().Group().UpsertMember(groupA.Id, userGroupA.Id) 3983 s.Require().Nil(err) 3984 _, err = s.Store().Group().UpsertMember(groupB.Id, userGroupB.Id) 3985 s.Require().Nil(err) 3986 3987 // association one group to team 3988 _, err = s.Store().Group().CreateGroupSyncable(&model.GroupSyncable{ 3989 GroupId: groupA.Id, 3990 SyncableId: team.Id, 3991 Type: model.GroupSyncableTypeTeam, 3992 }) 3993 s.Require().Nil(err) 3994 3995 var users []*model.User 3996 3997 requireNUsers := func(n int) { 3998 users, err = s.Store().User().GetTeamGroupUsers(team.Id) 3999 s.Require().Nil(err) 4000 s.Require().NotNil(users) 4001 s.Require().Len(users, n) 4002 } 4003 4004 // team not group constrained returns users 4005 requireNUsers(1) 4006 4007 // update team to be group-constrained 4008 team.GroupConstrained = model.NewBool(true) 4009 team, err = s.Store().Team().Update(team) 4010 s.Require().Nil(err) 4011 4012 // still returns user (being group-constrained has no effect) 4013 requireNUsers(1) 4014 4015 // associate other group to team 4016 _, err = s.Store().Group().CreateGroupSyncable(&model.GroupSyncable{ 4017 GroupId: groupB.Id, 4018 SyncableId: team.Id, 4019 Type: model.GroupSyncableTypeTeam, 4020 }) 4021 s.Require().Nil(err) 4022 4023 // should return users from all groups 4024 // 2 users now that both groups have been associated to the team 4025 requireNUsers(2) 4026 4027 // add team membership of allowed user 4028 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{ 4029 TeamId: team.Id, 4030 UserId: userGroupA.Id, 4031 }, 999) 4032 s.Require().Nil(nErr) 4033 4034 // ensure allowed member still returned by query 4035 requireNUsers(2) 4036 4037 // delete team membership of allowed user 4038 err = s.Store().Team().RemoveMember(team.Id, userGroupA.Id) 4039 s.Require().Nil(err) 4040 4041 // ensure removed allowed member still returned by query 4042 requireNUsers(2) 4043 } 4044 4045 func (s *UserStoreTS) TestGetChannelGroupUsers() { 4046 // create channel 4047 id := model.NewId() 4048 channel, nErr := s.Store().Channel().Save(&model.Channel{ 4049 DisplayName: "dn_" + id, 4050 Name: "n-" + id, 4051 Type: model.CHANNEL_PRIVATE, 4052 }, 999) 4053 s.Require().Nil(nErr) 4054 s.Require().NotNil(channel) 4055 4056 // create users 4057 var testUsers []*model.User 4058 for i := 0; i < 3; i++ { 4059 id = model.NewId() 4060 user, userErr := s.Store().User().Save(&model.User{ 4061 Email: id + "@test.com", 4062 Username: "un_" + id, 4063 Nickname: "nn_" + id, 4064 FirstName: "f_" + id, 4065 LastName: "l_" + id, 4066 Password: "Password1", 4067 }) 4068 s.Require().Nil(userErr) 4069 s.Require().NotNil(user) 4070 testUsers = append(testUsers, user) 4071 } 4072 s.Require().Len(testUsers, 3, "testUsers length doesn't meet required length") 4073 userGroupA, userGroupB, userNoGroup := testUsers[0], testUsers[1], testUsers[2] 4074 4075 // add non-group-member to the channel (to prove that the query isn't just returning all members) 4076 _, err := s.Store().Channel().SaveMember(&model.ChannelMember{ 4077 ChannelId: channel.Id, 4078 UserId: userNoGroup.Id, 4079 NotifyProps: model.GetDefaultChannelNotifyProps(), 4080 }) 4081 s.Require().Nil(err) 4082 4083 // create groups 4084 var testGroups []*model.Group 4085 for i := 0; i < 2; i++ { 4086 id = model.NewId() 4087 var group *model.Group 4088 group, err = s.Store().Group().Create(&model.Group{ 4089 Name: model.NewString("n_" + id), 4090 DisplayName: "dn_" + id, 4091 Source: model.GroupSourceLdap, 4092 RemoteId: "ri_" + id, 4093 }) 4094 s.Require().Nil(err) 4095 s.Require().NotNil(group) 4096 testGroups = append(testGroups, group) 4097 } 4098 s.Require().Len(testGroups, 2, "testGroups length doesn't meet required length") 4099 groupA, groupB := testGroups[0], testGroups[1] 4100 4101 // add members to groups 4102 _, err = s.Store().Group().UpsertMember(groupA.Id, userGroupA.Id) 4103 s.Require().Nil(err) 4104 _, err = s.Store().Group().UpsertMember(groupB.Id, userGroupB.Id) 4105 s.Require().Nil(err) 4106 4107 // association one group to channel 4108 _, err = s.Store().Group().CreateGroupSyncable(&model.GroupSyncable{ 4109 GroupId: groupA.Id, 4110 SyncableId: channel.Id, 4111 Type: model.GroupSyncableTypeChannel, 4112 }) 4113 s.Require().Nil(err) 4114 4115 var users []*model.User 4116 4117 requireNUsers := func(n int) { 4118 users, err = s.Store().User().GetChannelGroupUsers(channel.Id) 4119 s.Require().Nil(err) 4120 s.Require().NotNil(users) 4121 s.Require().Len(users, n) 4122 } 4123 4124 // channel not group constrained returns users 4125 requireNUsers(1) 4126 4127 // update team to be group-constrained 4128 channel.GroupConstrained = model.NewBool(true) 4129 _, nErr = s.Store().Channel().Update(channel) 4130 s.Require().Nil(nErr) 4131 4132 // still returns user (being group-constrained has no effect) 4133 requireNUsers(1) 4134 4135 // associate other group to team 4136 _, err = s.Store().Group().CreateGroupSyncable(&model.GroupSyncable{ 4137 GroupId: groupB.Id, 4138 SyncableId: channel.Id, 4139 Type: model.GroupSyncableTypeChannel, 4140 }) 4141 s.Require().Nil(err) 4142 4143 // should return users from all groups 4144 // 2 users now that both groups have been associated to the team 4145 requireNUsers(2) 4146 4147 // add team membership of allowed user 4148 _, err = s.Store().Channel().SaveMember(&model.ChannelMember{ 4149 ChannelId: channel.Id, 4150 UserId: userGroupA.Id, 4151 NotifyProps: model.GetDefaultChannelNotifyProps(), 4152 }) 4153 s.Require().Nil(err) 4154 4155 // ensure allowed member still returned by query 4156 requireNUsers(2) 4157 4158 // delete team membership of allowed user 4159 err = s.Store().Channel().RemoveMember(channel.Id, userGroupA.Id) 4160 s.Require().Nil(err) 4161 4162 // ensure removed allowed member still returned by query 4163 requireNUsers(2) 4164 } 4165 4166 func (s *UserStoreTS) TestPromoteGuestToUser() { 4167 // create users 4168 s.T().Run("Must do nothing with regular user", func(t *testing.T) { 4169 id := model.NewId() 4170 user, err := s.Store().User().Save(&model.User{ 4171 Email: id + "@test.com", 4172 Username: "un_" + id, 4173 Nickname: "nn_" + id, 4174 FirstName: "f_" + id, 4175 LastName: "l_" + id, 4176 Password: "Password1", 4177 Roles: "system_user", 4178 }) 4179 s.Require().Nil(err) 4180 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user.Id)) }() 4181 4182 teamId := model.NewId() 4183 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: user.Id, SchemeGuest: true, SchemeUser: false}, 999) 4184 s.Require().Nil(nErr) 4185 4186 channel, nErr := s.Store().Channel().Save(&model.Channel{ 4187 TeamId: teamId, 4188 DisplayName: "Channel name", 4189 Name: "channel-" + model.NewId(), 4190 Type: model.CHANNEL_OPEN, 4191 }, -1) 4192 s.Require().Nil(nErr) 4193 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ChannelId: channel.Id, UserId: user.Id, SchemeGuest: true, SchemeUser: false, NotifyProps: model.GetDefaultChannelNotifyProps()}) 4194 s.Require().Nil(nErr) 4195 4196 err = s.Store().User().PromoteGuestToUser(user.Id) 4197 s.Require().Nil(err) 4198 updatedUser, err := s.Store().User().Get(context.Background(), user.Id) 4199 s.Require().Nil(err) 4200 s.Require().Equal("system_user", updatedUser.Roles) 4201 s.Require().True(user.UpdateAt < updatedUser.UpdateAt) 4202 4203 updatedTeamMember, nErr := s.Store().Team().GetMember(context.Background(), teamId, user.Id) 4204 s.Require().Nil(nErr) 4205 s.Require().False(updatedTeamMember.SchemeGuest) 4206 s.Require().True(updatedTeamMember.SchemeUser) 4207 4208 updatedChannelMember, nErr := s.Store().Channel().GetMember(context.Background(), channel.Id, user.Id) 4209 s.Require().Nil(nErr) 4210 s.Require().False(updatedChannelMember.SchemeGuest) 4211 s.Require().True(updatedChannelMember.SchemeUser) 4212 }) 4213 4214 s.T().Run("Must do nothing with admin user", func(t *testing.T) { 4215 id := model.NewId() 4216 user, err := s.Store().User().Save(&model.User{ 4217 Email: id + "@test.com", 4218 Username: "un_" + id, 4219 Nickname: "nn_" + id, 4220 FirstName: "f_" + id, 4221 LastName: "l_" + id, 4222 Password: "Password1", 4223 Roles: "system_user system_admin", 4224 }) 4225 s.Require().Nil(err) 4226 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user.Id)) }() 4227 4228 teamId := model.NewId() 4229 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: user.Id, SchemeGuest: true, SchemeUser: false}, 999) 4230 s.Require().Nil(nErr) 4231 4232 channel, nErr := s.Store().Channel().Save(&model.Channel{ 4233 TeamId: teamId, 4234 DisplayName: "Channel name", 4235 Name: "channel-" + model.NewId(), 4236 Type: model.CHANNEL_OPEN, 4237 }, -1) 4238 s.Require().Nil(nErr) 4239 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ChannelId: channel.Id, UserId: user.Id, SchemeGuest: true, SchemeUser: false, NotifyProps: model.GetDefaultChannelNotifyProps()}) 4240 s.Require().Nil(nErr) 4241 4242 err = s.Store().User().PromoteGuestToUser(user.Id) 4243 s.Require().Nil(err) 4244 updatedUser, err := s.Store().User().Get(context.Background(), user.Id) 4245 s.Require().Nil(err) 4246 s.Require().Equal("system_user system_admin", updatedUser.Roles) 4247 4248 updatedTeamMember, nErr := s.Store().Team().GetMember(context.Background(), teamId, user.Id) 4249 s.Require().Nil(nErr) 4250 s.Require().False(updatedTeamMember.SchemeGuest) 4251 s.Require().True(updatedTeamMember.SchemeUser) 4252 4253 updatedChannelMember, nErr := s.Store().Channel().GetMember(context.Background(), channel.Id, user.Id) 4254 s.Require().Nil(nErr) 4255 s.Require().False(updatedChannelMember.SchemeGuest) 4256 s.Require().True(updatedChannelMember.SchemeUser) 4257 }) 4258 4259 s.T().Run("Must work with guest user without teams or channels", func(t *testing.T) { 4260 id := model.NewId() 4261 user, err := s.Store().User().Save(&model.User{ 4262 Email: id + "@test.com", 4263 Username: "un_" + id, 4264 Nickname: "nn_" + id, 4265 FirstName: "f_" + id, 4266 LastName: "l_" + id, 4267 Password: "Password1", 4268 Roles: "system_guest", 4269 }) 4270 s.Require().Nil(err) 4271 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user.Id)) }() 4272 4273 err = s.Store().User().PromoteGuestToUser(user.Id) 4274 s.Require().Nil(err) 4275 updatedUser, err := s.Store().User().Get(context.Background(), user.Id) 4276 s.Require().Nil(err) 4277 s.Require().Equal("system_user", updatedUser.Roles) 4278 }) 4279 4280 s.T().Run("Must work with guest user with teams but no channels", func(t *testing.T) { 4281 id := model.NewId() 4282 user, err := s.Store().User().Save(&model.User{ 4283 Email: id + "@test.com", 4284 Username: "un_" + id, 4285 Nickname: "nn_" + id, 4286 FirstName: "f_" + id, 4287 LastName: "l_" + id, 4288 Password: "Password1", 4289 Roles: "system_guest", 4290 }) 4291 s.Require().Nil(err) 4292 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user.Id)) }() 4293 4294 teamId := model.NewId() 4295 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: user.Id, SchemeGuest: true, SchemeUser: false}, 999) 4296 s.Require().Nil(nErr) 4297 4298 err = s.Store().User().PromoteGuestToUser(user.Id) 4299 s.Require().Nil(err) 4300 updatedUser, err := s.Store().User().Get(context.Background(), user.Id) 4301 s.Require().Nil(err) 4302 s.Require().Equal("system_user", updatedUser.Roles) 4303 4304 updatedTeamMember, nErr := s.Store().Team().GetMember(context.Background(), teamId, user.Id) 4305 s.Require().Nil(nErr) 4306 s.Require().False(updatedTeamMember.SchemeGuest) 4307 s.Require().True(updatedTeamMember.SchemeUser) 4308 }) 4309 4310 s.T().Run("Must work with guest user with teams and channels", func(t *testing.T) { 4311 id := model.NewId() 4312 user, err := s.Store().User().Save(&model.User{ 4313 Email: id + "@test.com", 4314 Username: "un_" + id, 4315 Nickname: "nn_" + id, 4316 FirstName: "f_" + id, 4317 LastName: "l_" + id, 4318 Password: "Password1", 4319 Roles: "system_guest", 4320 }) 4321 s.Require().Nil(err) 4322 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user.Id)) }() 4323 4324 teamId := model.NewId() 4325 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: user.Id, SchemeGuest: true, SchemeUser: false}, 999) 4326 s.Require().Nil(nErr) 4327 4328 channel, nErr := s.Store().Channel().Save(&model.Channel{ 4329 TeamId: teamId, 4330 DisplayName: "Channel name", 4331 Name: "channel-" + model.NewId(), 4332 Type: model.CHANNEL_OPEN, 4333 }, -1) 4334 s.Require().Nil(nErr) 4335 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ChannelId: channel.Id, UserId: user.Id, SchemeGuest: true, SchemeUser: false, NotifyProps: model.GetDefaultChannelNotifyProps()}) 4336 s.Require().Nil(nErr) 4337 4338 err = s.Store().User().PromoteGuestToUser(user.Id) 4339 s.Require().Nil(err) 4340 updatedUser, err := s.Store().User().Get(context.Background(), user.Id) 4341 s.Require().Nil(err) 4342 s.Require().Equal("system_user", updatedUser.Roles) 4343 4344 updatedTeamMember, nErr := s.Store().Team().GetMember(context.Background(), teamId, user.Id) 4345 s.Require().Nil(nErr) 4346 s.Require().False(updatedTeamMember.SchemeGuest) 4347 s.Require().True(updatedTeamMember.SchemeUser) 4348 4349 updatedChannelMember, nErr := s.Store().Channel().GetMember(context.Background(), channel.Id, user.Id) 4350 s.Require().Nil(nErr) 4351 s.Require().False(updatedChannelMember.SchemeGuest) 4352 s.Require().True(updatedChannelMember.SchemeUser) 4353 }) 4354 4355 s.T().Run("Must work with guest user with teams and channels and custom role", func(t *testing.T) { 4356 id := model.NewId() 4357 user, err := s.Store().User().Save(&model.User{ 4358 Email: id + "@test.com", 4359 Username: "un_" + id, 4360 Nickname: "nn_" + id, 4361 FirstName: "f_" + id, 4362 LastName: "l_" + id, 4363 Password: "Password1", 4364 Roles: "system_guest custom_role", 4365 }) 4366 s.Require().Nil(err) 4367 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user.Id)) }() 4368 4369 teamId := model.NewId() 4370 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: user.Id, SchemeGuest: true, SchemeUser: false}, 999) 4371 s.Require().Nil(nErr) 4372 4373 channel, nErr := s.Store().Channel().Save(&model.Channel{ 4374 TeamId: teamId, 4375 DisplayName: "Channel name", 4376 Name: "channel-" + model.NewId(), 4377 Type: model.CHANNEL_OPEN, 4378 }, -1) 4379 s.Require().Nil(nErr) 4380 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ChannelId: channel.Id, UserId: user.Id, SchemeGuest: true, SchemeUser: false, NotifyProps: model.GetDefaultChannelNotifyProps()}) 4381 s.Require().Nil(nErr) 4382 4383 err = s.Store().User().PromoteGuestToUser(user.Id) 4384 s.Require().Nil(err) 4385 updatedUser, err := s.Store().User().Get(context.Background(), user.Id) 4386 s.Require().Nil(err) 4387 s.Require().Equal("system_user custom_role", updatedUser.Roles) 4388 4389 updatedTeamMember, nErr := s.Store().Team().GetMember(context.Background(), teamId, user.Id) 4390 s.Require().Nil(nErr) 4391 s.Require().False(updatedTeamMember.SchemeGuest) 4392 s.Require().True(updatedTeamMember.SchemeUser) 4393 4394 updatedChannelMember, nErr := s.Store().Channel().GetMember(context.Background(), channel.Id, user.Id) 4395 s.Require().Nil(nErr) 4396 s.Require().False(updatedChannelMember.SchemeGuest) 4397 s.Require().True(updatedChannelMember.SchemeUser) 4398 }) 4399 4400 s.T().Run("Must no change any other user guest role", func(t *testing.T) { 4401 id := model.NewId() 4402 user1, err := s.Store().User().Save(&model.User{ 4403 Email: id + "@test.com", 4404 Username: "un_" + id, 4405 Nickname: "nn_" + id, 4406 FirstName: "f_" + id, 4407 LastName: "l_" + id, 4408 Password: "Password1", 4409 Roles: "system_guest", 4410 }) 4411 s.Require().Nil(err) 4412 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user1.Id)) }() 4413 4414 teamId1 := model.NewId() 4415 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId1, UserId: user1.Id, SchemeGuest: true, SchemeUser: false}, 999) 4416 s.Require().Nil(nErr) 4417 4418 channel, nErr := s.Store().Channel().Save(&model.Channel{ 4419 TeamId: teamId1, 4420 DisplayName: "Channel name", 4421 Name: "channel-" + model.NewId(), 4422 Type: model.CHANNEL_OPEN, 4423 }, -1) 4424 s.Require().Nil(nErr) 4425 4426 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ChannelId: channel.Id, UserId: user1.Id, SchemeGuest: true, SchemeUser: false, NotifyProps: model.GetDefaultChannelNotifyProps()}) 4427 s.Require().Nil(nErr) 4428 4429 id = model.NewId() 4430 user2, err := s.Store().User().Save(&model.User{ 4431 Email: id + "@test.com", 4432 Username: "un_" + id, 4433 Nickname: "nn_" + id, 4434 FirstName: "f_" + id, 4435 LastName: "l_" + id, 4436 Password: "Password1", 4437 Roles: "system_guest", 4438 }) 4439 s.Require().Nil(err) 4440 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user2.Id)) }() 4441 4442 teamId2 := model.NewId() 4443 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId2, UserId: user2.Id, SchemeGuest: true, SchemeUser: false}, 999) 4444 s.Require().Nil(nErr) 4445 4446 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ChannelId: channel.Id, UserId: user2.Id, SchemeGuest: true, SchemeUser: false, NotifyProps: model.GetDefaultChannelNotifyProps()}) 4447 s.Require().Nil(nErr) 4448 4449 err = s.Store().User().PromoteGuestToUser(user1.Id) 4450 s.Require().Nil(err) 4451 updatedUser, err := s.Store().User().Get(context.Background(), user1.Id) 4452 s.Require().Nil(err) 4453 s.Require().Equal("system_user", updatedUser.Roles) 4454 4455 updatedTeamMember, nErr := s.Store().Team().GetMember(context.Background(), teamId1, user1.Id) 4456 s.Require().Nil(nErr) 4457 s.Require().False(updatedTeamMember.SchemeGuest) 4458 s.Require().True(updatedTeamMember.SchemeUser) 4459 4460 updatedChannelMember, nErr := s.Store().Channel().GetMember(context.Background(), channel.Id, user1.Id) 4461 s.Require().Nil(nErr) 4462 s.Require().False(updatedChannelMember.SchemeGuest) 4463 s.Require().True(updatedChannelMember.SchemeUser) 4464 4465 notUpdatedUser, err := s.Store().User().Get(context.Background(), user2.Id) 4466 s.Require().Nil(err) 4467 s.Require().Equal("system_guest", notUpdatedUser.Roles) 4468 4469 notUpdatedTeamMember, nErr := s.Store().Team().GetMember(context.Background(), teamId2, user2.Id) 4470 s.Require().Nil(nErr) 4471 s.Require().True(notUpdatedTeamMember.SchemeGuest) 4472 s.Require().False(notUpdatedTeamMember.SchemeUser) 4473 4474 notUpdatedChannelMember, nErr := s.Store().Channel().GetMember(context.Background(), channel.Id, user2.Id) 4475 s.Require().Nil(nErr) 4476 s.Require().True(notUpdatedChannelMember.SchemeGuest) 4477 s.Require().False(notUpdatedChannelMember.SchemeUser) 4478 }) 4479 } 4480 4481 func (s *UserStoreTS) TestDemoteUserToGuest() { 4482 // create users 4483 s.T().Run("Must do nothing with guest", func(t *testing.T) { 4484 id := model.NewId() 4485 user, err := s.Store().User().Save(&model.User{ 4486 Email: id + "@test.com", 4487 Username: "un_" + id, 4488 Nickname: "nn_" + id, 4489 FirstName: "f_" + id, 4490 LastName: "l_" + id, 4491 Password: "Password1", 4492 Roles: "system_guest", 4493 }) 4494 s.Require().Nil(err) 4495 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user.Id)) }() 4496 4497 teamId := model.NewId() 4498 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: user.Id, SchemeGuest: false, SchemeUser: true}, 999) 4499 s.Require().Nil(nErr) 4500 4501 channel, nErr := s.Store().Channel().Save(&model.Channel{ 4502 TeamId: teamId, 4503 DisplayName: "Channel name", 4504 Name: "channel-" + model.NewId(), 4505 Type: model.CHANNEL_OPEN, 4506 }, -1) 4507 s.Require().Nil(nErr) 4508 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ChannelId: channel.Id, UserId: user.Id, SchemeGuest: false, SchemeUser: true, NotifyProps: model.GetDefaultChannelNotifyProps()}) 4509 s.Require().Nil(nErr) 4510 4511 updatedUser, err := s.Store().User().DemoteUserToGuest(user.Id) 4512 s.Require().NoError(err) 4513 s.Require().Equal("system_guest", updatedUser.Roles) 4514 s.Require().True(user.UpdateAt < updatedUser.UpdateAt) 4515 4516 updatedTeamMember, nErr := s.Store().Team().GetMember(context.Background(), teamId, user.Id) 4517 s.Require().Nil(nErr) 4518 s.Require().True(updatedTeamMember.SchemeGuest) 4519 s.Require().False(updatedTeamMember.SchemeUser) 4520 4521 updatedChannelMember, nErr := s.Store().Channel().GetMember(context.Background(), channel.Id, user.Id) 4522 s.Require().Nil(nErr) 4523 s.Require().True(updatedChannelMember.SchemeGuest) 4524 s.Require().False(updatedChannelMember.SchemeUser) 4525 }) 4526 4527 s.T().Run("Must demote properly an admin user", func(t *testing.T) { 4528 id := model.NewId() 4529 user, err := s.Store().User().Save(&model.User{ 4530 Email: id + "@test.com", 4531 Username: "un_" + id, 4532 Nickname: "nn_" + id, 4533 FirstName: "f_" + id, 4534 LastName: "l_" + id, 4535 Password: "Password1", 4536 Roles: "system_user system_admin", 4537 }) 4538 s.Require().Nil(err) 4539 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user.Id)) }() 4540 4541 teamId := model.NewId() 4542 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: user.Id, SchemeGuest: true, SchemeUser: false}, 999) 4543 s.Require().Nil(nErr) 4544 4545 channel, nErr := s.Store().Channel().Save(&model.Channel{ 4546 TeamId: teamId, 4547 DisplayName: "Channel name", 4548 Name: "channel-" + model.NewId(), 4549 Type: model.CHANNEL_OPEN, 4550 }, -1) 4551 s.Require().Nil(nErr) 4552 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ChannelId: channel.Id, UserId: user.Id, SchemeGuest: true, SchemeUser: false, NotifyProps: model.GetDefaultChannelNotifyProps()}) 4553 s.Require().Nil(nErr) 4554 4555 updatedUser, err := s.Store().User().DemoteUserToGuest(user.Id) 4556 s.Require().NoError(err) 4557 s.Require().Equal("system_guest", updatedUser.Roles) 4558 4559 updatedTeamMember, nErr := s.Store().Team().GetMember(context.Background(), teamId, user.Id) 4560 s.Require().Nil(nErr) 4561 s.Require().True(updatedTeamMember.SchemeGuest) 4562 s.Require().False(updatedTeamMember.SchemeUser) 4563 4564 updatedChannelMember, nErr := s.Store().Channel().GetMember(context.Background(), channel.Id, user.Id) 4565 s.Require().Nil(nErr) 4566 s.Require().True(updatedChannelMember.SchemeGuest) 4567 s.Require().False(updatedChannelMember.SchemeUser) 4568 }) 4569 4570 s.T().Run("Must work with user without teams or channels", func(t *testing.T) { 4571 id := model.NewId() 4572 user, err := s.Store().User().Save(&model.User{ 4573 Email: id + "@test.com", 4574 Username: "un_" + id, 4575 Nickname: "nn_" + id, 4576 FirstName: "f_" + id, 4577 LastName: "l_" + id, 4578 Password: "Password1", 4579 Roles: "system_user", 4580 }) 4581 s.Require().Nil(err) 4582 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user.Id)) }() 4583 4584 updatedUser, err := s.Store().User().DemoteUserToGuest(user.Id) 4585 s.Require().NoError(err) 4586 s.Require().Equal("system_guest", updatedUser.Roles) 4587 }) 4588 4589 s.T().Run("Must work with user with teams but no channels", func(t *testing.T) { 4590 id := model.NewId() 4591 user, err := s.Store().User().Save(&model.User{ 4592 Email: id + "@test.com", 4593 Username: "un_" + id, 4594 Nickname: "nn_" + id, 4595 FirstName: "f_" + id, 4596 LastName: "l_" + id, 4597 Password: "Password1", 4598 Roles: "system_user", 4599 }) 4600 s.Require().Nil(err) 4601 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user.Id)) }() 4602 4603 teamId := model.NewId() 4604 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: user.Id, SchemeGuest: false, SchemeUser: true}, 999) 4605 s.Require().Nil(nErr) 4606 4607 updatedUser, err := s.Store().User().DemoteUserToGuest(user.Id) 4608 s.Require().NoError(err) 4609 s.Require().Equal("system_guest", updatedUser.Roles) 4610 4611 updatedTeamMember, nErr := s.Store().Team().GetMember(context.Background(), teamId, user.Id) 4612 s.Require().Nil(nErr) 4613 s.Require().True(updatedTeamMember.SchemeGuest) 4614 s.Require().False(updatedTeamMember.SchemeUser) 4615 }) 4616 4617 s.T().Run("Must work with user with teams and channels", func(t *testing.T) { 4618 id := model.NewId() 4619 user, err := s.Store().User().Save(&model.User{ 4620 Email: id + "@test.com", 4621 Username: "un_" + id, 4622 Nickname: "nn_" + id, 4623 FirstName: "f_" + id, 4624 LastName: "l_" + id, 4625 Password: "Password1", 4626 Roles: "system_user", 4627 }) 4628 s.Require().Nil(err) 4629 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user.Id)) }() 4630 4631 teamId := model.NewId() 4632 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: user.Id, SchemeGuest: false, SchemeUser: true}, 999) 4633 s.Require().Nil(nErr) 4634 4635 channel, nErr := s.Store().Channel().Save(&model.Channel{ 4636 TeamId: teamId, 4637 DisplayName: "Channel name", 4638 Name: "channel-" + model.NewId(), 4639 Type: model.CHANNEL_OPEN, 4640 }, -1) 4641 s.Require().Nil(nErr) 4642 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ChannelId: channel.Id, UserId: user.Id, SchemeGuest: false, SchemeUser: true, NotifyProps: model.GetDefaultChannelNotifyProps()}) 4643 s.Require().Nil(nErr) 4644 4645 updatedUser, err := s.Store().User().DemoteUserToGuest(user.Id) 4646 s.Require().Nil(err) 4647 s.Require().Equal("system_guest", updatedUser.Roles) 4648 4649 updatedTeamMember, nErr := s.Store().Team().GetMember(context.Background(), teamId, user.Id) 4650 s.Require().Nil(nErr) 4651 s.Require().True(updatedTeamMember.SchemeGuest) 4652 s.Require().False(updatedTeamMember.SchemeUser) 4653 4654 updatedChannelMember, nErr := s.Store().Channel().GetMember(context.Background(), channel.Id, user.Id) 4655 s.Require().Nil(nErr) 4656 s.Require().True(updatedChannelMember.SchemeGuest) 4657 s.Require().False(updatedChannelMember.SchemeUser) 4658 }) 4659 4660 s.T().Run("Must work with user with teams and channels and custom role", func(t *testing.T) { 4661 id := model.NewId() 4662 user, err := s.Store().User().Save(&model.User{ 4663 Email: id + "@test.com", 4664 Username: "un_" + id, 4665 Nickname: "nn_" + id, 4666 FirstName: "f_" + id, 4667 LastName: "l_" + id, 4668 Password: "Password1", 4669 Roles: "system_user custom_role", 4670 }) 4671 s.Require().Nil(err) 4672 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user.Id)) }() 4673 4674 teamId := model.NewId() 4675 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: user.Id, SchemeGuest: false, SchemeUser: true}, 999) 4676 s.Require().Nil(nErr) 4677 4678 channel, nErr := s.Store().Channel().Save(&model.Channel{ 4679 TeamId: teamId, 4680 DisplayName: "Channel name", 4681 Name: "channel-" + model.NewId(), 4682 Type: model.CHANNEL_OPEN, 4683 }, -1) 4684 s.Require().Nil(nErr) 4685 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ChannelId: channel.Id, UserId: user.Id, SchemeGuest: false, SchemeUser: true, NotifyProps: model.GetDefaultChannelNotifyProps()}) 4686 s.Require().Nil(nErr) 4687 4688 updatedUser, err := s.Store().User().DemoteUserToGuest(user.Id) 4689 s.Require().Nil(err) 4690 s.Require().Equal("system_guest custom_role", updatedUser.Roles) 4691 4692 updatedTeamMember, nErr := s.Store().Team().GetMember(context.Background(), teamId, user.Id) 4693 s.Require().Nil(nErr) 4694 s.Require().True(updatedTeamMember.SchemeGuest) 4695 s.Require().False(updatedTeamMember.SchemeUser) 4696 4697 updatedChannelMember, nErr := s.Store().Channel().GetMember(context.Background(), channel.Id, user.Id) 4698 s.Require().Nil(nErr) 4699 s.Require().True(updatedChannelMember.SchemeGuest) 4700 s.Require().False(updatedChannelMember.SchemeUser) 4701 }) 4702 4703 s.T().Run("Must no change any other user role", func(t *testing.T) { 4704 id := model.NewId() 4705 user1, err := s.Store().User().Save(&model.User{ 4706 Email: id + "@test.com", 4707 Username: "un_" + id, 4708 Nickname: "nn_" + id, 4709 FirstName: "f_" + id, 4710 LastName: "l_" + id, 4711 Password: "Password1", 4712 Roles: "system_user", 4713 }) 4714 s.Require().Nil(err) 4715 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user1.Id)) }() 4716 4717 teamId1 := model.NewId() 4718 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId1, UserId: user1.Id, SchemeGuest: false, SchemeUser: true}, 999) 4719 s.Require().Nil(nErr) 4720 4721 channel, nErr := s.Store().Channel().Save(&model.Channel{ 4722 TeamId: teamId1, 4723 DisplayName: "Channel name", 4724 Name: "channel-" + model.NewId(), 4725 Type: model.CHANNEL_OPEN, 4726 }, -1) 4727 s.Require().Nil(nErr) 4728 4729 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ChannelId: channel.Id, UserId: user1.Id, SchemeGuest: false, SchemeUser: true, NotifyProps: model.GetDefaultChannelNotifyProps()}) 4730 s.Require().Nil(nErr) 4731 4732 id = model.NewId() 4733 user2, err := s.Store().User().Save(&model.User{ 4734 Email: id + "@test.com", 4735 Username: "un_" + id, 4736 Nickname: "nn_" + id, 4737 FirstName: "f_" + id, 4738 LastName: "l_" + id, 4739 Password: "Password1", 4740 Roles: "system_user", 4741 }) 4742 s.Require().Nil(err) 4743 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(user2.Id)) }() 4744 4745 teamId2 := model.NewId() 4746 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId2, UserId: user2.Id, SchemeGuest: false, SchemeUser: true}, 999) 4747 s.Require().Nil(nErr) 4748 4749 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ChannelId: channel.Id, UserId: user2.Id, SchemeGuest: false, SchemeUser: true, NotifyProps: model.GetDefaultChannelNotifyProps()}) 4750 s.Require().Nil(nErr) 4751 4752 updatedUser, err := s.Store().User().DemoteUserToGuest(user1.Id) 4753 s.Require().Nil(err) 4754 s.Require().Equal("system_guest", updatedUser.Roles) 4755 4756 updatedTeamMember, nErr := s.Store().Team().GetMember(context.Background(), teamId1, user1.Id) 4757 s.Require().Nil(nErr) 4758 s.Require().True(updatedTeamMember.SchemeGuest) 4759 s.Require().False(updatedTeamMember.SchemeUser) 4760 4761 updatedChannelMember, nErr := s.Store().Channel().GetMember(context.Background(), channel.Id, user1.Id) 4762 s.Require().Nil(nErr) 4763 s.Require().True(updatedChannelMember.SchemeGuest) 4764 s.Require().False(updatedChannelMember.SchemeUser) 4765 4766 notUpdatedUser, err := s.Store().User().Get(context.Background(), user2.Id) 4767 s.Require().Nil(err) 4768 s.Require().Equal("system_user", notUpdatedUser.Roles) 4769 4770 notUpdatedTeamMember, nErr := s.Store().Team().GetMember(context.Background(), teamId2, user2.Id) 4771 s.Require().Nil(nErr) 4772 s.Require().False(notUpdatedTeamMember.SchemeGuest) 4773 s.Require().True(notUpdatedTeamMember.SchemeUser) 4774 4775 notUpdatedChannelMember, nErr := s.Store().Channel().GetMember(context.Background(), channel.Id, user2.Id) 4776 s.Require().Nil(nErr) 4777 s.Require().False(notUpdatedChannelMember.SchemeGuest) 4778 s.Require().True(notUpdatedChannelMember.SchemeUser) 4779 }) 4780 } 4781 4782 func (s *UserStoreTS) TestDeactivateGuests() { 4783 // create users 4784 s.T().Run("Must disable all guests and no regular user or already deactivated users", func(t *testing.T) { 4785 guest1Random := model.NewId() 4786 guest1, err := s.Store().User().Save(&model.User{ 4787 Email: guest1Random + "@test.com", 4788 Username: "un_" + guest1Random, 4789 Nickname: "nn_" + guest1Random, 4790 FirstName: "f_" + guest1Random, 4791 LastName: "l_" + guest1Random, 4792 Password: "Password1", 4793 Roles: "system_guest", 4794 }) 4795 s.Require().Nil(err) 4796 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(guest1.Id)) }() 4797 4798 guest2Random := model.NewId() 4799 guest2, err := s.Store().User().Save(&model.User{ 4800 Email: guest2Random + "@test.com", 4801 Username: "un_" + guest2Random, 4802 Nickname: "nn_" + guest2Random, 4803 FirstName: "f_" + guest2Random, 4804 LastName: "l_" + guest2Random, 4805 Password: "Password1", 4806 Roles: "system_guest", 4807 }) 4808 s.Require().Nil(err) 4809 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(guest2.Id)) }() 4810 4811 guest3Random := model.NewId() 4812 guest3, err := s.Store().User().Save(&model.User{ 4813 Email: guest3Random + "@test.com", 4814 Username: "un_" + guest3Random, 4815 Nickname: "nn_" + guest3Random, 4816 FirstName: "f_" + guest3Random, 4817 LastName: "l_" + guest3Random, 4818 Password: "Password1", 4819 Roles: "system_guest", 4820 DeleteAt: 10, 4821 }) 4822 s.Require().Nil(err) 4823 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(guest3.Id)) }() 4824 4825 regularUserRandom := model.NewId() 4826 regularUser, err := s.Store().User().Save(&model.User{ 4827 Email: regularUserRandom + "@test.com", 4828 Username: "un_" + regularUserRandom, 4829 Nickname: "nn_" + regularUserRandom, 4830 FirstName: "f_" + regularUserRandom, 4831 LastName: "l_" + regularUserRandom, 4832 Password: "Password1", 4833 Roles: "system_user", 4834 }) 4835 s.Require().Nil(err) 4836 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(regularUser.Id)) }() 4837 4838 ids, err := s.Store().User().DeactivateGuests() 4839 s.Require().Nil(err) 4840 s.Assert().ElementsMatch([]string{guest1.Id, guest2.Id}, ids) 4841 4842 u, err := s.Store().User().Get(context.Background(), guest1.Id) 4843 s.Require().Nil(err) 4844 s.Assert().NotEqual(u.DeleteAt, int64(0)) 4845 4846 u, err = s.Store().User().Get(context.Background(), guest2.Id) 4847 s.Require().Nil(err) 4848 s.Assert().NotEqual(u.DeleteAt, int64(0)) 4849 4850 u, err = s.Store().User().Get(context.Background(), guest3.Id) 4851 s.Require().Nil(err) 4852 s.Assert().Equal(u.DeleteAt, int64(10)) 4853 4854 u, err = s.Store().User().Get(context.Background(), regularUser.Id) 4855 s.Require().Nil(err) 4856 s.Assert().Equal(u.DeleteAt, int64(0)) 4857 }) 4858 } 4859 4860 func (s *UserStoreTS) TestUserStoreResetLastPictureUpdate() { 4861 u1 := &model.User{} 4862 u1.Email = MakeEmail() 4863 _, err := s.Store().User().Save(u1) 4864 s.Require().Nil(err) 4865 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 4866 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1) 4867 s.Require().Nil(nErr) 4868 4869 err = s.Store().User().UpdateLastPictureUpdate(u1.Id) 4870 s.Require().Nil(err) 4871 4872 user, err := s.Store().User().Get(context.Background(), u1.Id) 4873 s.Require().Nil(err) 4874 4875 s.Assert().NotZero(user.LastPictureUpdate) 4876 s.Assert().NotZero(user.UpdateAt) 4877 4878 // Ensure update at timestamp changes 4879 time.Sleep(time.Millisecond) 4880 4881 err = s.Store().User().ResetLastPictureUpdate(u1.Id) 4882 s.Require().Nil(err) 4883 4884 s.Store().User().InvalidateProfileCacheForUser(u1.Id) 4885 4886 user2, err := s.Store().User().Get(context.Background(), u1.Id) 4887 s.Require().Nil(err) 4888 4889 s.Assert().True(user2.UpdateAt > user.UpdateAt) 4890 s.Assert().Zero(user2.LastPictureUpdate) 4891 } 4892 4893 func (s *UserStoreTS) testGetKnownUsers() { 4894 teamId := model.NewId() 4895 4896 u1, err := s.Store().User().Save(&model.User{ 4897 Email: MakeEmail(), 4898 Username: "u1" + model.NewId(), 4899 }) 4900 s.Require().Nil(err) 4901 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u1.Id)) }() 4902 _, nErr := s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1) 4903 s.Require().Nil(nErr) 4904 4905 u2, err := s.Store().User().Save(&model.User{ 4906 Email: MakeEmail(), 4907 Username: "u2" + model.NewId(), 4908 }) 4909 s.Require().Nil(err) 4910 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u2.Id)) }() 4911 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1) 4912 s.Require().Nil(nErr) 4913 4914 u3, err := s.Store().User().Save(&model.User{ 4915 Email: MakeEmail(), 4916 Username: "u3" + model.NewId(), 4917 }) 4918 s.Require().Nil(err) 4919 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u3.Id)) }() 4920 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1) 4921 s.Require().Nil(nErr) 4922 _, nErr = s.Store().Bot().Save(&model.Bot{ 4923 UserId: u3.Id, 4924 Username: u3.Username, 4925 OwnerId: u1.Id, 4926 }) 4927 s.Require().Nil(nErr) 4928 u3.IsBot = true 4929 4930 defer func() { s.Require().Nil(s.Store().Bot().PermanentDelete(u3.Id)) }() 4931 4932 u4, err := s.Store().User().Save(&model.User{ 4933 Email: MakeEmail(), 4934 Username: "u4" + model.NewId(), 4935 }) 4936 s.Require().Nil(err) 4937 defer func() { s.Require().Nil(s.Store().User().PermanentDelete(u4.Id)) }() 4938 _, nErr = s.Store().Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u4.Id}, -1) 4939 s.Require().Nil(nErr) 4940 4941 ch1 := &model.Channel{ 4942 TeamId: teamId, 4943 DisplayName: "Profiles in channel", 4944 Name: "profiles-" + model.NewId(), 4945 Type: model.CHANNEL_OPEN, 4946 } 4947 c1, nErr := s.Store().Channel().Save(ch1, -1) 4948 s.Require().Nil(nErr) 4949 4950 ch2 := &model.Channel{ 4951 TeamId: teamId, 4952 DisplayName: "Profiles in private", 4953 Name: "profiles-" + model.NewId(), 4954 Type: model.CHANNEL_PRIVATE, 4955 } 4956 c2, nErr := s.Store().Channel().Save(ch2, -1) 4957 s.Require().Nil(nErr) 4958 4959 ch3 := &model.Channel{ 4960 TeamId: teamId, 4961 DisplayName: "Profiles in private", 4962 Name: "profiles-" + model.NewId(), 4963 Type: model.CHANNEL_PRIVATE, 4964 } 4965 c3, nErr := s.Store().Channel().Save(ch3, -1) 4966 s.Require().Nil(nErr) 4967 4968 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ 4969 ChannelId: c1.Id, 4970 UserId: u1.Id, 4971 NotifyProps: model.GetDefaultChannelNotifyProps(), 4972 }) 4973 s.Require().Nil(nErr) 4974 4975 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ 4976 ChannelId: c1.Id, 4977 UserId: u2.Id, 4978 NotifyProps: model.GetDefaultChannelNotifyProps(), 4979 }) 4980 s.Require().Nil(nErr) 4981 4982 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ 4983 ChannelId: c2.Id, 4984 UserId: u3.Id, 4985 NotifyProps: model.GetDefaultChannelNotifyProps(), 4986 }) 4987 s.Require().Nil(nErr) 4988 4989 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ 4990 ChannelId: c2.Id, 4991 UserId: u1.Id, 4992 NotifyProps: model.GetDefaultChannelNotifyProps(), 4993 }) 4994 s.Require().Nil(nErr) 4995 4996 _, nErr = s.Store().Channel().SaveMember(&model.ChannelMember{ 4997 ChannelId: c3.Id, 4998 UserId: u4.Id, 4999 NotifyProps: model.GetDefaultChannelNotifyProps(), 5000 }) 5001 s.Require().Nil(nErr) 5002 5003 s.T().Run("get know users sharing no channels", func(t *testing.T) { 5004 userIds, err := s.Store().User().GetKnownUsers(u4.Id) 5005 s.Require().Nil(err) 5006 s.Assert().Empty(userIds) 5007 }) 5008 5009 s.T().Run("get know users sharing one channel", func(t *testing.T) { 5010 userIds, err := s.Store().User().GetKnownUsers(u3.Id) 5011 s.Require().Nil(err) 5012 s.Assert().Len(userIds, 1) 5013 s.Assert().Equal(userIds[0], u1.Id) 5014 }) 5015 5016 s.T().Run("get know users sharing multiple channels", func(t *testing.T) { 5017 userIds, err := s.Store().User().GetKnownUsers(u1.Id) 5018 s.Require().Nil(err) 5019 s.Assert().Len(userIds, 2) 5020 s.Assert().ElementsMatch(userIds, []string{u2.Id, u3.Id}) 5021 }) 5022 }