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