github.com/xzl8028/xenia-server@v0.0.0-20190809101854-18450a97da63/store/storetest/user_store.go (about) 1 // Copyright (c) 2015-present Xenia, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package storetest 5 6 import ( 7 "strings" 8 "testing" 9 "time" 10 11 "github.com/stretchr/testify/assert" 12 "github.com/stretchr/testify/require" 13 14 "github.com/xzl8028/xenia-server/model" 15 "github.com/xzl8028/xenia-server/store" 16 ) 17 18 func TestUserStore(t *testing.T, ss store.Store) { 19 result := <-ss.User().GetAll() 20 require.Nil(t, result.Err, "failed cleaning up test users") 21 users := result.Data.([]*model.User) 22 23 for _, u := range users { 24 err := ss.User().PermanentDelete(u.Id) 25 require.Nil(t, err, "failed cleaning up test user %s", u.Username) 26 } 27 28 t.Run("Count", func(t *testing.T) { testCount(t, ss) }) 29 t.Run("AnalyticsGetInactiveUsersCount", func(t *testing.T) { testUserStoreAnalyticsGetInactiveUsersCount(t, ss) }) 30 t.Run("AnalyticsGetSystemAdminCount", func(t *testing.T) { testUserStoreAnalyticsGetSystemAdminCount(t, ss) }) 31 t.Run("Save", func(t *testing.T) { testUserStoreSave(t, ss) }) 32 t.Run("Update", func(t *testing.T) { testUserStoreUpdate(t, ss) }) 33 t.Run("UpdateUpdateAt", func(t *testing.T) { testUserStoreUpdateUpdateAt(t, ss) }) 34 t.Run("UpdateFailedPasswordAttempts", func(t *testing.T) { testUserStoreUpdateFailedPasswordAttempts(t, ss) }) 35 t.Run("Get", func(t *testing.T) { testUserStoreGet(t, ss) }) 36 t.Run("GetAllUsingAuthService", func(t *testing.T) { testGetAllUsingAuthService(t, ss) }) 37 t.Run("GetAllProfiles", func(t *testing.T) { testUserStoreGetAllProfiles(t, ss) }) 38 t.Run("GetProfiles", func(t *testing.T) { testUserStoreGetProfiles(t, ss) }) 39 t.Run("GetProfilesInChannel", func(t *testing.T) { testUserStoreGetProfilesInChannel(t, ss) }) 40 t.Run("GetProfilesInChannelByStatus", func(t *testing.T) { testUserStoreGetProfilesInChannelByStatus(t, ss) }) 41 t.Run("GetProfilesWithoutTeam", func(t *testing.T) { testUserStoreGetProfilesWithoutTeam(t, ss) }) 42 t.Run("GetAllProfilesInChannel", func(t *testing.T) { testUserStoreGetAllProfilesInChannel(t, ss) }) 43 t.Run("GetProfilesNotInChannel", func(t *testing.T) { testUserStoreGetProfilesNotInChannel(t, ss) }) 44 t.Run("GetProfilesByIds", func(t *testing.T) { testUserStoreGetProfilesByIds(t, ss) }) 45 t.Run("GetProfileByGroupChannelIdsForUser", func(t *testing.T) { testUserStoreGetProfileByGroupChannelIdsForUser(t, ss) }) 46 t.Run("GetProfilesByUsernames", func(t *testing.T) { testUserStoreGetProfilesByUsernames(t, ss) }) 47 t.Run("GetSystemAdminProfiles", func(t *testing.T) { testUserStoreGetSystemAdminProfiles(t, ss) }) 48 t.Run("GetByEmail", func(t *testing.T) { testUserStoreGetByEmail(t, ss) }) 49 t.Run("GetByAuthData", func(t *testing.T) { testUserStoreGetByAuthData(t, ss) }) 50 t.Run("GetByUsername", func(t *testing.T) { testUserStoreGetByUsername(t, ss) }) 51 t.Run("GetForLogin", func(t *testing.T) { testUserStoreGetForLogin(t, ss) }) 52 t.Run("UpdatePassword", func(t *testing.T) { testUserStoreUpdatePassword(t, ss) }) 53 t.Run("Delete", func(t *testing.T) { testUserStoreDelete(t, ss) }) 54 t.Run("UpdateAuthData", func(t *testing.T) { testUserStoreUpdateAuthData(t, ss) }) 55 t.Run("UserUnreadCount", func(t *testing.T) { testUserUnreadCount(t, ss) }) 56 t.Run("UpdateMfaSecret", func(t *testing.T) { testUserStoreUpdateMfaSecret(t, ss) }) 57 t.Run("UpdateMfaActive", func(t *testing.T) { testUserStoreUpdateMfaActive(t, ss) }) 58 t.Run("GetRecentlyActiveUsersForTeam", func(t *testing.T) { testUserStoreGetRecentlyActiveUsersForTeam(t, ss) }) 59 t.Run("GetNewUsersForTeam", func(t *testing.T) { testUserStoreGetNewUsersForTeam(t, ss) }) 60 t.Run("Search", func(t *testing.T) { testUserStoreSearch(t, ss) }) 61 t.Run("SearchNotInChannel", func(t *testing.T) { testUserStoreSearchNotInChannel(t, ss) }) 62 t.Run("SearchInChannel", func(t *testing.T) { testUserStoreSearchInChannel(t, ss) }) 63 t.Run("SearchNotInTeam", func(t *testing.T) { testUserStoreSearchNotInTeam(t, ss) }) 64 t.Run("SearchWithoutTeam", func(t *testing.T) { testUserStoreSearchWithoutTeam(t, ss) }) 65 t.Run("GetProfilesNotInTeam", func(t *testing.T) { testUserStoreGetProfilesNotInTeam(t, ss) }) 66 t.Run("ClearAllCustomRoleAssignments", func(t *testing.T) { testUserStoreClearAllCustomRoleAssignments(t, ss) }) 67 t.Run("GetAllAfter", func(t *testing.T) { testUserStoreGetAllAfter(t, ss) }) 68 t.Run("GetUsersBatchForIndexing", func(t *testing.T) { testUserStoreGetUsersBatchForIndexing(t, ss) }) 69 t.Run("GetTeamGroupUsers", func(t *testing.T) { testUserStoreGetTeamGroupUsers(t, ss) }) 70 t.Run("GetChannelGroupUsers", func(t *testing.T) { testUserStoreGetChannelGroupUsers(t, ss) }) 71 } 72 73 func testUserStoreSave(t *testing.T, ss store.Store) { 74 teamId := model.NewId() 75 maxUsersPerTeam := 50 76 77 u1 := model.User{ 78 Email: MakeEmail(), 79 Username: model.NewId(), 80 } 81 82 if err := (<-ss.User().Save(&u1)).Err; err != nil { 83 t.Fatal("couldn't save user", err) 84 } 85 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 86 87 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, maxUsersPerTeam)) 88 89 if err := (<-ss.User().Save(&u1)).Err; err == nil { 90 t.Fatal("shouldn't be able to update user from save") 91 } 92 93 u2 := model.User{ 94 Email: u1.Email, 95 Username: model.NewId(), 96 } 97 if err := (<-ss.User().Save(&u2)).Err; err == nil { 98 t.Fatal("should be unique email") 99 } 100 101 u2.Email = MakeEmail() 102 u2.Username = u1.Username 103 if err := (<-ss.User().Save(&u1)).Err; err == nil { 104 t.Fatal("should be unique username") 105 } 106 107 u2.Username = "" 108 if err := (<-ss.User().Save(&u1)).Err; err == nil { 109 t.Fatal("should be unique username") 110 } 111 112 for i := 0; i < 49; i++ { 113 u := model.User{ 114 Email: MakeEmail(), 115 Username: model.NewId(), 116 } 117 if err := (<-ss.User().Save(&u)).Err; err != nil { 118 t.Fatal("couldn't save item", err) 119 } 120 defer func() { require.Nil(t, ss.User().PermanentDelete(u.Id)) }() 121 122 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u.Id}, maxUsersPerTeam)) 123 } 124 125 u2.Id = "" 126 u2.Email = MakeEmail() 127 u2.Username = model.NewId() 128 if err := (<-ss.User().Save(&u2)).Err; err != nil { 129 t.Fatal("couldn't save item", err) 130 } 131 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 132 133 if err := (<-ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, maxUsersPerTeam)).Err; err == nil { 134 t.Fatal("should be the limit") 135 } 136 } 137 138 func testUserStoreUpdate(t *testing.T, ss store.Store) { 139 u1 := &model.User{ 140 Email: MakeEmail(), 141 } 142 store.Must(ss.User().Save(u1)) 143 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 144 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1)) 145 146 u2 := &model.User{ 147 Email: MakeEmail(), 148 AuthService: "ldap", 149 } 150 store.Must(ss.User().Save(u2)) 151 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 152 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}, -1)) 153 154 time.Sleep(100 * time.Millisecond) 155 156 if _, err := ss.User().Update(u1, false); err != nil { 157 t.Fatal(err) 158 } 159 160 missing := &model.User{} 161 if _, err := ss.User().Update(missing, false); err == nil { 162 t.Fatal("Update should have failed because of missing key") 163 } 164 165 newId := &model.User{ 166 Id: model.NewId(), 167 } 168 if _, err := ss.User().Update(newId, false); err == nil { 169 t.Fatal("Update should have failed because id change") 170 } 171 172 u2.Email = MakeEmail() 173 if _, err := ss.User().Update(u2, false); err == nil { 174 t.Fatal("Update should have failed because you can't modify AD/LDAP fields") 175 } 176 177 u3 := &model.User{ 178 Email: MakeEmail(), 179 AuthService: "gitlab", 180 } 181 oldEmail := u3.Email 182 store.Must(ss.User().Save(u3)) 183 defer func() { require.Nil(t, ss.User().PermanentDelete(u3.Id)) }() 184 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u3.Id}, -1)) 185 186 u3.Email = MakeEmail() 187 if userUpdate, err := ss.User().Update(u3, false); err != nil { 188 t.Fatal("Update should not have failed") 189 } else { 190 newUser := userUpdate.New 191 if newUser.Email != oldEmail { 192 t.Fatal("Email should not have been updated as the update is not trusted") 193 } 194 } 195 196 u3.Email = MakeEmail() 197 if userUpdate, err := ss.User().Update(u3, true); err != nil { 198 t.Fatal("Update should not have failed") 199 } else { 200 newUser := userUpdate.New 201 if newUser.Email == oldEmail { 202 t.Fatal("Email should have been updated as the update is trusted") 203 } 204 } 205 206 if result := <-ss.User().UpdateLastPictureUpdate(u1.Id); result.Err != nil { 207 t.Fatal("Update should not have failed") 208 } 209 } 210 211 func testUserStoreUpdateUpdateAt(t *testing.T, ss store.Store) { 212 u1 := &model.User{} 213 u1.Email = MakeEmail() 214 store.Must(ss.User().Save(u1)) 215 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 216 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1)) 217 218 time.Sleep(10 * time.Millisecond) 219 220 if err := (<-ss.User().UpdateUpdateAt(u1.Id)).Err; err != nil { 221 t.Fatal(err) 222 } 223 224 user, err := ss.User().Get(u1.Id) 225 require.Nil(t, err) 226 if user.UpdateAt <= u1.UpdateAt { 227 t.Fatal("UpdateAt not updated correctly") 228 } 229 230 } 231 232 func testUserStoreUpdateFailedPasswordAttempts(t *testing.T, ss store.Store) { 233 u1 := &model.User{} 234 u1.Email = MakeEmail() 235 store.Must(ss.User().Save(u1)) 236 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 237 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1)) 238 239 if err := (<-ss.User().UpdateFailedPasswordAttempts(u1.Id, 3)).Err; err != nil { 240 t.Fatal(err) 241 } 242 243 user, err := ss.User().Get(u1.Id) 244 require.Nil(t, err) 245 if user.FailedAttempts != 3 { 246 t.Fatal("FailedAttempts not updated correctly") 247 } 248 } 249 250 func testUserStoreGet(t *testing.T, ss store.Store) { 251 u1 := &model.User{ 252 Email: MakeEmail(), 253 } 254 store.Must(ss.User().Save(u1)) 255 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 256 257 u2 := store.Must(ss.User().Save(&model.User{ 258 Email: MakeEmail(), 259 Username: model.NewId(), 260 })).(*model.User) 261 _, err := ss.Bot().Save(&model.Bot{ 262 UserId: u2.Id, 263 Username: u2.Username, 264 Description: "bot description", 265 OwnerId: u1.Id, 266 }) 267 require.Nil(t, err) 268 u2.IsBot = true 269 u2.BotDescription = "bot description" 270 defer func() { require.Nil(t, ss.Bot().PermanentDelete(u2.Id)) }() 271 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 272 273 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1)) 274 275 t.Run("fetch empty id", func(t *testing.T) { 276 _, err := ss.User().Get("") 277 require.NotNil(t, err) 278 }) 279 280 t.Run("fetch user 1", func(t *testing.T) { 281 actual, err := ss.User().Get(u1.Id) 282 require.Nil(t, err) 283 require.Equal(t, u1, actual) 284 require.False(t, actual.IsBot) 285 }) 286 287 t.Run("fetch user 2, also a bot", func(t *testing.T) { 288 actual, err := ss.User().Get(u2.Id) 289 require.Nil(t, err) 290 require.Equal(t, u2, actual) 291 require.True(t, actual.IsBot) 292 require.Equal(t, "bot description", actual.BotDescription) 293 }) 294 } 295 296 func testGetAllUsingAuthService(t *testing.T, ss store.Store) { 297 teamId := model.NewId() 298 299 u1 := store.Must(ss.User().Save(&model.User{ 300 Email: MakeEmail(), 301 Username: "u1" + model.NewId(), 302 AuthService: "service", 303 })).(*model.User) 304 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 305 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)) 306 307 u2 := store.Must(ss.User().Save(&model.User{ 308 Email: MakeEmail(), 309 Username: "u2" + model.NewId(), 310 AuthService: "service", 311 })).(*model.User) 312 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 313 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)) 314 315 u3 := store.Must(ss.User().Save(&model.User{ 316 Email: MakeEmail(), 317 Username: "u3" + model.NewId(), 318 AuthService: "service2", 319 })).(*model.User) 320 defer func() { require.Nil(t, ss.User().PermanentDelete(u3.Id)) }() 321 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1)) 322 _, err := ss.Bot().Save(&model.Bot{ 323 UserId: u3.Id, 324 Username: u3.Username, 325 OwnerId: u1.Id, 326 }) 327 require.Nil(t, err) 328 u3.IsBot = true 329 defer func() { require.Nil(t, ss.Bot().PermanentDelete(u3.Id)) }() 330 defer func() { require.Nil(t, ss.User().PermanentDelete(u3.Id)) }() 331 332 t.Run("get by unknown auth service", func(t *testing.T) { 333 users, err := ss.User().GetAllUsingAuthService("unknown") 334 require.Nil(t, err) 335 assert.Equal(t, []*model.User{}, users) 336 }) 337 338 t.Run("get by auth service", func(t *testing.T) { 339 users, err := ss.User().GetAllUsingAuthService("service") 340 require.Nil(t, err) 341 assert.Equal(t, []*model.User{u1, u2}, users) 342 }) 343 344 t.Run("get by other auth service", func(t *testing.T) { 345 users, err := ss.User().GetAllUsingAuthService("service2") 346 require.Nil(t, err) 347 assert.Equal(t, []*model.User{u3}, users) 348 }) 349 } 350 351 func sanitized(user *model.User) *model.User { 352 clonedUser := model.UserFromJson(strings.NewReader(user.ToJson())) 353 clonedUser.AuthData = new(string) 354 *clonedUser.AuthData = "" 355 clonedUser.Props = model.StringMap{} 356 357 return clonedUser 358 } 359 360 func testUserStoreGetAllProfiles(t *testing.T, ss store.Store) { 361 u1 := store.Must(ss.User().Save(&model.User{ 362 Email: MakeEmail(), 363 Username: "u1" + model.NewId(), 364 })).(*model.User) 365 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 366 367 u2 := store.Must(ss.User().Save(&model.User{ 368 Email: MakeEmail(), 369 Username: "u2" + model.NewId(), 370 })).(*model.User) 371 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 372 373 u3 := store.Must(ss.User().Save(&model.User{ 374 Email: MakeEmail(), 375 Username: "u3" + model.NewId(), 376 })).(*model.User) 377 _, err := ss.Bot().Save(&model.Bot{ 378 UserId: u3.Id, 379 Username: u3.Username, 380 OwnerId: u1.Id, 381 }) 382 require.Nil(t, err) 383 u3.IsBot = true 384 defer func() { require.Nil(t, ss.Bot().PermanentDelete(u3.Id)) }() 385 defer func() { require.Nil(t, ss.User().PermanentDelete(u3.Id)) }() 386 387 u4 := store.Must(ss.User().Save(&model.User{ 388 Email: MakeEmail(), 389 Username: "u4" + model.NewId(), 390 Roles: "system_user some-other-role", 391 })).(*model.User) 392 defer func() { require.Nil(t, ss.User().PermanentDelete(u4.Id)) }() 393 394 u5 := store.Must(ss.User().Save(&model.User{ 395 Email: MakeEmail(), 396 Username: "u5" + model.NewId(), 397 Roles: "system_admin", 398 })).(*model.User) 399 defer func() { require.Nil(t, ss.User().PermanentDelete(u5.Id)) }() 400 401 u6 := store.Must(ss.User().Save(&model.User{ 402 Email: MakeEmail(), 403 Username: "u6" + model.NewId(), 404 DeleteAt: model.GetMillis(), 405 Roles: "system_admin", 406 })).(*model.User) 407 defer func() { require.Nil(t, ss.User().PermanentDelete(u6.Id)) }() 408 409 u7 := store.Must(ss.User().Save(&model.User{ 410 Email: MakeEmail(), 411 Username: "u7" + model.NewId(), 412 DeleteAt: model.GetMillis(), 413 })).(*model.User) 414 defer func() { require.Nil(t, ss.User().PermanentDelete(u7.Id)) }() 415 416 t.Run("get offset 0, limit 100", func(t *testing.T) { 417 options := &model.UserGetOptions{Page: 0, PerPage: 100} 418 result := <-ss.User().GetAllProfiles(options) 419 require.Nil(t, result.Err) 420 421 actual := result.Data.([]*model.User) 422 require.Equal(t, []*model.User{ 423 sanitized(u1), 424 sanitized(u2), 425 sanitized(u3), 426 sanitized(u4), 427 sanitized(u5), 428 sanitized(u6), 429 sanitized(u7), 430 }, actual) 431 }) 432 433 t.Run("get offset 0, limit 1", func(t *testing.T) { 434 result := <-ss.User().GetAllProfiles(&model.UserGetOptions{ 435 Page: 0, 436 PerPage: 1, 437 }) 438 require.Nil(t, result.Err) 439 actual := result.Data.([]*model.User) 440 require.Equal(t, []*model.User{ 441 sanitized(u1), 442 }, actual) 443 }) 444 445 t.Run("get all", func(t *testing.T) { 446 result := <-ss.User().GetAll() 447 require.Nil(t, result.Err) 448 449 actual := result.Data.([]*model.User) 450 require.Equal(t, []*model.User{ 451 u1, 452 u2, 453 u3, 454 u4, 455 u5, 456 u6, 457 u7, 458 }, actual) 459 }) 460 461 t.Run("etag changes for all after user creation", func(t *testing.T) { 462 result := <-ss.User().GetEtagForAllProfiles() 463 require.Nil(t, result.Err) 464 etag := result.Data.(string) 465 466 uNew := &model.User{} 467 uNew.Email = MakeEmail() 468 store.Must(ss.User().Save(uNew)) 469 defer func() { require.Nil(t, ss.User().PermanentDelete(uNew.Id)) }() 470 471 result = <-ss.User().GetEtagForAllProfiles() 472 require.Nil(t, result.Err) 473 updatedEtag := result.Data.(string) 474 475 require.NotEqual(t, etag, updatedEtag) 476 }) 477 478 t.Run("filter to system_admin role", func(t *testing.T) { 479 result := <-ss.User().GetAllProfiles(&model.UserGetOptions{ 480 Page: 0, 481 PerPage: 10, 482 Role: "system_admin", 483 }) 484 require.Nil(t, result.Err) 485 actual := result.Data.([]*model.User) 486 require.Equal(t, []*model.User{ 487 sanitized(u5), 488 sanitized(u6), 489 }, actual) 490 }) 491 492 t.Run("filter to system_admin role, inactive", func(t *testing.T) { 493 result := <-ss.User().GetAllProfiles(&model.UserGetOptions{ 494 Page: 0, 495 PerPage: 10, 496 Role: "system_admin", 497 Inactive: true, 498 }) 499 require.Nil(t, result.Err) 500 actual := result.Data.([]*model.User) 501 require.Equal(t, []*model.User{ 502 sanitized(u6), 503 }, actual) 504 }) 505 506 t.Run("filter to inactive", func(t *testing.T) { 507 result := <-ss.User().GetAllProfiles(&model.UserGetOptions{ 508 Page: 0, 509 PerPage: 10, 510 Inactive: true, 511 }) 512 require.Nil(t, result.Err) 513 actual := result.Data.([]*model.User) 514 require.Equal(t, []*model.User{ 515 sanitized(u6), 516 sanitized(u7), 517 }, actual) 518 }) 519 } 520 521 func testUserStoreGetProfiles(t *testing.T, ss store.Store) { 522 teamId := model.NewId() 523 524 u1 := store.Must(ss.User().Save(&model.User{ 525 Email: MakeEmail(), 526 Username: "u1" + model.NewId(), 527 })).(*model.User) 528 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 529 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)) 530 531 u2 := store.Must(ss.User().Save(&model.User{ 532 Email: MakeEmail(), 533 Username: "u2" + model.NewId(), 534 })).(*model.User) 535 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 536 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)) 537 538 u3 := store.Must(ss.User().Save(&model.User{ 539 Email: MakeEmail(), 540 Username: "u3" + model.NewId(), 541 })).(*model.User) 542 _, err := ss.Bot().Save(&model.Bot{ 543 UserId: u3.Id, 544 Username: u3.Username, 545 OwnerId: u1.Id, 546 }) 547 require.Nil(t, err) 548 u3.IsBot = true 549 defer func() { require.Nil(t, ss.Bot().PermanentDelete(u3.Id)) }() 550 defer func() { require.Nil(t, ss.User().PermanentDelete(u3.Id)) }() 551 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1)) 552 553 u4 := store.Must(ss.User().Save(&model.User{ 554 Email: MakeEmail(), 555 Username: "u4" + model.NewId(), 556 Roles: "system_admin", 557 })).(*model.User) 558 defer func() { require.Nil(t, ss.User().PermanentDelete(u4.Id)) }() 559 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u4.Id}, -1)) 560 561 u5 := store.Must(ss.User().Save(&model.User{ 562 Email: MakeEmail(), 563 Username: "u5" + model.NewId(), 564 DeleteAt: model.GetMillis(), 565 })).(*model.User) 566 defer func() { require.Nil(t, ss.User().PermanentDelete(u5.Id)) }() 567 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u5.Id}, -1)) 568 569 t.Run("get page 0, perPage 100", func(t *testing.T) { 570 result := <-ss.User().GetProfiles(&model.UserGetOptions{ 571 InTeamId: teamId, 572 Page: 0, 573 PerPage: 100, 574 }) 575 require.Nil(t, result.Err) 576 577 actual := result.Data.([]*model.User) 578 require.Equal(t, []*model.User{ 579 sanitized(u1), 580 sanitized(u2), 581 sanitized(u3), 582 sanitized(u4), 583 sanitized(u5), 584 }, actual) 585 }) 586 587 t.Run("get page 0, perPage 1", func(t *testing.T) { 588 result := <-ss.User().GetProfiles(&model.UserGetOptions{ 589 InTeamId: teamId, 590 Page: 0, 591 PerPage: 1, 592 }) 593 require.Nil(t, result.Err) 594 595 actual := result.Data.([]*model.User) 596 require.Equal(t, []*model.User{sanitized(u1)}, actual) 597 }) 598 599 t.Run("get unknown team id", func(t *testing.T) { 600 result := <-ss.User().GetProfiles(&model.UserGetOptions{ 601 InTeamId: "123", 602 Page: 0, 603 PerPage: 100, 604 }) 605 require.Nil(t, result.Err) 606 607 actual := result.Data.([]*model.User) 608 require.Equal(t, []*model.User{}, actual) 609 }) 610 611 t.Run("etag changes for all after user creation", func(t *testing.T) { 612 result := <-ss.User().GetEtagForProfiles(teamId) 613 require.Nil(t, result.Err) 614 etag := result.Data.(string) 615 616 uNew := &model.User{} 617 uNew.Email = MakeEmail() 618 store.Must(ss.User().Save(uNew)) 619 defer func() { require.Nil(t, ss.User().PermanentDelete(uNew.Id)) }() 620 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: uNew.Id}, -1)) 621 622 result = <-ss.User().GetEtagForProfiles(teamId) 623 require.Nil(t, result.Err) 624 updatedEtag := result.Data.(string) 625 626 require.NotEqual(t, etag, updatedEtag) 627 }) 628 629 t.Run("filter to system_admin role", func(t *testing.T) { 630 result := <-ss.User().GetProfiles(&model.UserGetOptions{ 631 InTeamId: teamId, 632 Page: 0, 633 PerPage: 10, 634 Role: "system_admin", 635 }) 636 require.Nil(t, result.Err) 637 actual := result.Data.([]*model.User) 638 require.Equal(t, []*model.User{ 639 sanitized(u4), 640 }, actual) 641 }) 642 643 t.Run("filter to inactive", func(t *testing.T) { 644 result := <-ss.User().GetProfiles(&model.UserGetOptions{ 645 InTeamId: teamId, 646 Page: 0, 647 PerPage: 10, 648 Inactive: true, 649 }) 650 require.Nil(t, result.Err) 651 actual := result.Data.([]*model.User) 652 require.Equal(t, []*model.User{ 653 sanitized(u5), 654 }, actual) 655 }) 656 } 657 658 func testUserStoreGetProfilesInChannel(t *testing.T, ss store.Store) { 659 teamId := model.NewId() 660 661 u1 := store.Must(ss.User().Save(&model.User{ 662 Email: MakeEmail(), 663 Username: "u1" + model.NewId(), 664 })).(*model.User) 665 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 666 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)) 667 668 u2 := store.Must(ss.User().Save(&model.User{ 669 Email: MakeEmail(), 670 Username: "u2" + model.NewId(), 671 })).(*model.User) 672 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 673 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)) 674 675 u3 := store.Must(ss.User().Save(&model.User{ 676 Email: MakeEmail(), 677 Username: "u3" + model.NewId(), 678 })).(*model.User) 679 defer func() { require.Nil(t, ss.User().PermanentDelete(u3.Id)) }() 680 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1)) 681 _, err := ss.Bot().Save(&model.Bot{ 682 UserId: u3.Id, 683 Username: u3.Username, 684 OwnerId: u1.Id, 685 }) 686 require.Nil(t, err) 687 u3.IsBot = true 688 defer func() { require.Nil(t, ss.Bot().PermanentDelete(u3.Id)) }() 689 690 ch1 := &model.Channel{ 691 TeamId: teamId, 692 DisplayName: "Profiles in channel", 693 Name: "profiles-" + model.NewId(), 694 Type: model.CHANNEL_OPEN, 695 } 696 c1, err := ss.Channel().Save(ch1, -1) 697 require.Nil(t, err) 698 699 ch2 := &model.Channel{ 700 TeamId: teamId, 701 DisplayName: "Profiles in private", 702 Name: "profiles-" + model.NewId(), 703 Type: model.CHANNEL_PRIVATE, 704 } 705 c2, err := ss.Channel().Save(ch2, -1) 706 require.Nil(t, err) 707 708 store.Must(ss.Channel().SaveMember(&model.ChannelMember{ 709 ChannelId: c1.Id, 710 UserId: u1.Id, 711 NotifyProps: model.GetDefaultChannelNotifyProps(), 712 })) 713 714 store.Must(ss.Channel().SaveMember(&model.ChannelMember{ 715 ChannelId: c1.Id, 716 UserId: u2.Id, 717 NotifyProps: model.GetDefaultChannelNotifyProps(), 718 })) 719 720 store.Must(ss.Channel().SaveMember(&model.ChannelMember{ 721 ChannelId: c1.Id, 722 UserId: u3.Id, 723 NotifyProps: model.GetDefaultChannelNotifyProps(), 724 })) 725 726 store.Must(ss.Channel().SaveMember(&model.ChannelMember{ 727 ChannelId: c2.Id, 728 UserId: u1.Id, 729 NotifyProps: model.GetDefaultChannelNotifyProps(), 730 })) 731 732 t.Run("get in channel 1, offset 0, limit 100", func(t *testing.T) { 733 result := <-ss.User().GetProfilesInChannel(c1.Id, 0, 100) 734 require.Nil(t, result.Err) 735 assert.Equal(t, []*model.User{sanitized(u1), sanitized(u2), sanitized(u3)}, result.Data.([]*model.User)) 736 }) 737 738 t.Run("get in channel 1, offset 1, limit 2", func(t *testing.T) { 739 result := <-ss.User().GetProfilesInChannel(c1.Id, 1, 2) 740 require.Nil(t, result.Err) 741 assert.Equal(t, []*model.User{sanitized(u2), sanitized(u3)}, result.Data.([]*model.User)) 742 }) 743 744 t.Run("get in channel 2, offset 0, limit 1", func(t *testing.T) { 745 result := <-ss.User().GetProfilesInChannel(c2.Id, 0, 1) 746 require.Nil(t, result.Err) 747 assert.Equal(t, []*model.User{sanitized(u1)}, result.Data.([]*model.User)) 748 }) 749 } 750 751 func testUserStoreGetProfilesInChannelByStatus(t *testing.T, ss store.Store) { 752 teamId := model.NewId() 753 754 u1 := store.Must(ss.User().Save(&model.User{ 755 Email: MakeEmail(), 756 Username: "u1" + model.NewId(), 757 })).(*model.User) 758 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 759 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)) 760 761 u2 := store.Must(ss.User().Save(&model.User{ 762 Email: MakeEmail(), 763 Username: "u2" + model.NewId(), 764 })).(*model.User) 765 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 766 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)) 767 768 u3 := store.Must(ss.User().Save(&model.User{ 769 Email: MakeEmail(), 770 Username: "u3" + model.NewId(), 771 })).(*model.User) 772 defer func() { require.Nil(t, ss.User().PermanentDelete(u3.Id)) }() 773 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1)) 774 _, err := ss.Bot().Save(&model.Bot{ 775 UserId: u3.Id, 776 Username: u3.Username, 777 OwnerId: u1.Id, 778 }) 779 require.Nil(t, err) 780 u3.IsBot = true 781 defer func() { require.Nil(t, ss.Bot().PermanentDelete(u3.Id)) }() 782 783 ch1 := &model.Channel{ 784 TeamId: teamId, 785 DisplayName: "Profiles in channel", 786 Name: "profiles-" + model.NewId(), 787 Type: model.CHANNEL_OPEN, 788 } 789 c1, err := ss.Channel().Save(ch1, -1) 790 require.Nil(t, err) 791 792 ch2 := &model.Channel{ 793 TeamId: teamId, 794 DisplayName: "Profiles in private", 795 Name: "profiles-" + model.NewId(), 796 Type: model.CHANNEL_PRIVATE, 797 } 798 c2, err := ss.Channel().Save(ch2, -1) 799 require.Nil(t, err) 800 801 store.Must(ss.Channel().SaveMember(&model.ChannelMember{ 802 ChannelId: c1.Id, 803 UserId: u1.Id, 804 NotifyProps: model.GetDefaultChannelNotifyProps(), 805 })) 806 807 store.Must(ss.Channel().SaveMember(&model.ChannelMember{ 808 ChannelId: c1.Id, 809 UserId: u2.Id, 810 NotifyProps: model.GetDefaultChannelNotifyProps(), 811 })) 812 813 store.Must(ss.Channel().SaveMember(&model.ChannelMember{ 814 ChannelId: c1.Id, 815 UserId: u3.Id, 816 NotifyProps: model.GetDefaultChannelNotifyProps(), 817 })) 818 819 store.Must(ss.Channel().SaveMember(&model.ChannelMember{ 820 ChannelId: c2.Id, 821 UserId: u1.Id, 822 NotifyProps: model.GetDefaultChannelNotifyProps(), 823 })) 824 825 require.Nil(t, ss.Status().SaveOrUpdate(&model.Status{ 826 UserId: u1.Id, 827 Status: model.STATUS_DND, 828 })) 829 require.Nil(t, ss.Status().SaveOrUpdate(&model.Status{ 830 UserId: u2.Id, 831 Status: model.STATUS_AWAY, 832 })) 833 require.Nil(t, ss.Status().SaveOrUpdate(&model.Status{ 834 UserId: u3.Id, 835 Status: model.STATUS_ONLINE, 836 })) 837 838 t.Run("get in channel 1 by status, offset 0, limit 100", func(t *testing.T) { 839 result := <-ss.User().GetProfilesInChannelByStatus(c1.Id, 0, 100) 840 require.Nil(t, result.Err) 841 assert.Equal(t, []*model.User{sanitized(u3), sanitized(u2), sanitized(u1)}, result.Data.([]*model.User)) 842 }) 843 844 t.Run("get in channel 2 by status, offset 0, limit 1", func(t *testing.T) { 845 result := <-ss.User().GetProfilesInChannelByStatus(c2.Id, 0, 1) 846 require.Nil(t, result.Err) 847 assert.Equal(t, []*model.User{sanitized(u1)}, result.Data.([]*model.User)) 848 }) 849 } 850 851 func testUserStoreGetProfilesWithoutTeam(t *testing.T, ss store.Store) { 852 teamId := model.NewId() 853 854 u1 := store.Must(ss.User().Save(&model.User{ 855 Email: MakeEmail(), 856 Username: "u1" + model.NewId(), 857 })).(*model.User) 858 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 859 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)) 860 861 u2 := store.Must(ss.User().Save(&model.User{ 862 Email: MakeEmail(), 863 Username: "u2" + model.NewId(), 864 })).(*model.User) 865 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 866 867 u3 := store.Must(ss.User().Save(&model.User{ 868 Email: MakeEmail(), 869 Username: "u3" + model.NewId(), 870 })).(*model.User) 871 defer func() { require.Nil(t, ss.User().PermanentDelete(u3.Id)) }() 872 _, err := ss.Bot().Save(&model.Bot{ 873 UserId: u3.Id, 874 Username: u3.Username, 875 OwnerId: u1.Id, 876 }) 877 require.Nil(t, err) 878 u3.IsBot = true 879 defer func() { require.Nil(t, ss.Bot().PermanentDelete(u3.Id)) }() 880 881 t.Run("get, offset 0, limit 100", func(t *testing.T) { 882 result := <-ss.User().GetProfilesWithoutTeam(0, 100, nil) 883 require.Nil(t, result.Err) 884 assert.Equal(t, []*model.User{sanitized(u2), sanitized(u3)}, result.Data.([]*model.User)) 885 }) 886 887 t.Run("get, offset 1, limit 1", func(t *testing.T) { 888 result := <-ss.User().GetProfilesWithoutTeam(1, 1, nil) 889 require.Nil(t, result.Err) 890 assert.Equal(t, []*model.User{sanitized(u3)}, result.Data.([]*model.User)) 891 }) 892 893 t.Run("get, offset 2, limit 1", func(t *testing.T) { 894 result := <-ss.User().GetProfilesWithoutTeam(2, 1, nil) 895 require.Nil(t, result.Err) 896 assert.Equal(t, []*model.User{}, result.Data.([]*model.User)) 897 }) 898 } 899 900 func testUserStoreGetAllProfilesInChannel(t *testing.T, ss store.Store) { 901 teamId := model.NewId() 902 903 u1 := store.Must(ss.User().Save(&model.User{ 904 Email: MakeEmail(), 905 Username: "u1" + model.NewId(), 906 })).(*model.User) 907 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 908 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)) 909 910 u2 := store.Must(ss.User().Save(&model.User{ 911 Email: MakeEmail(), 912 Username: "u2" + model.NewId(), 913 })).(*model.User) 914 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 915 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)) 916 917 u3 := store.Must(ss.User().Save(&model.User{ 918 Email: MakeEmail(), 919 Username: "u3" + model.NewId(), 920 })).(*model.User) 921 defer func() { require.Nil(t, ss.User().PermanentDelete(u3.Id)) }() 922 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1)) 923 _, err := ss.Bot().Save(&model.Bot{ 924 UserId: u3.Id, 925 Username: u3.Username, 926 OwnerId: u1.Id, 927 }) 928 require.Nil(t, err) 929 u3.IsBot = true 930 defer func() { require.Nil(t, ss.Bot().PermanentDelete(u3.Id)) }() 931 932 ch1 := &model.Channel{ 933 TeamId: teamId, 934 DisplayName: "Profiles in channel", 935 Name: "profiles-" + model.NewId(), 936 Type: model.CHANNEL_OPEN, 937 } 938 c1, err := ss.Channel().Save(ch1, -1) 939 require.Nil(t, err) 940 941 ch2 := &model.Channel{ 942 TeamId: teamId, 943 DisplayName: "Profiles in private", 944 Name: "profiles-" + model.NewId(), 945 Type: model.CHANNEL_PRIVATE, 946 } 947 c2, err := ss.Channel().Save(ch2, -1) 948 require.Nil(t, err) 949 950 store.Must(ss.Channel().SaveMember(&model.ChannelMember{ 951 ChannelId: c1.Id, 952 UserId: u1.Id, 953 NotifyProps: model.GetDefaultChannelNotifyProps(), 954 })) 955 956 store.Must(ss.Channel().SaveMember(&model.ChannelMember{ 957 ChannelId: c1.Id, 958 UserId: u2.Id, 959 NotifyProps: model.GetDefaultChannelNotifyProps(), 960 })) 961 962 store.Must(ss.Channel().SaveMember(&model.ChannelMember{ 963 ChannelId: c1.Id, 964 UserId: u3.Id, 965 NotifyProps: model.GetDefaultChannelNotifyProps(), 966 })) 967 968 store.Must(ss.Channel().SaveMember(&model.ChannelMember{ 969 ChannelId: c2.Id, 970 UserId: u1.Id, 971 NotifyProps: model.GetDefaultChannelNotifyProps(), 972 })) 973 974 t.Run("all profiles in channel 1, no caching", func(t *testing.T) { 975 result := <-ss.User().GetAllProfilesInChannel(c1.Id, false) 976 require.Nil(t, result.Err) 977 assert.Equal(t, map[string]*model.User{ 978 u1.Id: sanitized(u1), 979 u2.Id: sanitized(u2), 980 u3.Id: sanitized(u3), 981 }, result.Data.(map[string]*model.User)) 982 }) 983 984 t.Run("all profiles in channel 2, no caching", func(t *testing.T) { 985 result := <-ss.User().GetAllProfilesInChannel(c2.Id, false) 986 require.Nil(t, result.Err) 987 assert.Equal(t, map[string]*model.User{ 988 u1.Id: sanitized(u1), 989 }, result.Data.(map[string]*model.User)) 990 }) 991 992 t.Run("all profiles in channel 2, caching", func(t *testing.T) { 993 result := <-ss.User().GetAllProfilesInChannel(c2.Id, true) 994 require.Nil(t, result.Err) 995 assert.Equal(t, map[string]*model.User{ 996 u1.Id: sanitized(u1), 997 }, result.Data.(map[string]*model.User)) 998 }) 999 1000 t.Run("all profiles in channel 2, caching [repeated]", func(t *testing.T) { 1001 result := <-ss.User().GetAllProfilesInChannel(c2.Id, true) 1002 require.Nil(t, result.Err) 1003 assert.Equal(t, map[string]*model.User{ 1004 u1.Id: sanitized(u1), 1005 }, result.Data.(map[string]*model.User)) 1006 }) 1007 1008 ss.User().InvalidateProfilesInChannelCacheByUser(u1.Id) 1009 ss.User().InvalidateProfilesInChannelCache(c2.Id) 1010 } 1011 1012 func testUserStoreGetProfilesNotInChannel(t *testing.T, ss store.Store) { 1013 teamId := model.NewId() 1014 1015 u1 := store.Must(ss.User().Save(&model.User{ 1016 Email: MakeEmail(), 1017 Username: "u1" + model.NewId(), 1018 })).(*model.User) 1019 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 1020 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)) 1021 1022 u2 := store.Must(ss.User().Save(&model.User{ 1023 Email: MakeEmail(), 1024 Username: "u2" + model.NewId(), 1025 })).(*model.User) 1026 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 1027 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)) 1028 1029 u3 := store.Must(ss.User().Save(&model.User{ 1030 Email: MakeEmail(), 1031 Username: "u3" + model.NewId(), 1032 })).(*model.User) 1033 defer func() { require.Nil(t, ss.User().PermanentDelete(u3.Id)) }() 1034 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1)) 1035 _, err := ss.Bot().Save(&model.Bot{ 1036 UserId: u3.Id, 1037 Username: u3.Username, 1038 OwnerId: u1.Id, 1039 }) 1040 require.Nil(t, err) 1041 u3.IsBot = true 1042 defer func() { require.Nil(t, ss.Bot().PermanentDelete(u3.Id)) }() 1043 1044 ch1 := &model.Channel{ 1045 TeamId: teamId, 1046 DisplayName: "Profiles in channel", 1047 Name: "profiles-" + model.NewId(), 1048 Type: model.CHANNEL_OPEN, 1049 } 1050 c1, err := ss.Channel().Save(ch1, -1) 1051 require.Nil(t, err) 1052 1053 ch2 := &model.Channel{ 1054 TeamId: teamId, 1055 DisplayName: "Profiles in private", 1056 Name: "profiles-" + model.NewId(), 1057 Type: model.CHANNEL_PRIVATE, 1058 } 1059 c2, err := ss.Channel().Save(ch2, -1) 1060 require.Nil(t, err) 1061 1062 t.Run("get team 1, channel 1, offset 0, limit 100", func(t *testing.T) { 1063 result := <-ss.User().GetProfilesNotInChannel(teamId, c1.Id, false, 0, 100, nil) 1064 require.Nil(t, result.Err) 1065 assert.Equal(t, []*model.User{ 1066 sanitized(u1), 1067 sanitized(u2), 1068 sanitized(u3), 1069 }, result.Data.([]*model.User)) 1070 }) 1071 1072 t.Run("get team 1, channel 2, offset 0, limit 100", func(t *testing.T) { 1073 result := <-ss.User().GetProfilesNotInChannel(teamId, c2.Id, false, 0, 100, nil) 1074 require.Nil(t, result.Err) 1075 assert.Equal(t, []*model.User{ 1076 sanitized(u1), 1077 sanitized(u2), 1078 sanitized(u3), 1079 }, result.Data.([]*model.User)) 1080 }) 1081 1082 store.Must(ss.Channel().SaveMember(&model.ChannelMember{ 1083 ChannelId: c1.Id, 1084 UserId: u1.Id, 1085 NotifyProps: model.GetDefaultChannelNotifyProps(), 1086 })) 1087 1088 store.Must(ss.Channel().SaveMember(&model.ChannelMember{ 1089 ChannelId: c1.Id, 1090 UserId: u2.Id, 1091 NotifyProps: model.GetDefaultChannelNotifyProps(), 1092 })) 1093 1094 store.Must(ss.Channel().SaveMember(&model.ChannelMember{ 1095 ChannelId: c1.Id, 1096 UserId: u3.Id, 1097 NotifyProps: model.GetDefaultChannelNotifyProps(), 1098 })) 1099 1100 store.Must(ss.Channel().SaveMember(&model.ChannelMember{ 1101 ChannelId: c2.Id, 1102 UserId: u1.Id, 1103 NotifyProps: model.GetDefaultChannelNotifyProps(), 1104 })) 1105 1106 t.Run("get team 1, channel 1, offset 0, limit 100, after update", func(t *testing.T) { 1107 result := <-ss.User().GetProfilesNotInChannel(teamId, c1.Id, false, 0, 100, nil) 1108 require.Nil(t, result.Err) 1109 assert.Equal(t, []*model.User{}, result.Data.([]*model.User)) 1110 }) 1111 1112 t.Run("get team 1, channel 2, offset 0, limit 100, after update", func(t *testing.T) { 1113 result := <-ss.User().GetProfilesNotInChannel(teamId, c2.Id, false, 0, 100, nil) 1114 require.Nil(t, result.Err) 1115 assert.Equal(t, []*model.User{ 1116 sanitized(u2), 1117 sanitized(u3), 1118 }, result.Data.([]*model.User)) 1119 }) 1120 1121 t.Run("get team 1, channel 2, offset 0, limit 0, setting group constrained when it's not", func(t *testing.T) { 1122 result := <-ss.User().GetProfilesNotInChannel(teamId, c2.Id, true, 0, 100, nil) 1123 require.Nil(t, result.Err) 1124 assert.Empty(t, result.Data.([]*model.User)) 1125 }) 1126 1127 // create a group 1128 group := store.Must(ss.Group().Create(&model.Group{ 1129 Name: "n_" + model.NewId(), 1130 DisplayName: "dn_" + model.NewId(), 1131 Source: model.GroupSourceLdap, 1132 RemoteId: "ri_" + model.NewId(), 1133 })).(*model.Group) 1134 1135 // add two members to the group 1136 for _, u := range []*model.User{u1, u2} { 1137 res := <-ss.Group().UpsertMember(group.Id, u.Id) 1138 require.Nil(t, res.Err) 1139 } 1140 1141 // associate the group with the channel 1142 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 1143 GroupId: group.Id, 1144 SyncableId: c2.Id, 1145 Type: model.GroupSyncableTypeChannel, 1146 }) 1147 require.Nil(t, err) 1148 1149 t.Run("get team 1, channel 2, offset 0, limit 0, setting group constrained", func(t *testing.T) { 1150 result := <-ss.User().GetProfilesNotInChannel(teamId, c2.Id, true, 0, 100, nil) 1151 require.Nil(t, result.Err) 1152 assert.Equal(t, []*model.User{ 1153 sanitized(u2), 1154 }, result.Data.([]*model.User)) 1155 }) 1156 } 1157 1158 func testUserStoreGetProfilesByIds(t *testing.T, ss store.Store) { 1159 teamId := model.NewId() 1160 1161 u1 := store.Must(ss.User().Save(&model.User{ 1162 Email: MakeEmail(), 1163 Username: "u1" + model.NewId(), 1164 })).(*model.User) 1165 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 1166 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)) 1167 1168 u2 := store.Must(ss.User().Save(&model.User{ 1169 Email: MakeEmail(), 1170 Username: "u2" + model.NewId(), 1171 })).(*model.User) 1172 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 1173 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)) 1174 1175 u3 := store.Must(ss.User().Save(&model.User{ 1176 Email: MakeEmail(), 1177 Username: "u3" + model.NewId(), 1178 })).(*model.User) 1179 defer func() { require.Nil(t, ss.User().PermanentDelete(u3.Id)) }() 1180 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1)) 1181 _, err := ss.Bot().Save(&model.Bot{ 1182 UserId: u3.Id, 1183 Username: u3.Username, 1184 OwnerId: u1.Id, 1185 }) 1186 require.Nil(t, err) 1187 u3.IsBot = true 1188 defer func() { require.Nil(t, ss.Bot().PermanentDelete(u3.Id)) }() 1189 1190 u4 := store.Must(ss.User().Save(&model.User{ 1191 Email: MakeEmail(), 1192 Username: "u4" + model.NewId(), 1193 })).(*model.User) 1194 defer func() { require.Nil(t, ss.User().PermanentDelete(u4.Id)) }() 1195 1196 t.Run("get u1 by id, no caching", func(t *testing.T) { 1197 result := <-ss.User().GetProfileByIds([]string{u1.Id}, nil, false) 1198 require.Nil(t, result.Err) 1199 assert.Equal(t, []*model.User{sanitized(u1)}, result.Data.([]*model.User)) 1200 }) 1201 1202 t.Run("get u1 by id, caching", func(t *testing.T) { 1203 result := <-ss.User().GetProfileByIds([]string{u1.Id}, nil, true) 1204 require.Nil(t, result.Err) 1205 assert.Equal(t, []*model.User{sanitized(u1)}, result.Data.([]*model.User)) 1206 }) 1207 1208 t.Run("get u1, u2, u3 by id, no caching", func(t *testing.T) { 1209 result := <-ss.User().GetProfileByIds([]string{u1.Id, u2.Id, u3.Id}, nil, false) 1210 require.Nil(t, result.Err) 1211 assert.Equal(t, []*model.User{sanitized(u1), sanitized(u2), sanitized(u3)}, result.Data.([]*model.User)) 1212 }) 1213 1214 t.Run("get u1, u2, u3 by id, caching", func(t *testing.T) { 1215 result := <-ss.User().GetProfileByIds([]string{u1.Id, u2.Id, u3.Id}, nil, true) 1216 require.Nil(t, result.Err) 1217 assert.Equal(t, []*model.User{sanitized(u1), sanitized(u2), sanitized(u3)}, result.Data.([]*model.User)) 1218 }) 1219 1220 t.Run("get unknown id, caching", func(t *testing.T) { 1221 result := <-ss.User().GetProfileByIds([]string{"123"}, nil, true) 1222 require.Nil(t, result.Err) 1223 assert.Equal(t, []*model.User{}, result.Data.([]*model.User)) 1224 }) 1225 1226 t.Run("should only return users with UpdateAt greater than the since time", func(t *testing.T) { 1227 result := <-ss.User().GetProfileByIds([]string{u1.Id, u2.Id, u3.Id, u4.Id}, &store.UserGetByIdsOpts{ 1228 Since: u2.CreateAt, 1229 }, true) 1230 require.Nil(t, result.Err) 1231 1232 // u3 comes from the cache, and u4 does not 1233 assert.Equal(t, []*model.User{sanitized(u3), sanitized(u4)}, result.Data.([]*model.User)) 1234 }) 1235 } 1236 1237 func testUserStoreGetProfileByGroupChannelIdsForUser(t *testing.T, ss store.Store) { 1238 u1 := store.Must(ss.User().Save(&model.User{ 1239 Email: MakeEmail(), 1240 Username: "u1" + model.NewId(), 1241 })).(*model.User) 1242 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 1243 1244 u2 := store.Must(ss.User().Save(&model.User{ 1245 Email: MakeEmail(), 1246 Username: "u2" + model.NewId(), 1247 })).(*model.User) 1248 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 1249 1250 u3 := store.Must(ss.User().Save(&model.User{ 1251 Email: MakeEmail(), 1252 Username: "u3" + model.NewId(), 1253 })).(*model.User) 1254 defer func() { require.Nil(t, ss.User().PermanentDelete(u3.Id)) }() 1255 1256 u4 := store.Must(ss.User().Save(&model.User{ 1257 Email: MakeEmail(), 1258 Username: "u4" + model.NewId(), 1259 })).(*model.User) 1260 defer func() { require.Nil(t, ss.User().PermanentDelete(u4.Id)) }() 1261 1262 gc1, err := ss.Channel().Save(&model.Channel{ 1263 DisplayName: "Profiles in private", 1264 Name: "profiles-" + model.NewId(), 1265 Type: model.CHANNEL_GROUP, 1266 }, -1) 1267 require.Nil(t, err) 1268 1269 for _, uId := range []string{u1.Id, u2.Id, u3.Id} { 1270 store.Must(ss.Channel().SaveMember(&model.ChannelMember{ 1271 ChannelId: gc1.Id, 1272 UserId: uId, 1273 NotifyProps: model.GetDefaultChannelNotifyProps(), 1274 })) 1275 } 1276 1277 gc2, err := ss.Channel().Save(&model.Channel{ 1278 DisplayName: "Profiles in private", 1279 Name: "profiles-" + model.NewId(), 1280 Type: model.CHANNEL_GROUP, 1281 }, -1) 1282 require.Nil(t, err) 1283 1284 for _, uId := range []string{u1.Id, u3.Id, u4.Id} { 1285 store.Must(ss.Channel().SaveMember(&model.ChannelMember{ 1286 ChannelId: gc2.Id, 1287 UserId: uId, 1288 NotifyProps: model.GetDefaultChannelNotifyProps(), 1289 })) 1290 } 1291 1292 testCases := []struct { 1293 Name string 1294 UserId string 1295 ChannelIds []string 1296 ExpectedUserIdsByChannel map[string][]string 1297 EnsureChannelsNotInResults []string 1298 }{ 1299 { 1300 Name: "Get group 1 as user 1", 1301 UserId: u1.Id, 1302 ChannelIds: []string{gc1.Id}, 1303 ExpectedUserIdsByChannel: map[string][]string{ 1304 gc1.Id: {u2.Id, u3.Id}, 1305 }, 1306 EnsureChannelsNotInResults: []string{}, 1307 }, 1308 { 1309 Name: "Get groups 1 and 2 as user 1", 1310 UserId: u1.Id, 1311 ChannelIds: []string{gc1.Id, gc2.Id}, 1312 ExpectedUserIdsByChannel: map[string][]string{ 1313 gc1.Id: {u2.Id, u3.Id}, 1314 gc2.Id: {u3.Id, u4.Id}, 1315 }, 1316 EnsureChannelsNotInResults: []string{}, 1317 }, 1318 { 1319 Name: "Get groups 1 and 2 as user 2", 1320 UserId: u2.Id, 1321 ChannelIds: []string{gc1.Id, gc2.Id}, 1322 ExpectedUserIdsByChannel: map[string][]string{ 1323 gc1.Id: {u1.Id, u3.Id}, 1324 }, 1325 EnsureChannelsNotInResults: []string{gc2.Id}, 1326 }, 1327 } 1328 1329 for _, tc := range testCases { 1330 t.Run(tc.Name, func(t *testing.T) { 1331 res, err := ss.User().GetProfileByGroupChannelIdsForUser(tc.UserId, tc.ChannelIds) 1332 require.Nil(t, err) 1333 1334 for channelId, expectedUsers := range tc.ExpectedUserIdsByChannel { 1335 users, ok := res[channelId] 1336 require.True(t, ok) 1337 1338 userIds := []string{} 1339 for _, user := range users { 1340 userIds = append(userIds, user.Id) 1341 } 1342 require.ElementsMatch(t, expectedUsers, userIds) 1343 } 1344 1345 for _, channelId := range tc.EnsureChannelsNotInResults { 1346 _, ok := res[channelId] 1347 require.False(t, ok) 1348 } 1349 }) 1350 } 1351 } 1352 1353 func testUserStoreGetProfilesByUsernames(t *testing.T, ss store.Store) { 1354 teamId := model.NewId() 1355 team2Id := model.NewId() 1356 1357 u1 := store.Must(ss.User().Save(&model.User{ 1358 Email: MakeEmail(), 1359 Username: "u1" + model.NewId(), 1360 })).(*model.User) 1361 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 1362 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)) 1363 1364 u2 := store.Must(ss.User().Save(&model.User{ 1365 Email: MakeEmail(), 1366 Username: "u2" + model.NewId(), 1367 })).(*model.User) 1368 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 1369 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)) 1370 1371 u3 := store.Must(ss.User().Save(&model.User{ 1372 Email: MakeEmail(), 1373 Username: "u3" + model.NewId(), 1374 })).(*model.User) 1375 defer func() { require.Nil(t, ss.User().PermanentDelete(u3.Id)) }() 1376 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: team2Id, UserId: u3.Id}, -1)) 1377 _, err := ss.Bot().Save(&model.Bot{ 1378 UserId: u3.Id, 1379 Username: u3.Username, 1380 OwnerId: u1.Id, 1381 }) 1382 require.Nil(t, err) 1383 u3.IsBot = true 1384 defer func() { require.Nil(t, ss.Bot().PermanentDelete(u3.Id)) }() 1385 1386 t.Run("get by u1 and u2 usernames, team id 1", func(t *testing.T) { 1387 result := <-ss.User().GetProfilesByUsernames([]string{u1.Username, u2.Username}, &model.ViewUsersRestrictions{Teams: []string{teamId}}) 1388 require.Nil(t, result.Err) 1389 assert.Equal(t, []*model.User{u1, u2}, result.Data.([]*model.User)) 1390 }) 1391 1392 t.Run("get by u1 username, team id 1", func(t *testing.T) { 1393 result := <-ss.User().GetProfilesByUsernames([]string{u1.Username}, &model.ViewUsersRestrictions{Teams: []string{teamId}}) 1394 require.Nil(t, result.Err) 1395 assert.Equal(t, []*model.User{u1}, result.Data.([]*model.User)) 1396 }) 1397 1398 t.Run("get by u1 and u3 usernames, no team id", func(t *testing.T) { 1399 result := <-ss.User().GetProfilesByUsernames([]string{u1.Username, u3.Username}, nil) 1400 require.Nil(t, result.Err) 1401 assert.Equal(t, []*model.User{u1, u3}, result.Data.([]*model.User)) 1402 }) 1403 1404 t.Run("get by u1 and u3 usernames, team id 1", func(t *testing.T) { 1405 result := <-ss.User().GetProfilesByUsernames([]string{u1.Username, u3.Username}, &model.ViewUsersRestrictions{Teams: []string{teamId}}) 1406 require.Nil(t, result.Err) 1407 assert.Equal(t, []*model.User{u1}, result.Data.([]*model.User)) 1408 }) 1409 1410 t.Run("get by u1 and u3 usernames, team id 2", func(t *testing.T) { 1411 result := <-ss.User().GetProfilesByUsernames([]string{u1.Username, u3.Username}, &model.ViewUsersRestrictions{Teams: []string{team2Id}}) 1412 require.Nil(t, result.Err) 1413 assert.Equal(t, []*model.User{u3}, result.Data.([]*model.User)) 1414 }) 1415 } 1416 1417 func testUserStoreGetSystemAdminProfiles(t *testing.T, ss store.Store) { 1418 teamId := model.NewId() 1419 1420 u1 := store.Must(ss.User().Save(&model.User{ 1421 Email: MakeEmail(), 1422 Roles: model.SYSTEM_USER_ROLE_ID + " " + model.SYSTEM_ADMIN_ROLE_ID, 1423 Username: "u1" + model.NewId(), 1424 })).(*model.User) 1425 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 1426 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)) 1427 1428 u2 := store.Must(ss.User().Save(&model.User{ 1429 Email: MakeEmail(), 1430 Username: "u2" + model.NewId(), 1431 })).(*model.User) 1432 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 1433 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)) 1434 1435 u3 := store.Must(ss.User().Save(&model.User{ 1436 Email: MakeEmail(), 1437 Roles: model.SYSTEM_USER_ROLE_ID + " " + model.SYSTEM_ADMIN_ROLE_ID, 1438 Username: "u3" + model.NewId(), 1439 })).(*model.User) 1440 defer func() { require.Nil(t, ss.User().PermanentDelete(u3.Id)) }() 1441 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1)) 1442 _, err := ss.Bot().Save(&model.Bot{ 1443 UserId: u3.Id, 1444 Username: u3.Username, 1445 OwnerId: u1.Id, 1446 }) 1447 require.Nil(t, err) 1448 u3.IsBot = true 1449 defer func() { require.Nil(t, ss.Bot().PermanentDelete(u3.Id)) }() 1450 1451 t.Run("all system admin profiles", func(t *testing.T) { 1452 result := <-ss.User().GetSystemAdminProfiles() 1453 require.Nil(t, result.Err) 1454 assert.Equal(t, map[string]*model.User{ 1455 u1.Id: sanitized(u1), 1456 u3.Id: sanitized(u3), 1457 }, result.Data.(map[string]*model.User)) 1458 }) 1459 } 1460 1461 func testUserStoreGetByEmail(t *testing.T, ss store.Store) { 1462 teamId := model.NewId() 1463 1464 u1 := store.Must(ss.User().Save(&model.User{ 1465 Email: MakeEmail(), 1466 Username: "u1" + model.NewId(), 1467 })).(*model.User) 1468 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 1469 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)) 1470 1471 u2 := store.Must(ss.User().Save(&model.User{ 1472 Email: MakeEmail(), 1473 Username: "u2" + model.NewId(), 1474 })).(*model.User) 1475 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 1476 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)) 1477 1478 u3 := store.Must(ss.User().Save(&model.User{ 1479 Email: MakeEmail(), 1480 Username: "u3" + model.NewId(), 1481 })).(*model.User) 1482 defer func() { require.Nil(t, ss.User().PermanentDelete(u3.Id)) }() 1483 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1)) 1484 _, err := ss.Bot().Save(&model.Bot{ 1485 UserId: u3.Id, 1486 Username: u3.Username, 1487 OwnerId: u1.Id, 1488 }) 1489 require.Nil(t, err) 1490 u3.IsBot = true 1491 defer func() { require.Nil(t, ss.Bot().PermanentDelete(u3.Id)) }() 1492 1493 t.Run("get u1 by email", func(t *testing.T) { 1494 u, err := ss.User().GetByEmail(u1.Email) 1495 require.Nil(t, err) 1496 assert.Equal(t, u1, u) 1497 }) 1498 1499 t.Run("get u2 by email", func(t *testing.T) { 1500 u, err := ss.User().GetByEmail(u2.Email) 1501 require.Nil(t, err) 1502 assert.Equal(t, u2, u) 1503 }) 1504 1505 t.Run("get u3 by email", func(t *testing.T) { 1506 u, err := ss.User().GetByEmail(u3.Email) 1507 require.Nil(t, err) 1508 assert.Equal(t, u3, u) 1509 }) 1510 1511 t.Run("get by empty email", func(t *testing.T) { 1512 _, err := ss.User().GetByEmail("") 1513 require.NotNil(t, err) 1514 require.Equal(t, err.Id, store.MISSING_ACCOUNT_ERROR) 1515 }) 1516 1517 t.Run("get by unknown", func(t *testing.T) { 1518 _, err := ss.User().GetByEmail("unknown") 1519 require.NotNil(t, err) 1520 require.Equal(t, err.Id, store.MISSING_ACCOUNT_ERROR) 1521 }) 1522 } 1523 1524 func testUserStoreGetByAuthData(t *testing.T, ss store.Store) { 1525 teamId := model.NewId() 1526 auth1 := model.NewId() 1527 auth3 := model.NewId() 1528 1529 u1 := store.Must(ss.User().Save(&model.User{ 1530 Email: MakeEmail(), 1531 Username: "u1" + model.NewId(), 1532 AuthData: &auth1, 1533 AuthService: "service", 1534 })).(*model.User) 1535 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 1536 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)) 1537 1538 u2 := store.Must(ss.User().Save(&model.User{ 1539 Email: MakeEmail(), 1540 Username: "u2" + model.NewId(), 1541 })).(*model.User) 1542 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 1543 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)) 1544 1545 u3 := store.Must(ss.User().Save(&model.User{ 1546 Email: MakeEmail(), 1547 Username: "u3" + model.NewId(), 1548 AuthData: &auth3, 1549 AuthService: "service2", 1550 })).(*model.User) 1551 defer func() { require.Nil(t, ss.User().PermanentDelete(u3.Id)) }() 1552 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1)) 1553 _, err := ss.Bot().Save(&model.Bot{ 1554 UserId: u3.Id, 1555 Username: u3.Username, 1556 OwnerId: u1.Id, 1557 }) 1558 require.Nil(t, err) 1559 u3.IsBot = true 1560 defer func() { require.Nil(t, ss.Bot().PermanentDelete(u3.Id)) }() 1561 1562 t.Run("get by u1 auth", func(t *testing.T) { 1563 u, err := ss.User().GetByAuth(u1.AuthData, u1.AuthService) 1564 require.Nil(t, err) 1565 assert.Equal(t, u1, u) 1566 }) 1567 1568 t.Run("get by u3 auth", func(t *testing.T) { 1569 u, err := ss.User().GetByAuth(u3.AuthData, u3.AuthService) 1570 require.Nil(t, err) 1571 assert.Equal(t, u3, u) 1572 }) 1573 1574 t.Run("get by u1 auth, unknown service", func(t *testing.T) { 1575 _, err := ss.User().GetByAuth(u1.AuthData, "unknown") 1576 require.NotNil(t, err) 1577 require.Equal(t, err.Id, store.MISSING_AUTH_ACCOUNT_ERROR) 1578 }) 1579 1580 t.Run("get by unknown auth, u1 service", func(t *testing.T) { 1581 unknownAuth := "" 1582 _, err := ss.User().GetByAuth(&unknownAuth, u1.AuthService) 1583 require.NotNil(t, err) 1584 require.Equal(t, err.Id, store.MISSING_AUTH_ACCOUNT_ERROR) 1585 }) 1586 1587 t.Run("get by unknown auth, unknown service", func(t *testing.T) { 1588 unknownAuth := "" 1589 _, err := ss.User().GetByAuth(&unknownAuth, "unknown") 1590 require.NotNil(t, err) 1591 require.Equal(t, err.Id, store.MISSING_AUTH_ACCOUNT_ERROR) 1592 }) 1593 } 1594 1595 func testUserStoreGetByUsername(t *testing.T, ss store.Store) { 1596 teamId := model.NewId() 1597 1598 u1 := store.Must(ss.User().Save(&model.User{ 1599 Email: MakeEmail(), 1600 Username: "u1" + model.NewId(), 1601 })).(*model.User) 1602 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 1603 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)) 1604 1605 u2 := store.Must(ss.User().Save(&model.User{ 1606 Email: MakeEmail(), 1607 Username: "u2" + model.NewId(), 1608 })).(*model.User) 1609 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 1610 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)) 1611 1612 u3 := store.Must(ss.User().Save(&model.User{ 1613 Email: MakeEmail(), 1614 Username: "u3" + model.NewId(), 1615 })).(*model.User) 1616 defer func() { require.Nil(t, ss.User().PermanentDelete(u3.Id)) }() 1617 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1)) 1618 _, err := ss.Bot().Save(&model.Bot{ 1619 UserId: u3.Id, 1620 Username: u3.Username, 1621 OwnerId: u1.Id, 1622 }) 1623 require.Nil(t, err) 1624 u3.IsBot = true 1625 defer func() { require.Nil(t, ss.Bot().PermanentDelete(u3.Id)) }() 1626 1627 t.Run("get u1 by username", func(t *testing.T) { 1628 result := <-ss.User().GetByUsername(u1.Username) 1629 require.Nil(t, result.Err) 1630 assert.Equal(t, u1, result.Data.(*model.User)) 1631 }) 1632 1633 t.Run("get u2 by username", func(t *testing.T) { 1634 result := <-ss.User().GetByUsername(u2.Username) 1635 require.Nil(t, result.Err) 1636 assert.Equal(t, u2, result.Data.(*model.User)) 1637 }) 1638 1639 t.Run("get u3 by username", func(t *testing.T) { 1640 result := <-ss.User().GetByUsername(u3.Username) 1641 require.Nil(t, result.Err) 1642 assert.Equal(t, u3, result.Data.(*model.User)) 1643 }) 1644 1645 t.Run("get by empty username", func(t *testing.T) { 1646 result := <-ss.User().GetByUsername("") 1647 require.NotNil(t, result.Err) 1648 require.Equal(t, result.Err.Id, "store.sql_user.get_by_username.app_error") 1649 }) 1650 1651 t.Run("get by unknown", func(t *testing.T) { 1652 result := <-ss.User().GetByUsername("unknown") 1653 require.NotNil(t, result.Err) 1654 require.Equal(t, result.Err.Id, "store.sql_user.get_by_username.app_error") 1655 }) 1656 } 1657 1658 func testUserStoreGetForLogin(t *testing.T, ss store.Store) { 1659 teamId := model.NewId() 1660 auth := model.NewId() 1661 auth2 := model.NewId() 1662 auth3 := model.NewId() 1663 1664 u1 := store.Must(ss.User().Save(&model.User{ 1665 Email: MakeEmail(), 1666 Username: "u1" + model.NewId(), 1667 AuthService: model.USER_AUTH_SERVICE_GITLAB, 1668 AuthData: &auth, 1669 })).(*model.User) 1670 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 1671 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)) 1672 1673 u2 := store.Must(ss.User().Save(&model.User{ 1674 Email: MakeEmail(), 1675 Username: "u2" + model.NewId(), 1676 AuthService: model.USER_AUTH_SERVICE_LDAP, 1677 AuthData: &auth2, 1678 })).(*model.User) 1679 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 1680 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)) 1681 1682 u3 := store.Must(ss.User().Save(&model.User{ 1683 Email: MakeEmail(), 1684 Username: "u3" + model.NewId(), 1685 AuthService: model.USER_AUTH_SERVICE_LDAP, 1686 AuthData: &auth3, 1687 })).(*model.User) 1688 defer func() { require.Nil(t, ss.User().PermanentDelete(u3.Id)) }() 1689 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1)) 1690 _, err := ss.Bot().Save(&model.Bot{ 1691 UserId: u3.Id, 1692 Username: u3.Username, 1693 OwnerId: u1.Id, 1694 }) 1695 require.Nil(t, err) 1696 u3.IsBot = true 1697 defer func() { require.Nil(t, ss.Bot().PermanentDelete(u3.Id)) }() 1698 1699 t.Run("get u1 by username, allow both", func(t *testing.T) { 1700 result := <-ss.User().GetForLogin(u1.Username, true, true) 1701 require.Nil(t, result.Err) 1702 assert.Equal(t, u1, result.Data.(*model.User)) 1703 }) 1704 1705 t.Run("get u1 by username, allow only email", func(t *testing.T) { 1706 result := <-ss.User().GetForLogin(u1.Username, false, true) 1707 require.NotNil(t, result.Err) 1708 require.Equal(t, result.Err.Id, "store.sql_user.get_for_login.app_error") 1709 }) 1710 1711 t.Run("get u1 by email, allow both", func(t *testing.T) { 1712 result := <-ss.User().GetForLogin(u1.Email, true, true) 1713 require.Nil(t, result.Err) 1714 assert.Equal(t, u1, result.Data.(*model.User)) 1715 }) 1716 1717 t.Run("get u1 by email, allow only username", func(t *testing.T) { 1718 result := <-ss.User().GetForLogin(u1.Email, true, false) 1719 require.NotNil(t, result.Err) 1720 require.Equal(t, result.Err.Id, "store.sql_user.get_for_login.app_error") 1721 }) 1722 1723 t.Run("get u2 by username, allow both", func(t *testing.T) { 1724 result := <-ss.User().GetForLogin(u2.Username, true, true) 1725 require.Nil(t, result.Err) 1726 assert.Equal(t, u2, result.Data.(*model.User)) 1727 }) 1728 1729 t.Run("get u2 by email, allow both", func(t *testing.T) { 1730 result := <-ss.User().GetForLogin(u2.Email, true, true) 1731 require.Nil(t, result.Err) 1732 assert.Equal(t, u2, result.Data.(*model.User)) 1733 }) 1734 1735 t.Run("get u2 by username, allow neither", func(t *testing.T) { 1736 result := <-ss.User().GetForLogin(u2.Username, false, false) 1737 require.NotNil(t, result.Err) 1738 require.Equal(t, result.Err.Id, "store.sql_user.get_for_login.app_error") 1739 }) 1740 } 1741 1742 func testUserStoreUpdatePassword(t *testing.T, ss store.Store) { 1743 teamId := model.NewId() 1744 1745 u1 := &model.User{} 1746 u1.Email = MakeEmail() 1747 store.Must(ss.User().Save(u1)) 1748 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 1749 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)) 1750 1751 hashedPassword := model.HashPassword("newpwd") 1752 1753 if err := (<-ss.User().UpdatePassword(u1.Id, hashedPassword)).Err; err != nil { 1754 t.Fatal(err) 1755 } 1756 1757 if user, err := ss.User().GetByEmail(u1.Email); err != nil { 1758 t.Fatal(err) 1759 } else { 1760 if user.Password != hashedPassword { 1761 t.Fatal("Password was not updated correctly") 1762 } 1763 } 1764 } 1765 1766 func testUserStoreDelete(t *testing.T, ss store.Store) { 1767 u1 := &model.User{} 1768 u1.Email = MakeEmail() 1769 store.Must(ss.User().Save(u1)) 1770 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 1771 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}, -1)) 1772 1773 if err := ss.User().PermanentDelete(u1.Id); err != nil { 1774 t.Fatal(err) 1775 } 1776 } 1777 1778 func testUserStoreUpdateAuthData(t *testing.T, ss store.Store) { 1779 teamId := model.NewId() 1780 1781 u1 := &model.User{} 1782 u1.Email = MakeEmail() 1783 store.Must(ss.User().Save(u1)) 1784 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 1785 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)) 1786 1787 service := "someservice" 1788 authData := model.NewId() 1789 1790 _, err := ss.User().UpdateAuthData(u1.Id, service, &authData, "", true) 1791 require.Nil(t, err) 1792 1793 if user, err := ss.User().GetByEmail(u1.Email); err != nil { 1794 t.Fatal(err) 1795 } else { 1796 if user.AuthService != service { 1797 t.Fatal("AuthService was not updated correctly") 1798 } 1799 if *user.AuthData != authData { 1800 t.Fatal("AuthData was not updated correctly") 1801 } 1802 if user.Password != "" { 1803 t.Fatal("Password was not cleared properly") 1804 } 1805 } 1806 } 1807 1808 func testUserUnreadCount(t *testing.T, ss store.Store) { 1809 teamId := model.NewId() 1810 1811 c1 := model.Channel{} 1812 c1.TeamId = teamId 1813 c1.DisplayName = "Unread Messages" 1814 c1.Name = "unread-messages-" + model.NewId() 1815 c1.Type = model.CHANNEL_OPEN 1816 1817 c2 := model.Channel{} 1818 c2.TeamId = teamId 1819 c2.DisplayName = "Unread Direct" 1820 c2.Name = "unread-direct-" + model.NewId() 1821 c2.Type = model.CHANNEL_DIRECT 1822 1823 u1 := &model.User{} 1824 u1.Username = "user1" + model.NewId() 1825 u1.Email = MakeEmail() 1826 store.Must(ss.User().Save(u1)) 1827 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 1828 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)) 1829 1830 u2 := &model.User{} 1831 u2.Email = MakeEmail() 1832 u2.Username = "user2" + model.NewId() 1833 store.Must(ss.User().Save(u2)) 1834 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 1835 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)) 1836 1837 if _, err := ss.Channel().Save(&c1, -1); err != nil { 1838 t.Fatal("couldn't save item", err) 1839 } 1840 1841 m1 := model.ChannelMember{} 1842 m1.ChannelId = c1.Id 1843 m1.UserId = u1.Id 1844 m1.NotifyProps = model.GetDefaultChannelNotifyProps() 1845 1846 m2 := model.ChannelMember{} 1847 m2.ChannelId = c1.Id 1848 m2.UserId = u2.Id 1849 m2.NotifyProps = model.GetDefaultChannelNotifyProps() 1850 1851 store.Must(ss.Channel().SaveMember(&m1)) 1852 store.Must(ss.Channel().SaveMember(&m2)) 1853 1854 m1.ChannelId = c2.Id 1855 m2.ChannelId = c2.Id 1856 1857 if _, err := ss.Channel().SaveDirectChannel(&c2, &m1, &m2); err != nil { 1858 t.Fatal("couldn't save direct channel", err) 1859 } 1860 1861 p1 := model.Post{} 1862 p1.ChannelId = c1.Id 1863 p1.UserId = u1.Id 1864 p1.Message = "this is a message for @" + u2.Username 1865 1866 // Post one message with mention to open channel 1867 _, err := ss.Post().Save(&p1) 1868 require.Nil(t, err) 1869 err = ss.Channel().IncrementMentionCount(c1.Id, u2.Id) 1870 require.Nil(t, err) 1871 1872 // Post 2 messages without mention to direct channel 1873 p2 := model.Post{} 1874 p2.ChannelId = c2.Id 1875 p2.UserId = u1.Id 1876 p2.Message = "first message" 1877 1878 _, err = ss.Post().Save(&p2) 1879 require.Nil(t, err) 1880 err = ss.Channel().IncrementMentionCount(c2.Id, u2.Id) 1881 require.Nil(t, err) 1882 1883 p3 := model.Post{} 1884 p3.ChannelId = c2.Id 1885 p3.UserId = u1.Id 1886 p3.Message = "second message" 1887 _, err = ss.Post().Save(&p3) 1888 require.Nil(t, err) 1889 1890 err = ss.Channel().IncrementMentionCount(c2.Id, u2.Id) 1891 require.Nil(t, err) 1892 1893 badge, unreadCountErr := ss.User().GetUnreadCount(u2.Id) 1894 require.Nil(t, unreadCountErr) 1895 if badge != 3 { 1896 t.Fatal("should have 3 unread messages") 1897 } 1898 1899 badge = (<-ss.User().GetUnreadCountForChannel(u2.Id, c1.Id)).Data.(int64) 1900 if badge != 1 { 1901 t.Fatal("should have 1 unread messages for that channel") 1902 } 1903 1904 badge = (<-ss.User().GetUnreadCountForChannel(u2.Id, c2.Id)).Data.(int64) 1905 if badge != 2 { 1906 t.Fatal("should have 2 unread messages for that channel") 1907 } 1908 } 1909 1910 func testUserStoreUpdateMfaSecret(t *testing.T, ss store.Store) { 1911 u1 := model.User{} 1912 u1.Email = MakeEmail() 1913 store.Must(ss.User().Save(&u1)) 1914 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 1915 1916 time.Sleep(100 * time.Millisecond) 1917 1918 if err := (<-ss.User().UpdateMfaSecret(u1.Id, "12345")).Err; err != nil { 1919 t.Fatal(err) 1920 } 1921 1922 // should pass, no update will occur though 1923 if err := (<-ss.User().UpdateMfaSecret("junk", "12345")).Err; err != nil { 1924 t.Fatal(err) 1925 } 1926 } 1927 1928 func testUserStoreUpdateMfaActive(t *testing.T, ss store.Store) { 1929 u1 := model.User{} 1930 u1.Email = MakeEmail() 1931 store.Must(ss.User().Save(&u1)) 1932 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 1933 1934 time.Sleep(100 * time.Millisecond) 1935 1936 if err := (<-ss.User().UpdateMfaActive(u1.Id, true)).Err; err != nil { 1937 t.Fatal(err) 1938 } 1939 1940 if err := (<-ss.User().UpdateMfaActive(u1.Id, false)).Err; err != nil { 1941 t.Fatal(err) 1942 } 1943 1944 // should pass, no update will occur though 1945 if err := (<-ss.User().UpdateMfaActive("junk", true)).Err; err != nil { 1946 t.Fatal(err) 1947 } 1948 } 1949 1950 func testUserStoreGetRecentlyActiveUsersForTeam(t *testing.T, ss store.Store) { 1951 teamId := model.NewId() 1952 1953 u1 := store.Must(ss.User().Save(&model.User{ 1954 Email: MakeEmail(), 1955 Username: "u1" + model.NewId(), 1956 })).(*model.User) 1957 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 1958 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)) 1959 1960 u2 := store.Must(ss.User().Save(&model.User{ 1961 Email: MakeEmail(), 1962 Username: "u2" + model.NewId(), 1963 })).(*model.User) 1964 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 1965 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)) 1966 1967 u3 := store.Must(ss.User().Save(&model.User{ 1968 Email: MakeEmail(), 1969 Username: "u3" + model.NewId(), 1970 })).(*model.User) 1971 defer func() { require.Nil(t, ss.User().PermanentDelete(u3.Id)) }() 1972 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1)) 1973 _, err := ss.Bot().Save(&model.Bot{ 1974 UserId: u3.Id, 1975 Username: u3.Username, 1976 OwnerId: u1.Id, 1977 }) 1978 require.Nil(t, err) 1979 u3.IsBot = true 1980 defer func() { require.Nil(t, ss.Bot().PermanentDelete(u3.Id)) }() 1981 1982 millis := model.GetMillis() 1983 u3.LastActivityAt = millis 1984 u2.LastActivityAt = millis - 1 1985 u1.LastActivityAt = millis - 1 1986 1987 require.Nil(t, ss.Status().SaveOrUpdate(&model.Status{UserId: u1.Id, Status: model.STATUS_ONLINE, Manual: false, LastActivityAt: u1.LastActivityAt, ActiveChannel: ""})) 1988 require.Nil(t, ss.Status().SaveOrUpdate(&model.Status{UserId: u2.Id, Status: model.STATUS_ONLINE, Manual: false, LastActivityAt: u2.LastActivityAt, ActiveChannel: ""})) 1989 require.Nil(t, ss.Status().SaveOrUpdate(&model.Status{UserId: u3.Id, Status: model.STATUS_ONLINE, Manual: false, LastActivityAt: u3.LastActivityAt, ActiveChannel: ""})) 1990 1991 t.Run("get team 1, offset 0, limit 100", func(t *testing.T) { 1992 users, err := ss.User().GetRecentlyActiveUsersForTeam(teamId, 0, 100, nil) 1993 require.Nil(t, err) 1994 assert.Equal(t, []*model.User{ 1995 sanitized(u3), 1996 sanitized(u1), 1997 sanitized(u2), 1998 }, users) 1999 }) 2000 2001 t.Run("get team 1, offset 0, limit 1", func(t *testing.T) { 2002 users, err := ss.User().GetRecentlyActiveUsersForTeam(teamId, 0, 1, nil) 2003 require.Nil(t, err) 2004 assert.Equal(t, []*model.User{ 2005 sanitized(u3), 2006 }, users) 2007 }) 2008 2009 t.Run("get team 1, offset 2, limit 1", func(t *testing.T) { 2010 users, err := ss.User().GetRecentlyActiveUsersForTeam(teamId, 2, 1, nil) 2011 require.Nil(t, err) 2012 assert.Equal(t, []*model.User{ 2013 sanitized(u2), 2014 }, users) 2015 }) 2016 } 2017 2018 func testUserStoreGetNewUsersForTeam(t *testing.T, ss store.Store) { 2019 teamId := model.NewId() 2020 teamId2 := model.NewId() 2021 2022 u1 := store.Must(ss.User().Save(&model.User{ 2023 Email: MakeEmail(), 2024 Username: "u1" + model.NewId(), 2025 })).(*model.User) 2026 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 2027 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)) 2028 2029 u2 := store.Must(ss.User().Save(&model.User{ 2030 Email: MakeEmail(), 2031 Username: "u2" + model.NewId(), 2032 })).(*model.User) 2033 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 2034 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)) 2035 2036 u3 := store.Must(ss.User().Save(&model.User{ 2037 Email: MakeEmail(), 2038 Username: "u3" + model.NewId(), 2039 })).(*model.User) 2040 defer func() { require.Nil(t, ss.User().PermanentDelete(u3.Id)) }() 2041 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u3.Id}, -1)) 2042 _, err := ss.Bot().Save(&model.Bot{ 2043 UserId: u3.Id, 2044 Username: u3.Username, 2045 OwnerId: u1.Id, 2046 }) 2047 require.Nil(t, err) 2048 u3.IsBot = true 2049 defer func() { require.Nil(t, ss.Bot().PermanentDelete(u3.Id)) }() 2050 2051 u4 := store.Must(ss.User().Save(&model.User{ 2052 Email: MakeEmail(), 2053 Username: "u4" + model.NewId(), 2054 })).(*model.User) 2055 defer func() { require.Nil(t, ss.User().PermanentDelete(u4.Id)) }() 2056 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId2, UserId: u4.Id}, -1)) 2057 2058 t.Run("get team 1, offset 0, limit 100", func(t *testing.T) { 2059 result, err := ss.User().GetNewUsersForTeam(teamId, 0, 100, nil) 2060 require.Nil(t, err) 2061 assert.Equal(t, []*model.User{ 2062 sanitized(u3), 2063 sanitized(u2), 2064 sanitized(u1), 2065 }, result) 2066 }) 2067 2068 t.Run("get team 1, offset 0, limit 1", func(t *testing.T) { 2069 result, err := ss.User().GetNewUsersForTeam(teamId, 0, 1, nil) 2070 require.Nil(t, err) 2071 assert.Equal(t, []*model.User{ 2072 sanitized(u3), 2073 }, result) 2074 }) 2075 2076 t.Run("get team 1, offset 2, limit 1", func(t *testing.T) { 2077 result, err := ss.User().GetNewUsersForTeam(teamId, 2, 1, nil) 2078 require.Nil(t, err) 2079 assert.Equal(t, []*model.User{ 2080 sanitized(u1), 2081 }, result) 2082 }) 2083 2084 t.Run("get team 2, offset 0, limit 100", func(t *testing.T) { 2085 result, err := ss.User().GetNewUsersForTeam(teamId2, 0, 100, nil) 2086 require.Nil(t, err) 2087 assert.Equal(t, []*model.User{ 2088 sanitized(u4), 2089 }, result) 2090 }) 2091 } 2092 2093 func assertUsers(t *testing.T, expected, actual []*model.User) { 2094 expectedUsernames := make([]string, 0, len(expected)) 2095 for _, user := range expected { 2096 expectedUsernames = append(expectedUsernames, user.Username) 2097 } 2098 2099 actualUsernames := make([]string, 0, len(actual)) 2100 for _, user := range actual { 2101 actualUsernames = append(actualUsernames, user.Username) 2102 } 2103 2104 if assert.Equal(t, expectedUsernames, actualUsernames) { 2105 assert.Equal(t, expected, actual) 2106 } 2107 } 2108 2109 func assertUsersMatchInAnyOrder(t *testing.T, expected, actual []*model.User) { 2110 expectedUsernames := make([]string, 0, len(expected)) 2111 for _, user := range expected { 2112 expectedUsernames = append(expectedUsernames, user.Username) 2113 } 2114 2115 actualUsernames := make([]string, 0, len(actual)) 2116 for _, user := range actual { 2117 actualUsernames = append(actualUsernames, user.Username) 2118 } 2119 2120 if assert.ElementsMatch(t, expectedUsernames, actualUsernames) { 2121 assert.ElementsMatch(t, expected, actual) 2122 } 2123 } 2124 2125 func testUserStoreSearch(t *testing.T, ss store.Store) { 2126 u1 := &model.User{ 2127 Username: "jimbo1" + model.NewId(), 2128 FirstName: "Tim", 2129 LastName: "Bill", 2130 Nickname: "Rob", 2131 Email: "harold" + model.NewId() + "@simulator.amazonses.com", 2132 Roles: "system_user system_admin", 2133 } 2134 store.Must(ss.User().Save(u1)) 2135 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 2136 2137 u2 := &model.User{ 2138 Username: "jim-bobby" + model.NewId(), 2139 Email: MakeEmail(), 2140 Roles: "system_user", 2141 } 2142 store.Must(ss.User().Save(u2)) 2143 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 2144 2145 u3 := &model.User{ 2146 Username: "jimbo3" + model.NewId(), 2147 Email: MakeEmail(), 2148 DeleteAt: 1, 2149 Roles: "system_admin", 2150 } 2151 store.Must(ss.User().Save(u3)) 2152 defer func() { require.Nil(t, ss.User().PermanentDelete(u3.Id)) }() 2153 _, err := ss.Bot().Save(&model.Bot{ 2154 UserId: u3.Id, 2155 Username: u3.Username, 2156 OwnerId: u1.Id, 2157 }) 2158 require.Nil(t, err) 2159 u3.IsBot = true 2160 defer func() { require.Nil(t, ss.Bot().PermanentDelete(u3.Id)) }() 2161 2162 u5 := &model.User{ 2163 Username: "yu" + model.NewId(), 2164 FirstName: "En", 2165 LastName: "Yu", 2166 Nickname: "enyu", 2167 Email: MakeEmail(), 2168 } 2169 store.Must(ss.User().Save(u5)) 2170 defer func() { require.Nil(t, ss.User().PermanentDelete(u5.Id)) }() 2171 2172 u6 := &model.User{ 2173 Username: "underscore" + model.NewId(), 2174 FirstName: "Du_", 2175 LastName: "_DE", 2176 Nickname: "lodash", 2177 Email: MakeEmail(), 2178 } 2179 store.Must(ss.User().Save(u6)) 2180 defer func() { require.Nil(t, ss.User().PermanentDelete(u6.Id)) }() 2181 2182 tid := model.NewId() 2183 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u1.Id}, -1)) 2184 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u2.Id}, -1)) 2185 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u3.Id}, -1)) 2186 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u5.Id}, -1)) 2187 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u6.Id}, -1)) 2188 2189 // The users returned from the database will have AuthData as an empty string. 2190 nilAuthData := new(string) 2191 *nilAuthData = "" 2192 2193 u1.AuthData = nilAuthData 2194 u2.AuthData = nilAuthData 2195 u3.AuthData = nilAuthData 2196 u5.AuthData = nilAuthData 2197 u6.AuthData = nilAuthData 2198 2199 testCases := []struct { 2200 Description string 2201 TeamId string 2202 Term string 2203 Options *model.UserSearchOptions 2204 Expected []*model.User 2205 }{ 2206 { 2207 "search jimb", 2208 tid, 2209 "jimb", 2210 &model.UserSearchOptions{ 2211 AllowFullNames: true, 2212 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2213 }, 2214 []*model.User{u1}, 2215 }, 2216 { 2217 "search en", 2218 tid, 2219 "en", 2220 &model.UserSearchOptions{ 2221 AllowFullNames: true, 2222 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2223 }, 2224 []*model.User{u5}, 2225 }, 2226 { 2227 "search email", 2228 tid, 2229 u1.Email, 2230 &model.UserSearchOptions{ 2231 AllowEmails: true, 2232 AllowFullNames: true, 2233 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2234 }, 2235 []*model.User{u1}, 2236 }, 2237 { 2238 "search maps * to space", 2239 tid, 2240 "jimb*", 2241 &model.UserSearchOptions{ 2242 AllowFullNames: true, 2243 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2244 }, 2245 []*model.User{u1}, 2246 }, 2247 { 2248 "should not return spurious matches", 2249 tid, 2250 "harol", 2251 &model.UserSearchOptions{ 2252 AllowFullNames: true, 2253 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2254 }, 2255 []*model.User{}, 2256 }, 2257 { 2258 "% should be escaped", 2259 tid, 2260 "h%", 2261 &model.UserSearchOptions{ 2262 AllowFullNames: true, 2263 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2264 }, 2265 []*model.User{}, 2266 }, 2267 { 2268 "_ should be escaped", 2269 tid, 2270 "h_", 2271 &model.UserSearchOptions{ 2272 AllowFullNames: true, 2273 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2274 }, 2275 []*model.User{}, 2276 }, 2277 { 2278 "_ should be escaped (2)", 2279 tid, 2280 "Du_", 2281 &model.UserSearchOptions{ 2282 AllowFullNames: true, 2283 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2284 }, 2285 []*model.User{u6}, 2286 }, 2287 { 2288 "_ should be escaped (2)", 2289 tid, 2290 "_dE", 2291 &model.UserSearchOptions{ 2292 AllowFullNames: true, 2293 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2294 }, 2295 []*model.User{u6}, 2296 }, 2297 { 2298 "search jimb, allowing inactive", 2299 tid, 2300 "jimb", 2301 &model.UserSearchOptions{ 2302 AllowFullNames: true, 2303 AllowInactive: true, 2304 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2305 }, 2306 []*model.User{u1, u3}, 2307 }, 2308 { 2309 "search jimb, no team id", 2310 "", 2311 "jimb", 2312 &model.UserSearchOptions{ 2313 AllowFullNames: true, 2314 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2315 }, 2316 []*model.User{u1}, 2317 }, 2318 { 2319 "search jim-bobb, no team id", 2320 "", 2321 "jim-bobb", 2322 &model.UserSearchOptions{ 2323 AllowFullNames: true, 2324 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2325 }, 2326 []*model.User{u2}, 2327 }, 2328 2329 { 2330 "search harol, search all fields", 2331 tid, 2332 "harol", 2333 &model.UserSearchOptions{ 2334 AllowFullNames: true, 2335 AllowEmails: true, 2336 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2337 }, 2338 []*model.User{u1}, 2339 }, 2340 { 2341 "search Tim, search all fields", 2342 tid, 2343 "Tim", 2344 &model.UserSearchOptions{ 2345 AllowFullNames: true, 2346 AllowEmails: true, 2347 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2348 }, 2349 []*model.User{u1}, 2350 }, 2351 { 2352 "search Tim, don't search full names", 2353 tid, 2354 "Tim", 2355 &model.UserSearchOptions{ 2356 AllowFullNames: false, 2357 AllowEmails: true, 2358 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2359 }, 2360 []*model.User{}, 2361 }, 2362 { 2363 "search Bill, search all fields", 2364 tid, 2365 "Bill", 2366 &model.UserSearchOptions{ 2367 AllowFullNames: true, 2368 AllowEmails: true, 2369 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2370 }, 2371 []*model.User{u1}, 2372 }, 2373 { 2374 "search Rob, search all fields", 2375 tid, 2376 "Rob", 2377 &model.UserSearchOptions{ 2378 AllowFullNames: true, 2379 AllowEmails: true, 2380 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2381 }, 2382 []*model.User{u1}, 2383 }, 2384 { 2385 "leading @ should be ignored", 2386 tid, 2387 "@jimb", 2388 &model.UserSearchOptions{ 2389 AllowFullNames: true, 2390 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2391 }, 2392 []*model.User{u1}, 2393 }, 2394 { 2395 "search jim-bobby with system_user roles", 2396 tid, 2397 "jim-bobby", 2398 &model.UserSearchOptions{ 2399 AllowFullNames: true, 2400 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2401 Role: "system_user", 2402 }, 2403 []*model.User{u2}, 2404 }, 2405 { 2406 "search jim with system_admin roles", 2407 tid, 2408 "jim", 2409 &model.UserSearchOptions{ 2410 AllowFullNames: true, 2411 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2412 Role: "system_admin", 2413 }, 2414 []*model.User{u1}, 2415 }, 2416 { 2417 "search ji with system_user roles", 2418 tid, 2419 "ji", 2420 &model.UserSearchOptions{ 2421 AllowFullNames: true, 2422 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2423 Role: "system_user", 2424 }, 2425 []*model.User{u1, u2}, 2426 }, 2427 } 2428 2429 for _, testCase := range testCases { 2430 t.Run(testCase.Description, func(t *testing.T) { 2431 users, err := ss.User().Search(testCase.TeamId, testCase.Term, testCase.Options) 2432 require.Nil(t, err) 2433 assertUsersMatchInAnyOrder(t, testCase.Expected, users) 2434 }) 2435 } 2436 2437 t.Run("search empty string", func(t *testing.T) { 2438 searchOptions := &model.UserSearchOptions{ 2439 AllowFullNames: true, 2440 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2441 } 2442 2443 users, err := ss.User().Search(tid, "", searchOptions) 2444 require.Nil(t, err) 2445 assert.Len(t, users, 4) 2446 // Don't assert contents, since Postgres' default collation order is left up to 2447 // the operating system, and jimbo1 might sort before or after jim-bo. 2448 // assertUsers(t, []*model.User{u2, u1, u6, u5}, r1.Data.([]*model.User)) 2449 }) 2450 2451 t.Run("search empty string, limit 2", func(t *testing.T) { 2452 searchOptions := &model.UserSearchOptions{ 2453 AllowFullNames: true, 2454 Limit: 2, 2455 } 2456 2457 users, err := ss.User().Search(tid, "", searchOptions) 2458 require.Nil(t, err) 2459 assert.Len(t, users, 2) 2460 // Don't assert contents, since Postgres' default collation order is left up to 2461 // the operating system, and jimbo1 might sort before or after jim-bo. 2462 // assertUsers(t, []*model.User{u2, u1, u6, u5}, r1.Data.([]*model.User)) 2463 }) 2464 } 2465 2466 func testUserStoreSearchNotInChannel(t *testing.T, ss store.Store) { 2467 u1 := &model.User{ 2468 Username: "jimbo1" + model.NewId(), 2469 FirstName: "Tim", 2470 LastName: "Bill", 2471 Nickname: "Rob", 2472 Email: "harold" + model.NewId() + "@simulator.amazonses.com", 2473 } 2474 store.Must(ss.User().Save(u1)) 2475 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 2476 2477 u2 := &model.User{ 2478 Username: "jim2-bobby" + model.NewId(), 2479 Email: MakeEmail(), 2480 } 2481 store.Must(ss.User().Save(u2)) 2482 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 2483 2484 u3 := &model.User{ 2485 Username: "jimbo3" + model.NewId(), 2486 Email: MakeEmail(), 2487 DeleteAt: 1, 2488 } 2489 store.Must(ss.User().Save(u3)) 2490 defer func() { require.Nil(t, ss.User().PermanentDelete(u3.Id)) }() 2491 _, err := ss.Bot().Save(&model.Bot{ 2492 UserId: u3.Id, 2493 Username: u3.Username, 2494 OwnerId: u1.Id, 2495 }) 2496 require.Nil(t, err) 2497 u3.IsBot = true 2498 defer func() { require.Nil(t, ss.Bot().PermanentDelete(u3.Id)) }() 2499 2500 tid := model.NewId() 2501 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u1.Id}, -1)) 2502 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u2.Id}, -1)) 2503 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u3.Id}, -1)) 2504 2505 // The users returned from the database will have AuthData as an empty string. 2506 nilAuthData := new(string) 2507 *nilAuthData = "" 2508 2509 u1.AuthData = nilAuthData 2510 u2.AuthData = nilAuthData 2511 u3.AuthData = nilAuthData 2512 2513 ch1 := model.Channel{ 2514 TeamId: tid, 2515 DisplayName: "NameName", 2516 Name: "zz" + model.NewId() + "b", 2517 Type: model.CHANNEL_OPEN, 2518 } 2519 c1, err := ss.Channel().Save(&ch1, -1) 2520 require.Nil(t, err) 2521 2522 ch2 := model.Channel{ 2523 TeamId: tid, 2524 DisplayName: "NameName", 2525 Name: "zz" + model.NewId() + "b", 2526 Type: model.CHANNEL_OPEN, 2527 } 2528 c2, err := ss.Channel().Save(&ch2, -1) 2529 require.Nil(t, err) 2530 2531 store.Must(ss.Channel().SaveMember(&model.ChannelMember{ 2532 ChannelId: c2.Id, 2533 UserId: u1.Id, 2534 NotifyProps: model.GetDefaultChannelNotifyProps(), 2535 })) 2536 store.Must(ss.Channel().SaveMember(&model.ChannelMember{ 2537 ChannelId: c1.Id, 2538 UserId: u3.Id, 2539 NotifyProps: model.GetDefaultChannelNotifyProps(), 2540 })) 2541 store.Must(ss.Channel().SaveMember(&model.ChannelMember{ 2542 ChannelId: c2.Id, 2543 UserId: u2.Id, 2544 NotifyProps: model.GetDefaultChannelNotifyProps(), 2545 })) 2546 2547 testCases := []struct { 2548 Description string 2549 TeamId string 2550 ChannelId string 2551 Term string 2552 Options *model.UserSearchOptions 2553 Expected []*model.User 2554 }{ 2555 { 2556 "search jimb, channel 1", 2557 tid, 2558 c1.Id, 2559 "jimb", 2560 &model.UserSearchOptions{ 2561 AllowFullNames: true, 2562 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2563 }, 2564 []*model.User{u1}, 2565 }, 2566 { 2567 "search jimb, allow inactive, channel 1", 2568 tid, 2569 c1.Id, 2570 "jimb", 2571 &model.UserSearchOptions{ 2572 AllowFullNames: true, 2573 AllowInactive: true, 2574 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2575 }, 2576 []*model.User{u1}, 2577 }, 2578 { 2579 "search jimb, channel 1, no team id", 2580 "", 2581 c1.Id, 2582 "jimb", 2583 &model.UserSearchOptions{ 2584 AllowFullNames: true, 2585 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2586 }, 2587 []*model.User{u1}, 2588 }, 2589 { 2590 "search jimb, channel 1, junk team id", 2591 "junk", 2592 c1.Id, 2593 "jimb", 2594 &model.UserSearchOptions{ 2595 AllowFullNames: true, 2596 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2597 }, 2598 []*model.User{}, 2599 }, 2600 { 2601 "search jimb, channel 2", 2602 tid, 2603 c2.Id, 2604 "jimb", 2605 &model.UserSearchOptions{ 2606 AllowFullNames: true, 2607 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2608 }, 2609 []*model.User{}, 2610 }, 2611 { 2612 "search jimb, allow inactive, channel 2", 2613 tid, 2614 c2.Id, 2615 "jimb", 2616 &model.UserSearchOptions{ 2617 AllowFullNames: true, 2618 AllowInactive: true, 2619 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2620 }, 2621 []*model.User{u3}, 2622 }, 2623 { 2624 "search jimb, channel 2, no team id", 2625 "", 2626 c2.Id, 2627 "jimb", 2628 &model.UserSearchOptions{ 2629 AllowFullNames: true, 2630 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2631 }, 2632 []*model.User{}, 2633 }, 2634 { 2635 "search jimb, channel 2, junk team id", 2636 "junk", 2637 c2.Id, 2638 "jimb", 2639 &model.UserSearchOptions{ 2640 AllowFullNames: true, 2641 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2642 }, 2643 []*model.User{}, 2644 }, 2645 { 2646 "search jim, channel 1", 2647 tid, 2648 c1.Id, 2649 "jim", 2650 &model.UserSearchOptions{ 2651 AllowFullNames: true, 2652 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2653 }, 2654 []*model.User{u2, u1}, 2655 }, 2656 { 2657 "search jim, channel 1, limit 1", 2658 tid, 2659 c1.Id, 2660 "jim", 2661 &model.UserSearchOptions{ 2662 AllowFullNames: true, 2663 Limit: 1, 2664 }, 2665 []*model.User{u2}, 2666 }, 2667 } 2668 2669 for _, testCase := range testCases { 2670 t.Run(testCase.Description, func(t *testing.T) { 2671 result := <-ss.User().SearchNotInChannel( 2672 testCase.TeamId, 2673 testCase.ChannelId, 2674 testCase.Term, 2675 testCase.Options, 2676 ) 2677 require.Nil(t, result.Err) 2678 assertUsers(t, testCase.Expected, result.Data.([]*model.User)) 2679 }) 2680 } 2681 } 2682 2683 func testUserStoreSearchInChannel(t *testing.T, ss store.Store) { 2684 u1 := &model.User{ 2685 Username: "jimbo1" + model.NewId(), 2686 FirstName: "Tim", 2687 LastName: "Bill", 2688 Nickname: "Rob", 2689 Email: "harold" + model.NewId() + "@simulator.amazonses.com", 2690 } 2691 store.Must(ss.User().Save(u1)) 2692 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 2693 2694 u2 := &model.User{ 2695 Username: "jim-bobby" + model.NewId(), 2696 Email: MakeEmail(), 2697 } 2698 store.Must(ss.User().Save(u2)) 2699 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 2700 2701 u3 := &model.User{ 2702 Username: "jimbo3" + model.NewId(), 2703 Email: MakeEmail(), 2704 DeleteAt: 1, 2705 } 2706 store.Must(ss.User().Save(u3)) 2707 defer func() { require.Nil(t, ss.User().PermanentDelete(u3.Id)) }() 2708 _, err := ss.Bot().Save(&model.Bot{ 2709 UserId: u3.Id, 2710 Username: u3.Username, 2711 OwnerId: u1.Id, 2712 }) 2713 require.Nil(t, err) 2714 u3.IsBot = true 2715 defer func() { require.Nil(t, ss.Bot().PermanentDelete(u3.Id)) }() 2716 2717 tid := model.NewId() 2718 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u1.Id}, -1)) 2719 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u2.Id}, -1)) 2720 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u3.Id}, -1)) 2721 2722 // The users returned from the database will have AuthData as an empty string. 2723 nilAuthData := new(string) 2724 *nilAuthData = "" 2725 2726 u1.AuthData = nilAuthData 2727 u2.AuthData = nilAuthData 2728 u3.AuthData = nilAuthData 2729 2730 ch1 := model.Channel{ 2731 TeamId: tid, 2732 DisplayName: "NameName", 2733 Name: "zz" + model.NewId() + "b", 2734 Type: model.CHANNEL_OPEN, 2735 } 2736 c1, err := ss.Channel().Save(&ch1, -1) 2737 require.Nil(t, err) 2738 2739 ch2 := model.Channel{ 2740 TeamId: tid, 2741 DisplayName: "NameName", 2742 Name: "zz" + model.NewId() + "b", 2743 Type: model.CHANNEL_OPEN, 2744 } 2745 c2, err := ss.Channel().Save(&ch2, -1) 2746 require.Nil(t, err) 2747 2748 store.Must(ss.Channel().SaveMember(&model.ChannelMember{ 2749 ChannelId: c1.Id, 2750 UserId: u1.Id, 2751 NotifyProps: model.GetDefaultChannelNotifyProps(), 2752 })) 2753 store.Must(ss.Channel().SaveMember(&model.ChannelMember{ 2754 ChannelId: c2.Id, 2755 UserId: u2.Id, 2756 NotifyProps: model.GetDefaultChannelNotifyProps(), 2757 })) 2758 store.Must(ss.Channel().SaveMember(&model.ChannelMember{ 2759 ChannelId: c1.Id, 2760 UserId: u3.Id, 2761 NotifyProps: model.GetDefaultChannelNotifyProps(), 2762 })) 2763 2764 testCases := []struct { 2765 Description string 2766 ChannelId string 2767 Term string 2768 Options *model.UserSearchOptions 2769 Expected []*model.User 2770 }{ 2771 { 2772 "search jimb, channel 1", 2773 c1.Id, 2774 "jimb", 2775 &model.UserSearchOptions{ 2776 AllowFullNames: true, 2777 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2778 }, 2779 []*model.User{u1}, 2780 }, 2781 { 2782 "search jimb, allow inactive, channel 1", 2783 c1.Id, 2784 "jimb", 2785 &model.UserSearchOptions{ 2786 AllowFullNames: true, 2787 AllowInactive: true, 2788 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2789 }, 2790 []*model.User{u1, u3}, 2791 }, 2792 { 2793 "search jimb, allow inactive, channel 1, limit 1", 2794 c1.Id, 2795 "jimb", 2796 &model.UserSearchOptions{ 2797 AllowFullNames: true, 2798 AllowInactive: true, 2799 Limit: 1, 2800 }, 2801 []*model.User{u1}, 2802 }, 2803 { 2804 "search jimb, channel 2", 2805 c2.Id, 2806 "jimb", 2807 &model.UserSearchOptions{ 2808 AllowFullNames: true, 2809 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2810 }, 2811 []*model.User{}, 2812 }, 2813 { 2814 "search jimb, allow inactive, channel 2", 2815 c2.Id, 2816 "jimb", 2817 &model.UserSearchOptions{ 2818 AllowFullNames: true, 2819 AllowInactive: true, 2820 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2821 }, 2822 []*model.User{}, 2823 }, 2824 } 2825 2826 for _, testCase := range testCases { 2827 t.Run(testCase.Description, func(t *testing.T) { 2828 users, err := ss.User().SearchInChannel( 2829 testCase.ChannelId, 2830 testCase.Term, 2831 testCase.Options, 2832 ) 2833 require.Nil(t, err) 2834 assertUsers(t, testCase.Expected, users) 2835 }) 2836 } 2837 } 2838 2839 func testUserStoreSearchNotInTeam(t *testing.T, ss store.Store) { 2840 u1 := &model.User{ 2841 Username: "jimbo1" + model.NewId(), 2842 FirstName: "Tim", 2843 LastName: "Bill", 2844 Nickname: "Rob", 2845 Email: "harold" + model.NewId() + "@simulator.amazonses.com", 2846 } 2847 store.Must(ss.User().Save(u1)) 2848 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 2849 2850 u2 := &model.User{ 2851 Username: "jim-bobby" + model.NewId(), 2852 Email: MakeEmail(), 2853 } 2854 store.Must(ss.User().Save(u2)) 2855 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 2856 2857 u3 := &model.User{ 2858 Username: "jimbo3" + model.NewId(), 2859 Email: MakeEmail(), 2860 DeleteAt: 1, 2861 } 2862 store.Must(ss.User().Save(u3)) 2863 defer func() { require.Nil(t, ss.User().PermanentDelete(u3.Id)) }() 2864 _, err := ss.Bot().Save(&model.Bot{ 2865 UserId: u3.Id, 2866 Username: u3.Username, 2867 OwnerId: u1.Id, 2868 }) 2869 require.Nil(t, err) 2870 u3.IsBot = true 2871 defer func() { require.Nil(t, ss.Bot().PermanentDelete(u3.Id)) }() 2872 2873 u4 := &model.User{ 2874 Username: "simon" + model.NewId(), 2875 Email: MakeEmail(), 2876 DeleteAt: 0, 2877 } 2878 store.Must(ss.User().Save(u4)) 2879 defer func() { require.Nil(t, ss.User().PermanentDelete(u4.Id)) }() 2880 2881 u5 := &model.User{ 2882 Username: "yu" + model.NewId(), 2883 FirstName: "En", 2884 LastName: "Yu", 2885 Nickname: "enyu", 2886 Email: MakeEmail(), 2887 } 2888 store.Must(ss.User().Save(u5)) 2889 defer func() { require.Nil(t, ss.User().PermanentDelete(u5.Id)) }() 2890 2891 u6 := &model.User{ 2892 Username: "underscore" + model.NewId(), 2893 FirstName: "Du_", 2894 LastName: "_DE", 2895 Nickname: "lodash", 2896 Email: MakeEmail(), 2897 } 2898 store.Must(ss.User().Save(u6)) 2899 defer func() { require.Nil(t, ss.User().PermanentDelete(u6.Id)) }() 2900 2901 teamId1 := model.NewId() 2902 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId1, UserId: u1.Id}, -1)) 2903 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId1, UserId: u2.Id}, -1)) 2904 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId1, UserId: u3.Id}, -1)) 2905 // u4 is not in team 1 2906 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId1, UserId: u5.Id}, -1)) 2907 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId1, UserId: u6.Id}, -1)) 2908 2909 teamId2 := model.NewId() 2910 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId2, UserId: u4.Id}, -1)) 2911 2912 // The users returned from the database will have AuthData as an empty string. 2913 nilAuthData := new(string) 2914 *nilAuthData = "" 2915 2916 u1.AuthData = nilAuthData 2917 u2.AuthData = nilAuthData 2918 u3.AuthData = nilAuthData 2919 u4.AuthData = nilAuthData 2920 u5.AuthData = nilAuthData 2921 u6.AuthData = nilAuthData 2922 2923 testCases := []struct { 2924 Description string 2925 TeamId string 2926 Term string 2927 Options *model.UserSearchOptions 2928 Expected []*model.User 2929 }{ 2930 { 2931 "search simo, team 1", 2932 teamId1, 2933 "simo", 2934 &model.UserSearchOptions{ 2935 AllowFullNames: true, 2936 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2937 }, 2938 []*model.User{u4}, 2939 }, 2940 2941 { 2942 "search jimb, team 1", 2943 teamId1, 2944 "jimb", 2945 &model.UserSearchOptions{ 2946 AllowFullNames: true, 2947 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2948 }, 2949 []*model.User{}, 2950 }, 2951 { 2952 "search jimb, allow inactive, team 1", 2953 teamId1, 2954 "jimb", 2955 &model.UserSearchOptions{ 2956 AllowFullNames: true, 2957 AllowInactive: true, 2958 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2959 }, 2960 []*model.User{}, 2961 }, 2962 { 2963 "search simo, team 2", 2964 teamId2, 2965 "simo", 2966 &model.UserSearchOptions{ 2967 AllowFullNames: true, 2968 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2969 }, 2970 []*model.User{}, 2971 }, 2972 { 2973 "search jimb, team2", 2974 teamId2, 2975 "jimb", 2976 &model.UserSearchOptions{ 2977 AllowFullNames: true, 2978 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2979 }, 2980 []*model.User{u1}, 2981 }, 2982 { 2983 "search jimb, allow inactive, team 2", 2984 teamId2, 2985 "jimb", 2986 &model.UserSearchOptions{ 2987 AllowFullNames: true, 2988 AllowInactive: true, 2989 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 2990 }, 2991 []*model.User{u1, u3}, 2992 }, 2993 { 2994 "search jimb, allow inactive, team 2, limit 1", 2995 teamId2, 2996 "jimb", 2997 &model.UserSearchOptions{ 2998 AllowFullNames: true, 2999 AllowInactive: true, 3000 Limit: 1, 3001 }, 3002 []*model.User{u1}, 3003 }, 3004 } 3005 3006 for _, testCase := range testCases { 3007 t.Run(testCase.Description, func(t *testing.T) { 3008 users, err := ss.User().SearchNotInTeam( 3009 testCase.TeamId, 3010 testCase.Term, 3011 testCase.Options, 3012 ) 3013 require.Nil(t, err) 3014 assertUsers(t, testCase.Expected, users) 3015 }) 3016 } 3017 } 3018 3019 func testUserStoreSearchWithoutTeam(t *testing.T, ss store.Store) { 3020 u1 := &model.User{ 3021 Username: "jimbo1" + model.NewId(), 3022 FirstName: "Tim", 3023 LastName: "Bill", 3024 Nickname: "Rob", 3025 Email: "harold" + model.NewId() + "@simulator.amazonses.com", 3026 } 3027 store.Must(ss.User().Save(u1)) 3028 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 3029 3030 u2 := &model.User{ 3031 Username: "jim2-bobby" + model.NewId(), 3032 Email: MakeEmail(), 3033 } 3034 store.Must(ss.User().Save(u2)) 3035 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 3036 3037 u3 := &model.User{ 3038 Username: "jimbo3" + model.NewId(), 3039 Email: MakeEmail(), 3040 DeleteAt: 1, 3041 } 3042 store.Must(ss.User().Save(u3)) 3043 defer func() { require.Nil(t, ss.User().PermanentDelete(u3.Id)) }() 3044 _, err := ss.Bot().Save(&model.Bot{ 3045 UserId: u3.Id, 3046 Username: u3.Username, 3047 OwnerId: u1.Id, 3048 }) 3049 require.Nil(t, err) 3050 u3.IsBot = true 3051 defer func() { require.Nil(t, ss.Bot().PermanentDelete(u3.Id)) }() 3052 3053 tid := model.NewId() 3054 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: tid, UserId: u3.Id}, -1)) 3055 3056 // The users returned from the database will have AuthData as an empty string. 3057 nilAuthData := new(string) 3058 *nilAuthData = "" 3059 3060 u1.AuthData = nilAuthData 3061 u2.AuthData = nilAuthData 3062 u3.AuthData = nilAuthData 3063 3064 testCases := []struct { 3065 Description string 3066 Term string 3067 Options *model.UserSearchOptions 3068 Expected []*model.User 3069 }{ 3070 { 3071 "empty string", 3072 "", 3073 &model.UserSearchOptions{ 3074 AllowFullNames: true, 3075 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3076 }, 3077 []*model.User{u2, u1}, 3078 }, 3079 { 3080 "jim", 3081 "jim", 3082 &model.UserSearchOptions{ 3083 AllowFullNames: true, 3084 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3085 }, 3086 []*model.User{u2, u1}, 3087 }, 3088 { 3089 "PLT-8354", 3090 "* ", 3091 &model.UserSearchOptions{ 3092 AllowFullNames: true, 3093 Limit: model.USER_SEARCH_DEFAULT_LIMIT, 3094 }, 3095 []*model.User{u2, u1}, 3096 }, 3097 { 3098 "jim, limit 1", 3099 "jim", 3100 &model.UserSearchOptions{ 3101 AllowFullNames: true, 3102 Limit: 1, 3103 }, 3104 []*model.User{u2}, 3105 }, 3106 } 3107 3108 for _, testCase := range testCases { 3109 t.Run(testCase.Description, func(t *testing.T) { 3110 users, err := ss.User().SearchWithoutTeam( 3111 testCase.Term, 3112 testCase.Options, 3113 ) 3114 require.Nil(t, err) 3115 assertUsers(t, testCase.Expected, users) 3116 }) 3117 } 3118 } 3119 3120 func testCount(t *testing.T, ss store.Store) { 3121 // Regular 3122 teamId := model.NewId() 3123 u1 := &model.User{} 3124 u1.Email = MakeEmail() 3125 store.Must(ss.User().Save(u1)) 3126 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 3127 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)) 3128 3129 // Deleted 3130 u2 := &model.User{} 3131 u2.Email = MakeEmail() 3132 u2.DeleteAt = model.GetMillis() 3133 store.Must(ss.User().Save(u2)) 3134 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 3135 3136 // Bot 3137 u3 := store.Must(ss.User().Save(&model.User{ 3138 Email: MakeEmail(), 3139 })).(*model.User) 3140 defer func() { require.Nil(t, ss.User().PermanentDelete(u3.Id)) }() 3141 _, err := ss.Bot().Save(&model.Bot{ 3142 UserId: u3.Id, 3143 Username: u3.Username, 3144 OwnerId: u1.Id, 3145 }) 3146 require.Nil(t, err) 3147 u3.IsBot = true 3148 defer func() { require.Nil(t, ss.Bot().PermanentDelete(u3.Id)) }() 3149 3150 count, err := ss.User().Count(model.UserCountOptions{ 3151 IncludeBotAccounts: false, 3152 IncludeDeleted: false, 3153 TeamId: "", 3154 }) 3155 require.Nil(t, err) 3156 require.Equal(t, int64(1), count) 3157 3158 count, err = ss.User().Count(model.UserCountOptions{ 3159 IncludeBotAccounts: true, 3160 IncludeDeleted: false, 3161 TeamId: "", 3162 }) 3163 require.Nil(t, err) 3164 require.Equal(t, int64(2), count) 3165 3166 count, err = ss.User().Count(model.UserCountOptions{ 3167 IncludeBotAccounts: false, 3168 IncludeDeleted: true, 3169 TeamId: "", 3170 }) 3171 require.Nil(t, err) 3172 require.Equal(t, int64(2), count) 3173 3174 count, err = ss.User().Count(model.UserCountOptions{ 3175 IncludeBotAccounts: true, 3176 IncludeDeleted: true, 3177 TeamId: "", 3178 }) 3179 require.Nil(t, err) 3180 require.Equal(t, int64(3), count) 3181 3182 count, err = ss.User().Count(model.UserCountOptions{ 3183 IncludeBotAccounts: true, 3184 IncludeDeleted: true, 3185 ExcludeRegularUsers: true, 3186 TeamId: "", 3187 }) 3188 require.Nil(t, err) 3189 require.Equal(t, int64(1), count) 3190 3191 count, err = ss.User().Count(model.UserCountOptions{ 3192 IncludeBotAccounts: true, 3193 IncludeDeleted: true, 3194 TeamId: teamId, 3195 }) 3196 require.Nil(t, err) 3197 require.Equal(t, int64(1), count) 3198 3199 count, err = ss.User().Count(model.UserCountOptions{ 3200 IncludeBotAccounts: true, 3201 IncludeDeleted: true, 3202 TeamId: model.NewId(), 3203 }) 3204 require.Nil(t, err) 3205 require.Equal(t, int64(0), count) 3206 3207 count, err = ss.User().Count(model.UserCountOptions{ 3208 IncludeBotAccounts: true, 3209 IncludeDeleted: true, 3210 TeamId: teamId, 3211 ViewRestrictions: &model.ViewUsersRestrictions{Teams: []string{teamId}}, 3212 }) 3213 require.Nil(t, err) 3214 require.Equal(t, int64(1), count) 3215 3216 count, err = ss.User().Count(model.UserCountOptions{ 3217 IncludeBotAccounts: true, 3218 IncludeDeleted: true, 3219 TeamId: teamId, 3220 ViewRestrictions: &model.ViewUsersRestrictions{Teams: []string{model.NewId()}}, 3221 }) 3222 require.Nil(t, err) 3223 require.Equal(t, int64(0), count) 3224 } 3225 3226 func testUserStoreAnalyticsGetInactiveUsersCount(t *testing.T, ss store.Store) { 3227 u1 := &model.User{} 3228 u1.Email = MakeEmail() 3229 store.Must(ss.User().Save(u1)) 3230 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 3231 3232 count, err := ss.User().AnalyticsGetInactiveUsersCount() 3233 if err != nil { 3234 t.Fatal(err) 3235 } 3236 3237 u2 := &model.User{} 3238 u2.Email = MakeEmail() 3239 u2.DeleteAt = model.GetMillis() 3240 store.Must(ss.User().Save(u2)) 3241 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 3242 3243 newCount, err := ss.User().AnalyticsGetInactiveUsersCount() 3244 if err != nil { 3245 t.Fatal(err) 3246 } 3247 3248 if count != newCount-1 { 3249 t.Fatal("Expected 1 more inactive users but found otherwise.", count, newCount) 3250 } 3251 } 3252 3253 func testUserStoreAnalyticsGetSystemAdminCount(t *testing.T, ss store.Store) { 3254 var countBefore int64 3255 if result := <-ss.User().AnalyticsGetSystemAdminCount(); result.Err != nil { 3256 t.Fatal(result.Err) 3257 } else { 3258 countBefore = result.Data.(int64) 3259 } 3260 3261 u1 := model.User{} 3262 u1.Email = MakeEmail() 3263 u1.Username = model.NewId() 3264 u1.Roles = "system_user system_admin" 3265 3266 u2 := model.User{} 3267 u2.Email = MakeEmail() 3268 u2.Username = model.NewId() 3269 3270 if err := (<-ss.User().Save(&u1)).Err; err != nil { 3271 t.Fatal("couldn't save user", err) 3272 } 3273 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 3274 3275 if err := (<-ss.User().Save(&u2)).Err; err != nil { 3276 t.Fatal("couldn't save user", err) 3277 } 3278 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 3279 3280 if result := <-ss.User().AnalyticsGetSystemAdminCount(); result.Err != nil { 3281 t.Fatal(result.Err) 3282 } else { 3283 // We expect to find 1 more system admin than there was at the start of this test function. 3284 if count := result.Data.(int64); count != countBefore+1 { 3285 t.Fatal("Did not get the expected number of system admins. Expected, got: ", countBefore+1, count) 3286 } 3287 } 3288 } 3289 3290 func testUserStoreGetProfilesNotInTeam(t *testing.T, ss store.Store) { 3291 team, err := ss.Team().Save(&model.Team{ 3292 DisplayName: "Team", 3293 Name: model.NewId(), 3294 Type: model.TEAM_OPEN, 3295 }) 3296 require.Nil(t, err) 3297 3298 teamId := team.Id 3299 teamId2 := model.NewId() 3300 3301 u1 := store.Must(ss.User().Save(&model.User{ 3302 Email: MakeEmail(), 3303 Username: "u1" + model.NewId(), 3304 })).(*model.User) 3305 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 3306 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u1.Id}, -1)) 3307 3308 // Ensure update at timestamp changes 3309 time.Sleep(time.Millisecond * 10) 3310 3311 u2 := store.Must(ss.User().Save(&model.User{ 3312 Email: MakeEmail(), 3313 Username: "u2" + model.NewId(), 3314 })).(*model.User) 3315 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 3316 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId2, UserId: u2.Id}, -1)) 3317 3318 // Ensure update at timestamp changes 3319 time.Sleep(time.Millisecond * 10) 3320 3321 u3 := store.Must(ss.User().Save(&model.User{ 3322 Email: MakeEmail(), 3323 Username: "u3" + model.NewId(), 3324 })).(*model.User) 3325 defer func() { require.Nil(t, ss.User().PermanentDelete(u3.Id)) }() 3326 _, err = ss.Bot().Save(&model.Bot{ 3327 UserId: u3.Id, 3328 Username: u3.Username, 3329 OwnerId: u1.Id, 3330 }) 3331 require.Nil(t, err) 3332 u3.IsBot = true 3333 defer func() { require.Nil(t, ss.Bot().PermanentDelete(u3.Id)) }() 3334 3335 var etag1, etag2, etag3 string 3336 3337 t.Run("etag for profiles not in team 1", func(t *testing.T) { 3338 result := <-ss.User().GetEtagForProfilesNotInTeam(teamId) 3339 require.Nil(t, result.Err) 3340 etag1 = result.Data.(string) 3341 }) 3342 3343 t.Run("get not in team 1, offset 0, limit 100000", func(t *testing.T) { 3344 result := <-ss.User().GetProfilesNotInTeam(teamId, false, 0, 100000, nil) 3345 require.Nil(t, result.Err) 3346 assert.Equal(t, []*model.User{ 3347 sanitized(u2), 3348 sanitized(u3), 3349 }, result.Data.([]*model.User)) 3350 }) 3351 3352 t.Run("get not in team 1, offset 1, limit 1", func(t *testing.T) { 3353 result := <-ss.User().GetProfilesNotInTeam(teamId, false, 1, 1, nil) 3354 require.Nil(t, result.Err) 3355 assert.Equal(t, []*model.User{ 3356 sanitized(u3), 3357 }, result.Data.([]*model.User)) 3358 }) 3359 3360 t.Run("get not in team 2, offset 0, limit 100", func(t *testing.T) { 3361 result := <-ss.User().GetProfilesNotInTeam(teamId2, false, 0, 100, nil) 3362 require.Nil(t, result.Err) 3363 assert.Equal(t, []*model.User{ 3364 sanitized(u1), 3365 sanitized(u3), 3366 }, result.Data.([]*model.User)) 3367 }) 3368 3369 // Ensure update at timestamp changes 3370 time.Sleep(time.Millisecond * 10) 3371 3372 // Add u2 to team 1 3373 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u2.Id}, -1)) 3374 u2.UpdateAt = store.Must(ss.User().UpdateUpdateAt(u2.Id)).(int64) 3375 3376 t.Run("etag for profiles not in team 1 after update", func(t *testing.T) { 3377 result := <-ss.User().GetEtagForProfilesNotInTeam(teamId) 3378 require.Nil(t, result.Err) 3379 etag2 = result.Data.(string) 3380 require.NotEqual(t, etag2, etag1, "etag should have changed") 3381 }) 3382 3383 t.Run("get not in team 1, offset 0, limit 100000 after update", func(t *testing.T) { 3384 result := <-ss.User().GetProfilesNotInTeam(teamId, false, 0, 100000, nil) 3385 require.Nil(t, result.Err) 3386 assert.Equal(t, []*model.User{ 3387 sanitized(u3), 3388 }, result.Data.([]*model.User)) 3389 }) 3390 3391 // Ensure update at timestamp changes 3392 time.Sleep(time.Millisecond * 10) 3393 3394 store.Must(ss.Team().RemoveMember(teamId, u1.Id)) 3395 store.Must(ss.Team().RemoveMember(teamId, u2.Id)) 3396 u1.UpdateAt = store.Must(ss.User().UpdateUpdateAt(u1.Id)).(int64) 3397 u2.UpdateAt = store.Must(ss.User().UpdateUpdateAt(u2.Id)).(int64) 3398 3399 t.Run("etag for profiles not in team 1 after second update", func(t *testing.T) { 3400 result := <-ss.User().GetEtagForProfilesNotInTeam(teamId) 3401 require.Nil(t, result.Err) 3402 etag3 = result.Data.(string) 3403 require.NotEqual(t, etag1, etag3, "etag should have changed") 3404 require.NotEqual(t, etag2, etag3, "etag should have changed") 3405 }) 3406 3407 t.Run("get not in team 1, offset 0, limit 100000 after second update", func(t *testing.T) { 3408 result := <-ss.User().GetProfilesNotInTeam(teamId, false, 0, 100000, nil) 3409 require.Nil(t, result.Err) 3410 assert.Equal(t, []*model.User{ 3411 sanitized(u1), 3412 sanitized(u2), 3413 sanitized(u3), 3414 }, result.Data.([]*model.User)) 3415 }) 3416 3417 // Ensure update at timestamp changes 3418 time.Sleep(time.Millisecond * 10) 3419 3420 u4 := store.Must(ss.User().Save(&model.User{ 3421 Email: MakeEmail(), 3422 Username: "u4" + model.NewId(), 3423 })).(*model.User) 3424 defer func() { require.Nil(t, ss.User().PermanentDelete(u4.Id)) }() 3425 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId, UserId: u4.Id}, -1)) 3426 3427 t.Run("etag for profiles not in team 1 after addition to team", func(t *testing.T) { 3428 result := <-ss.User().GetEtagForProfilesNotInTeam(teamId) 3429 require.Nil(t, result.Err) 3430 etag4 := result.Data.(string) 3431 require.Equal(t, etag3, etag4, "etag should not have changed") 3432 }) 3433 3434 // Add u3 to team 2 3435 store.Must(ss.Team().SaveMember(&model.TeamMember{TeamId: teamId2, UserId: u3.Id}, -1)) 3436 u3.UpdateAt = store.Must(ss.User().UpdateUpdateAt(u3.Id)).(int64) 3437 3438 // GetEtagForProfilesNotInTeam produces a new etag every time a member, not 3439 // in the team, gets a new UpdateAt value. In the case that an older member 3440 // in the set joins a different team, their UpdateAt value changes, thus 3441 // creating a new etag (even though the user set doesn't change). A hashing 3442 // solution, which only uses UserIds, would solve this issue. 3443 t.Run("etag for profiles not in team 1 after u3 added to team 2", func(t *testing.T) { 3444 t.Skip() 3445 result := <-ss.User().GetEtagForProfilesNotInTeam(teamId) 3446 require.Nil(t, result.Err) 3447 etag4 := result.Data.(string) 3448 require.Equal(t, etag3, etag4, "etag should not have changed") 3449 }) 3450 3451 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) { 3452 result := <-ss.User().GetProfilesNotInTeam(teamId, true, 0, 100000, nil) 3453 require.Nil(t, result.Err) 3454 assert.Empty(t, result.Data.([]*model.User)) 3455 }) 3456 3457 // create a group 3458 group := store.Must(ss.Group().Create(&model.Group{ 3459 Name: "n_" + model.NewId(), 3460 DisplayName: "dn_" + model.NewId(), 3461 Source: model.GroupSourceLdap, 3462 RemoteId: "ri_" + model.NewId(), 3463 })).(*model.Group) 3464 3465 // add two members to the group 3466 for _, u := range []*model.User{u1, u2} { 3467 res := <-ss.Group().UpsertMember(group.Id, u.Id) 3468 require.Nil(t, res.Err) 3469 } 3470 3471 // associate the group with the team 3472 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 3473 GroupId: group.Id, 3474 SyncableId: teamId, 3475 Type: model.GroupSyncableTypeTeam, 3476 }) 3477 require.Nil(t, err) 3478 3479 t.Run("get not in team 1, offset 0, limit 100000 after second update, setting group constrained", func(t *testing.T) { 3480 result := <-ss.User().GetProfilesNotInTeam(teamId, true, 0, 100000, nil) 3481 require.Nil(t, result.Err) 3482 assert.Equal(t, []*model.User{ 3483 sanitized(u1), 3484 sanitized(u2), 3485 }, result.Data.([]*model.User)) 3486 }) 3487 } 3488 3489 func testUserStoreClearAllCustomRoleAssignments(t *testing.T, ss store.Store) { 3490 u1 := model.User{ 3491 Email: MakeEmail(), 3492 Username: model.NewId(), 3493 Roles: "system_user system_admin system_post_all", 3494 } 3495 u2 := model.User{ 3496 Email: MakeEmail(), 3497 Username: model.NewId(), 3498 Roles: "system_user custom_role system_admin another_custom_role", 3499 } 3500 u3 := model.User{ 3501 Email: MakeEmail(), 3502 Username: model.NewId(), 3503 Roles: "system_user", 3504 } 3505 u4 := model.User{ 3506 Email: MakeEmail(), 3507 Username: model.NewId(), 3508 Roles: "custom_only", 3509 } 3510 3511 store.Must(ss.User().Save(&u1)) 3512 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 3513 store.Must(ss.User().Save(&u2)) 3514 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 3515 store.Must(ss.User().Save(&u3)) 3516 defer func() { require.Nil(t, ss.User().PermanentDelete(u3.Id)) }() 3517 store.Must(ss.User().Save(&u4)) 3518 defer func() { require.Nil(t, ss.User().PermanentDelete(u4.Id)) }() 3519 3520 require.Nil(t, (<-ss.User().ClearAllCustomRoleAssignments()).Err) 3521 3522 r1 := <-ss.User().GetByUsername(u1.Username) 3523 require.Nil(t, r1.Err) 3524 assert.Equal(t, u1.Roles, r1.Data.(*model.User).Roles) 3525 3526 r2 := <-ss.User().GetByUsername(u2.Username) 3527 require.Nil(t, r2.Err) 3528 assert.Equal(t, "system_user system_admin", r2.Data.(*model.User).Roles) 3529 3530 r3 := <-ss.User().GetByUsername(u3.Username) 3531 require.Nil(t, r3.Err) 3532 assert.Equal(t, u3.Roles, r3.Data.(*model.User).Roles) 3533 3534 r4 := <-ss.User().GetByUsername(u4.Username) 3535 require.Nil(t, r4.Err) 3536 assert.Equal(t, "", r4.Data.(*model.User).Roles) 3537 } 3538 3539 func testUserStoreGetAllAfter(t *testing.T, ss store.Store) { 3540 u1 := store.Must(ss.User().Save(&model.User{ 3541 Email: MakeEmail(), 3542 Username: model.NewId(), 3543 Roles: "system_user system_admin system_post_all", 3544 })).(*model.User) 3545 defer func() { require.Nil(t, ss.User().PermanentDelete(u1.Id)) }() 3546 3547 u2 := store.Must(ss.User().Save(&model.User{ 3548 Email: MakeEmail(), 3549 Username: "u2" + model.NewId(), 3550 })).(*model.User) 3551 defer func() { require.Nil(t, ss.User().PermanentDelete(u2.Id)) }() 3552 _, err := ss.Bot().Save(&model.Bot{ 3553 UserId: u2.Id, 3554 Username: u2.Username, 3555 OwnerId: u1.Id, 3556 }) 3557 require.Nil(t, err) 3558 u2.IsBot = true 3559 defer func() { require.Nil(t, ss.Bot().PermanentDelete(u2.Id)) }() 3560 3561 expected := []*model.User{u1, u2} 3562 if strings.Compare(u2.Id, u1.Id) < 0 { 3563 expected = []*model.User{u2, u1} 3564 } 3565 3566 t.Run("get after lowest possible id", func(t *testing.T) { 3567 actual, err := ss.User().GetAllAfter(10000, strings.Repeat("0", 26)) 3568 require.Nil(t, err) 3569 3570 assert.Equal(t, expected, actual) 3571 }) 3572 3573 t.Run("get after first user", func(t *testing.T) { 3574 actual, err := ss.User().GetAllAfter(10000, expected[0].Id) 3575 require.Nil(t, err) 3576 3577 assert.Equal(t, []*model.User{expected[1]}, actual) 3578 }) 3579 3580 t.Run("get after second user", func(t *testing.T) { 3581 actual, err := ss.User().GetAllAfter(10000, expected[1].Id) 3582 require.Nil(t, err) 3583 3584 assert.Equal(t, []*model.User{}, actual) 3585 }) 3586 } 3587 3588 func testUserStoreGetUsersBatchForIndexing(t *testing.T, ss store.Store) { 3589 // Set up all the objects needed 3590 t1, err := ss.Team().Save(&model.Team{ 3591 DisplayName: "Team1", 3592 Name: model.NewId(), 3593 Type: model.TEAM_OPEN, 3594 }) 3595 require.Nil(t, err) 3596 3597 ch1 := &model.Channel{ 3598 Name: model.NewId(), 3599 Type: model.CHANNEL_OPEN, 3600 } 3601 cPub1, err := ss.Channel().Save(ch1, -1) 3602 require.Nil(t, err) 3603 3604 ch2 := &model.Channel{ 3605 Name: model.NewId(), 3606 Type: model.CHANNEL_OPEN, 3607 } 3608 cPub2, err := ss.Channel().Save(ch2, -1) 3609 require.Nil(t, err) 3610 3611 ch3 := &model.Channel{ 3612 Name: model.NewId(), 3613 Type: model.CHANNEL_PRIVATE, 3614 } 3615 3616 cPriv, err := ss.Channel().Save(ch3, -1) 3617 require.Nil(t, err) 3618 3619 u1 := store.Must(ss.User().Save(&model.User{ 3620 Email: MakeEmail(), 3621 Username: model.NewId(), 3622 CreateAt: model.GetMillis(), 3623 })).(*model.User) 3624 3625 time.Sleep(10 * time.Millisecond) 3626 3627 u2 := store.Must(ss.User().Save(&model.User{ 3628 Email: MakeEmail(), 3629 Username: model.NewId(), 3630 CreateAt: model.GetMillis(), 3631 })).(*model.User) 3632 store.Must(ss.Team().SaveMember(&model.TeamMember{ 3633 UserId: u2.Id, 3634 TeamId: t1.Id, 3635 }, 100)) 3636 store.Must(ss.Channel().SaveMember(&model.ChannelMember{ 3637 UserId: u2.Id, 3638 ChannelId: cPub1.Id, 3639 NotifyProps: model.GetDefaultChannelNotifyProps(), 3640 })) 3641 store.Must(ss.Channel().SaveMember(&model.ChannelMember{ 3642 UserId: u2.Id, 3643 ChannelId: cPub2.Id, 3644 NotifyProps: model.GetDefaultChannelNotifyProps(), 3645 })) 3646 3647 startTime := u2.CreateAt 3648 time.Sleep(10 * time.Millisecond) 3649 3650 u3 := store.Must(ss.User().Save(&model.User{ 3651 Email: MakeEmail(), 3652 Username: model.NewId(), 3653 CreateAt: model.GetMillis(), 3654 })).(*model.User) 3655 store.Must(ss.Team().SaveMember(&model.TeamMember{ 3656 UserId: u3.Id, 3657 TeamId: t1.Id, 3658 DeleteAt: model.GetMillis(), 3659 }, 100)) 3660 store.Must(ss.Channel().SaveMember(&model.ChannelMember{ 3661 UserId: u3.Id, 3662 ChannelId: cPub2.Id, 3663 NotifyProps: model.GetDefaultChannelNotifyProps(), 3664 })) 3665 store.Must(ss.Channel().SaveMember(&model.ChannelMember{ 3666 UserId: u3.Id, 3667 ChannelId: cPriv.Id, 3668 NotifyProps: model.GetDefaultChannelNotifyProps(), 3669 })) 3670 3671 endTime := u3.CreateAt 3672 3673 // First and last user should be outside the range 3674 res1List, err := ss.User().GetUsersBatchForIndexing(startTime, endTime, 100) 3675 assert.Nil(t, err) 3676 3677 assert.Len(t, res1List, 1) 3678 assert.Equal(t, res1List[0].Username, u2.Username) 3679 assert.ElementsMatch(t, res1List[0].TeamsIds, []string{t1.Id}) 3680 assert.ElementsMatch(t, res1List[0].ChannelsIds, []string{cPub1.Id, cPub2.Id}) 3681 3682 // Update startTime to include first user 3683 startTime = u1.CreateAt 3684 res2List, err := ss.User().GetUsersBatchForIndexing(startTime, endTime, 100) 3685 assert.Nil(t, err) 3686 3687 assert.Len(t, res2List, 2) 3688 assert.Equal(t, res2List[0].Username, u1.Username) 3689 assert.Equal(t, res2List[0].ChannelsIds, []string{}) 3690 assert.Equal(t, res2List[0].TeamsIds, []string{}) 3691 assert.Equal(t, res2List[1].Username, u2.Username) 3692 3693 // Update endTime to include last user 3694 endTime = model.GetMillis() 3695 res3List, err := ss.User().GetUsersBatchForIndexing(startTime, endTime, 100) 3696 assert.Nil(t, err) 3697 3698 assert.Len(t, res3List, 3) 3699 assert.Equal(t, res3List[0].Username, u1.Username) 3700 assert.Equal(t, res3List[1].Username, u2.Username) 3701 assert.Equal(t, res3List[2].Username, u3.Username) 3702 assert.ElementsMatch(t, res3List[2].TeamsIds, []string{}) 3703 assert.ElementsMatch(t, res3List[2].ChannelsIds, []string{cPub2.Id}) 3704 3705 // Testing the limit 3706 res4List, err := ss.User().GetUsersBatchForIndexing(startTime, endTime, 2) 3707 assert.Nil(t, err) 3708 3709 assert.Len(t, res4List, 2) 3710 assert.Equal(t, res4List[0].Username, u1.Username) 3711 assert.Equal(t, res4List[1].Username, u2.Username) 3712 } 3713 3714 func testUserStoreGetTeamGroupUsers(t *testing.T, ss store.Store) { 3715 // create team 3716 id := model.NewId() 3717 team, err := ss.Team().Save(&model.Team{ 3718 DisplayName: "dn_" + id, 3719 Name: "n-" + id, 3720 Email: id + "@test.com", 3721 Type: model.TEAM_INVITE, 3722 }) 3723 require.Nil(t, err) 3724 require.NotNil(t, team) 3725 3726 // create users 3727 var testUsers []*model.User 3728 for i := 0; i < 3; i++ { 3729 id = model.NewId() 3730 res := <-ss.User().Save(&model.User{ 3731 Email: id + "@test.com", 3732 Username: "un_" + id, 3733 Nickname: "nn_" + id, 3734 FirstName: "f_" + id, 3735 LastName: "l_" + id, 3736 Password: "Password1", 3737 }) 3738 require.Nil(t, res.Err) 3739 user := res.Data.(*model.User) 3740 require.NotNil(t, user) 3741 testUsers = append(testUsers, user) 3742 } 3743 userGroupA := testUsers[0] 3744 userGroupB := testUsers[1] 3745 userNoGroup := testUsers[2] 3746 3747 // add non-group-member to the team (to prove that the query isn't just returning all members) 3748 res := <-ss.Team().SaveMember(&model.TeamMember{ 3749 TeamId: team.Id, 3750 UserId: userNoGroup.Id, 3751 }, 999) 3752 require.Nil(t, res.Err) 3753 3754 // create groups 3755 var testGroups []*model.Group 3756 for i := 0; i < 2; i++ { 3757 id = model.NewId() 3758 res = <-ss.Group().Create(&model.Group{ 3759 Name: "n_" + id, 3760 DisplayName: "dn_" + id, 3761 Source: model.GroupSourceLdap, 3762 RemoteId: "ri_" + id, 3763 }) 3764 require.Nil(t, res.Err) 3765 group := res.Data.(*model.Group) 3766 require.NotNil(t, group) 3767 testGroups = append(testGroups, group) 3768 } 3769 groupA := testGroups[0] 3770 groupB := testGroups[1] 3771 3772 // add members to groups 3773 res = <-ss.Group().UpsertMember(groupA.Id, userGroupA.Id) 3774 require.Nil(t, res.Err) 3775 res = <-ss.Group().UpsertMember(groupB.Id, userGroupB.Id) 3776 require.Nil(t, res.Err) 3777 3778 // association one group to team 3779 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 3780 GroupId: groupA.Id, 3781 SyncableId: team.Id, 3782 Type: model.GroupSyncableTypeTeam, 3783 }) 3784 require.Nil(t, err) 3785 3786 var users []*model.User 3787 3788 requireNUsers := func(n int) { 3789 users, err = ss.User().GetTeamGroupUsers(team.Id) 3790 require.Nil(t, err) 3791 require.NotNil(t, users) 3792 require.Len(t, users, n) 3793 } 3794 3795 // team not group constrained returns users 3796 requireNUsers(1) 3797 3798 // update team to be group-constrained 3799 team.GroupConstrained = model.NewBool(true) 3800 team, err = ss.Team().Update(team) 3801 require.Nil(t, err) 3802 3803 // still returns user (being group-constrained has no effect) 3804 requireNUsers(1) 3805 3806 // associate other group to team 3807 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 3808 GroupId: groupB.Id, 3809 SyncableId: team.Id, 3810 Type: model.GroupSyncableTypeTeam, 3811 }) 3812 require.Nil(t, err) 3813 3814 // should return users from all groups 3815 // 2 users now that both groups have been associated to the team 3816 requireNUsers(2) 3817 3818 // add team membership of allowed user 3819 res = <-ss.Team().SaveMember(&model.TeamMember{ 3820 TeamId: team.Id, 3821 UserId: userGroupA.Id, 3822 }, 999) 3823 require.Nil(t, res.Err) 3824 3825 // ensure allowed member still returned by query 3826 requireNUsers(2) 3827 3828 // delete team membership of allowed user 3829 res = <-ss.Team().RemoveMember(team.Id, userGroupA.Id) 3830 require.Nil(t, res.Err) 3831 3832 // ensure removed allowed member still returned by query 3833 requireNUsers(2) 3834 } 3835 3836 func testUserStoreGetChannelGroupUsers(t *testing.T, ss store.Store) { 3837 // create channel 3838 id := model.NewId() 3839 channel, err := ss.Channel().Save(&model.Channel{ 3840 DisplayName: "dn_" + id, 3841 Name: "n-" + id, 3842 Type: model.CHANNEL_PRIVATE, 3843 }, 999) 3844 require.Nil(t, err) 3845 require.NotNil(t, channel) 3846 3847 // create users 3848 var testUsers []*model.User 3849 for i := 0; i < 3; i++ { 3850 id = model.NewId() 3851 res := <-ss.User().Save(&model.User{ 3852 Email: id + "@test.com", 3853 Username: "un_" + id, 3854 Nickname: "nn_" + id, 3855 FirstName: "f_" + id, 3856 LastName: "l_" + id, 3857 Password: "Password1", 3858 }) 3859 require.Nil(t, res.Err) 3860 user := res.Data.(*model.User) 3861 require.NotNil(t, user) 3862 testUsers = append(testUsers, user) 3863 } 3864 userGroupA := testUsers[0] 3865 userGroupB := testUsers[1] 3866 userNoGroup := testUsers[2] 3867 3868 // add non-group-member to the channel (to prove that the query isn't just returning all members) 3869 res := <-ss.Channel().SaveMember(&model.ChannelMember{ 3870 ChannelId: channel.Id, 3871 UserId: userNoGroup.Id, 3872 NotifyProps: model.GetDefaultChannelNotifyProps(), 3873 }) 3874 require.Nil(t, res.Err) 3875 3876 // create groups 3877 var testGroups []*model.Group 3878 for i := 0; i < 2; i++ { 3879 id = model.NewId() 3880 res = <-ss.Group().Create(&model.Group{ 3881 Name: "n_" + id, 3882 DisplayName: "dn_" + id, 3883 Source: model.GroupSourceLdap, 3884 RemoteId: "ri_" + id, 3885 }) 3886 require.Nil(t, res.Err) 3887 group := res.Data.(*model.Group) 3888 require.NotNil(t, group) 3889 testGroups = append(testGroups, group) 3890 } 3891 groupA := testGroups[0] 3892 groupB := testGroups[1] 3893 3894 // add members to groups 3895 res = <-ss.Group().UpsertMember(groupA.Id, userGroupA.Id) 3896 require.Nil(t, res.Err) 3897 res = <-ss.Group().UpsertMember(groupB.Id, userGroupB.Id) 3898 require.Nil(t, res.Err) 3899 3900 // association one group to channel 3901 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 3902 GroupId: groupA.Id, 3903 SyncableId: channel.Id, 3904 Type: model.GroupSyncableTypeChannel, 3905 }) 3906 require.Nil(t, err) 3907 3908 var users []*model.User 3909 3910 requireNUsers := func(n int) { 3911 users, err = ss.User().GetChannelGroupUsers(channel.Id) 3912 require.Nil(t, err) 3913 require.NotNil(t, users) 3914 require.Len(t, users, n) 3915 } 3916 3917 // channel not group constrained returns users 3918 requireNUsers(1) 3919 3920 // update team to be group-constrained 3921 channel.GroupConstrained = model.NewBool(true) 3922 _, err = ss.Channel().Update(channel) 3923 require.Nil(t, err) 3924 3925 // still returns user (being group-constrained has no effect) 3926 requireNUsers(1) 3927 3928 // associate other group to team 3929 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 3930 GroupId: groupB.Id, 3931 SyncableId: channel.Id, 3932 Type: model.GroupSyncableTypeChannel, 3933 }) 3934 require.Nil(t, err) 3935 3936 // should return users from all groups 3937 // 2 users now that both groups have been associated to the team 3938 requireNUsers(2) 3939 3940 // add team membership of allowed user 3941 res = <-ss.Channel().SaveMember(&model.ChannelMember{ 3942 ChannelId: channel.Id, 3943 UserId: userGroupA.Id, 3944 NotifyProps: model.GetDefaultChannelNotifyProps(), 3945 }) 3946 require.Nil(t, res.Err) 3947 3948 // ensure allowed member still returned by query 3949 requireNUsers(2) 3950 3951 // delete team membership of allowed user 3952 err = ss.Channel().RemoveMember(channel.Id, userGroupA.Id) 3953 require.Nil(t, err) 3954 3955 // ensure removed allowed member still returned by query 3956 requireNUsers(2) 3957 }