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