github.com/mattermost/mattermost-server/v5@v5.39.3/store/storetest/group_store.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package storetest 5 6 import ( 7 "errors" 8 "fmt" 9 "math" 10 "sort" 11 "strings" 12 "testing" 13 "time" 14 15 "github.com/stretchr/testify/assert" 16 "github.com/stretchr/testify/require" 17 18 "github.com/mattermost/mattermost-server/v5/model" 19 "github.com/mattermost/mattermost-server/v5/store" 20 "github.com/mattermost/mattermost-server/v5/utils" 21 ) 22 23 func TestGroupStore(t *testing.T, ss store.Store) { 24 t.Run("Create", func(t *testing.T) { testGroupStoreCreate(t, ss) }) 25 t.Run("Get", func(t *testing.T) { testGroupStoreGet(t, ss) }) 26 t.Run("GetByName", func(t *testing.T) { testGroupStoreGetByName(t, ss) }) 27 t.Run("GetByIDs", func(t *testing.T) { testGroupStoreGetByIDs(t, ss) }) 28 t.Run("GetByRemoteID", func(t *testing.T) { testGroupStoreGetByRemoteID(t, ss) }) 29 t.Run("GetAllBySource", func(t *testing.T) { testGroupStoreGetAllByType(t, ss) }) 30 t.Run("GetByUser", func(t *testing.T) { testGroupStoreGetByUser(t, ss) }) 31 t.Run("Update", func(t *testing.T) { testGroupStoreUpdate(t, ss) }) 32 t.Run("Delete", func(t *testing.T) { testGroupStoreDelete(t, ss) }) 33 34 t.Run("GetMemberUsers", func(t *testing.T) { testGroupGetMemberUsers(t, ss) }) 35 t.Run("GetMemberUsersPage", func(t *testing.T) { testGroupGetMemberUsersPage(t, ss) }) 36 37 t.Run("GetMemberUsersInTeam", func(t *testing.T) { testGroupGetMemberUsersInTeam(t, ss) }) 38 t.Run("GetMemberUsersNotInChannel", func(t *testing.T) { testGroupGetMemberUsersNotInChannel(t, ss) }) 39 40 t.Run("UpsertMember", func(t *testing.T) { testUpsertMember(t, ss) }) 41 t.Run("DeleteMember", func(t *testing.T) { testGroupDeleteMember(t, ss) }) 42 t.Run("PermanentDeleteMembersByUser", func(t *testing.T) { testGroupPermanentDeleteMembersByUser(t, ss) }) 43 44 t.Run("CreateGroupSyncable", func(t *testing.T) { testCreateGroupSyncable(t, ss) }) 45 t.Run("GetGroupSyncable", func(t *testing.T) { testGetGroupSyncable(t, ss) }) 46 t.Run("GetAllGroupSyncablesByGroupId", func(t *testing.T) { testGetAllGroupSyncablesByGroup(t, ss) }) 47 t.Run("UpdateGroupSyncable", func(t *testing.T) { testUpdateGroupSyncable(t, ss) }) 48 t.Run("DeleteGroupSyncable", func(t *testing.T) { testDeleteGroupSyncable(t, ss) }) 49 50 t.Run("TeamMembersToAdd", func(t *testing.T) { testTeamMembersToAdd(t, ss) }) 51 t.Run("TeamMembersToAdd_SingleTeam", func(t *testing.T) { testTeamMembersToAddSingleTeam(t, ss) }) 52 53 t.Run("ChannelMembersToAdd", func(t *testing.T) { testChannelMembersToAdd(t, ss) }) 54 t.Run("ChannelMembersToAdd_SingleChannel", func(t *testing.T) { testChannelMembersToAddSingleChannel(t, ss) }) 55 56 t.Run("TeamMembersToRemove", func(t *testing.T) { testTeamMembersToRemove(t, ss) }) 57 t.Run("TeamMembersToRemove_SingleTeam", func(t *testing.T) { testTeamMembersToRemoveSingleTeam(t, ss) }) 58 59 t.Run("ChannelMembersToRemove", func(t *testing.T) { testChannelMembersToRemove(t, ss) }) 60 t.Run("ChannelMembersToRemove_SingleChannel", func(t *testing.T) { testChannelMembersToRemoveSingleChannel(t, ss) }) 61 62 t.Run("GetGroupsByChannel", func(t *testing.T) { testGetGroupsByChannel(t, ss) }) 63 t.Run("GetGroupsAssociatedToChannelsByTeam", func(t *testing.T) { testGetGroupsAssociatedToChannelsByTeam(t, ss) }) 64 t.Run("GetGroupsByTeam", func(t *testing.T) { testGetGroupsByTeam(t, ss) }) 65 66 t.Run("GetGroups", func(t *testing.T) { testGetGroups(t, ss) }) 67 68 t.Run("TeamMembersMinusGroupMembers", func(t *testing.T) { testTeamMembersMinusGroupMembers(t, ss) }) 69 t.Run("ChannelMembersMinusGroupMembers", func(t *testing.T) { testChannelMembersMinusGroupMembers(t, ss) }) 70 71 t.Run("GetMemberCount", func(t *testing.T) { groupTestGetMemberCount(t, ss) }) 72 73 t.Run("AdminRoleGroupsForSyncableMember_Channel", func(t *testing.T) { groupTestAdminRoleGroupsForSyncableMemberChannel(t, ss) }) 74 t.Run("AdminRoleGroupsForSyncableMember_Team", func(t *testing.T) { groupTestAdminRoleGroupsForSyncableMemberTeam(t, ss) }) 75 t.Run("PermittedSyncableAdmins_Team", func(t *testing.T) { groupTestPermittedSyncableAdminsTeam(t, ss) }) 76 t.Run("PermittedSyncableAdmins_Channel", func(t *testing.T) { groupTestPermittedSyncableAdminsChannel(t, ss) }) 77 t.Run("UpdateMembersRole_Team", func(t *testing.T) { groupTestpUpdateMembersRoleTeam(t, ss) }) 78 t.Run("UpdateMembersRole_Channel", func(t *testing.T) { groupTestpUpdateMembersRoleChannel(t, ss) }) 79 80 t.Run("GroupCount", func(t *testing.T) { groupTestGroupCount(t, ss) }) 81 t.Run("GroupTeamCount", func(t *testing.T) { groupTestGroupTeamCount(t, ss) }) 82 t.Run("GroupChannelCount", func(t *testing.T) { groupTestGroupChannelCount(t, ss) }) 83 t.Run("GroupMemberCount", func(t *testing.T) { groupTestGroupMemberCount(t, ss) }) 84 t.Run("DistinctGroupMemberCount", func(t *testing.T) { groupTestDistinctGroupMemberCount(t, ss) }) 85 t.Run("GroupCountWithAllowReference", func(t *testing.T) { groupTestGroupCountWithAllowReference(t, ss) }) 86 } 87 88 func testGroupStoreCreate(t *testing.T, ss store.Store) { 89 // Save a new group 90 g1 := &model.Group{ 91 Name: model.NewString(model.NewId()), 92 DisplayName: model.NewId(), 93 Source: model.GroupSourceLdap, 94 Description: model.NewId(), 95 RemoteId: model.NewId(), 96 } 97 98 // Happy path 99 d1, err := ss.Group().Create(g1) 100 require.NoError(t, err) 101 require.Len(t, d1.Id, 26) 102 require.Equal(t, *g1.Name, *d1.Name) 103 require.Equal(t, g1.DisplayName, d1.DisplayName) 104 require.Equal(t, g1.Description, d1.Description) 105 require.Equal(t, g1.RemoteId, d1.RemoteId) 106 require.NotZero(t, d1.CreateAt) 107 require.NotZero(t, d1.UpdateAt) 108 require.Zero(t, d1.DeleteAt) 109 110 // Requires display name 111 g2 := &model.Group{ 112 Name: model.NewString(model.NewId()), 113 DisplayName: "", 114 Source: model.GroupSourceLdap, 115 RemoteId: model.NewId(), 116 } 117 data, err := ss.Group().Create(g2) 118 require.Nil(t, data) 119 require.Error(t, err) 120 var appErr *model.AppError 121 require.True(t, errors.As(err, &appErr)) 122 require.Equal(t, appErr.Id, "model.group.display_name.app_error") 123 124 // Won't accept a duplicate name 125 g4 := &model.Group{ 126 Name: model.NewString(model.NewId()), 127 DisplayName: model.NewId(), 128 Source: model.GroupSourceLdap, 129 RemoteId: model.NewId(), 130 } 131 _, err = ss.Group().Create(g4) 132 require.NoError(t, err) 133 g4b := &model.Group{ 134 Name: g4.Name, 135 DisplayName: model.NewId(), 136 Source: model.GroupSourceLdap, 137 RemoteId: model.NewId(), 138 } 139 data, err = ss.Group().Create(g4b) 140 require.Nil(t, data) 141 require.Error(t, err) 142 require.Contains(t, err.Error(), fmt.Sprintf("Group with name %s already exists", *g4b.Name)) 143 144 // Fields cannot be greater than max values 145 g5 := &model.Group{ 146 Name: model.NewString(strings.Repeat("x", model.GroupNameMaxLength)), 147 DisplayName: strings.Repeat("x", model.GroupDisplayNameMaxLength), 148 Description: strings.Repeat("x", model.GroupDescriptionMaxLength), 149 Source: model.GroupSourceLdap, 150 RemoteId: model.NewId(), 151 } 152 require.Nil(t, g5.IsValidForCreate()) 153 154 g5.Name = model.NewString(*g5.Name + "x") 155 require.Equal(t, g5.IsValidForCreate().Id, "model.group.name.invalid_length.app_error") 156 g5.Name = model.NewString(model.NewId()) 157 require.Nil(t, g5.IsValidForCreate()) 158 159 g5.DisplayName = g5.DisplayName + "x" 160 require.Equal(t, g5.IsValidForCreate().Id, "model.group.display_name.app_error") 161 g5.DisplayName = model.NewId() 162 require.Nil(t, g5.IsValidForCreate()) 163 164 g5.Description = g5.Description + "x" 165 require.Equal(t, g5.IsValidForCreate().Id, "model.group.description.app_error") 166 g5.Description = model.NewId() 167 require.Nil(t, g5.IsValidForCreate()) 168 169 // Must use a valid type 170 g6 := &model.Group{ 171 Name: model.NewString(model.NewId()), 172 DisplayName: model.NewId(), 173 Description: model.NewId(), 174 Source: model.GroupSource("fake"), 175 RemoteId: model.NewId(), 176 } 177 require.Equal(t, g6.IsValidForCreate().Id, "model.group.source.app_error") 178 179 //must use valid characters 180 g7 := &model.Group{ 181 Name: model.NewString("%^#@$$"), 182 DisplayName: model.NewId(), 183 Description: model.NewId(), 184 Source: model.GroupSourceLdap, 185 RemoteId: model.NewId(), 186 } 187 require.Equal(t, g7.IsValidForCreate().Id, "model.group.name.invalid_chars.app_error") 188 } 189 190 func testGroupStoreGet(t *testing.T, ss store.Store) { 191 // Create a group 192 g1 := &model.Group{ 193 Name: model.NewString(model.NewId()), 194 DisplayName: model.NewId(), 195 Description: model.NewId(), 196 Source: model.GroupSourceLdap, 197 RemoteId: model.NewId(), 198 } 199 d1, err := ss.Group().Create(g1) 200 require.NoError(t, err) 201 require.Len(t, d1.Id, 26) 202 203 // Get the group 204 d2, err := ss.Group().Get(d1.Id) 205 require.NoError(t, err) 206 require.Equal(t, d1.Id, d2.Id) 207 require.Equal(t, *d1.Name, *d2.Name) 208 require.Equal(t, d1.DisplayName, d2.DisplayName) 209 require.Equal(t, d1.Description, d2.Description) 210 require.Equal(t, d1.RemoteId, d2.RemoteId) 211 require.Equal(t, d1.CreateAt, d2.CreateAt) 212 require.Equal(t, d1.UpdateAt, d2.UpdateAt) 213 require.Equal(t, d1.DeleteAt, d2.DeleteAt) 214 215 // Get an invalid group 216 _, err = ss.Group().Get(model.NewId()) 217 require.Error(t, err) 218 var nfErr *store.ErrNotFound 219 require.True(t, errors.As(err, &nfErr)) 220 } 221 222 func testGroupStoreGetByName(t *testing.T, ss store.Store) { 223 // Create a group 224 g1 := &model.Group{ 225 Name: model.NewString(model.NewId()), 226 DisplayName: model.NewId(), 227 Description: model.NewId(), 228 Source: model.GroupSourceLdap, 229 RemoteId: model.NewId(), 230 } 231 g1Opts := model.GroupSearchOpts{ 232 FilterAllowReference: false, 233 } 234 235 d1, err := ss.Group().Create(g1) 236 require.NoError(t, err) 237 require.Len(t, d1.Id, 26) 238 239 // Get the group 240 d2, err := ss.Group().GetByName(*d1.Name, g1Opts) 241 require.NoError(t, err) 242 require.Equal(t, d1.Id, d2.Id) 243 require.Equal(t, *d1.Name, *d2.Name) 244 require.Equal(t, d1.DisplayName, d2.DisplayName) 245 require.Equal(t, d1.Description, d2.Description) 246 require.Equal(t, d1.RemoteId, d2.RemoteId) 247 require.Equal(t, d1.CreateAt, d2.CreateAt) 248 require.Equal(t, d1.UpdateAt, d2.UpdateAt) 249 require.Equal(t, d1.DeleteAt, d2.DeleteAt) 250 251 // Get an invalid group 252 _, err = ss.Group().GetByName(model.NewId(), g1Opts) 253 require.Error(t, err) 254 var nfErr *store.ErrNotFound 255 require.True(t, errors.As(err, &nfErr)) 256 } 257 258 func testGroupStoreGetByIDs(t *testing.T, ss store.Store) { 259 var group1 *model.Group 260 var group2 *model.Group 261 262 for i := 0; i < 2; i++ { 263 group := &model.Group{ 264 Name: model.NewString(model.NewId()), 265 DisplayName: model.NewId(), 266 Description: model.NewId(), 267 Source: model.GroupSourceLdap, 268 RemoteId: model.NewId(), 269 } 270 group, err := ss.Group().Create(group) 271 require.NoError(t, err) 272 switch i { 273 case 0: 274 group1 = group 275 case 1: 276 group2 = group 277 } 278 } 279 280 groups, err := ss.Group().GetByIDs([]string{group1.Id, group2.Id}) 281 require.NoError(t, err) 282 require.Len(t, groups, 2) 283 284 for i := 0; i < 2; i++ { 285 require.True(t, (groups[i].Id == group1.Id || groups[i].Id == group2.Id)) 286 } 287 288 require.True(t, groups[0].Id != groups[1].Id) 289 } 290 291 func testGroupStoreGetByRemoteID(t *testing.T, ss store.Store) { 292 // Create a group 293 g1 := &model.Group{ 294 Name: model.NewString(model.NewId()), 295 DisplayName: model.NewId(), 296 Description: model.NewId(), 297 Source: model.GroupSourceLdap, 298 RemoteId: model.NewId(), 299 } 300 d1, err := ss.Group().Create(g1) 301 require.NoError(t, err) 302 require.Len(t, d1.Id, 26) 303 304 // Get the group 305 d2, err := ss.Group().GetByRemoteID(d1.RemoteId, model.GroupSourceLdap) 306 require.NoError(t, err) 307 require.Equal(t, d1.Id, d2.Id) 308 require.Equal(t, *d1.Name, *d2.Name) 309 require.Equal(t, d1.DisplayName, d2.DisplayName) 310 require.Equal(t, d1.Description, d2.Description) 311 require.Equal(t, d1.RemoteId, d2.RemoteId) 312 require.Equal(t, d1.CreateAt, d2.CreateAt) 313 require.Equal(t, d1.UpdateAt, d2.UpdateAt) 314 require.Equal(t, d1.DeleteAt, d2.DeleteAt) 315 316 // Get an invalid group 317 _, err = ss.Group().GetByRemoteID(model.NewId(), model.GroupSource("fake")) 318 require.Error(t, err) 319 var nfErr *store.ErrNotFound 320 require.True(t, errors.As(err, &nfErr)) 321 } 322 323 func testGroupStoreGetAllByType(t *testing.T, ss store.Store) { 324 numGroups := 10 325 326 groups := []*model.Group{} 327 328 // Create groups 329 for i := 0; i < numGroups; i++ { 330 g := &model.Group{ 331 Name: model.NewString(model.NewId()), 332 DisplayName: model.NewId(), 333 Description: model.NewId(), 334 Source: model.GroupSourceLdap, 335 RemoteId: model.NewId(), 336 } 337 groups = append(groups, g) 338 _, err := ss.Group().Create(g) 339 require.NoError(t, err) 340 } 341 342 // Returns all the groups 343 d1, err := ss.Group().GetAllBySource(model.GroupSourceLdap) 344 require.NoError(t, err) 345 require.Condition(t, func() bool { return len(d1) >= numGroups }) 346 for _, expectedGroup := range groups { 347 present := false 348 for _, dbGroup := range d1 { 349 if dbGroup.Id == expectedGroup.Id { 350 present = true 351 break 352 } 353 } 354 require.True(t, present) 355 } 356 } 357 358 func testGroupStoreGetByUser(t *testing.T, ss store.Store) { 359 // Save a group 360 g1 := &model.Group{ 361 Name: model.NewString(model.NewId()), 362 DisplayName: model.NewId(), 363 Description: model.NewId(), 364 Source: model.GroupSourceLdap, 365 RemoteId: model.NewId(), 366 } 367 g1, err := ss.Group().Create(g1) 368 require.NoError(t, err) 369 370 g2 := &model.Group{ 371 Name: model.NewString(model.NewId()), 372 DisplayName: model.NewId(), 373 Description: model.NewId(), 374 Source: model.GroupSourceLdap, 375 RemoteId: model.NewId(), 376 } 377 g2, err = ss.Group().Create(g2) 378 require.NoError(t, err) 379 380 u1 := &model.User{ 381 Email: MakeEmail(), 382 Username: model.NewId(), 383 } 384 u1, nErr := ss.User().Save(u1) 385 require.NoError(t, nErr) 386 387 _, err = ss.Group().UpsertMember(g1.Id, u1.Id) 388 require.NoError(t, err) 389 _, err = ss.Group().UpsertMember(g2.Id, u1.Id) 390 require.NoError(t, err) 391 392 u2 := &model.User{ 393 Email: MakeEmail(), 394 Username: model.NewId(), 395 } 396 u2, nErr = ss.User().Save(u2) 397 require.NoError(t, nErr) 398 399 _, err = ss.Group().UpsertMember(g2.Id, u2.Id) 400 require.NoError(t, err) 401 402 groups, err := ss.Group().GetByUser(u1.Id) 403 require.NoError(t, err) 404 assert.Equal(t, 2, len(groups)) 405 found1 := false 406 found2 := false 407 for _, g := range groups { 408 if g.Id == g1.Id { 409 found1 = true 410 } 411 if g.Id == g2.Id { 412 found2 = true 413 } 414 } 415 assert.True(t, found1) 416 assert.True(t, found2) 417 418 groups, err = ss.Group().GetByUser(u2.Id) 419 require.NoError(t, err) 420 require.Equal(t, 1, len(groups)) 421 assert.Equal(t, g2.Id, groups[0].Id) 422 423 groups, err = ss.Group().GetByUser(model.NewId()) 424 require.NoError(t, err) 425 assert.Equal(t, 0, len(groups)) 426 } 427 428 func testGroupStoreUpdate(t *testing.T, ss store.Store) { 429 // Save a new group 430 g1 := &model.Group{ 431 Name: model.NewString("g1-test"), 432 DisplayName: model.NewId(), 433 Source: model.GroupSourceLdap, 434 Description: model.NewId(), 435 RemoteId: model.NewId(), 436 } 437 438 // Create a group 439 d1, err := ss.Group().Create(g1) 440 require.NoError(t, err) 441 442 // Update happy path 443 g1Update := &model.Group{} 444 *g1Update = *g1 445 g1Update.Name = model.NewString(model.NewId()) 446 g1Update.DisplayName = model.NewId() 447 g1Update.Description = model.NewId() 448 g1Update.RemoteId = model.NewId() 449 450 ud1, err := ss.Group().Update(g1Update) 451 require.NoError(t, err) 452 // Not changed... 453 require.Equal(t, d1.Id, ud1.Id) 454 require.Equal(t, d1.CreateAt, ud1.CreateAt) 455 require.Equal(t, d1.Source, ud1.Source) 456 // Still zero... 457 require.Zero(t, ud1.DeleteAt) 458 // Updated... 459 require.Equal(t, *g1Update.Name, *ud1.Name) 460 require.Equal(t, g1Update.DisplayName, ud1.DisplayName) 461 require.Equal(t, g1Update.Description, ud1.Description) 462 require.Equal(t, g1Update.RemoteId, ud1.RemoteId) 463 464 // Requires display name 465 data, err := ss.Group().Update(&model.Group{ 466 Id: d1.Id, 467 Name: model.NewString(model.NewId()), 468 DisplayName: "", 469 Source: model.GroupSourceLdap, 470 RemoteId: model.NewId(), 471 }) 472 require.Nil(t, data) 473 require.Error(t, err) 474 var appErr *model.AppError 475 require.True(t, errors.As(err, &appErr)) 476 require.Equal(t, appErr.Id, "model.group.display_name.app_error") 477 478 // Create another Group 479 g2 := &model.Group{ 480 Name: model.NewString(model.NewId()), 481 DisplayName: model.NewId(), 482 Source: model.GroupSourceLdap, 483 Description: model.NewId(), 484 RemoteId: model.NewId(), 485 } 486 d2, err := ss.Group().Create(g2) 487 require.NoError(t, err) 488 489 // Can't update the name to be a duplicate of an existing group's name 490 _, err = ss.Group().Update(&model.Group{ 491 Id: d2.Id, 492 Name: g1Update.Name, 493 DisplayName: model.NewId(), 494 Source: model.GroupSourceLdap, 495 Description: model.NewId(), 496 RemoteId: model.NewId(), 497 }) 498 require.Error(t, err) 499 require.Contains(t, err.Error(), fmt.Sprintf("Group with name %s already exists", *g1Update.Name)) 500 501 // Cannot update CreateAt 502 someVal := model.GetMillis() 503 d1.CreateAt = someVal 504 d3, err := ss.Group().Update(d1) 505 require.NoError(t, err) 506 require.NotEqual(t, someVal, d3.CreateAt) 507 508 // Cannot update DeleteAt to non-zero 509 d1.DeleteAt = 1 510 _, err = ss.Group().Update(d1) 511 require.Error(t, err) 512 require.Contains(t, err.Error(), "DeleteAt should be 0 when updating") 513 514 //...except for 0 for DeleteAt 515 d1.DeleteAt = 0 516 d4, err := ss.Group().Update(d1) 517 require.NoError(t, err) 518 require.Zero(t, d4.DeleteAt) 519 } 520 521 func testGroupStoreDelete(t *testing.T, ss store.Store) { 522 // Save a group 523 g1 := &model.Group{ 524 Name: model.NewString(model.NewId()), 525 DisplayName: model.NewId(), 526 Description: model.NewId(), 527 Source: model.GroupSourceLdap, 528 RemoteId: model.NewId(), 529 } 530 531 d1, err := ss.Group().Create(g1) 532 require.NoError(t, err) 533 require.Len(t, d1.Id, 26) 534 535 // Check the group is retrievable 536 _, err = ss.Group().Get(d1.Id) 537 require.NoError(t, err) 538 539 // Get the before count 540 d7, err := ss.Group().GetAllBySource(model.GroupSourceLdap) 541 require.NoError(t, err) 542 beforeCount := len(d7) 543 544 // Delete the group 545 _, err = ss.Group().Delete(d1.Id) 546 require.NoError(t, err) 547 548 // Check the group is deleted 549 d4, err := ss.Group().Get(d1.Id) 550 require.NoError(t, err) 551 require.NotZero(t, d4.DeleteAt) 552 553 // Check the after count 554 d5, err := ss.Group().GetAllBySource(model.GroupSourceLdap) 555 require.NoError(t, err) 556 afterCount := len(d5) 557 require.Condition(t, func() bool { return beforeCount == afterCount+1 }) 558 559 // Try and delete a nonexistent group 560 _, err = ss.Group().Delete(model.NewId()) 561 require.Error(t, err) 562 var nfErr *store.ErrNotFound 563 require.True(t, errors.As(err, &nfErr)) 564 565 // Cannot delete again 566 _, err = ss.Group().Delete(d1.Id) 567 require.True(t, errors.As(err, &nfErr)) 568 } 569 570 func testGroupGetMemberUsers(t *testing.T, ss store.Store) { 571 // Save a group 572 g1 := &model.Group{ 573 Name: model.NewString(model.NewId()), 574 DisplayName: model.NewId(), 575 Description: model.NewId(), 576 Source: model.GroupSourceLdap, 577 RemoteId: model.NewId(), 578 } 579 group, err := ss.Group().Create(g1) 580 require.NoError(t, err) 581 582 u1 := &model.User{ 583 Email: MakeEmail(), 584 Username: model.NewId(), 585 } 586 user1, nErr := ss.User().Save(u1) 587 require.NoError(t, nErr) 588 589 _, err = ss.Group().UpsertMember(group.Id, user1.Id) 590 require.NoError(t, err) 591 592 u2 := &model.User{ 593 Email: MakeEmail(), 594 Username: model.NewId(), 595 } 596 user2, nErr := ss.User().Save(u2) 597 require.NoError(t, nErr) 598 599 _, err = ss.Group().UpsertMember(group.Id, user2.Id) 600 require.NoError(t, err) 601 602 // Check returns members 603 groupMembers, err := ss.Group().GetMemberUsers(group.Id) 604 require.NoError(t, err) 605 require.Equal(t, 2, len(groupMembers)) 606 607 // Check madeup id 608 groupMembers, err = ss.Group().GetMemberUsers(model.NewId()) 609 require.NoError(t, err) 610 require.Equal(t, 0, len(groupMembers)) 611 612 // Delete a member 613 _, err = ss.Group().DeleteMember(group.Id, user1.Id) 614 require.NoError(t, err) 615 616 // Should not return deleted members 617 groupMembers, err = ss.Group().GetMemberUsers(group.Id) 618 require.NoError(t, err) 619 require.Equal(t, 1, len(groupMembers)) 620 } 621 622 func testGroupGetMemberUsersPage(t *testing.T, ss store.Store) { 623 // Save a group 624 g1 := &model.Group{ 625 Name: model.NewString(model.NewId()), 626 DisplayName: model.NewId(), 627 Description: model.NewId(), 628 Source: model.GroupSourceLdap, 629 RemoteId: model.NewId(), 630 } 631 group, err := ss.Group().Create(g1) 632 require.NoError(t, err) 633 634 u1 := &model.User{ 635 Email: MakeEmail(), 636 Username: model.NewId(), 637 } 638 user1, nErr := ss.User().Save(u1) 639 require.NoError(t, nErr) 640 641 _, err = ss.Group().UpsertMember(group.Id, user1.Id) 642 require.NoError(t, err) 643 644 u2 := &model.User{ 645 Email: MakeEmail(), 646 Username: model.NewId(), 647 } 648 user2, nErr := ss.User().Save(u2) 649 require.NoError(t, nErr) 650 651 _, err = ss.Group().UpsertMember(group.Id, user2.Id) 652 require.NoError(t, err) 653 654 u3 := &model.User{ 655 Email: MakeEmail(), 656 Username: model.NewId(), 657 } 658 user3, nErr := ss.User().Save(u3) 659 require.NoError(t, nErr) 660 661 _, err = ss.Group().UpsertMember(group.Id, user3.Id) 662 require.NoError(t, err) 663 664 // Check returns members 665 groupMembers, err := ss.Group().GetMemberUsersPage(group.Id, 0, 100) 666 require.NoError(t, err) 667 require.Equal(t, 3, len(groupMembers)) 668 669 // Check page 1 670 groupMembers, err = ss.Group().GetMemberUsersPage(group.Id, 0, 2) 671 require.NoError(t, err) 672 require.Equal(t, 2, len(groupMembers)) 673 require.Equal(t, user3.Id, groupMembers[0].Id) 674 require.Equal(t, user2.Id, groupMembers[1].Id) 675 676 // Check page 2 677 groupMembers, err = ss.Group().GetMemberUsersPage(group.Id, 1, 2) 678 require.NoError(t, err) 679 require.Equal(t, 1, len(groupMembers)) 680 require.Equal(t, user1.Id, groupMembers[0].Id) 681 682 // Check madeup id 683 groupMembers, err = ss.Group().GetMemberUsersPage(model.NewId(), 0, 100) 684 require.NoError(t, err) 685 require.Equal(t, 0, len(groupMembers)) 686 687 // Delete a member 688 _, err = ss.Group().DeleteMember(group.Id, user1.Id) 689 require.NoError(t, err) 690 691 // Should not return deleted members 692 groupMembers, err = ss.Group().GetMemberUsersPage(group.Id, 0, 100) 693 require.NoError(t, err) 694 require.Equal(t, 2, len(groupMembers)) 695 } 696 697 func testGroupGetMemberUsersInTeam(t *testing.T, ss store.Store) { 698 // Save a team 699 team := &model.Team{ 700 DisplayName: "Name", 701 Description: "Some description", 702 CompanyName: "Some company name", 703 Name: "z-z-" + model.NewId() + "a", 704 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 705 Type: model.TEAM_OPEN, 706 } 707 team, err := ss.Team().Save(team) 708 require.NoError(t, err) 709 710 // Save a group 711 g1 := &model.Group{ 712 Name: model.NewString(model.NewId()), 713 DisplayName: model.NewId(), 714 Description: model.NewId(), 715 Source: model.GroupSourceLdap, 716 RemoteId: model.NewId(), 717 } 718 group, err := ss.Group().Create(g1) 719 require.NoError(t, err) 720 721 u1 := &model.User{ 722 Email: MakeEmail(), 723 Username: model.NewId(), 724 } 725 user1, err := ss.User().Save(u1) 726 require.NoError(t, err) 727 728 _, err = ss.Group().UpsertMember(group.Id, user1.Id) 729 require.NoError(t, err) 730 731 u2 := &model.User{ 732 Email: MakeEmail(), 733 Username: model.NewId(), 734 } 735 user2, err := ss.User().Save(u2) 736 require.NoError(t, err) 737 738 _, err = ss.Group().UpsertMember(group.Id, user2.Id) 739 require.NoError(t, err) 740 741 u3 := &model.User{ 742 Email: MakeEmail(), 743 Username: model.NewId(), 744 } 745 user3, err := ss.User().Save(u3) 746 require.NoError(t, err) 747 748 _, err = ss.Group().UpsertMember(group.Id, user3.Id) 749 require.NoError(t, err) 750 751 // returns no members when team does not exist 752 groupMembers, err := ss.Group().GetMemberUsersInTeam(group.Id, "non-existent-channel-id") 753 require.NoError(t, err) 754 require.Equal(t, 0, len(groupMembers)) 755 756 // returns no members when group has no members in the team 757 groupMembers, err = ss.Group().GetMemberUsersInTeam(group.Id, team.Id) 758 require.NoError(t, err) 759 require.Equal(t, 0, len(groupMembers)) 760 761 m1 := &model.TeamMember{TeamId: team.Id, UserId: user1.Id} 762 _, nErr := ss.Team().SaveMember(m1, -1) 763 require.NoError(t, nErr) 764 765 // returns single member in team 766 groupMembers, err = ss.Group().GetMemberUsersInTeam(group.Id, team.Id) 767 require.NoError(t, err) 768 require.Equal(t, 1, len(groupMembers)) 769 770 m2 := &model.TeamMember{TeamId: team.Id, UserId: user2.Id} 771 m3 := &model.TeamMember{TeamId: team.Id, UserId: user3.Id} 772 _, nErr = ss.Team().SaveMember(m2, -1) 773 require.NoError(t, nErr) 774 _, nErr = ss.Team().SaveMember(m3, -1) 775 require.NoError(t, nErr) 776 777 // returns all members when all members are in team 778 groupMembers, err = ss.Group().GetMemberUsersInTeam(group.Id, team.Id) 779 require.NoError(t, err) 780 require.Equal(t, 3, len(groupMembers)) 781 } 782 783 func testGroupGetMemberUsersNotInChannel(t *testing.T, ss store.Store) { 784 // Save a team 785 team := &model.Team{ 786 DisplayName: "Name", 787 Description: "Some description", 788 CompanyName: "Some company name", 789 Name: "z-z-" + model.NewId() + "a", 790 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 791 Type: model.TEAM_OPEN, 792 } 793 team, err := ss.Team().Save(team) 794 require.NoError(t, err) 795 796 // Save a group 797 g1 := &model.Group{ 798 Name: model.NewString(model.NewId()), 799 DisplayName: model.NewId(), 800 Description: model.NewId(), 801 Source: model.GroupSourceLdap, 802 RemoteId: model.NewId(), 803 } 804 group, err := ss.Group().Create(g1) 805 require.NoError(t, err) 806 807 u1 := &model.User{ 808 Email: MakeEmail(), 809 Username: model.NewId(), 810 } 811 user1, err := ss.User().Save(u1) 812 require.NoError(t, err) 813 814 _, err = ss.Group().UpsertMember(group.Id, user1.Id) 815 require.NoError(t, err) 816 817 u2 := &model.User{ 818 Email: MakeEmail(), 819 Username: model.NewId(), 820 } 821 user2, err := ss.User().Save(u2) 822 require.NoError(t, err) 823 824 _, err = ss.Group().UpsertMember(group.Id, user2.Id) 825 require.NoError(t, err) 826 827 u3 := &model.User{ 828 Email: MakeEmail(), 829 Username: model.NewId(), 830 } 831 user3, err := ss.User().Save(u3) 832 require.NoError(t, err) 833 834 _, err = ss.Group().UpsertMember(group.Id, user3.Id) 835 require.NoError(t, err) 836 837 // Create Channel 838 channel := &model.Channel{ 839 TeamId: team.Id, 840 DisplayName: "Channel", 841 Name: model.NewId(), 842 Type: model.CHANNEL_OPEN, // Query does not look at type so this shouldn't matter. 843 } 844 channel, nErr := ss.Channel().Save(channel, 9999) 845 require.NoError(t, nErr) 846 847 // returns no members when channel does not exist 848 groupMembers, err := ss.Group().GetMemberUsersNotInChannel(group.Id, "non-existent-channel-id") 849 require.NoError(t, err) 850 require.Equal(t, 0, len(groupMembers)) 851 852 // returns no members when group has no members in the team that the channel belongs to 853 groupMembers, err = ss.Group().GetMemberUsersNotInChannel(group.Id, channel.Id) 854 require.NoError(t, err) 855 require.Equal(t, 0, len(groupMembers)) 856 857 m1 := &model.TeamMember{TeamId: team.Id, UserId: user1.Id} 858 _, nErr = ss.Team().SaveMember(m1, -1) 859 require.NoError(t, nErr) 860 861 // returns single member in team and not in channel 862 groupMembers, err = ss.Group().GetMemberUsersNotInChannel(group.Id, channel.Id) 863 require.NoError(t, err) 864 require.Equal(t, 1, len(groupMembers)) 865 866 m2 := &model.TeamMember{TeamId: team.Id, UserId: user2.Id} 867 m3 := &model.TeamMember{TeamId: team.Id, UserId: user3.Id} 868 _, nErr = ss.Team().SaveMember(m2, -1) 869 require.NoError(t, nErr) 870 _, nErr = ss.Team().SaveMember(m3, -1) 871 require.NoError(t, nErr) 872 873 // returns all members when all members are in team and not in channel 874 groupMembers, err = ss.Group().GetMemberUsersNotInChannel(group.Id, channel.Id) 875 require.NoError(t, err) 876 require.Equal(t, 3, len(groupMembers)) 877 878 cm1 := &model.ChannelMember{ 879 ChannelId: channel.Id, 880 UserId: user1.Id, 881 SchemeGuest: false, 882 SchemeUser: true, 883 SchemeAdmin: false, 884 NotifyProps: model.GetDefaultChannelNotifyProps(), 885 } 886 _, err = ss.Channel().SaveMember(cm1) 887 require.NoError(t, err) 888 889 // returns both members not yet added to channel 890 groupMembers, err = ss.Group().GetMemberUsersNotInChannel(group.Id, channel.Id) 891 require.NoError(t, err) 892 require.Equal(t, 2, len(groupMembers)) 893 894 cm2 := &model.ChannelMember{ 895 ChannelId: channel.Id, 896 UserId: user2.Id, 897 SchemeGuest: false, 898 SchemeUser: true, 899 SchemeAdmin: false, 900 NotifyProps: model.GetDefaultChannelNotifyProps(), 901 } 902 cm3 := &model.ChannelMember{ 903 ChannelId: channel.Id, 904 UserId: user3.Id, 905 SchemeGuest: false, 906 SchemeUser: true, 907 SchemeAdmin: false, 908 NotifyProps: model.GetDefaultChannelNotifyProps(), 909 } 910 911 _, err = ss.Channel().SaveMember(cm2) 912 require.NoError(t, err) 913 _, err = ss.Channel().SaveMember(cm3) 914 require.NoError(t, err) 915 916 // returns none when all members have been added to team and channel 917 groupMembers, err = ss.Group().GetMemberUsersNotInChannel(group.Id, channel.Id) 918 require.NoError(t, err) 919 require.Equal(t, 0, len(groupMembers)) 920 } 921 922 func testUpsertMember(t *testing.T, ss store.Store) { 923 // Create group 924 g1 := &model.Group{ 925 Name: model.NewString(model.NewId()), 926 DisplayName: model.NewId(), 927 Source: model.GroupSourceLdap, 928 RemoteId: model.NewId(), 929 } 930 group, err := ss.Group().Create(g1) 931 require.NoError(t, err) 932 933 // Create user 934 u1 := &model.User{ 935 Email: MakeEmail(), 936 Username: model.NewId(), 937 } 938 user, nErr := ss.User().Save(u1) 939 require.NoError(t, nErr) 940 941 // Happy path 942 d2, err := ss.Group().UpsertMember(group.Id, user.Id) 943 require.NoError(t, err) 944 require.Equal(t, d2.GroupId, group.Id) 945 require.Equal(t, d2.UserId, user.Id) 946 require.NotZero(t, d2.CreateAt) 947 require.Zero(t, d2.DeleteAt) 948 949 // Duplicate composite key (GroupId, UserId) 950 // Ensure new CreateAt > previous CreateAt for the same (groupId, userId) 951 time.Sleep(1 * time.Millisecond) 952 _, err = ss.Group().UpsertMember(group.Id, user.Id) 953 require.NoError(t, err) 954 955 // Invalid GroupId 956 _, err = ss.Group().UpsertMember(model.NewId(), user.Id) 957 require.Error(t, err) 958 require.Contains(t, err.Error(), "failed to get UserGroup with") 959 960 // Restores a deleted member 961 // Ensure new CreateAt > previous CreateAt for the same (groupId, userId) 962 time.Sleep(1 * time.Millisecond) 963 _, err = ss.Group().UpsertMember(group.Id, user.Id) 964 require.NoError(t, err) 965 966 _, err = ss.Group().DeleteMember(group.Id, user.Id) 967 require.NoError(t, err) 968 969 groupMembers, err := ss.Group().GetMemberUsers(group.Id) 970 beforeRestoreCount := len(groupMembers) 971 972 _, err = ss.Group().UpsertMember(group.Id, user.Id) 973 require.NoError(t, err) 974 975 groupMembers, err = ss.Group().GetMemberUsers(group.Id) 976 afterRestoreCount := len(groupMembers) 977 978 require.Equal(t, beforeRestoreCount+1, afterRestoreCount) 979 } 980 981 func testGroupDeleteMember(t *testing.T, ss store.Store) { 982 // Create group 983 g1 := &model.Group{ 984 Name: model.NewString(model.NewId()), 985 DisplayName: model.NewId(), 986 Source: model.GroupSourceLdap, 987 RemoteId: model.NewId(), 988 } 989 group, err := ss.Group().Create(g1) 990 require.NoError(t, err) 991 992 // Create user 993 u1 := &model.User{ 994 Email: MakeEmail(), 995 Username: model.NewId(), 996 } 997 user, nErr := ss.User().Save(u1) 998 require.NoError(t, nErr) 999 1000 // Create member 1001 d1, err := ss.Group().UpsertMember(group.Id, user.Id) 1002 require.NoError(t, err) 1003 1004 // Happy path 1005 d2, err := ss.Group().DeleteMember(group.Id, user.Id) 1006 require.NoError(t, err) 1007 require.Equal(t, d2.GroupId, group.Id) 1008 require.Equal(t, d2.UserId, user.Id) 1009 require.Equal(t, d2.CreateAt, d1.CreateAt) 1010 require.NotZero(t, d2.DeleteAt) 1011 1012 // Delete an already deleted member 1013 _, err = ss.Group().DeleteMember(group.Id, user.Id) 1014 var nfErr *store.ErrNotFound 1015 require.True(t, errors.As(err, &nfErr)) 1016 1017 // Delete with non-existent User 1018 _, err = ss.Group().DeleteMember(group.Id, model.NewId()) 1019 require.True(t, errors.As(err, &nfErr)) 1020 1021 // Delete non-existent Group 1022 _, err = ss.Group().DeleteMember(model.NewId(), group.Id) 1023 require.True(t, errors.As(err, &nfErr)) 1024 } 1025 1026 func testGroupPermanentDeleteMembersByUser(t *testing.T, ss store.Store) { 1027 var g *model.Group 1028 var groups []*model.Group 1029 numberOfGroups := 5 1030 1031 for i := 0; i < numberOfGroups; i++ { 1032 g = &model.Group{ 1033 Name: model.NewString(model.NewId()), 1034 DisplayName: model.NewId(), 1035 Source: model.GroupSourceLdap, 1036 RemoteId: model.NewId(), 1037 } 1038 group, err := ss.Group().Create(g) 1039 groups = append(groups, group) 1040 require.NoError(t, err) 1041 } 1042 1043 // Create user 1044 u1 := &model.User{ 1045 Email: MakeEmail(), 1046 Username: model.NewId(), 1047 } 1048 user, err := ss.User().Save(u1) 1049 require.NoError(t, err) 1050 1051 // Create members 1052 for _, group := range groups { 1053 _, err = ss.Group().UpsertMember(group.Id, user.Id) 1054 require.NoError(t, err) 1055 } 1056 1057 // Happy path 1058 err = ss.Group().PermanentDeleteMembersByUser(user.Id) 1059 require.NoError(t, err) 1060 } 1061 1062 func testCreateGroupSyncable(t *testing.T, ss store.Store) { 1063 // Invalid GroupID 1064 _, err := ss.Group().CreateGroupSyncable(model.NewGroupTeam("x", model.NewId(), false)) 1065 var appErr *model.AppError 1066 require.True(t, errors.As(err, &appErr)) 1067 require.Equal(t, appErr.Id, "model.group_syncable.group_id.app_error") 1068 1069 // Create Group 1070 g1 := &model.Group{ 1071 Name: model.NewString(model.NewId()), 1072 DisplayName: model.NewId(), 1073 Source: model.GroupSourceLdap, 1074 RemoteId: model.NewId(), 1075 } 1076 group, err := ss.Group().Create(g1) 1077 require.NoError(t, err) 1078 1079 // Create Team 1080 t1 := &model.Team{ 1081 DisplayName: "Name", 1082 Description: "Some description", 1083 CompanyName: "Some company name", 1084 AllowOpenInvite: false, 1085 InviteId: "inviteid0", 1086 Name: "z-z-" + model.NewId() + "a", 1087 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 1088 Type: model.TEAM_OPEN, 1089 } 1090 team, nErr := ss.Team().Save(t1) 1091 require.NoError(t, nErr) 1092 1093 // New GroupSyncable, happy path 1094 gt1 := model.NewGroupTeam(group.Id, team.Id, false) 1095 d1, err := ss.Group().CreateGroupSyncable(gt1) 1096 require.NoError(t, err) 1097 require.Equal(t, gt1.SyncableId, d1.SyncableId) 1098 require.Equal(t, gt1.GroupId, d1.GroupId) 1099 require.Equal(t, gt1.AutoAdd, d1.AutoAdd) 1100 require.NotZero(t, d1.CreateAt) 1101 require.Zero(t, d1.DeleteAt) 1102 } 1103 1104 func testGetGroupSyncable(t *testing.T, ss store.Store) { 1105 // Create a group 1106 g1 := &model.Group{ 1107 Name: model.NewString(model.NewId()), 1108 DisplayName: model.NewId(), 1109 Description: model.NewId(), 1110 Source: model.GroupSourceLdap, 1111 RemoteId: model.NewId(), 1112 } 1113 group, err := ss.Group().Create(g1) 1114 require.NoError(t, err) 1115 1116 // Create Team 1117 t1 := &model.Team{ 1118 DisplayName: "Name", 1119 Description: "Some description", 1120 CompanyName: "Some company name", 1121 AllowOpenInvite: false, 1122 InviteId: "inviteid0", 1123 Name: "z-z-" + model.NewId() + "a", 1124 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 1125 Type: model.TEAM_OPEN, 1126 } 1127 team, nErr := ss.Team().Save(t1) 1128 require.NoError(t, nErr) 1129 1130 // Create GroupSyncable 1131 gt1 := model.NewGroupTeam(group.Id, team.Id, false) 1132 groupTeam, err := ss.Group().CreateGroupSyncable(gt1) 1133 require.NoError(t, err) 1134 1135 // Get GroupSyncable 1136 dgt, err := ss.Group().GetGroupSyncable(groupTeam.GroupId, groupTeam.SyncableId, model.GroupSyncableTypeTeam) 1137 require.NoError(t, err) 1138 require.Equal(t, gt1.GroupId, dgt.GroupId) 1139 require.Equal(t, gt1.SyncableId, dgt.SyncableId) 1140 require.Equal(t, gt1.AutoAdd, dgt.AutoAdd) 1141 require.NotZero(t, gt1.CreateAt) 1142 require.NotZero(t, gt1.UpdateAt) 1143 require.Zero(t, gt1.DeleteAt) 1144 } 1145 1146 func testGetAllGroupSyncablesByGroup(t *testing.T, ss store.Store) { 1147 numGroupSyncables := 10 1148 1149 // Create group 1150 g := &model.Group{ 1151 Name: model.NewString(model.NewId()), 1152 DisplayName: model.NewId(), 1153 Description: model.NewId(), 1154 Source: model.GroupSourceLdap, 1155 RemoteId: model.NewId(), 1156 } 1157 group, err := ss.Group().Create(g) 1158 require.NoError(t, err) 1159 1160 groupTeams := []*model.GroupSyncable{} 1161 1162 // Create groupTeams 1163 for i := 0; i < numGroupSyncables; i++ { 1164 // Create Team 1165 t1 := &model.Team{ 1166 DisplayName: "Name", 1167 Description: "Some description", 1168 CompanyName: "Some company name", 1169 AllowOpenInvite: false, 1170 InviteId: "inviteid0", 1171 Name: "z-z-" + model.NewId() + "a", 1172 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 1173 Type: model.TEAM_OPEN, 1174 } 1175 var team *model.Team 1176 team, nErr := ss.Team().Save(t1) 1177 require.NoError(t, nErr) 1178 1179 // create groupteam 1180 var groupTeam *model.GroupSyncable 1181 gt := model.NewGroupTeam(group.Id, team.Id, false) 1182 gt.SchemeAdmin = true 1183 groupTeam, err = ss.Group().CreateGroupSyncable(gt) 1184 require.NoError(t, err) 1185 groupTeams = append(groupTeams, groupTeam) 1186 } 1187 1188 // Returns all the group teams 1189 d1, err := ss.Group().GetAllGroupSyncablesByGroupId(group.Id, model.GroupSyncableTypeTeam) 1190 require.NoError(t, err) 1191 require.Condition(t, func() bool { return len(d1) >= numGroupSyncables }) 1192 for _, expectedGroupTeam := range groupTeams { 1193 present := false 1194 for _, dbGroupTeam := range d1 { 1195 if dbGroupTeam.GroupId == expectedGroupTeam.GroupId && dbGroupTeam.SyncableId == expectedGroupTeam.SyncableId { 1196 require.True(t, dbGroupTeam.SchemeAdmin) 1197 present = true 1198 break 1199 } 1200 } 1201 require.True(t, present) 1202 } 1203 } 1204 1205 func testUpdateGroupSyncable(t *testing.T, ss store.Store) { 1206 // Create Group 1207 g1 := &model.Group{ 1208 Name: model.NewString(model.NewId()), 1209 DisplayName: model.NewId(), 1210 Source: model.GroupSourceLdap, 1211 RemoteId: model.NewId(), 1212 } 1213 group, err := ss.Group().Create(g1) 1214 require.NoError(t, err) 1215 1216 // Create Team 1217 t1 := &model.Team{ 1218 DisplayName: "Name", 1219 Description: "Some description", 1220 CompanyName: "Some company name", 1221 AllowOpenInvite: false, 1222 InviteId: "inviteid0", 1223 Name: "z-z-" + model.NewId() + "a", 1224 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 1225 Type: model.TEAM_OPEN, 1226 } 1227 team, nErr := ss.Team().Save(t1) 1228 require.NoError(t, nErr) 1229 1230 // New GroupSyncable, happy path 1231 gt1 := model.NewGroupTeam(group.Id, team.Id, false) 1232 d1, err := ss.Group().CreateGroupSyncable(gt1) 1233 require.NoError(t, err) 1234 1235 // Update existing group team 1236 gt1.AutoAdd = true 1237 d2, err := ss.Group().UpdateGroupSyncable(gt1) 1238 require.NoError(t, err) 1239 require.True(t, d2.AutoAdd) 1240 1241 // Non-existent Group 1242 gt2 := model.NewGroupTeam(model.NewId(), team.Id, false) 1243 _, err = ss.Group().UpdateGroupSyncable(gt2) 1244 var nfErr *store.ErrNotFound 1245 require.True(t, errors.As(err, &nfErr)) 1246 1247 // Non-existent Team 1248 gt3 := model.NewGroupTeam(group.Id, model.NewId(), false) 1249 _, err = ss.Group().UpdateGroupSyncable(gt3) 1250 require.True(t, errors.As(err, &nfErr)) 1251 1252 // Cannot update CreateAt or DeleteAt 1253 origCreateAt := d1.CreateAt 1254 d1.CreateAt = model.GetMillis() 1255 d1.AutoAdd = true 1256 d3, err := ss.Group().UpdateGroupSyncable(d1) 1257 require.NoError(t, err) 1258 require.Equal(t, origCreateAt, d3.CreateAt) 1259 1260 // Cannot update DeleteAt to arbitrary value 1261 d1.DeleteAt = 1 1262 _, err = ss.Group().UpdateGroupSyncable(d1) 1263 require.Error(t, err) 1264 require.Contains(t, err.Error(), "DeleteAt should be 0 when updating") 1265 1266 // Can update DeleteAt to 0 1267 d1.DeleteAt = 0 1268 d4, err := ss.Group().UpdateGroupSyncable(d1) 1269 require.NoError(t, err) 1270 require.Zero(t, d4.DeleteAt) 1271 } 1272 1273 func testDeleteGroupSyncable(t *testing.T, ss store.Store) { 1274 // Create Group 1275 g1 := &model.Group{ 1276 Name: model.NewString(model.NewId()), 1277 DisplayName: model.NewId(), 1278 Source: model.GroupSourceLdap, 1279 RemoteId: model.NewId(), 1280 } 1281 group, err := ss.Group().Create(g1) 1282 require.NoError(t, err) 1283 1284 // Create Team 1285 t1 := &model.Team{ 1286 DisplayName: "Name", 1287 Description: "Some description", 1288 CompanyName: "Some company name", 1289 AllowOpenInvite: false, 1290 InviteId: "inviteid0", 1291 Name: "z-z-" + model.NewId() + "a", 1292 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 1293 Type: model.TEAM_OPEN, 1294 } 1295 team, nErr := ss.Team().Save(t1) 1296 require.NoError(t, nErr) 1297 1298 // Create GroupSyncable 1299 gt1 := model.NewGroupTeam(group.Id, team.Id, false) 1300 groupTeam, err := ss.Group().CreateGroupSyncable(gt1) 1301 require.NoError(t, err) 1302 1303 // Non-existent Group 1304 _, err = ss.Group().DeleteGroupSyncable(model.NewId(), groupTeam.SyncableId, model.GroupSyncableTypeTeam) 1305 var nfErr *store.ErrNotFound 1306 require.True(t, errors.As(err, &nfErr)) 1307 1308 // Non-existent Team 1309 _, err = ss.Group().DeleteGroupSyncable(groupTeam.GroupId, model.NewId(), model.GroupSyncableTypeTeam) 1310 require.True(t, errors.As(err, &nfErr)) 1311 1312 // Happy path... 1313 d1, err := ss.Group().DeleteGroupSyncable(groupTeam.GroupId, groupTeam.SyncableId, model.GroupSyncableTypeTeam) 1314 require.NoError(t, err) 1315 require.NotZero(t, d1.DeleteAt) 1316 require.Equal(t, d1.GroupId, groupTeam.GroupId) 1317 require.Equal(t, d1.SyncableId, groupTeam.SyncableId) 1318 require.Equal(t, d1.AutoAdd, groupTeam.AutoAdd) 1319 require.Equal(t, d1.CreateAt, groupTeam.CreateAt) 1320 require.Condition(t, func() bool { return d1.UpdateAt > groupTeam.UpdateAt }) 1321 1322 // Record already deleted 1323 _, err = ss.Group().DeleteGroupSyncable(d1.GroupId, d1.SyncableId, d1.Type) 1324 require.Error(t, err) 1325 var invErr *store.ErrInvalidInput 1326 require.True(t, errors.As(err, &invErr)) 1327 } 1328 1329 func testTeamMembersToAdd(t *testing.T, ss store.Store) { 1330 // Create Group 1331 group, err := ss.Group().Create(&model.Group{ 1332 Name: model.NewString(model.NewId()), 1333 DisplayName: "TeamMembersToAdd Test Group", 1334 RemoteId: model.NewId(), 1335 Source: model.GroupSourceLdap, 1336 }) 1337 require.NoError(t, err) 1338 1339 // Create User 1340 user := &model.User{ 1341 Email: MakeEmail(), 1342 Username: model.NewId(), 1343 } 1344 user, nErr := ss.User().Save(user) 1345 require.NoError(t, nErr) 1346 1347 // Create GroupMember 1348 _, err = ss.Group().UpsertMember(group.Id, user.Id) 1349 require.NoError(t, err) 1350 1351 // Create Team 1352 team := &model.Team{ 1353 DisplayName: "Name", 1354 Description: "Some description", 1355 CompanyName: "Some company name", 1356 AllowOpenInvite: false, 1357 InviteId: "inviteid0", 1358 Name: "z-z-" + model.NewId() + "a", 1359 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 1360 Type: model.TEAM_OPEN, 1361 } 1362 team, nErr = ss.Team().Save(team) 1363 require.NoError(t, nErr) 1364 1365 // Create GroupTeam 1366 syncable, err := ss.Group().CreateGroupSyncable(model.NewGroupTeam(group.Id, team.Id, true)) 1367 require.NoError(t, err) 1368 1369 // Time before syncable was created 1370 teamMembers, err := ss.Group().TeamMembersToAdd(syncable.CreateAt-1, nil, false) 1371 require.NoError(t, err) 1372 require.Len(t, teamMembers, 1) 1373 require.Equal(t, user.Id, teamMembers[0].UserID) 1374 require.Equal(t, team.Id, teamMembers[0].TeamID) 1375 1376 // Time after syncable was created 1377 teamMembers, err = ss.Group().TeamMembersToAdd(syncable.CreateAt+1, nil, false) 1378 require.NoError(t, err) 1379 require.Empty(t, teamMembers) 1380 1381 // Delete and restore GroupMember should return result 1382 _, err = ss.Group().DeleteMember(group.Id, user.Id) 1383 require.NoError(t, err) 1384 _, err = ss.Group().UpsertMember(group.Id, user.Id) 1385 require.NoError(t, err) 1386 teamMembers, err = ss.Group().TeamMembersToAdd(syncable.CreateAt+1, nil, false) 1387 require.NoError(t, err) 1388 require.Len(t, teamMembers, 1) 1389 1390 pristineSyncable := *syncable 1391 1392 _, err = ss.Group().UpdateGroupSyncable(syncable) 1393 require.NoError(t, err) 1394 1395 // Time before syncable was updated 1396 teamMembers, err = ss.Group().TeamMembersToAdd(syncable.UpdateAt-1, nil, false) 1397 require.NoError(t, err) 1398 require.Len(t, teamMembers, 1) 1399 require.Equal(t, user.Id, teamMembers[0].UserID) 1400 require.Equal(t, team.Id, teamMembers[0].TeamID) 1401 1402 // Time after syncable was updated 1403 teamMembers, err = ss.Group().TeamMembersToAdd(syncable.UpdateAt+1, nil, false) 1404 require.NoError(t, err) 1405 require.Empty(t, teamMembers) 1406 1407 // Only includes if auto-add 1408 syncable.AutoAdd = false 1409 _, err = ss.Group().UpdateGroupSyncable(syncable) 1410 require.NoError(t, err) 1411 teamMembers, err = ss.Group().TeamMembersToAdd(0, nil, false) 1412 require.NoError(t, err) 1413 require.Empty(t, teamMembers) 1414 1415 // reset state of syncable and verify 1416 _, err = ss.Group().UpdateGroupSyncable(&pristineSyncable) 1417 require.NoError(t, err) 1418 teamMembers, err = ss.Group().TeamMembersToAdd(0, nil, false) 1419 require.NoError(t, err) 1420 require.Len(t, teamMembers, 1) 1421 1422 // No result if Group deleted 1423 _, err = ss.Group().Delete(group.Id) 1424 require.NoError(t, err) 1425 teamMembers, err = ss.Group().TeamMembersToAdd(0, nil, false) 1426 require.NoError(t, err) 1427 require.Empty(t, teamMembers) 1428 1429 // reset state of group and verify 1430 group.DeleteAt = 0 1431 _, err = ss.Group().Update(group) 1432 require.NoError(t, err) 1433 teamMembers, err = ss.Group().TeamMembersToAdd(0, nil, false) 1434 require.NoError(t, err) 1435 require.Len(t, teamMembers, 1) 1436 1437 // No result if Team deleted 1438 team.DeleteAt = model.GetMillis() 1439 team, nErr = ss.Team().Update(team) 1440 require.NoError(t, nErr) 1441 teamMembers, err = ss.Group().TeamMembersToAdd(0, nil, false) 1442 require.NoError(t, err) 1443 require.Empty(t, teamMembers) 1444 1445 // reset state of team and verify 1446 team.DeleteAt = 0 1447 team, nErr = ss.Team().Update(team) 1448 require.NoError(t, nErr) 1449 teamMembers, err = ss.Group().TeamMembersToAdd(0, nil, false) 1450 require.NoError(t, err) 1451 require.Len(t, teamMembers, 1) 1452 1453 // No result if GroupTeam deleted 1454 _, err = ss.Group().DeleteGroupSyncable(group.Id, team.Id, model.GroupSyncableTypeTeam) 1455 require.NoError(t, err) 1456 teamMembers, err = ss.Group().TeamMembersToAdd(0, nil, false) 1457 require.NoError(t, err) 1458 require.Empty(t, teamMembers) 1459 1460 // reset GroupTeam and verify 1461 _, err = ss.Group().UpdateGroupSyncable(&pristineSyncable) 1462 require.NoError(t, err) 1463 teamMembers, err = ss.Group().TeamMembersToAdd(0, nil, false) 1464 require.NoError(t, err) 1465 require.Len(t, teamMembers, 1) 1466 1467 // No result if GroupMember deleted 1468 _, err = ss.Group().DeleteMember(group.Id, user.Id) 1469 require.NoError(t, err) 1470 teamMembers, err = ss.Group().TeamMembersToAdd(0, nil, false) 1471 require.NoError(t, err) 1472 require.Empty(t, teamMembers) 1473 1474 // restore group member and verify 1475 _, err = ss.Group().UpsertMember(group.Id, user.Id) 1476 require.NoError(t, err) 1477 teamMembers, err = ss.Group().TeamMembersToAdd(0, nil, false) 1478 require.NoError(t, err) 1479 require.Len(t, teamMembers, 1) 1480 1481 // adding team membership stops returning result 1482 _, nErr = ss.Team().SaveMember(&model.TeamMember{ 1483 TeamId: team.Id, 1484 UserId: user.Id, 1485 }, 999) 1486 require.NoError(t, nErr) 1487 teamMembers, err = ss.Group().TeamMembersToAdd(0, nil, false) 1488 require.NoError(t, err) 1489 require.Empty(t, teamMembers) 1490 1491 // Leaving Team should still not return result 1492 _, nErr = ss.Team().UpdateMember(&model.TeamMember{ 1493 TeamId: team.Id, 1494 UserId: user.Id, 1495 DeleteAt: model.GetMillis(), 1496 }) 1497 require.NoError(t, nErr) 1498 teamMembers, err = ss.Group().TeamMembersToAdd(0, nil, false) 1499 require.NoError(t, err) 1500 require.Empty(t, teamMembers) 1501 1502 // If includeRemovedMembers is set to true, removed members should be added back in 1503 teamMembers, err = ss.Group().TeamMembersToAdd(0, nil, true) 1504 require.NoError(t, err) 1505 require.Len(t, teamMembers, 1) 1506 } 1507 1508 func testTeamMembersToAddSingleTeam(t *testing.T, ss store.Store) { 1509 group1, err := ss.Group().Create(&model.Group{ 1510 Name: model.NewString(model.NewId()), 1511 DisplayName: "TeamMembersToAdd Test Group", 1512 RemoteId: model.NewId(), 1513 Source: model.GroupSourceLdap, 1514 }) 1515 require.NoError(t, err) 1516 1517 group2, err := ss.Group().Create(&model.Group{ 1518 Name: model.NewString(model.NewId()), 1519 DisplayName: "TeamMembersToAdd Test Group", 1520 RemoteId: model.NewId(), 1521 Source: model.GroupSourceLdap, 1522 }) 1523 require.NoError(t, err) 1524 1525 user1 := &model.User{ 1526 Email: MakeEmail(), 1527 Username: model.NewId(), 1528 } 1529 user1, nErr := ss.User().Save(user1) 1530 require.NoError(t, nErr) 1531 1532 user2 := &model.User{ 1533 Email: MakeEmail(), 1534 Username: model.NewId(), 1535 } 1536 user2, nErr = ss.User().Save(user2) 1537 require.NoError(t, nErr) 1538 1539 user3 := &model.User{ 1540 Email: MakeEmail(), 1541 Username: model.NewId(), 1542 } 1543 user3, nErr = ss.User().Save(user3) 1544 require.NoError(t, nErr) 1545 1546 for _, user := range []*model.User{user1, user2} { 1547 _, err = ss.Group().UpsertMember(group1.Id, user.Id) 1548 require.NoError(t, err) 1549 } 1550 _, err = ss.Group().UpsertMember(group2.Id, user3.Id) 1551 require.NoError(t, err) 1552 1553 team1 := &model.Team{ 1554 DisplayName: "Name", 1555 Description: "Some description", 1556 CompanyName: "Some company name", 1557 AllowOpenInvite: false, 1558 InviteId: "inviteid0", 1559 Name: "z-z-" + model.NewId() + "a", 1560 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 1561 Type: model.TEAM_OPEN, 1562 } 1563 team1, nErr = ss.Team().Save(team1) 1564 require.NoError(t, nErr) 1565 1566 team2 := &model.Team{ 1567 DisplayName: "Name", 1568 Description: "Some description", 1569 CompanyName: "Some company name", 1570 AllowOpenInvite: false, 1571 InviteId: "inviteid0", 1572 Name: "z-z-" + model.NewId() + "a", 1573 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 1574 Type: model.TEAM_OPEN, 1575 } 1576 team2, nErr = ss.Team().Save(team2) 1577 require.NoError(t, nErr) 1578 1579 _, err = ss.Group().CreateGroupSyncable(model.NewGroupTeam(group1.Id, team1.Id, true)) 1580 require.NoError(t, err) 1581 1582 _, err = ss.Group().CreateGroupSyncable(model.NewGroupTeam(group2.Id, team2.Id, true)) 1583 require.NoError(t, err) 1584 1585 teamMembers, err := ss.Group().TeamMembersToAdd(0, nil, false) 1586 require.NoError(t, err) 1587 require.Len(t, teamMembers, 3) 1588 1589 teamMembers, err = ss.Group().TeamMembersToAdd(0, &team1.Id, false) 1590 require.NoError(t, err) 1591 require.Len(t, teamMembers, 2) 1592 1593 teamMembers, err = ss.Group().TeamMembersToAdd(0, &team2.Id, false) 1594 require.NoError(t, err) 1595 require.Len(t, teamMembers, 1) 1596 } 1597 1598 func testChannelMembersToAdd(t *testing.T, ss store.Store) { 1599 // Create Group 1600 group, err := ss.Group().Create(&model.Group{ 1601 Name: model.NewString(model.NewId()), 1602 DisplayName: "ChannelMembersToAdd Test Group", 1603 RemoteId: model.NewId(), 1604 Source: model.GroupSourceLdap, 1605 }) 1606 require.NoError(t, err) 1607 1608 // Create User 1609 user := &model.User{ 1610 Email: MakeEmail(), 1611 Username: model.NewId(), 1612 } 1613 user, nErr := ss.User().Save(user) 1614 require.NoError(t, nErr) 1615 1616 // Create GroupMember 1617 _, err = ss.Group().UpsertMember(group.Id, user.Id) 1618 require.NoError(t, err) 1619 1620 // Create Channel 1621 channel := &model.Channel{ 1622 TeamId: model.NewId(), 1623 DisplayName: "A Name", 1624 Name: model.NewId(), 1625 Type: model.CHANNEL_OPEN, // Query does not look at type so this shouldn't matter. 1626 } 1627 channel, nErr = ss.Channel().Save(channel, 9999) 1628 require.NoError(t, nErr) 1629 1630 // Create GroupChannel 1631 syncable, err := ss.Group().CreateGroupSyncable(model.NewGroupChannel(group.Id, channel.Id, true)) 1632 require.NoError(t, err) 1633 1634 // Time before syncable was created 1635 channelMembers, err := ss.Group().ChannelMembersToAdd(syncable.CreateAt-1, nil, false) 1636 require.NoError(t, err) 1637 require.Len(t, channelMembers, 1) 1638 require.Equal(t, user.Id, channelMembers[0].UserID) 1639 require.Equal(t, channel.Id, channelMembers[0].ChannelID) 1640 1641 // Time after syncable was created 1642 channelMembers, err = ss.Group().ChannelMembersToAdd(syncable.CreateAt+1, nil, false) 1643 require.NoError(t, err) 1644 require.Empty(t, channelMembers) 1645 1646 // Delete and restore GroupMember should return result 1647 _, err = ss.Group().DeleteMember(group.Id, user.Id) 1648 require.NoError(t, err) 1649 _, err = ss.Group().UpsertMember(group.Id, user.Id) 1650 require.NoError(t, err) 1651 channelMembers, err = ss.Group().ChannelMembersToAdd(syncable.CreateAt+1, nil, false) 1652 require.NoError(t, err) 1653 require.Len(t, channelMembers, 1) 1654 1655 pristineSyncable := *syncable 1656 1657 _, err = ss.Group().UpdateGroupSyncable(syncable) 1658 require.NoError(t, err) 1659 1660 // Time before syncable was updated 1661 channelMembers, err = ss.Group().ChannelMembersToAdd(syncable.UpdateAt-1, nil, false) 1662 require.NoError(t, err) 1663 require.Len(t, channelMembers, 1) 1664 require.Equal(t, user.Id, channelMembers[0].UserID) 1665 require.Equal(t, channel.Id, channelMembers[0].ChannelID) 1666 1667 // Time after syncable was updated 1668 channelMembers, err = ss.Group().ChannelMembersToAdd(syncable.UpdateAt+1, nil, false) 1669 require.NoError(t, err) 1670 require.Empty(t, channelMembers) 1671 1672 // Only includes if auto-add 1673 syncable.AutoAdd = false 1674 _, err = ss.Group().UpdateGroupSyncable(syncable) 1675 require.NoError(t, err) 1676 channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false) 1677 require.NoError(t, err) 1678 require.Empty(t, channelMembers) 1679 1680 // reset state of syncable and verify 1681 _, err = ss.Group().UpdateGroupSyncable(&pristineSyncable) 1682 require.NoError(t, err) 1683 channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false) 1684 require.NoError(t, err) 1685 require.Len(t, channelMembers, 1) 1686 1687 // No result if Group deleted 1688 _, err = ss.Group().Delete(group.Id) 1689 require.NoError(t, err) 1690 channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false) 1691 require.NoError(t, err) 1692 require.Empty(t, channelMembers) 1693 1694 // reset state of group and verify 1695 group.DeleteAt = 0 1696 _, err = ss.Group().Update(group) 1697 require.NoError(t, err) 1698 channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false) 1699 require.NoError(t, err) 1700 require.Len(t, channelMembers, 1) 1701 1702 // No result if Channel deleted 1703 nErr = ss.Channel().Delete(channel.Id, model.GetMillis()) 1704 require.NoError(t, nErr) 1705 channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false) 1706 require.NoError(t, err) 1707 require.Empty(t, channelMembers) 1708 1709 // reset state of channel and verify 1710 channel.DeleteAt = 0 1711 _, nErr = ss.Channel().Update(channel) 1712 require.NoError(t, nErr) 1713 channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false) 1714 require.NoError(t, err) 1715 require.Len(t, channelMembers, 1) 1716 1717 // No result if GroupChannel deleted 1718 _, err = ss.Group().DeleteGroupSyncable(group.Id, channel.Id, model.GroupSyncableTypeChannel) 1719 require.NoError(t, err) 1720 channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false) 1721 require.NoError(t, err) 1722 require.Empty(t, channelMembers) 1723 1724 // reset GroupChannel and verify 1725 _, err = ss.Group().UpdateGroupSyncable(&pristineSyncable) 1726 require.NoError(t, err) 1727 channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false) 1728 require.NoError(t, err) 1729 require.Len(t, channelMembers, 1) 1730 1731 // No result if GroupMember deleted 1732 _, err = ss.Group().DeleteMember(group.Id, user.Id) 1733 require.NoError(t, err) 1734 channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false) 1735 require.NoError(t, err) 1736 require.Empty(t, channelMembers) 1737 1738 // restore group member and verify 1739 _, err = ss.Group().UpsertMember(group.Id, user.Id) 1740 require.NoError(t, err) 1741 channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false) 1742 require.NoError(t, err) 1743 require.Len(t, channelMembers, 1) 1744 1745 // Adding Channel (ChannelMemberHistory) should stop returning result 1746 nErr = ss.ChannelMemberHistory().LogJoinEvent(user.Id, channel.Id, model.GetMillis()) 1747 require.NoError(t, nErr) 1748 channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false) 1749 require.NoError(t, err) 1750 require.Empty(t, channelMembers) 1751 1752 // Leaving Channel (ChannelMemberHistory) should still not return result 1753 nErr = ss.ChannelMemberHistory().LogLeaveEvent(user.Id, channel.Id, model.GetMillis()) 1754 require.NoError(t, nErr) 1755 channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false) 1756 require.NoError(t, err) 1757 require.Empty(t, channelMembers) 1758 1759 // Purging ChannelMemberHistory re-returns the result 1760 _, _, nErr = ss.ChannelMemberHistory().PermanentDeleteBatchForRetentionPolicies( 1761 0, model.GetMillis()+1, 100, model.RetentionPolicyCursor{}) 1762 require.NoError(t, nErr) 1763 channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false) 1764 require.NoError(t, err) 1765 require.Len(t, channelMembers, 1) 1766 1767 // If includeRemovedMembers is set to true, removed members should be added back in 1768 nErr = ss.ChannelMemberHistory().LogLeaveEvent(user.Id, channel.Id, model.GetMillis()) 1769 require.NoError(t, nErr) 1770 channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, true) 1771 require.NoError(t, err) 1772 require.Len(t, channelMembers, 1) 1773 } 1774 1775 func testChannelMembersToAddSingleChannel(t *testing.T, ss store.Store) { 1776 group1, err := ss.Group().Create(&model.Group{ 1777 Name: model.NewString(model.NewId()), 1778 DisplayName: "TeamMembersToAdd Test Group", 1779 RemoteId: model.NewId(), 1780 Source: model.GroupSourceLdap, 1781 }) 1782 require.NoError(t, err) 1783 1784 group2, err := ss.Group().Create(&model.Group{ 1785 Name: model.NewString(model.NewId()), 1786 DisplayName: "TeamMembersToAdd Test Group", 1787 RemoteId: model.NewId(), 1788 Source: model.GroupSourceLdap, 1789 }) 1790 require.NoError(t, err) 1791 1792 user1 := &model.User{ 1793 Email: MakeEmail(), 1794 Username: model.NewId(), 1795 } 1796 user1, nErr := ss.User().Save(user1) 1797 require.NoError(t, nErr) 1798 1799 user2 := &model.User{ 1800 Email: MakeEmail(), 1801 Username: model.NewId(), 1802 } 1803 user2, nErr = ss.User().Save(user2) 1804 require.NoError(t, nErr) 1805 1806 user3 := &model.User{ 1807 Email: MakeEmail(), 1808 Username: model.NewId(), 1809 } 1810 user3, nErr = ss.User().Save(user3) 1811 require.NoError(t, nErr) 1812 1813 for _, user := range []*model.User{user1, user2} { 1814 _, err = ss.Group().UpsertMember(group1.Id, user.Id) 1815 require.NoError(t, err) 1816 } 1817 _, err = ss.Group().UpsertMember(group2.Id, user3.Id) 1818 require.NoError(t, err) 1819 1820 channel1 := &model.Channel{ 1821 DisplayName: "Name", 1822 Name: "z-z-" + model.NewId() + "a", 1823 Type: model.CHANNEL_OPEN, 1824 } 1825 channel1, nErr = ss.Channel().Save(channel1, 999) 1826 require.NoError(t, nErr) 1827 1828 channel2 := &model.Channel{ 1829 DisplayName: "Name", 1830 Name: "z-z-" + model.NewId() + "a", 1831 Type: model.CHANNEL_OPEN, 1832 } 1833 channel2, nErr = ss.Channel().Save(channel2, 999) 1834 require.NoError(t, nErr) 1835 1836 _, err = ss.Group().CreateGroupSyncable(model.NewGroupChannel(group1.Id, channel1.Id, true)) 1837 require.NoError(t, err) 1838 1839 _, err = ss.Group().CreateGroupSyncable(model.NewGroupChannel(group2.Id, channel2.Id, true)) 1840 require.NoError(t, err) 1841 1842 channelMembers, err := ss.Group().ChannelMembersToAdd(0, nil, false) 1843 require.NoError(t, err) 1844 require.GreaterOrEqual(t, len(channelMembers), 3) 1845 1846 channelMembers, err = ss.Group().ChannelMembersToAdd(0, &channel1.Id, false) 1847 require.NoError(t, err) 1848 require.Len(t, channelMembers, 2) 1849 1850 channelMembers, err = ss.Group().ChannelMembersToAdd(0, &channel2.Id, false) 1851 require.NoError(t, err) 1852 require.Len(t, channelMembers, 1) 1853 } 1854 1855 func testTeamMembersToRemove(t *testing.T, ss store.Store) { 1856 data := pendingMemberRemovalsDataSetup(t, ss) 1857 1858 // one result when both users are in the group (for user C) 1859 teamMembers, err := ss.Group().TeamMembersToRemove(nil) 1860 require.NoError(t, err) 1861 require.Len(t, teamMembers, 1) 1862 require.Equal(t, data.UserC.Id, teamMembers[0].UserId) 1863 1864 _, err = ss.Group().DeleteMember(data.Group.Id, data.UserB.Id) 1865 require.NoError(t, err) 1866 1867 // user b and c should now be returned 1868 teamMembers, err = ss.Group().TeamMembersToRemove(nil) 1869 require.NoError(t, err) 1870 require.Len(t, teamMembers, 2) 1871 1872 var userIDs []string 1873 for _, item := range teamMembers { 1874 userIDs = append(userIDs, item.UserId) 1875 } 1876 require.Contains(t, userIDs, data.UserB.Id) 1877 require.Contains(t, userIDs, data.UserC.Id) 1878 require.Equal(t, data.ConstrainedTeam.Id, teamMembers[0].TeamId) 1879 require.Equal(t, data.ConstrainedTeam.Id, teamMembers[1].TeamId) 1880 1881 _, err = ss.Group().DeleteMember(data.Group.Id, data.UserA.Id) 1882 require.NoError(t, err) 1883 1884 teamMembers, err = ss.Group().TeamMembersToRemove(nil) 1885 require.NoError(t, err) 1886 require.Len(t, teamMembers, 3) 1887 1888 // Make one of them a bot 1889 teamMembers, err = ss.Group().TeamMembersToRemove(nil) 1890 require.NoError(t, err) 1891 teamMember := teamMembers[0] 1892 bot := &model.Bot{ 1893 UserId: teamMember.UserId, 1894 Username: "un_" + model.NewId(), 1895 DisplayName: "dn_" + model.NewId(), 1896 OwnerId: teamMember.UserId, 1897 } 1898 bot, nErr := ss.Bot().Save(bot) 1899 require.NoError(t, nErr) 1900 1901 // verify that bot is not returned in results 1902 teamMembers, err = ss.Group().TeamMembersToRemove(nil) 1903 require.NoError(t, err) 1904 require.Len(t, teamMembers, 2) 1905 1906 // delete the bot 1907 nErr = ss.Bot().PermanentDelete(bot.UserId) 1908 require.NoError(t, nErr) 1909 1910 // Should be back to 3 users 1911 teamMembers, err = ss.Group().TeamMembersToRemove(nil) 1912 require.NoError(t, err) 1913 require.Len(t, teamMembers, 3) 1914 1915 // add users back to groups 1916 res := ss.Team().RemoveMember(data.ConstrainedTeam.Id, data.UserA.Id) 1917 require.NoError(t, res) 1918 res = ss.Team().RemoveMember(data.ConstrainedTeam.Id, data.UserB.Id) 1919 require.NoError(t, res) 1920 res = ss.Team().RemoveMember(data.ConstrainedTeam.Id, data.UserC.Id) 1921 require.NoError(t, res) 1922 nErr = ss.Channel().RemoveMember(data.ConstrainedChannel.Id, data.UserA.Id) 1923 require.NoError(t, nErr) 1924 nErr = ss.Channel().RemoveMember(data.ConstrainedChannel.Id, data.UserB.Id) 1925 require.NoError(t, nErr) 1926 nErr = ss.Channel().RemoveMember(data.ConstrainedChannel.Id, data.UserC.Id) 1927 require.NoError(t, nErr) 1928 } 1929 1930 func testTeamMembersToRemoveSingleTeam(t *testing.T, ss store.Store) { 1931 user1 := &model.User{ 1932 Email: MakeEmail(), 1933 Username: model.NewId(), 1934 } 1935 user1, err := ss.User().Save(user1) 1936 require.NoError(t, err) 1937 1938 user2 := &model.User{ 1939 Email: MakeEmail(), 1940 Username: model.NewId(), 1941 } 1942 user2, err = ss.User().Save(user2) 1943 require.NoError(t, err) 1944 1945 user3 := &model.User{ 1946 Email: MakeEmail(), 1947 Username: model.NewId(), 1948 } 1949 user3, err = ss.User().Save(user3) 1950 require.NoError(t, err) 1951 1952 team1 := &model.Team{ 1953 DisplayName: "Name", 1954 Description: "Some description", 1955 CompanyName: "Some company name", 1956 AllowOpenInvite: false, 1957 InviteId: "inviteid0", 1958 Name: "z-z-" + model.NewId() + "a", 1959 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 1960 Type: model.TEAM_OPEN, 1961 GroupConstrained: model.NewBool(true), 1962 } 1963 team1, nErr := ss.Team().Save(team1) 1964 require.NoError(t, nErr) 1965 1966 team2 := &model.Team{ 1967 DisplayName: "Name", 1968 Description: "Some description", 1969 CompanyName: "Some company name", 1970 AllowOpenInvite: false, 1971 InviteId: "inviteid0", 1972 Name: "z-z-" + model.NewId() + "a", 1973 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 1974 Type: model.TEAM_OPEN, 1975 GroupConstrained: model.NewBool(true), 1976 } 1977 team2, nErr = ss.Team().Save(team2) 1978 require.NoError(t, nErr) 1979 1980 for _, user := range []*model.User{user1, user2} { 1981 _, nErr = ss.Team().SaveMember(&model.TeamMember{ 1982 TeamId: team1.Id, 1983 UserId: user.Id, 1984 }, 999) 1985 require.NoError(t, nErr) 1986 } 1987 1988 _, nErr = ss.Team().SaveMember(&model.TeamMember{ 1989 TeamId: team2.Id, 1990 UserId: user3.Id, 1991 }, 999) 1992 require.NoError(t, nErr) 1993 1994 teamMembers, err := ss.Group().TeamMembersToRemove(nil) 1995 require.NoError(t, err) 1996 require.Len(t, teamMembers, 3) 1997 1998 teamMembers, err = ss.Group().TeamMembersToRemove(&team1.Id) 1999 require.NoError(t, err) 2000 require.Len(t, teamMembers, 2) 2001 2002 teamMembers, err = ss.Group().TeamMembersToRemove(&team2.Id) 2003 require.NoError(t, err) 2004 require.Len(t, teamMembers, 1) 2005 } 2006 2007 func testChannelMembersToRemove(t *testing.T, ss store.Store) { 2008 data := pendingMemberRemovalsDataSetup(t, ss) 2009 2010 // one result when both users are in the group (for user C) 2011 channelMembers, err := ss.Group().ChannelMembersToRemove(nil) 2012 require.NoError(t, err) 2013 require.Len(t, channelMembers, 1) 2014 require.Equal(t, data.UserC.Id, channelMembers[0].UserId) 2015 2016 _, err = ss.Group().DeleteMember(data.Group.Id, data.UserB.Id) 2017 require.NoError(t, err) 2018 2019 // user b and c should now be returned 2020 channelMembers, err = ss.Group().ChannelMembersToRemove(nil) 2021 require.NoError(t, err) 2022 require.Len(t, channelMembers, 2) 2023 2024 var userIDs []string 2025 for _, item := range channelMembers { 2026 userIDs = append(userIDs, item.UserId) 2027 } 2028 require.Contains(t, userIDs, data.UserB.Id) 2029 require.Contains(t, userIDs, data.UserC.Id) 2030 require.Equal(t, data.ConstrainedChannel.Id, channelMembers[0].ChannelId) 2031 require.Equal(t, data.ConstrainedChannel.Id, channelMembers[1].ChannelId) 2032 2033 _, err = ss.Group().DeleteMember(data.Group.Id, data.UserA.Id) 2034 require.NoError(t, err) 2035 2036 channelMembers, err = ss.Group().ChannelMembersToRemove(nil) 2037 require.NoError(t, err) 2038 require.Len(t, channelMembers, 3) 2039 2040 // Make one of them a bot 2041 channelMembers, err = ss.Group().ChannelMembersToRemove(nil) 2042 require.NoError(t, err) 2043 channelMember := channelMembers[0] 2044 bot := &model.Bot{ 2045 UserId: channelMember.UserId, 2046 Username: "un_" + model.NewId(), 2047 DisplayName: "dn_" + model.NewId(), 2048 OwnerId: channelMember.UserId, 2049 } 2050 bot, nErr := ss.Bot().Save(bot) 2051 require.NoError(t, nErr) 2052 2053 // verify that bot is not returned in results 2054 channelMembers, err = ss.Group().ChannelMembersToRemove(nil) 2055 require.NoError(t, err) 2056 require.Len(t, channelMembers, 2) 2057 2058 // delete the bot 2059 nErr = ss.Bot().PermanentDelete(bot.UserId) 2060 require.NoError(t, nErr) 2061 2062 // Should be back to 3 users 2063 channelMembers, err = ss.Group().ChannelMembersToRemove(nil) 2064 require.NoError(t, err) 2065 require.Len(t, channelMembers, 3) 2066 2067 // add users back to groups 2068 res := ss.Team().RemoveMember(data.ConstrainedTeam.Id, data.UserA.Id) 2069 require.NoError(t, res) 2070 res = ss.Team().RemoveMember(data.ConstrainedTeam.Id, data.UserB.Id) 2071 require.NoError(t, res) 2072 res = ss.Team().RemoveMember(data.ConstrainedTeam.Id, data.UserC.Id) 2073 require.NoError(t, res) 2074 nErr = ss.Channel().RemoveMember(data.ConstrainedChannel.Id, data.UserA.Id) 2075 require.NoError(t, nErr) 2076 nErr = ss.Channel().RemoveMember(data.ConstrainedChannel.Id, data.UserB.Id) 2077 require.NoError(t, nErr) 2078 nErr = ss.Channel().RemoveMember(data.ConstrainedChannel.Id, data.UserC.Id) 2079 require.NoError(t, nErr) 2080 } 2081 2082 func testChannelMembersToRemoveSingleChannel(t *testing.T, ss store.Store) { 2083 user1 := &model.User{ 2084 Email: MakeEmail(), 2085 Username: model.NewId(), 2086 } 2087 user1, err := ss.User().Save(user1) 2088 require.NoError(t, err) 2089 2090 user2 := &model.User{ 2091 Email: MakeEmail(), 2092 Username: model.NewId(), 2093 } 2094 user2, err = ss.User().Save(user2) 2095 require.NoError(t, err) 2096 2097 user3 := &model.User{ 2098 Email: MakeEmail(), 2099 Username: model.NewId(), 2100 } 2101 user3, err = ss.User().Save(user3) 2102 require.NoError(t, err) 2103 2104 channel1 := &model.Channel{ 2105 DisplayName: "Name", 2106 Name: "z-z-" + model.NewId() + "a", 2107 Type: model.CHANNEL_OPEN, 2108 GroupConstrained: model.NewBool(true), 2109 } 2110 channel1, nErr := ss.Channel().Save(channel1, 999) 2111 require.NoError(t, nErr) 2112 2113 channel2 := &model.Channel{ 2114 DisplayName: "Name", 2115 Name: "z-z-" + model.NewId() + "a", 2116 Type: model.CHANNEL_OPEN, 2117 GroupConstrained: model.NewBool(true), 2118 } 2119 channel2, nErr = ss.Channel().Save(channel2, 999) 2120 require.NoError(t, nErr) 2121 2122 for _, user := range []*model.User{user1, user2} { 2123 _, nErr = ss.Channel().SaveMember(&model.ChannelMember{ 2124 ChannelId: channel1.Id, 2125 UserId: user.Id, 2126 NotifyProps: model.GetDefaultChannelNotifyProps(), 2127 }) 2128 require.NoError(t, nErr) 2129 } 2130 2131 _, nErr = ss.Channel().SaveMember(&model.ChannelMember{ 2132 ChannelId: channel2.Id, 2133 UserId: user3.Id, 2134 NotifyProps: model.GetDefaultChannelNotifyProps(), 2135 }) 2136 require.NoError(t, nErr) 2137 2138 channelMembers, err := ss.Group().ChannelMembersToRemove(nil) 2139 require.NoError(t, err) 2140 require.Len(t, channelMembers, 3) 2141 2142 channelMembers, err = ss.Group().ChannelMembersToRemove(&channel1.Id) 2143 require.NoError(t, err) 2144 require.Len(t, channelMembers, 2) 2145 2146 channelMembers, err = ss.Group().ChannelMembersToRemove(&channel2.Id) 2147 require.NoError(t, err) 2148 require.Len(t, channelMembers, 1) 2149 } 2150 2151 type removalsData struct { 2152 UserA *model.User 2153 UserB *model.User 2154 UserC *model.User 2155 ConstrainedChannel *model.Channel 2156 UnconstrainedChannel *model.Channel 2157 ConstrainedTeam *model.Team 2158 UnconstrainedTeam *model.Team 2159 Group *model.Group 2160 } 2161 2162 func pendingMemberRemovalsDataSetup(t *testing.T, ss store.Store) *removalsData { 2163 // create group 2164 group, err := ss.Group().Create(&model.Group{ 2165 Name: model.NewString(model.NewId()), 2166 DisplayName: "Pending[Channel|Team]MemberRemovals Test Group", 2167 RemoteId: model.NewId(), 2168 Source: model.GroupSourceLdap, 2169 }) 2170 require.NoError(t, err) 2171 2172 // create users 2173 // userA will get removed from the group 2174 userA := &model.User{ 2175 Email: MakeEmail(), 2176 Username: model.NewId(), 2177 } 2178 userA, nErr := ss.User().Save(userA) 2179 require.NoError(t, nErr) 2180 2181 // userB will not get removed from the group 2182 userB := &model.User{ 2183 Email: MakeEmail(), 2184 Username: model.NewId(), 2185 } 2186 userB, nErr = ss.User().Save(userB) 2187 require.NoError(t, nErr) 2188 2189 // userC was never in the group 2190 userC := &model.User{ 2191 Email: MakeEmail(), 2192 Username: model.NewId(), 2193 } 2194 userC, nErr = ss.User().Save(userC) 2195 require.NoError(t, nErr) 2196 2197 // add users to group (but not userC) 2198 _, err = ss.Group().UpsertMember(group.Id, userA.Id) 2199 require.NoError(t, err) 2200 2201 _, err = ss.Group().UpsertMember(group.Id, userB.Id) 2202 require.NoError(t, err) 2203 2204 // create channels 2205 channelConstrained := &model.Channel{ 2206 TeamId: model.NewId(), 2207 DisplayName: "A Name", 2208 Name: model.NewId(), 2209 Type: model.CHANNEL_PRIVATE, 2210 GroupConstrained: model.NewBool(true), 2211 } 2212 channelConstrained, nErr = ss.Channel().Save(channelConstrained, 9999) 2213 require.NoError(t, nErr) 2214 2215 channelUnconstrained := &model.Channel{ 2216 TeamId: model.NewId(), 2217 DisplayName: "A Name", 2218 Name: model.NewId(), 2219 Type: model.CHANNEL_PRIVATE, 2220 } 2221 channelUnconstrained, nErr = ss.Channel().Save(channelUnconstrained, 9999) 2222 require.NoError(t, nErr) 2223 2224 // create teams 2225 teamConstrained := &model.Team{ 2226 DisplayName: "Name", 2227 Description: "Some description", 2228 CompanyName: "Some company name", 2229 AllowOpenInvite: false, 2230 InviteId: "inviteid0", 2231 Name: "z-z-" + model.NewId() + "a", 2232 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 2233 Type: model.TEAM_INVITE, 2234 GroupConstrained: model.NewBool(true), 2235 } 2236 teamConstrained, nErr = ss.Team().Save(teamConstrained) 2237 require.NoError(t, nErr) 2238 2239 teamUnconstrained := &model.Team{ 2240 DisplayName: "Name", 2241 Description: "Some description", 2242 CompanyName: "Some company name", 2243 AllowOpenInvite: false, 2244 InviteId: "inviteid1", 2245 Name: "z-z-" + model.NewId() + "a", 2246 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 2247 Type: model.TEAM_INVITE, 2248 } 2249 teamUnconstrained, nErr = ss.Team().Save(teamUnconstrained) 2250 require.NoError(t, nErr) 2251 2252 // create groupteams 2253 _, err = ss.Group().CreateGroupSyncable(model.NewGroupTeam(group.Id, teamConstrained.Id, true)) 2254 require.NoError(t, err) 2255 2256 _, err = ss.Group().CreateGroupSyncable(model.NewGroupTeam(group.Id, teamUnconstrained.Id, true)) 2257 require.NoError(t, err) 2258 2259 // create groupchannels 2260 _, err = ss.Group().CreateGroupSyncable(model.NewGroupChannel(group.Id, channelConstrained.Id, true)) 2261 require.NoError(t, err) 2262 2263 _, err = ss.Group().CreateGroupSyncable(model.NewGroupChannel(group.Id, channelUnconstrained.Id, true)) 2264 require.NoError(t, err) 2265 2266 // add users to teams 2267 userIDTeamIDs := [][]string{ 2268 {userA.Id, teamConstrained.Id}, 2269 {userB.Id, teamConstrained.Id}, 2270 {userC.Id, teamConstrained.Id}, 2271 {userA.Id, teamUnconstrained.Id}, 2272 {userB.Id, teamUnconstrained.Id}, 2273 {userC.Id, teamUnconstrained.Id}, 2274 } 2275 2276 for _, item := range userIDTeamIDs { 2277 _, nErr = ss.Team().SaveMember(&model.TeamMember{ 2278 UserId: item[0], 2279 TeamId: item[1], 2280 }, 99) 2281 require.NoError(t, nErr) 2282 } 2283 2284 // add users to channels 2285 userIDChannelIDs := [][]string{ 2286 {userA.Id, channelConstrained.Id}, 2287 {userB.Id, channelConstrained.Id}, 2288 {userC.Id, channelConstrained.Id}, 2289 {userA.Id, channelUnconstrained.Id}, 2290 {userB.Id, channelUnconstrained.Id}, 2291 {userC.Id, channelUnconstrained.Id}, 2292 } 2293 2294 for _, item := range userIDChannelIDs { 2295 _, err := ss.Channel().SaveMember(&model.ChannelMember{ 2296 UserId: item[0], 2297 ChannelId: item[1], 2298 NotifyProps: model.GetDefaultChannelNotifyProps(), 2299 }) 2300 require.NoError(t, err) 2301 } 2302 2303 return &removalsData{ 2304 UserA: userA, 2305 UserB: userB, 2306 UserC: userC, 2307 ConstrainedChannel: channelConstrained, 2308 UnconstrainedChannel: channelUnconstrained, 2309 ConstrainedTeam: teamConstrained, 2310 UnconstrainedTeam: teamUnconstrained, 2311 Group: group, 2312 } 2313 } 2314 2315 func testGetGroupsByChannel(t *testing.T, ss store.Store) { 2316 // Create Channel1 2317 channel1 := &model.Channel{ 2318 TeamId: model.NewId(), 2319 DisplayName: "Channel1", 2320 Name: model.NewId(), 2321 Type: model.CHANNEL_OPEN, 2322 } 2323 channel1, err := ss.Channel().Save(channel1, 9999) 2324 require.NoError(t, err) 2325 2326 // Create Groups 1, 2 and a deleted group 2327 group1, err := ss.Group().Create(&model.Group{ 2328 Name: model.NewString(model.NewId()), 2329 DisplayName: "group-1", 2330 RemoteId: model.NewId(), 2331 Source: model.GroupSourceLdap, 2332 AllowReference: true, 2333 }) 2334 require.NoError(t, err) 2335 2336 group2, err := ss.Group().Create(&model.Group{ 2337 Name: model.NewString(model.NewId()), 2338 DisplayName: "group-2", 2339 RemoteId: model.NewId(), 2340 Source: model.GroupSourceLdap, 2341 AllowReference: false, 2342 }) 2343 require.NoError(t, err) 2344 2345 deletedGroup, err := ss.Group().Create(&model.Group{ 2346 Name: model.NewString(model.NewId()), 2347 DisplayName: "group-deleted", 2348 RemoteId: model.NewId(), 2349 Source: model.GroupSourceLdap, 2350 AllowReference: true, 2351 DeleteAt: 1, 2352 }) 2353 require.NoError(t, err) 2354 2355 // And associate them with Channel1 2356 for _, g := range []*model.Group{group1, group2, deletedGroup} { 2357 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 2358 AutoAdd: true, 2359 SyncableId: channel1.Id, 2360 Type: model.GroupSyncableTypeChannel, 2361 GroupId: g.Id, 2362 }) 2363 require.NoError(t, err) 2364 } 2365 2366 // Create Channel2 2367 channel2 := &model.Channel{ 2368 TeamId: model.NewId(), 2369 DisplayName: "Channel2", 2370 Name: model.NewId(), 2371 Type: model.CHANNEL_OPEN, 2372 } 2373 channel2, nErr := ss.Channel().Save(channel2, 9999) 2374 require.NoError(t, nErr) 2375 2376 // Create Group3 2377 group3, err := ss.Group().Create(&model.Group{ 2378 Name: model.NewString(model.NewId()), 2379 DisplayName: "group-3", 2380 RemoteId: model.NewId(), 2381 Source: model.GroupSourceLdap, 2382 AllowReference: true, 2383 }) 2384 require.NoError(t, err) 2385 2386 // And associate it to Channel2 2387 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 2388 AutoAdd: true, 2389 SyncableId: channel2.Id, 2390 Type: model.GroupSyncableTypeChannel, 2391 GroupId: group3.Id, 2392 }) 2393 require.NoError(t, err) 2394 2395 // add members 2396 u1 := &model.User{ 2397 Email: MakeEmail(), 2398 Username: model.NewId(), 2399 } 2400 user1, err := ss.User().Save(u1) 2401 require.NoError(t, err) 2402 2403 u2 := &model.User{ 2404 Email: MakeEmail(), 2405 Username: model.NewId(), 2406 } 2407 user2, err := ss.User().Save(u2) 2408 require.NoError(t, err) 2409 2410 _, err = ss.Group().UpsertMember(group1.Id, user1.Id) 2411 require.NoError(t, err) 2412 2413 _, err = ss.Group().UpsertMember(group1.Id, user2.Id) 2414 require.NoError(t, err) 2415 2416 user2.DeleteAt = 1 2417 _, err = ss.User().Update(user2, true) 2418 require.NoError(t, err) 2419 2420 group1WithMemberCount := *group1 2421 group1WithMemberCount.MemberCount = model.NewInt(1) 2422 2423 group2WithMemberCount := *group2 2424 group2WithMemberCount.MemberCount = model.NewInt(0) 2425 2426 group1WSA := &model.GroupWithSchemeAdmin{Group: *group1, SchemeAdmin: model.NewBool(false)} 2427 group2WSA := &model.GroupWithSchemeAdmin{Group: *group2, SchemeAdmin: model.NewBool(false)} 2428 group3WSA := &model.GroupWithSchemeAdmin{Group: *group3, SchemeAdmin: model.NewBool(false)} 2429 2430 testCases := []struct { 2431 Name string 2432 ChannelId string 2433 Page int 2434 PerPage int 2435 Result []*model.GroupWithSchemeAdmin 2436 Opts model.GroupSearchOpts 2437 TotalCount *int64 2438 }{ 2439 { 2440 Name: "Get the two Groups for Channel1", 2441 ChannelId: channel1.Id, 2442 Opts: model.GroupSearchOpts{}, 2443 Page: 0, 2444 PerPage: 60, 2445 Result: []*model.GroupWithSchemeAdmin{group1WSA, group2WSA}, 2446 TotalCount: model.NewInt64(2), 2447 }, 2448 { 2449 Name: "Get first Group for Channel1 with page 0 with 1 element", 2450 ChannelId: channel1.Id, 2451 Opts: model.GroupSearchOpts{}, 2452 Page: 0, 2453 PerPage: 1, 2454 Result: []*model.GroupWithSchemeAdmin{group1WSA}, 2455 }, 2456 { 2457 Name: "Get second Group for Channel1 with page 1 with 1 element", 2458 ChannelId: channel1.Id, 2459 Opts: model.GroupSearchOpts{}, 2460 Page: 1, 2461 PerPage: 1, 2462 Result: []*model.GroupWithSchemeAdmin{group2WSA}, 2463 }, 2464 { 2465 Name: "Get third Group for Channel2", 2466 ChannelId: channel2.Id, 2467 Opts: model.GroupSearchOpts{}, 2468 Page: 0, 2469 PerPage: 60, 2470 Result: []*model.GroupWithSchemeAdmin{group3WSA}, 2471 }, 2472 { 2473 Name: "Get empty Groups for a fake id", 2474 ChannelId: model.NewId(), 2475 Opts: model.GroupSearchOpts{}, 2476 Page: 0, 2477 PerPage: 60, 2478 Result: []*model.GroupWithSchemeAdmin{}, 2479 TotalCount: model.NewInt64(0), 2480 }, 2481 { 2482 Name: "Get group matching name", 2483 ChannelId: channel1.Id, 2484 Opts: model.GroupSearchOpts{Q: string([]rune(*group1.Name)[2:10])}, // very low change of a name collision 2485 Page: 0, 2486 PerPage: 100, 2487 Result: []*model.GroupWithSchemeAdmin{group1WSA}, 2488 TotalCount: model.NewInt64(1), 2489 }, 2490 { 2491 Name: "Get group matching display name", 2492 ChannelId: channel1.Id, 2493 Opts: model.GroupSearchOpts{Q: "rouP-1"}, 2494 Page: 0, 2495 PerPage: 100, 2496 Result: []*model.GroupWithSchemeAdmin{group1WSA}, 2497 TotalCount: model.NewInt64(1), 2498 }, 2499 { 2500 Name: "Get group matching multiple display names", 2501 ChannelId: channel1.Id, 2502 Opts: model.GroupSearchOpts{Q: "roUp-"}, 2503 Page: 0, 2504 PerPage: 100, 2505 Result: []*model.GroupWithSchemeAdmin{group1WSA, group2WSA}, 2506 TotalCount: model.NewInt64(2), 2507 }, 2508 { 2509 Name: "Include member counts", 2510 ChannelId: channel1.Id, 2511 Opts: model.GroupSearchOpts{IncludeMemberCount: true}, 2512 Page: 0, 2513 PerPage: 2, 2514 Result: []*model.GroupWithSchemeAdmin{ 2515 {Group: group1WithMemberCount, SchemeAdmin: model.NewBool(false)}, 2516 {Group: group2WithMemberCount, SchemeAdmin: model.NewBool(false)}, 2517 }, 2518 }, 2519 { 2520 Name: "Include allow reference", 2521 ChannelId: channel1.Id, 2522 Opts: model.GroupSearchOpts{FilterAllowReference: true}, 2523 Page: 0, 2524 PerPage: 100, 2525 Result: []*model.GroupWithSchemeAdmin{group1WSA}, 2526 }, 2527 } 2528 2529 for _, tc := range testCases { 2530 t.Run(tc.Name, func(t *testing.T) { 2531 if tc.Opts.PageOpts == nil { 2532 tc.Opts.PageOpts = &model.PageOpts{} 2533 } 2534 tc.Opts.PageOpts.Page = tc.Page 2535 tc.Opts.PageOpts.PerPage = tc.PerPage 2536 groups, err := ss.Group().GetGroupsByChannel(tc.ChannelId, tc.Opts) 2537 require.NoError(t, err) 2538 require.ElementsMatch(t, tc.Result, groups) 2539 if tc.TotalCount != nil { 2540 var count int64 2541 count, err = ss.Group().CountGroupsByChannel(tc.ChannelId, tc.Opts) 2542 require.NoError(t, err) 2543 require.Equal(t, *tc.TotalCount, count) 2544 } 2545 }) 2546 } 2547 } 2548 2549 func testGetGroupsAssociatedToChannelsByTeam(t *testing.T, ss store.Store) { 2550 // Create Team1 2551 team1 := &model.Team{ 2552 DisplayName: "Team1", 2553 Description: model.NewId(), 2554 CompanyName: model.NewId(), 2555 AllowOpenInvite: false, 2556 InviteId: model.NewId(), 2557 Name: "zz" + model.NewId(), 2558 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 2559 Type: model.TEAM_OPEN, 2560 } 2561 team1, errt := ss.Team().Save(team1) 2562 require.NoError(t, errt) 2563 2564 // Create Channel1 2565 channel1 := &model.Channel{ 2566 TeamId: team1.Id, 2567 DisplayName: "Channel1", 2568 Name: model.NewId(), 2569 Type: model.CHANNEL_OPEN, 2570 } 2571 channel1, err := ss.Channel().Save(channel1, 9999) 2572 require.NoError(t, err) 2573 2574 // Create Groups 1, 2 and a deleted group 2575 group1, err := ss.Group().Create(&model.Group{ 2576 Name: model.NewString(model.NewId()), 2577 DisplayName: "group-1", 2578 RemoteId: model.NewId(), 2579 Source: model.GroupSourceLdap, 2580 AllowReference: false, 2581 }) 2582 require.NoError(t, err) 2583 2584 group2, err := ss.Group().Create(&model.Group{ 2585 Name: model.NewString(model.NewId()), 2586 DisplayName: "group-2", 2587 RemoteId: model.NewId(), 2588 Source: model.GroupSourceLdap, 2589 AllowReference: true, 2590 }) 2591 require.NoError(t, err) 2592 2593 deletedGroup, err := ss.Group().Create(&model.Group{ 2594 Name: model.NewString(model.NewId()), 2595 DisplayName: "group-deleted", 2596 RemoteId: model.NewId(), 2597 Source: model.GroupSourceLdap, 2598 AllowReference: true, 2599 DeleteAt: 1, 2600 }) 2601 require.NoError(t, err) 2602 2603 // And associate them with Channel1 2604 for _, g := range []*model.Group{group1, group2, deletedGroup} { 2605 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 2606 AutoAdd: true, 2607 SyncableId: channel1.Id, 2608 Type: model.GroupSyncableTypeChannel, 2609 GroupId: g.Id, 2610 }) 2611 require.NoError(t, err) 2612 } 2613 2614 // Create Channel2 2615 channel2 := &model.Channel{ 2616 TeamId: team1.Id, 2617 DisplayName: "Channel2", 2618 Name: model.NewId(), 2619 Type: model.CHANNEL_OPEN, 2620 } 2621 channel2, err = ss.Channel().Save(channel2, 9999) 2622 require.NoError(t, err) 2623 2624 // Create Group3 2625 group3, err := ss.Group().Create(&model.Group{ 2626 Name: model.NewString(model.NewId()), 2627 DisplayName: "group-3", 2628 RemoteId: model.NewId(), 2629 Source: model.GroupSourceLdap, 2630 AllowReference: true, 2631 }) 2632 require.NoError(t, err) 2633 2634 // And associate it to Channel2 2635 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 2636 AutoAdd: true, 2637 SyncableId: channel2.Id, 2638 Type: model.GroupSyncableTypeChannel, 2639 GroupId: group3.Id, 2640 }) 2641 require.NoError(t, err) 2642 2643 // add members 2644 u1 := &model.User{ 2645 Email: MakeEmail(), 2646 Username: model.NewId(), 2647 } 2648 user1, err := ss.User().Save(u1) 2649 require.NoError(t, err) 2650 2651 u2 := &model.User{ 2652 Email: MakeEmail(), 2653 Username: model.NewId(), 2654 } 2655 user2, err := ss.User().Save(u2) 2656 require.NoError(t, err) 2657 2658 _, err = ss.Group().UpsertMember(group1.Id, user1.Id) 2659 require.NoError(t, err) 2660 2661 _, err = ss.Group().UpsertMember(group1.Id, user2.Id) 2662 require.NoError(t, err) 2663 2664 user2.DeleteAt = 1 2665 _, err = ss.User().Update(user2, true) 2666 require.NoError(t, err) 2667 2668 group1WithMemberCount := *group1 2669 group1WithMemberCount.MemberCount = model.NewInt(1) 2670 2671 group2WithMemberCount := *group2 2672 group2WithMemberCount.MemberCount = model.NewInt(0) 2673 2674 group3WithMemberCount := *group3 2675 group3WithMemberCount.MemberCount = model.NewInt(0) 2676 2677 group1WSA := &model.GroupWithSchemeAdmin{Group: *group1, SchemeAdmin: model.NewBool(false)} 2678 group2WSA := &model.GroupWithSchemeAdmin{Group: *group2, SchemeAdmin: model.NewBool(false)} 2679 group3WSA := &model.GroupWithSchemeAdmin{Group: *group3, SchemeAdmin: model.NewBool(false)} 2680 2681 testCases := []struct { 2682 Name string 2683 TeamId string 2684 Page int 2685 PerPage int 2686 Result map[string][]*model.GroupWithSchemeAdmin 2687 Opts model.GroupSearchOpts 2688 }{ 2689 { 2690 Name: "Get the groups for Channel1 and Channel2", 2691 TeamId: team1.Id, 2692 Opts: model.GroupSearchOpts{}, 2693 Page: 0, 2694 PerPage: 60, 2695 Result: map[string][]*model.GroupWithSchemeAdmin{channel1.Id: {group1WSA, group2WSA}, channel2.Id: {group3WSA}}, 2696 }, 2697 { 2698 Name: "Get first Group for Channel1 with page 0 with 1 element", 2699 TeamId: team1.Id, 2700 Opts: model.GroupSearchOpts{}, 2701 Page: 0, 2702 PerPage: 1, 2703 Result: map[string][]*model.GroupWithSchemeAdmin{channel1.Id: {group1WSA}}, 2704 }, 2705 { 2706 Name: "Get second Group for Channel1 with page 1 with 1 element", 2707 TeamId: team1.Id, 2708 Opts: model.GroupSearchOpts{}, 2709 Page: 1, 2710 PerPage: 1, 2711 Result: map[string][]*model.GroupWithSchemeAdmin{channel1.Id: {group2WSA}}, 2712 }, 2713 { 2714 Name: "Get empty Groups for a fake id", 2715 TeamId: model.NewId(), 2716 Opts: model.GroupSearchOpts{}, 2717 Page: 0, 2718 PerPage: 60, 2719 Result: map[string][]*model.GroupWithSchemeAdmin{}, 2720 }, 2721 { 2722 Name: "Get group matching name", 2723 TeamId: team1.Id, 2724 Opts: model.GroupSearchOpts{Q: string([]rune(*group1.Name)[2:10])}, // very low chance of a name collision 2725 Page: 0, 2726 PerPage: 100, 2727 Result: map[string][]*model.GroupWithSchemeAdmin{channel1.Id: {group1WSA}}, 2728 }, 2729 { 2730 Name: "Get group matching display name", 2731 TeamId: team1.Id, 2732 Opts: model.GroupSearchOpts{Q: "rouP-1"}, 2733 Page: 0, 2734 PerPage: 100, 2735 Result: map[string][]*model.GroupWithSchemeAdmin{channel1.Id: {group1WSA}}, 2736 }, 2737 { 2738 Name: "Get group matching multiple display names", 2739 TeamId: team1.Id, 2740 Opts: model.GroupSearchOpts{Q: "roUp-"}, 2741 Page: 0, 2742 PerPage: 100, 2743 Result: map[string][]*model.GroupWithSchemeAdmin{channel1.Id: {group1WSA, group2WSA}, channel2.Id: {group3WSA}}, 2744 }, 2745 { 2746 Name: "Include member counts", 2747 TeamId: team1.Id, 2748 Opts: model.GroupSearchOpts{IncludeMemberCount: true}, 2749 Page: 0, 2750 PerPage: 10, 2751 Result: map[string][]*model.GroupWithSchemeAdmin{ 2752 channel1.Id: { 2753 {Group: group1WithMemberCount, SchemeAdmin: model.NewBool(false)}, 2754 {Group: group2WithMemberCount, SchemeAdmin: model.NewBool(false)}, 2755 }, 2756 channel2.Id: { 2757 {Group: group3WithMemberCount, SchemeAdmin: model.NewBool(false)}, 2758 }, 2759 }, 2760 }, 2761 { 2762 Name: "Include allow reference", 2763 TeamId: team1.Id, 2764 Opts: model.GroupSearchOpts{FilterAllowReference: true}, 2765 Page: 0, 2766 PerPage: 2, 2767 Result: map[string][]*model.GroupWithSchemeAdmin{ 2768 channel1.Id: { 2769 group2WSA, 2770 }, 2771 channel2.Id: { 2772 group3WSA, 2773 }, 2774 }, 2775 }, 2776 } 2777 2778 for _, tc := range testCases { 2779 t.Run(tc.Name, func(t *testing.T) { 2780 if tc.Opts.PageOpts == nil { 2781 tc.Opts.PageOpts = &model.PageOpts{} 2782 } 2783 tc.Opts.PageOpts.Page = tc.Page 2784 tc.Opts.PageOpts.PerPage = tc.PerPage 2785 groups, err := ss.Group().GetGroupsAssociatedToChannelsByTeam(tc.TeamId, tc.Opts) 2786 require.NoError(t, err) 2787 assert.Equal(t, tc.Result, groups) 2788 }) 2789 } 2790 } 2791 2792 func testGetGroupsByTeam(t *testing.T, ss store.Store) { 2793 // Create Team1 2794 team1 := &model.Team{ 2795 DisplayName: "Team1", 2796 Description: model.NewId(), 2797 CompanyName: model.NewId(), 2798 AllowOpenInvite: false, 2799 InviteId: model.NewId(), 2800 Name: "zz" + model.NewId(), 2801 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 2802 Type: model.TEAM_OPEN, 2803 } 2804 team1, err := ss.Team().Save(team1) 2805 require.NoError(t, err) 2806 2807 // Create Groups 1, 2 and a deleted group 2808 group1, err := ss.Group().Create(&model.Group{ 2809 Name: model.NewString(model.NewId()), 2810 DisplayName: "group-1", 2811 RemoteId: model.NewId(), 2812 Source: model.GroupSourceLdap, 2813 AllowReference: false, 2814 }) 2815 require.NoError(t, err) 2816 2817 group2, err := ss.Group().Create(&model.Group{ 2818 Name: model.NewString(model.NewId()), 2819 DisplayName: "group-2", 2820 RemoteId: model.NewId(), 2821 Source: model.GroupSourceLdap, 2822 AllowReference: true, 2823 }) 2824 require.NoError(t, err) 2825 2826 deletedGroup, err := ss.Group().Create(&model.Group{ 2827 Name: model.NewString(model.NewId()), 2828 DisplayName: "group-deleted", 2829 RemoteId: model.NewId(), 2830 Source: model.GroupSourceLdap, 2831 AllowReference: true, 2832 DeleteAt: 1, 2833 }) 2834 require.NoError(t, err) 2835 2836 // And associate them with Team1 2837 for _, g := range []*model.Group{group1, group2, deletedGroup} { 2838 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 2839 AutoAdd: true, 2840 SyncableId: team1.Id, 2841 Type: model.GroupSyncableTypeTeam, 2842 GroupId: g.Id, 2843 }) 2844 require.NoError(t, err) 2845 } 2846 2847 // Create Team2 2848 team2 := &model.Team{ 2849 DisplayName: "Team2", 2850 Description: model.NewId(), 2851 CompanyName: model.NewId(), 2852 AllowOpenInvite: false, 2853 InviteId: model.NewId(), 2854 Name: "zz" + model.NewId(), 2855 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 2856 Type: model.TEAM_INVITE, 2857 } 2858 team2, err = ss.Team().Save(team2) 2859 require.NoError(t, err) 2860 2861 // Create Group3 2862 group3, err := ss.Group().Create(&model.Group{ 2863 Name: model.NewString(model.NewId()), 2864 DisplayName: "group-3", 2865 RemoteId: model.NewId(), 2866 Source: model.GroupSourceLdap, 2867 AllowReference: true, 2868 }) 2869 require.NoError(t, err) 2870 2871 // And associate it to Team2 2872 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 2873 AutoAdd: true, 2874 SyncableId: team2.Id, 2875 Type: model.GroupSyncableTypeTeam, 2876 GroupId: group3.Id, 2877 }) 2878 require.NoError(t, err) 2879 2880 // add members 2881 u1 := &model.User{ 2882 Email: MakeEmail(), 2883 Username: model.NewId(), 2884 } 2885 user1, err := ss.User().Save(u1) 2886 require.NoError(t, err) 2887 2888 u2 := &model.User{ 2889 Email: MakeEmail(), 2890 Username: model.NewId(), 2891 } 2892 user2, err := ss.User().Save(u2) 2893 require.NoError(t, err) 2894 2895 _, err = ss.Group().UpsertMember(group1.Id, user1.Id) 2896 require.NoError(t, err) 2897 2898 _, err = ss.Group().UpsertMember(group1.Id, user2.Id) 2899 require.NoError(t, err) 2900 2901 user2.DeleteAt = 1 2902 _, err = ss.User().Update(user2, true) 2903 require.NoError(t, err) 2904 2905 _, err = ss.Group().UpsertMember(deletedGroup.Id, user1.Id) 2906 require.NoError(t, err) 2907 2908 group1WithMemberCount := *group1 2909 group1WithMemberCount.MemberCount = model.NewInt(1) 2910 2911 group2WithMemberCount := *group2 2912 group2WithMemberCount.MemberCount = model.NewInt(0) 2913 2914 group1WSA := &model.GroupWithSchemeAdmin{Group: *group1, SchemeAdmin: model.NewBool(false)} 2915 group2WSA := &model.GroupWithSchemeAdmin{Group: *group2, SchemeAdmin: model.NewBool(false)} 2916 group3WSA := &model.GroupWithSchemeAdmin{Group: *group3, SchemeAdmin: model.NewBool(false)} 2917 2918 testCases := []struct { 2919 Name string 2920 TeamId string 2921 Page int 2922 PerPage int 2923 Opts model.GroupSearchOpts 2924 Result []*model.GroupWithSchemeAdmin 2925 TotalCount *int64 2926 }{ 2927 { 2928 Name: "Get the two Groups for Team1", 2929 TeamId: team1.Id, 2930 Opts: model.GroupSearchOpts{}, 2931 Page: 0, 2932 PerPage: 60, 2933 Result: []*model.GroupWithSchemeAdmin{group1WSA, group2WSA}, 2934 TotalCount: model.NewInt64(2), 2935 }, 2936 { 2937 Name: "Get first Group for Team1 with page 0 with 1 element", 2938 TeamId: team1.Id, 2939 Opts: model.GroupSearchOpts{}, 2940 Page: 0, 2941 PerPage: 1, 2942 Result: []*model.GroupWithSchemeAdmin{group1WSA}, 2943 }, 2944 { 2945 Name: "Get second Group for Team1 with page 1 with 1 element", 2946 TeamId: team1.Id, 2947 Opts: model.GroupSearchOpts{}, 2948 Page: 1, 2949 PerPage: 1, 2950 Result: []*model.GroupWithSchemeAdmin{group2WSA}, 2951 }, 2952 { 2953 Name: "Get third Group for Team2", 2954 TeamId: team2.Id, 2955 Opts: model.GroupSearchOpts{}, 2956 Page: 0, 2957 PerPage: 60, 2958 Result: []*model.GroupWithSchemeAdmin{group3WSA}, 2959 TotalCount: model.NewInt64(1), 2960 }, 2961 { 2962 Name: "Get empty Groups for a fake id", 2963 TeamId: model.NewId(), 2964 Opts: model.GroupSearchOpts{}, 2965 Page: 0, 2966 PerPage: 60, 2967 Result: []*model.GroupWithSchemeAdmin{}, 2968 TotalCount: model.NewInt64(0), 2969 }, 2970 { 2971 Name: "Get group matching name", 2972 TeamId: team1.Id, 2973 Opts: model.GroupSearchOpts{Q: string([]rune(*group1.Name)[2:10])}, // very low change of a name collision 2974 Page: 0, 2975 PerPage: 100, 2976 Result: []*model.GroupWithSchemeAdmin{group1WSA}, 2977 TotalCount: model.NewInt64(1), 2978 }, 2979 { 2980 Name: "Get group matching display name", 2981 TeamId: team1.Id, 2982 Opts: model.GroupSearchOpts{Q: "rouP-1"}, 2983 Page: 0, 2984 PerPage: 100, 2985 Result: []*model.GroupWithSchemeAdmin{group1WSA}, 2986 TotalCount: model.NewInt64(1), 2987 }, 2988 { 2989 Name: "Get group matching multiple display names", 2990 TeamId: team1.Id, 2991 Opts: model.GroupSearchOpts{Q: "roUp-"}, 2992 Page: 0, 2993 PerPage: 100, 2994 Result: []*model.GroupWithSchemeAdmin{group1WSA, group2WSA}, 2995 TotalCount: model.NewInt64(2), 2996 }, 2997 { 2998 Name: "Include member counts", 2999 TeamId: team1.Id, 3000 Opts: model.GroupSearchOpts{IncludeMemberCount: true}, 3001 Page: 0, 3002 PerPage: 2, 3003 Result: []*model.GroupWithSchemeAdmin{ 3004 {Group: group1WithMemberCount, SchemeAdmin: model.NewBool(false)}, 3005 {Group: group2WithMemberCount, SchemeAdmin: model.NewBool(false)}, 3006 }, 3007 }, 3008 { 3009 Name: "Include allow reference", 3010 TeamId: team1.Id, 3011 Opts: model.GroupSearchOpts{FilterAllowReference: true}, 3012 Page: 0, 3013 PerPage: 100, 3014 Result: []*model.GroupWithSchemeAdmin{group2WSA}, 3015 }, 3016 } 3017 3018 for _, tc := range testCases { 3019 t.Run(tc.Name, func(t *testing.T) { 3020 if tc.Opts.PageOpts == nil { 3021 tc.Opts.PageOpts = &model.PageOpts{} 3022 } 3023 tc.Opts.PageOpts.Page = tc.Page 3024 tc.Opts.PageOpts.PerPage = tc.PerPage 3025 groups, err := ss.Group().GetGroupsByTeam(tc.TeamId, tc.Opts) 3026 require.NoError(t, err) 3027 require.ElementsMatch(t, tc.Result, groups) 3028 if tc.TotalCount != nil { 3029 var count int64 3030 count, err = ss.Group().CountGroupsByTeam(tc.TeamId, tc.Opts) 3031 require.NoError(t, err) 3032 require.Equal(t, *tc.TotalCount, count) 3033 } 3034 }) 3035 } 3036 } 3037 3038 func testGetGroups(t *testing.T, ss store.Store) { 3039 // Create Team1 3040 team1 := &model.Team{ 3041 DisplayName: "Team1", 3042 Description: model.NewId(), 3043 CompanyName: model.NewId(), 3044 AllowOpenInvite: false, 3045 InviteId: model.NewId(), 3046 Name: "zz" + model.NewId(), 3047 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 3048 Type: model.TEAM_OPEN, 3049 GroupConstrained: model.NewBool(true), 3050 } 3051 team1, err := ss.Team().Save(team1) 3052 require.NoError(t, err) 3053 3054 startCreateTime := team1.UpdateAt - 1 3055 3056 // Create Channel1 3057 channel1 := &model.Channel{ 3058 TeamId: model.NewId(), 3059 DisplayName: "Channel1", 3060 Name: model.NewId(), 3061 Type: model.CHANNEL_PRIVATE, 3062 } 3063 channel1, nErr := ss.Channel().Save(channel1, 9999) 3064 require.NoError(t, nErr) 3065 3066 // Create Groups 1 and 2 3067 group1, err := ss.Group().Create(&model.Group{ 3068 Name: model.NewString(model.NewId()), 3069 DisplayName: "group-1", 3070 RemoteId: model.NewId(), 3071 Source: model.GroupSourceLdap, 3072 AllowReference: true, 3073 }) 3074 require.NoError(t, err) 3075 3076 group2, err := ss.Group().Create(&model.Group{ 3077 Name: model.NewString(model.NewId() + "-group-2"), 3078 DisplayName: "group-2", 3079 RemoteId: model.NewId(), 3080 Source: model.GroupSourceLdap, 3081 AllowReference: false, 3082 }) 3083 require.NoError(t, err) 3084 3085 deletedGroup, err := ss.Group().Create(&model.Group{ 3086 Name: model.NewString(model.NewId() + "-group-deleted"), 3087 DisplayName: "group-deleted", 3088 RemoteId: model.NewId(), 3089 Source: model.GroupSourceLdap, 3090 AllowReference: false, 3091 DeleteAt: 1, 3092 }) 3093 require.NoError(t, err) 3094 3095 // And associate them with Team1 3096 for _, g := range []*model.Group{group1, group2, deletedGroup} { 3097 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 3098 AutoAdd: true, 3099 SyncableId: team1.Id, 3100 Type: model.GroupSyncableTypeTeam, 3101 GroupId: g.Id, 3102 }) 3103 require.NoError(t, err) 3104 } 3105 3106 // Create Team2 3107 team2 := &model.Team{ 3108 DisplayName: "Team2", 3109 Description: model.NewId(), 3110 CompanyName: model.NewId(), 3111 AllowOpenInvite: false, 3112 InviteId: model.NewId(), 3113 Name: "zz" + model.NewId(), 3114 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 3115 Type: model.TEAM_INVITE, 3116 } 3117 team2, err = ss.Team().Save(team2) 3118 require.NoError(t, err) 3119 3120 // Create Channel2 3121 channel2 := &model.Channel{ 3122 TeamId: model.NewId(), 3123 DisplayName: "Channel2", 3124 Name: model.NewId(), 3125 Type: model.CHANNEL_PRIVATE, 3126 } 3127 channel2, nErr = ss.Channel().Save(channel2, 9999) 3128 require.NoError(t, nErr) 3129 3130 // Create Channel3 3131 channel3 := &model.Channel{ 3132 TeamId: team1.Id, 3133 DisplayName: "Channel3", 3134 Name: model.NewId(), 3135 Type: model.CHANNEL_PRIVATE, 3136 } 3137 channel3, nErr = ss.Channel().Save(channel3, 9999) 3138 require.NoError(t, nErr) 3139 3140 // Create Group3 3141 group3, err := ss.Group().Create(&model.Group{ 3142 Name: model.NewString(model.NewId() + "-group-3"), 3143 DisplayName: "group-3", 3144 RemoteId: model.NewId(), 3145 Source: model.GroupSourceLdap, 3146 AllowReference: true, 3147 }) 3148 require.NoError(t, err) 3149 3150 // And associate it to Team2 3151 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 3152 AutoAdd: true, 3153 SyncableId: team2.Id, 3154 Type: model.GroupSyncableTypeTeam, 3155 GroupId: group3.Id, 3156 }) 3157 require.NoError(t, err) 3158 3159 // And associate Group1 to Channel2 3160 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 3161 AutoAdd: true, 3162 SyncableId: channel2.Id, 3163 Type: model.GroupSyncableTypeChannel, 3164 GroupId: group1.Id, 3165 }) 3166 require.NoError(t, err) 3167 3168 // And associate Group2 and Group3 to Channel1 3169 for _, g := range []*model.Group{group2, group3} { 3170 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 3171 AutoAdd: true, 3172 SyncableId: channel1.Id, 3173 Type: model.GroupSyncableTypeChannel, 3174 GroupId: g.Id, 3175 }) 3176 require.NoError(t, err) 3177 } 3178 3179 // add members 3180 u1 := &model.User{ 3181 Email: MakeEmail(), 3182 Username: model.NewId(), 3183 } 3184 user1, err := ss.User().Save(u1) 3185 require.NoError(t, err) 3186 3187 u2 := &model.User{ 3188 Email: MakeEmail(), 3189 Username: model.NewId(), 3190 } 3191 user2, err := ss.User().Save(u2) 3192 require.NoError(t, err) 3193 3194 _, err = ss.Group().UpsertMember(group1.Id, user1.Id) 3195 require.NoError(t, err) 3196 3197 _, err = ss.Group().UpsertMember(group1.Id, user2.Id) 3198 require.NoError(t, err) 3199 3200 _, err = ss.Group().UpsertMember(deletedGroup.Id, user1.Id) 3201 require.NoError(t, err) 3202 3203 user2.DeleteAt = 1 3204 u2Update, _ := ss.User().Update(user2, true) 3205 3206 group2NameSubstring := "group-2" 3207 3208 endCreateTime := u2Update.New.UpdateAt + 1 3209 3210 // Create Team3 3211 team3 := &model.Team{ 3212 DisplayName: "Team3", 3213 Description: model.NewId(), 3214 CompanyName: model.NewId(), 3215 AllowOpenInvite: false, 3216 InviteId: model.NewId(), 3217 Name: "zz" + model.NewId(), 3218 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 3219 Type: model.TEAM_INVITE, 3220 } 3221 team3, err = ss.Team().Save(team3) 3222 require.NoError(t, err) 3223 3224 channel4 := &model.Channel{ 3225 TeamId: team3.Id, 3226 DisplayName: "Channel4", 3227 Name: model.NewId(), 3228 Type: model.CHANNEL_PRIVATE, 3229 } 3230 channel4, nErr = ss.Channel().Save(channel4, 9999) 3231 require.NoError(t, nErr) 3232 3233 testCases := []struct { 3234 Name string 3235 Page int 3236 PerPage int 3237 Opts model.GroupSearchOpts 3238 Resultf func([]*model.Group) bool 3239 }{ 3240 { 3241 Name: "Get all the Groups", 3242 Opts: model.GroupSearchOpts{}, 3243 Page: 0, 3244 PerPage: 3, 3245 Resultf: func(groups []*model.Group) bool { return len(groups) == 3 }, 3246 }, 3247 { 3248 Name: "Get first Group with page 0 with 1 element", 3249 Opts: model.GroupSearchOpts{}, 3250 Page: 0, 3251 PerPage: 1, 3252 Resultf: func(groups []*model.Group) bool { return len(groups) == 1 }, 3253 }, 3254 { 3255 Name: "Get single result from page 1", 3256 Opts: model.GroupSearchOpts{}, 3257 Page: 1, 3258 PerPage: 1, 3259 Resultf: func(groups []*model.Group) bool { return len(groups) == 1 }, 3260 }, 3261 { 3262 Name: "Get multiple results from page 1", 3263 Opts: model.GroupSearchOpts{}, 3264 Page: 1, 3265 PerPage: 2, 3266 Resultf: func(groups []*model.Group) bool { return len(groups) == 2 }, 3267 }, 3268 { 3269 Name: "Get group matching name", 3270 Opts: model.GroupSearchOpts{Q: group2NameSubstring}, 3271 Page: 0, 3272 PerPage: 100, 3273 Resultf: func(groups []*model.Group) bool { 3274 for _, g := range groups { 3275 if !strings.Contains(*g.Name, group2NameSubstring) && !strings.Contains(g.DisplayName, group2NameSubstring) { 3276 return false 3277 } 3278 } 3279 return true 3280 }, 3281 }, 3282 { 3283 Name: "Get group matching display name", 3284 Opts: model.GroupSearchOpts{Q: "rouP-3"}, 3285 Page: 0, 3286 PerPage: 100, 3287 Resultf: func(groups []*model.Group) bool { 3288 for _, g := range groups { 3289 if !strings.Contains(strings.ToLower(g.DisplayName), "roup-3") { 3290 return false 3291 } 3292 } 3293 return true 3294 }, 3295 }, 3296 { 3297 Name: "Get group matching multiple display names", 3298 Opts: model.GroupSearchOpts{Q: "groUp"}, 3299 Page: 0, 3300 PerPage: 100, 3301 Resultf: func(groups []*model.Group) bool { 3302 for _, g := range groups { 3303 if !strings.Contains(strings.ToLower(g.DisplayName), "group") { 3304 return false 3305 } 3306 } 3307 return true 3308 }, 3309 }, 3310 { 3311 Name: "Include member counts", 3312 Opts: model.GroupSearchOpts{IncludeMemberCount: true}, 3313 Page: 0, 3314 PerPage: 100, 3315 Resultf: func(groups []*model.Group) bool { 3316 for _, g := range groups { 3317 if g.MemberCount == nil { 3318 return false 3319 } 3320 if g.Id == group1.Id && *g.MemberCount != 1 { 3321 return false 3322 } 3323 if g.DeleteAt != 0 { 3324 return false 3325 } 3326 } 3327 return true 3328 }, 3329 }, 3330 { 3331 Name: "Not associated to team", 3332 Opts: model.GroupSearchOpts{NotAssociatedToTeam: team2.Id}, 3333 Page: 0, 3334 PerPage: 100, 3335 Resultf: func(groups []*model.Group) bool { 3336 if len(groups) == 0 { 3337 return false 3338 } 3339 for _, g := range groups { 3340 if g.Id == group3.Id { 3341 return false 3342 } 3343 if g.DeleteAt != 0 { 3344 return false 3345 } 3346 } 3347 return true 3348 }, 3349 }, 3350 { 3351 Name: "Not associated to other team", 3352 Opts: model.GroupSearchOpts{NotAssociatedToTeam: team1.Id}, 3353 Page: 0, 3354 PerPage: 100, 3355 Resultf: func(groups []*model.Group) bool { 3356 if len(groups) == 0 { 3357 return false 3358 } 3359 for _, g := range groups { 3360 if g.Id == group1.Id || g.Id == group2.Id { 3361 return false 3362 } 3363 if g.DeleteAt != 0 { 3364 return false 3365 } 3366 } 3367 return true 3368 }, 3369 }, 3370 { 3371 Name: "Include allow reference", 3372 Opts: model.GroupSearchOpts{FilterAllowReference: true}, 3373 Page: 0, 3374 PerPage: 100, 3375 Resultf: func(groups []*model.Group) bool { 3376 if len(groups) == 0 { 3377 return false 3378 } 3379 for _, g := range groups { 3380 if !g.AllowReference { 3381 return false 3382 } 3383 if g.DeleteAt != 0 { 3384 return false 3385 } 3386 } 3387 return true 3388 }, 3389 }, 3390 { 3391 Name: "Use Since return all", 3392 Opts: model.GroupSearchOpts{FilterAllowReference: true, Since: startCreateTime}, 3393 Page: 0, 3394 PerPage: 100, 3395 Resultf: func(groups []*model.Group) bool { 3396 if len(groups) == 0 { 3397 return false 3398 } 3399 for _, g := range groups { 3400 if g.DeleteAt != 0 { 3401 return false 3402 } 3403 } 3404 return true 3405 }, 3406 }, 3407 { 3408 Name: "Use Since return none", 3409 Opts: model.GroupSearchOpts{FilterAllowReference: true, Since: endCreateTime}, 3410 Page: 0, 3411 PerPage: 100, 3412 Resultf: func(groups []*model.Group) bool { 3413 return len(groups) == 0 3414 }, 3415 }, 3416 { 3417 Name: "Filter groups from group-constrained teams", 3418 Opts: model.GroupSearchOpts{NotAssociatedToChannel: channel3.Id, FilterParentTeamPermitted: true}, 3419 Page: 0, 3420 PerPage: 100, 3421 Resultf: func(groups []*model.Group) bool { 3422 return len(groups) == 2 && groups[0].Id == group1.Id && groups[1].Id == group2.Id 3423 }, 3424 }, 3425 { 3426 Name: "Filter groups from group-constrained page 0", 3427 Opts: model.GroupSearchOpts{NotAssociatedToChannel: channel3.Id, FilterParentTeamPermitted: true}, 3428 Page: 0, 3429 PerPage: 1, 3430 Resultf: func(groups []*model.Group) bool { 3431 return groups[0].Id == group1.Id 3432 }, 3433 }, 3434 { 3435 Name: "Filter groups from group-constrained page 1", 3436 Opts: model.GroupSearchOpts{NotAssociatedToChannel: channel3.Id, FilterParentTeamPermitted: true}, 3437 Page: 1, 3438 PerPage: 1, 3439 Resultf: func(groups []*model.Group) bool { 3440 return groups[0].Id == group2.Id 3441 }, 3442 }, 3443 { 3444 Name: "Non-group constrained team with no associated groups still returns groups for the child channel", 3445 Opts: model.GroupSearchOpts{NotAssociatedToChannel: channel4.Id, FilterParentTeamPermitted: true}, 3446 Page: 0, 3447 PerPage: 100, 3448 Resultf: func(groups []*model.Group) bool { 3449 return len(groups) > 0 3450 }, 3451 }, 3452 } 3453 3454 for _, tc := range testCases { 3455 t.Run(tc.Name, func(t *testing.T) { 3456 groups, err := ss.Group().GetGroups(tc.Page, tc.PerPage, tc.Opts) 3457 require.NoError(t, err) 3458 require.True(t, tc.Resultf(groups)) 3459 }) 3460 } 3461 } 3462 3463 func testTeamMembersMinusGroupMembers(t *testing.T, ss store.Store) { 3464 const numberOfGroups = 3 3465 const numberOfUsers = 4 3466 3467 groups := []*model.Group{} 3468 users := []*model.User{} 3469 3470 team := &model.Team{ 3471 DisplayName: model.NewId(), 3472 Description: model.NewId(), 3473 CompanyName: model.NewId(), 3474 AllowOpenInvite: false, 3475 InviteId: model.NewId(), 3476 Name: "zz" + model.NewId(), 3477 Email: model.NewId() + "@simulator.amazonses.com", 3478 Type: model.TEAM_OPEN, 3479 GroupConstrained: model.NewBool(true), 3480 } 3481 team, err := ss.Team().Save(team) 3482 require.NoError(t, err) 3483 3484 for i := 0; i < numberOfUsers; i++ { 3485 user := &model.User{ 3486 Email: MakeEmail(), 3487 Username: fmt.Sprintf("%d_%s", i, model.NewId()), 3488 } 3489 user, err = ss.User().Save(user) 3490 require.NoError(t, err) 3491 users = append(users, user) 3492 3493 trueOrFalse := int(math.Mod(float64(i), 2)) == 0 3494 _, nErr := ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: user.Id, SchemeUser: trueOrFalse, SchemeAdmin: !trueOrFalse}, 999) 3495 require.NoError(t, nErr) 3496 } 3497 3498 // Extra user outside of the group member users. 3499 user := &model.User{ 3500 Email: MakeEmail(), 3501 Username: "99_" + model.NewId(), 3502 } 3503 user, err = ss.User().Save(user) 3504 require.NoError(t, err) 3505 users = append(users, user) 3506 _, nErr := ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: user.Id, SchemeUser: true, SchemeAdmin: false}, 999) 3507 require.NoError(t, nErr) 3508 3509 for i := 0; i < numberOfGroups; i++ { 3510 group := &model.Group{ 3511 Name: model.NewString(fmt.Sprintf("n_%d_%s", i, model.NewId())), 3512 DisplayName: model.NewId(), 3513 Source: model.GroupSourceLdap, 3514 Description: model.NewId(), 3515 RemoteId: model.NewId(), 3516 } 3517 group, err := ss.Group().Create(group) 3518 require.NoError(t, err) 3519 groups = append(groups, group) 3520 } 3521 3522 sort.Slice(users, func(i, j int) bool { 3523 return users[i].Username < users[j].Username 3524 }) 3525 3526 // Add even users to even group, and the inverse 3527 for i := 0; i < numberOfUsers; i++ { 3528 groupIndex := int(math.Mod(float64(i), 2)) 3529 _, err := ss.Group().UpsertMember(groups[groupIndex].Id, users[i].Id) 3530 require.NoError(t, err) 3531 3532 // Add everyone to group 2 3533 _, err = ss.Group().UpsertMember(groups[numberOfGroups-1].Id, users[i].Id) 3534 require.NoError(t, err) 3535 } 3536 3537 testCases := map[string]struct { 3538 expectedUserIDs []string 3539 expectedTotalCount int64 3540 groupIDs []string 3541 page int 3542 perPage int 3543 setup func() 3544 teardown func() 3545 }{ 3546 "No group IDs, all members": { 3547 expectedUserIDs: []string{users[0].Id, users[1].Id, users[2].Id, users[3].Id, user.Id}, 3548 expectedTotalCount: numberOfUsers + 1, 3549 groupIDs: []string{}, 3550 page: 0, 3551 perPage: 100, 3552 }, 3553 "All members, page 1": { 3554 expectedUserIDs: []string{users[0].Id, users[1].Id, users[2].Id}, 3555 expectedTotalCount: numberOfUsers + 1, 3556 groupIDs: []string{}, 3557 page: 0, 3558 perPage: 3, 3559 }, 3560 "All members, page 2": { 3561 expectedUserIDs: []string{users[3].Id, users[4].Id}, 3562 expectedTotalCount: numberOfUsers + 1, 3563 groupIDs: []string{}, 3564 page: 1, 3565 perPage: 3, 3566 }, 3567 "Group 1, even users would be removed": { 3568 expectedUserIDs: []string{users[0].Id, users[2].Id, users[4].Id}, 3569 expectedTotalCount: 3, 3570 groupIDs: []string{groups[1].Id}, 3571 page: 0, 3572 perPage: 100, 3573 }, 3574 "Group 0, odd users would be removed": { 3575 expectedUserIDs: []string{users[1].Id, users[3].Id, users[4].Id}, 3576 expectedTotalCount: 3, 3577 groupIDs: []string{groups[0].Id}, 3578 page: 0, 3579 perPage: 100, 3580 }, 3581 "All groups, no users would be removed": { 3582 expectedUserIDs: []string{users[4].Id}, 3583 expectedTotalCount: 1, 3584 groupIDs: []string{groups[0].Id, groups[1].Id}, 3585 page: 0, 3586 perPage: 100, 3587 }, 3588 } 3589 3590 mapUserIDs := func(users []*model.UserWithGroups) []string { 3591 ids := []string{} 3592 for _, user := range users { 3593 ids = append(ids, user.Id) 3594 } 3595 return ids 3596 } 3597 3598 for tcName, tc := range testCases { 3599 t.Run(tcName, func(t *testing.T) { 3600 if tc.setup != nil { 3601 tc.setup() 3602 } 3603 3604 if tc.teardown != nil { 3605 defer tc.teardown() 3606 } 3607 3608 actual, err := ss.Group().TeamMembersMinusGroupMembers(team.Id, tc.groupIDs, tc.page, tc.perPage) 3609 require.NoError(t, err) 3610 require.ElementsMatch(t, tc.expectedUserIDs, mapUserIDs(actual)) 3611 3612 actualCount, err := ss.Group().CountTeamMembersMinusGroupMembers(team.Id, tc.groupIDs) 3613 require.NoError(t, err) 3614 require.Equal(t, tc.expectedTotalCount, actualCount) 3615 }) 3616 } 3617 } 3618 3619 func testChannelMembersMinusGroupMembers(t *testing.T, ss store.Store) { 3620 const numberOfGroups = 3 3621 const numberOfUsers = 4 3622 3623 groups := []*model.Group{} 3624 users := []*model.User{} 3625 3626 channel := &model.Channel{ 3627 TeamId: model.NewId(), 3628 DisplayName: "A Name", 3629 Name: model.NewId(), 3630 Type: model.CHANNEL_PRIVATE, 3631 GroupConstrained: model.NewBool(true), 3632 } 3633 channel, err := ss.Channel().Save(channel, 9999) 3634 require.NoError(t, err) 3635 3636 for i := 0; i < numberOfUsers; i++ { 3637 user := &model.User{ 3638 Email: MakeEmail(), 3639 Username: fmt.Sprintf("%d_%s", i, model.NewId()), 3640 } 3641 user, err = ss.User().Save(user) 3642 require.NoError(t, err) 3643 users = append(users, user) 3644 3645 trueOrFalse := int(math.Mod(float64(i), 2)) == 0 3646 _, err = ss.Channel().SaveMember(&model.ChannelMember{ 3647 ChannelId: channel.Id, 3648 UserId: user.Id, 3649 SchemeUser: trueOrFalse, 3650 SchemeAdmin: !trueOrFalse, 3651 NotifyProps: model.GetDefaultChannelNotifyProps(), 3652 }) 3653 require.NoError(t, err) 3654 } 3655 3656 // Extra user outside of the group member users. 3657 user, err := ss.User().Save(&model.User{ 3658 Email: MakeEmail(), 3659 Username: "99_" + model.NewId(), 3660 }) 3661 require.NoError(t, err) 3662 users = append(users, user) 3663 _, err = ss.Channel().SaveMember(&model.ChannelMember{ 3664 ChannelId: channel.Id, 3665 UserId: user.Id, 3666 SchemeUser: true, 3667 SchemeAdmin: false, 3668 NotifyProps: model.GetDefaultChannelNotifyProps(), 3669 }) 3670 require.NoError(t, err) 3671 3672 for i := 0; i < numberOfGroups; i++ { 3673 group := &model.Group{ 3674 Name: model.NewString(fmt.Sprintf("n_%d_%s", i, model.NewId())), 3675 DisplayName: model.NewId(), 3676 Source: model.GroupSourceLdap, 3677 Description: model.NewId(), 3678 RemoteId: model.NewId(), 3679 } 3680 group, err := ss.Group().Create(group) 3681 require.NoError(t, err) 3682 groups = append(groups, group) 3683 } 3684 3685 sort.Slice(users, func(i, j int) bool { 3686 return users[i].Username < users[j].Username 3687 }) 3688 3689 // Add even users to even group, and the inverse 3690 for i := 0; i < numberOfUsers; i++ { 3691 groupIndex := int(math.Mod(float64(i), 2)) 3692 _, err := ss.Group().UpsertMember(groups[groupIndex].Id, users[i].Id) 3693 require.NoError(t, err) 3694 3695 // Add everyone to group 2 3696 _, err = ss.Group().UpsertMember(groups[numberOfGroups-1].Id, users[i].Id) 3697 require.NoError(t, err) 3698 } 3699 3700 testCases := map[string]struct { 3701 expectedUserIDs []string 3702 expectedTotalCount int64 3703 groupIDs []string 3704 page int 3705 perPage int 3706 setup func() 3707 teardown func() 3708 }{ 3709 "No group IDs, all members": { 3710 expectedUserIDs: []string{users[0].Id, users[1].Id, users[2].Id, users[3].Id, users[4].Id}, 3711 expectedTotalCount: numberOfUsers + 1, 3712 groupIDs: []string{}, 3713 page: 0, 3714 perPage: 100, 3715 }, 3716 "All members, page 1": { 3717 expectedUserIDs: []string{users[0].Id, users[1].Id, users[2].Id}, 3718 expectedTotalCount: numberOfUsers + 1, 3719 groupIDs: []string{}, 3720 page: 0, 3721 perPage: 3, 3722 }, 3723 "All members, page 2": { 3724 expectedUserIDs: []string{users[3].Id, users[4].Id}, 3725 expectedTotalCount: numberOfUsers + 1, 3726 groupIDs: []string{}, 3727 page: 1, 3728 perPage: 3, 3729 }, 3730 "Group 1, even users would be removed": { 3731 expectedUserIDs: []string{users[0].Id, users[2].Id, users[4].Id}, 3732 expectedTotalCount: 3, 3733 groupIDs: []string{groups[1].Id}, 3734 page: 0, 3735 perPage: 100, 3736 }, 3737 "Group 0, odd users would be removed": { 3738 expectedUserIDs: []string{users[1].Id, users[3].Id, users[4].Id}, 3739 expectedTotalCount: 3, 3740 groupIDs: []string{groups[0].Id}, 3741 page: 0, 3742 perPage: 100, 3743 }, 3744 "All groups, no users would be removed": { 3745 expectedUserIDs: []string{users[4].Id}, 3746 expectedTotalCount: 1, 3747 groupIDs: []string{groups[0].Id, groups[1].Id}, 3748 page: 0, 3749 perPage: 100, 3750 }, 3751 } 3752 3753 mapUserIDs := func(users []*model.UserWithGroups) []string { 3754 ids := []string{} 3755 for _, user := range users { 3756 ids = append(ids, user.Id) 3757 } 3758 return ids 3759 } 3760 3761 for tcName, tc := range testCases { 3762 t.Run(tcName, func(t *testing.T) { 3763 if tc.setup != nil { 3764 tc.setup() 3765 } 3766 3767 if tc.teardown != nil { 3768 defer tc.teardown() 3769 } 3770 3771 actual, err := ss.Group().ChannelMembersMinusGroupMembers(channel.Id, tc.groupIDs, tc.page, tc.perPage) 3772 require.NoError(t, err) 3773 require.ElementsMatch(t, tc.expectedUserIDs, mapUserIDs(actual)) 3774 3775 actualCount, err := ss.Group().CountChannelMembersMinusGroupMembers(channel.Id, tc.groupIDs) 3776 require.NoError(t, err) 3777 require.Equal(t, tc.expectedTotalCount, actualCount) 3778 }) 3779 } 3780 } 3781 3782 func groupTestGetMemberCount(t *testing.T, ss store.Store) { 3783 group := &model.Group{ 3784 Name: model.NewString(model.NewId()), 3785 DisplayName: model.NewId(), 3786 Source: model.GroupSourceLdap, 3787 Description: model.NewId(), 3788 RemoteId: model.NewId(), 3789 } 3790 group, err := ss.Group().Create(group) 3791 require.NoError(t, err) 3792 3793 var user *model.User 3794 var nErr error 3795 for i := 0; i < 2; i++ { 3796 user = &model.User{ 3797 Email: MakeEmail(), 3798 Username: fmt.Sprintf("%d_%s", i, model.NewId()), 3799 } 3800 user, nErr = ss.User().Save(user) 3801 require.NoError(t, nErr) 3802 3803 _, err = ss.Group().UpsertMember(group.Id, user.Id) 3804 require.NoError(t, err) 3805 } 3806 3807 count, err := ss.Group().GetMemberCount(group.Id) 3808 require.NoError(t, err) 3809 require.Equal(t, int64(2), count) 3810 3811 user.DeleteAt = 1 3812 _, nErr = ss.User().Update(user, true) 3813 require.NoError(t, nErr) 3814 3815 count, err = ss.Group().GetMemberCount(group.Id) 3816 require.NoError(t, err) 3817 require.Equal(t, int64(1), count) 3818 } 3819 3820 func groupTestAdminRoleGroupsForSyncableMemberChannel(t *testing.T, ss store.Store) { 3821 user := &model.User{ 3822 Email: MakeEmail(), 3823 Username: model.NewId(), 3824 } 3825 user, err := ss.User().Save(user) 3826 require.NoError(t, err) 3827 3828 group1 := &model.Group{ 3829 Name: model.NewString(model.NewId()), 3830 DisplayName: model.NewId(), 3831 Source: model.GroupSourceLdap, 3832 Description: model.NewId(), 3833 RemoteId: model.NewId(), 3834 } 3835 group1, err = ss.Group().Create(group1) 3836 require.NoError(t, err) 3837 3838 _, err = ss.Group().UpsertMember(group1.Id, user.Id) 3839 require.NoError(t, err) 3840 3841 group2 := &model.Group{ 3842 Name: model.NewString(model.NewId()), 3843 DisplayName: model.NewId(), 3844 Source: model.GroupSourceLdap, 3845 Description: model.NewId(), 3846 RemoteId: model.NewId(), 3847 } 3848 group2, err = ss.Group().Create(group2) 3849 require.NoError(t, err) 3850 3851 _, err = ss.Group().UpsertMember(group2.Id, user.Id) 3852 require.NoError(t, err) 3853 3854 channel := &model.Channel{ 3855 TeamId: model.NewId(), 3856 DisplayName: "A Name", 3857 Name: model.NewId(), 3858 Type: model.CHANNEL_OPEN, 3859 } 3860 channel, nErr := ss.Channel().Save(channel, 9999) 3861 require.NoError(t, nErr) 3862 3863 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 3864 AutoAdd: true, 3865 SyncableId: channel.Id, 3866 Type: model.GroupSyncableTypeChannel, 3867 GroupId: group1.Id, 3868 SchemeAdmin: true, 3869 }) 3870 require.NoError(t, err) 3871 3872 groupSyncable2, err := ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 3873 AutoAdd: true, 3874 SyncableId: channel.Id, 3875 Type: model.GroupSyncableTypeChannel, 3876 GroupId: group2.Id, 3877 }) 3878 require.NoError(t, err) 3879 3880 // User is a member of both groups but only one is SchmeAdmin: true 3881 actualGroupIDs, err := ss.Group().AdminRoleGroupsForSyncableMember(user.Id, channel.Id, model.GroupSyncableTypeChannel) 3882 require.NoError(t, err) 3883 require.ElementsMatch(t, []string{group1.Id}, actualGroupIDs) 3884 3885 // Update the second group syncable to be SchemeAdmin: true and both groups should be returned 3886 groupSyncable2.SchemeAdmin = true 3887 _, err = ss.Group().UpdateGroupSyncable(groupSyncable2) 3888 require.NoError(t, err) 3889 actualGroupIDs, err = ss.Group().AdminRoleGroupsForSyncableMember(user.Id, channel.Id, model.GroupSyncableTypeChannel) 3890 require.NoError(t, err) 3891 require.ElementsMatch(t, []string{group1.Id, group2.Id}, actualGroupIDs) 3892 3893 // Deleting membership from group should stop the group from being returned 3894 _, err = ss.Group().DeleteMember(group1.Id, user.Id) 3895 require.NoError(t, err) 3896 actualGroupIDs, err = ss.Group().AdminRoleGroupsForSyncableMember(user.Id, channel.Id, model.GroupSyncableTypeChannel) 3897 require.NoError(t, err) 3898 require.ElementsMatch(t, []string{group2.Id}, actualGroupIDs) 3899 3900 // Deleting group syncable should stop it being returned 3901 _, err = ss.Group().DeleteGroupSyncable(group2.Id, channel.Id, model.GroupSyncableTypeChannel) 3902 require.NoError(t, err) 3903 actualGroupIDs, err = ss.Group().AdminRoleGroupsForSyncableMember(user.Id, channel.Id, model.GroupSyncableTypeChannel) 3904 require.NoError(t, err) 3905 require.ElementsMatch(t, []string{}, actualGroupIDs) 3906 } 3907 3908 func groupTestAdminRoleGroupsForSyncableMemberTeam(t *testing.T, ss store.Store) { 3909 user := &model.User{ 3910 Email: MakeEmail(), 3911 Username: model.NewId(), 3912 } 3913 user, err := ss.User().Save(user) 3914 require.NoError(t, err) 3915 3916 group1 := &model.Group{ 3917 Name: model.NewString(model.NewId()), 3918 DisplayName: model.NewId(), 3919 Source: model.GroupSourceLdap, 3920 Description: model.NewId(), 3921 RemoteId: model.NewId(), 3922 } 3923 group1, err = ss.Group().Create(group1) 3924 require.NoError(t, err) 3925 3926 _, err = ss.Group().UpsertMember(group1.Id, user.Id) 3927 require.NoError(t, err) 3928 3929 group2 := &model.Group{ 3930 Name: model.NewString(model.NewId()), 3931 DisplayName: model.NewId(), 3932 Source: model.GroupSourceLdap, 3933 Description: model.NewId(), 3934 RemoteId: model.NewId(), 3935 } 3936 group2, err = ss.Group().Create(group2) 3937 require.NoError(t, err) 3938 3939 _, err = ss.Group().UpsertMember(group2.Id, user.Id) 3940 require.NoError(t, err) 3941 3942 team := &model.Team{ 3943 DisplayName: "A Name", 3944 Name: "zz" + model.NewId(), 3945 Type: model.CHANNEL_OPEN, 3946 } 3947 team, nErr := ss.Team().Save(team) 3948 require.NoError(t, nErr) 3949 3950 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 3951 AutoAdd: true, 3952 SyncableId: team.Id, 3953 Type: model.GroupSyncableTypeTeam, 3954 GroupId: group1.Id, 3955 SchemeAdmin: true, 3956 }) 3957 require.NoError(t, err) 3958 3959 groupSyncable2, err := ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 3960 AutoAdd: true, 3961 SyncableId: team.Id, 3962 Type: model.GroupSyncableTypeTeam, 3963 GroupId: group2.Id, 3964 }) 3965 require.NoError(t, err) 3966 3967 // User is a member of both groups but only one is SchmeAdmin: true 3968 actualGroupIDs, err := ss.Group().AdminRoleGroupsForSyncableMember(user.Id, team.Id, model.GroupSyncableTypeTeam) 3969 require.NoError(t, err) 3970 require.ElementsMatch(t, []string{group1.Id}, actualGroupIDs) 3971 3972 // Update the second group syncable to be SchemeAdmin: true and both groups should be returned 3973 groupSyncable2.SchemeAdmin = true 3974 _, err = ss.Group().UpdateGroupSyncable(groupSyncable2) 3975 require.NoError(t, err) 3976 actualGroupIDs, err = ss.Group().AdminRoleGroupsForSyncableMember(user.Id, team.Id, model.GroupSyncableTypeTeam) 3977 require.NoError(t, err) 3978 require.ElementsMatch(t, []string{group1.Id, group2.Id}, actualGroupIDs) 3979 3980 // Deleting membership from group should stop the group from being returned 3981 _, err = ss.Group().DeleteMember(group1.Id, user.Id) 3982 require.NoError(t, err) 3983 actualGroupIDs, err = ss.Group().AdminRoleGroupsForSyncableMember(user.Id, team.Id, model.GroupSyncableTypeTeam) 3984 require.NoError(t, err) 3985 require.ElementsMatch(t, []string{group2.Id}, actualGroupIDs) 3986 3987 // Deleting group syncable should stop it being returned 3988 _, err = ss.Group().DeleteGroupSyncable(group2.Id, team.Id, model.GroupSyncableTypeTeam) 3989 require.NoError(t, err) 3990 actualGroupIDs, err = ss.Group().AdminRoleGroupsForSyncableMember(user.Id, team.Id, model.GroupSyncableTypeTeam) 3991 require.NoError(t, err) 3992 require.ElementsMatch(t, []string{}, actualGroupIDs) 3993 } 3994 3995 func groupTestPermittedSyncableAdminsTeam(t *testing.T, ss store.Store) { 3996 user1 := &model.User{ 3997 Email: MakeEmail(), 3998 Username: model.NewId(), 3999 } 4000 user1, err := ss.User().Save(user1) 4001 require.NoError(t, err) 4002 4003 user2 := &model.User{ 4004 Email: MakeEmail(), 4005 Username: model.NewId(), 4006 } 4007 user2, err = ss.User().Save(user2) 4008 require.NoError(t, err) 4009 4010 user3 := &model.User{ 4011 Email: MakeEmail(), 4012 Username: model.NewId(), 4013 } 4014 user3, err = ss.User().Save(user3) 4015 require.NoError(t, err) 4016 4017 group1 := &model.Group{ 4018 Name: model.NewString(model.NewId()), 4019 DisplayName: model.NewId(), 4020 Source: model.GroupSourceLdap, 4021 Description: model.NewId(), 4022 RemoteId: model.NewId(), 4023 } 4024 group1, err = ss.Group().Create(group1) 4025 require.NoError(t, err) 4026 4027 _, err = ss.Group().UpsertMember(group1.Id, user1.Id) 4028 require.NoError(t, err) 4029 _, err = ss.Group().UpsertMember(group1.Id, user2.Id) 4030 require.NoError(t, err) 4031 4032 group2 := &model.Group{ 4033 Name: model.NewString(model.NewId()), 4034 DisplayName: model.NewId(), 4035 Source: model.GroupSourceLdap, 4036 Description: model.NewId(), 4037 RemoteId: model.NewId(), 4038 } 4039 group2, err = ss.Group().Create(group2) 4040 require.NoError(t, err) 4041 4042 _, err = ss.Group().UpsertMember(group2.Id, user3.Id) 4043 require.NoError(t, err) 4044 4045 team := &model.Team{ 4046 DisplayName: "A Name", 4047 Name: "zz" + model.NewId(), 4048 Type: model.CHANNEL_OPEN, 4049 } 4050 team, nErr := ss.Team().Save(team) 4051 require.NoError(t, nErr) 4052 4053 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 4054 AutoAdd: true, 4055 SyncableId: team.Id, 4056 Type: model.GroupSyncableTypeTeam, 4057 GroupId: group1.Id, 4058 SchemeAdmin: true, 4059 }) 4060 require.NoError(t, err) 4061 4062 groupSyncable2, err := ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 4063 AutoAdd: true, 4064 SyncableId: team.Id, 4065 Type: model.GroupSyncableTypeTeam, 4066 GroupId: group2.Id, 4067 SchemeAdmin: false, 4068 }) 4069 require.NoError(t, err) 4070 4071 // group 1's users are returned because groupsyncable 2 has SchemeAdmin false. 4072 actualUserIDs, err := ss.Group().PermittedSyncableAdmins(team.Id, model.GroupSyncableTypeTeam) 4073 require.NoError(t, err) 4074 require.ElementsMatch(t, []string{user1.Id, user2.Id}, actualUserIDs) 4075 4076 // update groupsyncable 2 to be SchemeAdmin true 4077 groupSyncable2.SchemeAdmin = true 4078 _, err = ss.Group().UpdateGroupSyncable(groupSyncable2) 4079 require.NoError(t, err) 4080 4081 // group 2's users are now included in return value 4082 actualUserIDs, err = ss.Group().PermittedSyncableAdmins(team.Id, model.GroupSyncableTypeTeam) 4083 require.NoError(t, err) 4084 require.ElementsMatch(t, []string{user1.Id, user2.Id, user3.Id}, actualUserIDs) 4085 4086 // deleted group member should not be included 4087 ss.Group().DeleteMember(group1.Id, user2.Id) 4088 require.NoError(t, err) 4089 actualUserIDs, err = ss.Group().PermittedSyncableAdmins(team.Id, model.GroupSyncableTypeTeam) 4090 require.NoError(t, err) 4091 require.ElementsMatch(t, []string{user1.Id, user3.Id}, actualUserIDs) 4092 4093 // deleted group syncable no longer includes group members 4094 _, err = ss.Group().DeleteGroupSyncable(group1.Id, team.Id, model.GroupSyncableTypeTeam) 4095 require.NoError(t, err) 4096 actualUserIDs, err = ss.Group().PermittedSyncableAdmins(team.Id, model.GroupSyncableTypeTeam) 4097 require.NoError(t, err) 4098 require.ElementsMatch(t, []string{user3.Id}, actualUserIDs) 4099 } 4100 4101 func groupTestPermittedSyncableAdminsChannel(t *testing.T, ss store.Store) { 4102 user1 := &model.User{ 4103 Email: MakeEmail(), 4104 Username: model.NewId(), 4105 } 4106 user1, err := ss.User().Save(user1) 4107 require.NoError(t, err) 4108 4109 user2 := &model.User{ 4110 Email: MakeEmail(), 4111 Username: model.NewId(), 4112 } 4113 user2, err = ss.User().Save(user2) 4114 require.NoError(t, err) 4115 4116 user3 := &model.User{ 4117 Email: MakeEmail(), 4118 Username: model.NewId(), 4119 } 4120 user3, err = ss.User().Save(user3) 4121 require.NoError(t, err) 4122 4123 group1 := &model.Group{ 4124 Name: model.NewString(model.NewId()), 4125 DisplayName: model.NewId(), 4126 Source: model.GroupSourceLdap, 4127 Description: model.NewId(), 4128 RemoteId: model.NewId(), 4129 } 4130 group1, err = ss.Group().Create(group1) 4131 require.NoError(t, err) 4132 4133 _, err = ss.Group().UpsertMember(group1.Id, user1.Id) 4134 require.NoError(t, err) 4135 _, err = ss.Group().UpsertMember(group1.Id, user2.Id) 4136 require.NoError(t, err) 4137 4138 group2 := &model.Group{ 4139 Name: model.NewString(model.NewId()), 4140 DisplayName: model.NewId(), 4141 Source: model.GroupSourceLdap, 4142 Description: model.NewId(), 4143 RemoteId: model.NewId(), 4144 } 4145 group2, err = ss.Group().Create(group2) 4146 require.NoError(t, err) 4147 4148 _, err = ss.Group().UpsertMember(group2.Id, user3.Id) 4149 require.NoError(t, err) 4150 4151 channel := &model.Channel{ 4152 TeamId: model.NewId(), 4153 DisplayName: "A Name", 4154 Name: model.NewId(), 4155 Type: model.CHANNEL_OPEN, 4156 } 4157 channel, nErr := ss.Channel().Save(channel, 9999) 4158 require.NoError(t, nErr) 4159 4160 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 4161 AutoAdd: true, 4162 SyncableId: channel.Id, 4163 Type: model.GroupSyncableTypeChannel, 4164 GroupId: group1.Id, 4165 SchemeAdmin: true, 4166 }) 4167 require.NoError(t, err) 4168 4169 groupSyncable2, err := ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 4170 AutoAdd: true, 4171 SyncableId: channel.Id, 4172 Type: model.GroupSyncableTypeChannel, 4173 GroupId: group2.Id, 4174 SchemeAdmin: false, 4175 }) 4176 require.NoError(t, err) 4177 4178 // group 1's users are returned because groupsyncable 2 has SchemeAdmin false. 4179 actualUserIDs, err := ss.Group().PermittedSyncableAdmins(channel.Id, model.GroupSyncableTypeChannel) 4180 require.NoError(t, err) 4181 require.ElementsMatch(t, []string{user1.Id, user2.Id}, actualUserIDs) 4182 4183 // update groupsyncable 2 to be SchemeAdmin true 4184 groupSyncable2.SchemeAdmin = true 4185 _, err = ss.Group().UpdateGroupSyncable(groupSyncable2) 4186 require.NoError(t, err) 4187 4188 // group 2's users are now included in return value 4189 actualUserIDs, err = ss.Group().PermittedSyncableAdmins(channel.Id, model.GroupSyncableTypeChannel) 4190 require.NoError(t, err) 4191 require.ElementsMatch(t, []string{user1.Id, user2.Id, user3.Id}, actualUserIDs) 4192 4193 // deleted group member should not be included 4194 ss.Group().DeleteMember(group1.Id, user2.Id) 4195 require.NoError(t, err) 4196 actualUserIDs, err = ss.Group().PermittedSyncableAdmins(channel.Id, model.GroupSyncableTypeChannel) 4197 require.NoError(t, err) 4198 require.ElementsMatch(t, []string{user1.Id, user3.Id}, actualUserIDs) 4199 4200 // deleted group syncable no longer includes group members 4201 _, err = ss.Group().DeleteGroupSyncable(group1.Id, channel.Id, model.GroupSyncableTypeChannel) 4202 require.NoError(t, err) 4203 actualUserIDs, err = ss.Group().PermittedSyncableAdmins(channel.Id, model.GroupSyncableTypeChannel) 4204 require.NoError(t, err) 4205 require.ElementsMatch(t, []string{user3.Id}, actualUserIDs) 4206 } 4207 4208 func groupTestpUpdateMembersRoleTeam(t *testing.T, ss store.Store) { 4209 team := &model.Team{ 4210 DisplayName: "Name", 4211 Description: "Some description", 4212 CompanyName: "Some company name", 4213 AllowOpenInvite: false, 4214 InviteId: "inviteid0", 4215 Name: "z-z-" + model.NewId() + "a", 4216 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 4217 Type: model.TEAM_OPEN, 4218 } 4219 team, err := ss.Team().Save(team) 4220 require.NoError(t, err) 4221 4222 user1 := &model.User{ 4223 Email: MakeEmail(), 4224 Username: model.NewId(), 4225 } 4226 user1, err = ss.User().Save(user1) 4227 require.NoError(t, err) 4228 4229 user2 := &model.User{ 4230 Email: MakeEmail(), 4231 Username: model.NewId(), 4232 } 4233 user2, err = ss.User().Save(user2) 4234 require.NoError(t, err) 4235 4236 user3 := &model.User{ 4237 Email: MakeEmail(), 4238 Username: model.NewId(), 4239 } 4240 user3, err = ss.User().Save(user3) 4241 require.NoError(t, err) 4242 4243 user4 := &model.User{ 4244 Email: MakeEmail(), 4245 Username: model.NewId(), 4246 } 4247 user4, err = ss.User().Save(user4) 4248 require.NoError(t, err) 4249 4250 for _, user := range []*model.User{user1, user2, user3} { 4251 _, nErr := ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: user.Id}, 9999) 4252 require.NoError(t, nErr) 4253 } 4254 4255 _, nErr := ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: user4.Id, SchemeGuest: true}, 9999) 4256 require.NoError(t, nErr) 4257 4258 tests := []struct { 4259 testName string 4260 inUserIDs []string 4261 targetSchemeAdminValue bool 4262 }{ 4263 { 4264 "Given users are admins", 4265 []string{user1.Id, user2.Id}, 4266 true, 4267 }, 4268 { 4269 "Given users are members", 4270 []string{user2.Id}, 4271 false, 4272 }, 4273 { 4274 "Non-given users are admins", 4275 []string{user2.Id}, 4276 false, 4277 }, 4278 { 4279 "Non-given users are members", 4280 []string{user2.Id}, 4281 false, 4282 }, 4283 } 4284 4285 for _, tt := range tests { 4286 t.Run(tt.testName, func(t *testing.T) { 4287 err = ss.Team().UpdateMembersRole(team.Id, tt.inUserIDs) 4288 require.NoError(t, err) 4289 4290 members, err := ss.Team().GetMembers(team.Id, 0, 100, nil) 4291 require.NoError(t, err) 4292 require.GreaterOrEqual(t, len(members), 4) // sanity check for team membership 4293 4294 for _, member := range members { 4295 if utils.StringInSlice(member.UserId, tt.inUserIDs) { 4296 require.True(t, member.SchemeAdmin) 4297 } else { 4298 require.False(t, member.SchemeAdmin) 4299 } 4300 4301 // Ensure guest account never changes. 4302 if member.UserId == user4.Id { 4303 require.False(t, member.SchemeUser) 4304 require.False(t, member.SchemeAdmin) 4305 require.True(t, member.SchemeGuest) 4306 } 4307 } 4308 }) 4309 } 4310 } 4311 4312 func groupTestpUpdateMembersRoleChannel(t *testing.T, ss store.Store) { 4313 channel := &model.Channel{ 4314 TeamId: model.NewId(), 4315 DisplayName: "A Name", 4316 Name: model.NewId(), 4317 Type: model.CHANNEL_OPEN, // Query does not look at type so this shouldn't matter. 4318 } 4319 channel, err := ss.Channel().Save(channel, 9999) 4320 require.NoError(t, err) 4321 4322 user1 := &model.User{ 4323 Email: MakeEmail(), 4324 Username: model.NewId(), 4325 } 4326 user1, err = ss.User().Save(user1) 4327 require.NoError(t, err) 4328 4329 user2 := &model.User{ 4330 Email: MakeEmail(), 4331 Username: model.NewId(), 4332 } 4333 user2, err = ss.User().Save(user2) 4334 require.NoError(t, err) 4335 4336 user3 := &model.User{ 4337 Email: MakeEmail(), 4338 Username: model.NewId(), 4339 } 4340 user3, err = ss.User().Save(user3) 4341 require.NoError(t, err) 4342 4343 user4 := &model.User{ 4344 Email: MakeEmail(), 4345 Username: model.NewId(), 4346 } 4347 user4, err = ss.User().Save(user4) 4348 require.NoError(t, err) 4349 4350 for _, user := range []*model.User{user1, user2, user3} { 4351 _, err = ss.Channel().SaveMember(&model.ChannelMember{ 4352 ChannelId: channel.Id, 4353 UserId: user.Id, 4354 NotifyProps: model.GetDefaultChannelNotifyProps(), 4355 }) 4356 require.NoError(t, err) 4357 } 4358 4359 _, err = ss.Channel().SaveMember(&model.ChannelMember{ 4360 ChannelId: channel.Id, 4361 UserId: user4.Id, 4362 NotifyProps: model.GetDefaultChannelNotifyProps(), 4363 SchemeGuest: true, 4364 }) 4365 require.NoError(t, err) 4366 4367 tests := []struct { 4368 testName string 4369 inUserIDs []string 4370 targetSchemeAdminValue bool 4371 }{ 4372 { 4373 "Given users are admins", 4374 []string{user1.Id, user2.Id}, 4375 true, 4376 }, 4377 { 4378 "Given users are members", 4379 []string{user2.Id}, 4380 false, 4381 }, 4382 { 4383 "Non-given users are admins", 4384 []string{user2.Id}, 4385 false, 4386 }, 4387 { 4388 "Non-given users are members", 4389 []string{user2.Id}, 4390 false, 4391 }, 4392 } 4393 4394 for _, tt := range tests { 4395 t.Run(tt.testName, func(t *testing.T) { 4396 err = ss.Channel().UpdateMembersRole(channel.Id, tt.inUserIDs) 4397 require.NoError(t, err) 4398 4399 members, err := ss.Channel().GetMembers(channel.Id, 0, 100) 4400 require.NoError(t, err) 4401 4402 require.GreaterOrEqual(t, len(*members), 4) // sanity check for channel membership 4403 4404 for _, member := range *members { 4405 if utils.StringInSlice(member.UserId, tt.inUserIDs) { 4406 require.True(t, member.SchemeAdmin) 4407 } else { 4408 require.False(t, member.SchemeAdmin) 4409 } 4410 4411 // Ensure guest account never changes. 4412 if member.UserId == user4.Id { 4413 require.False(t, member.SchemeUser) 4414 require.False(t, member.SchemeAdmin) 4415 require.True(t, member.SchemeGuest) 4416 } 4417 } 4418 }) 4419 } 4420 } 4421 4422 func groupTestGroupCount(t *testing.T, ss store.Store) { 4423 group1, err := ss.Group().Create(&model.Group{ 4424 Name: model.NewString(model.NewId()), 4425 DisplayName: model.NewId(), 4426 Source: model.GroupSourceLdap, 4427 RemoteId: model.NewId(), 4428 }) 4429 require.NoError(t, err) 4430 defer ss.Group().Delete(group1.Id) 4431 4432 count, err := ss.Group().GroupCount() 4433 require.NoError(t, err) 4434 require.GreaterOrEqual(t, count, int64(1)) 4435 4436 group2, err := ss.Group().Create(&model.Group{ 4437 Name: model.NewString(model.NewId()), 4438 DisplayName: model.NewId(), 4439 Source: model.GroupSourceLdap, 4440 RemoteId: model.NewId(), 4441 }) 4442 require.NoError(t, err) 4443 defer ss.Group().Delete(group2.Id) 4444 4445 countAfter, err := ss.Group().GroupCount() 4446 require.NoError(t, err) 4447 require.GreaterOrEqual(t, countAfter, count+1) 4448 } 4449 4450 func groupTestGroupTeamCount(t *testing.T, ss store.Store) { 4451 team, err := ss.Team().Save(&model.Team{ 4452 DisplayName: model.NewId(), 4453 Description: model.NewId(), 4454 AllowOpenInvite: false, 4455 InviteId: model.NewId(), 4456 Name: "zz" + model.NewId(), 4457 Email: model.NewId() + "@simulator.amazonses.com", 4458 Type: model.TEAM_OPEN, 4459 }) 4460 require.NoError(t, err) 4461 defer ss.Team().PermanentDelete(team.Id) 4462 4463 group1, err := ss.Group().Create(&model.Group{ 4464 Name: model.NewString(model.NewId()), 4465 DisplayName: model.NewId(), 4466 Source: model.GroupSourceLdap, 4467 RemoteId: model.NewId(), 4468 }) 4469 require.NoError(t, err) 4470 defer ss.Group().Delete(group1.Id) 4471 4472 group2, err := ss.Group().Create(&model.Group{ 4473 Name: model.NewString(model.NewId()), 4474 DisplayName: model.NewId(), 4475 Source: model.GroupSourceLdap, 4476 RemoteId: model.NewId(), 4477 }) 4478 require.NoError(t, err) 4479 defer ss.Group().Delete(group2.Id) 4480 4481 groupSyncable1, err := ss.Group().CreateGroupSyncable(model.NewGroupTeam(group1.Id, team.Id, false)) 4482 require.NoError(t, err) 4483 defer ss.Group().DeleteGroupSyncable(groupSyncable1.GroupId, groupSyncable1.SyncableId, groupSyncable1.Type) 4484 4485 count, err := ss.Group().GroupTeamCount() 4486 require.NoError(t, err) 4487 require.GreaterOrEqual(t, count, int64(1)) 4488 4489 groupSyncable2, err := ss.Group().CreateGroupSyncable(model.NewGroupTeam(group2.Id, team.Id, false)) 4490 require.NoError(t, err) 4491 defer ss.Group().DeleteGroupSyncable(groupSyncable2.GroupId, groupSyncable2.SyncableId, groupSyncable2.Type) 4492 4493 countAfter, err := ss.Group().GroupTeamCount() 4494 require.NoError(t, err) 4495 require.GreaterOrEqual(t, countAfter, count+1) 4496 } 4497 4498 func groupTestGroupChannelCount(t *testing.T, ss store.Store) { 4499 channel, err := ss.Channel().Save(&model.Channel{ 4500 TeamId: model.NewId(), 4501 DisplayName: model.NewId(), 4502 Name: model.NewId(), 4503 Type: model.CHANNEL_OPEN, 4504 }, 9999) 4505 require.NoError(t, err) 4506 defer ss.Channel().Delete(channel.Id, 0) 4507 4508 group1, err := ss.Group().Create(&model.Group{ 4509 Name: model.NewString(model.NewId()), 4510 DisplayName: model.NewId(), 4511 Source: model.GroupSourceLdap, 4512 RemoteId: model.NewId(), 4513 }) 4514 require.NoError(t, err) 4515 defer ss.Group().Delete(group1.Id) 4516 4517 group2, err := ss.Group().Create(&model.Group{ 4518 Name: model.NewString(model.NewId()), 4519 DisplayName: model.NewId(), 4520 Source: model.GroupSourceLdap, 4521 RemoteId: model.NewId(), 4522 }) 4523 require.NoError(t, err) 4524 defer ss.Group().Delete(group2.Id) 4525 4526 groupSyncable1, err := ss.Group().CreateGroupSyncable(model.NewGroupChannel(group1.Id, channel.Id, false)) 4527 require.NoError(t, err) 4528 defer ss.Group().DeleteGroupSyncable(groupSyncable1.GroupId, groupSyncable1.SyncableId, groupSyncable1.Type) 4529 4530 count, err := ss.Group().GroupChannelCount() 4531 require.NoError(t, err) 4532 require.GreaterOrEqual(t, count, int64(1)) 4533 4534 groupSyncable2, err := ss.Group().CreateGroupSyncable(model.NewGroupChannel(group2.Id, channel.Id, false)) 4535 require.NoError(t, err) 4536 defer ss.Group().DeleteGroupSyncable(groupSyncable2.GroupId, groupSyncable2.SyncableId, groupSyncable2.Type) 4537 4538 countAfter, err := ss.Group().GroupChannelCount() 4539 require.NoError(t, err) 4540 require.GreaterOrEqual(t, countAfter, count+1) 4541 } 4542 4543 func groupTestGroupMemberCount(t *testing.T, ss store.Store) { 4544 group, err := ss.Group().Create(&model.Group{ 4545 Name: model.NewString(model.NewId()), 4546 DisplayName: model.NewId(), 4547 Source: model.GroupSourceLdap, 4548 RemoteId: model.NewId(), 4549 }) 4550 require.NoError(t, err) 4551 defer ss.Group().Delete(group.Id) 4552 4553 member1, err := ss.Group().UpsertMember(group.Id, model.NewId()) 4554 require.NoError(t, err) 4555 defer ss.Group().DeleteMember(group.Id, member1.UserId) 4556 4557 count, err := ss.Group().GroupMemberCount() 4558 require.NoError(t, err) 4559 require.GreaterOrEqual(t, count, int64(1)) 4560 4561 member2, err := ss.Group().UpsertMember(group.Id, model.NewId()) 4562 require.NoError(t, err) 4563 defer ss.Group().DeleteMember(group.Id, member2.UserId) 4564 4565 countAfter, err := ss.Group().GroupMemberCount() 4566 require.NoError(t, err) 4567 require.GreaterOrEqual(t, countAfter, count+1) 4568 } 4569 4570 func groupTestDistinctGroupMemberCount(t *testing.T, ss store.Store) { 4571 group1, err := ss.Group().Create(&model.Group{ 4572 Name: model.NewString(model.NewId()), 4573 DisplayName: model.NewId(), 4574 Source: model.GroupSourceLdap, 4575 RemoteId: model.NewId(), 4576 }) 4577 require.NoError(t, err) 4578 defer ss.Group().Delete(group1.Id) 4579 4580 group2, err := ss.Group().Create(&model.Group{ 4581 Name: model.NewString(model.NewId()), 4582 DisplayName: model.NewId(), 4583 Source: model.GroupSourceLdap, 4584 RemoteId: model.NewId(), 4585 }) 4586 require.NoError(t, err) 4587 defer ss.Group().Delete(group2.Id) 4588 4589 member1, err := ss.Group().UpsertMember(group1.Id, model.NewId()) 4590 require.NoError(t, err) 4591 defer ss.Group().DeleteMember(group1.Id, member1.UserId) 4592 4593 count, err := ss.Group().GroupMemberCount() 4594 require.NoError(t, err) 4595 require.GreaterOrEqual(t, count, int64(1)) 4596 4597 member2, err := ss.Group().UpsertMember(group1.Id, model.NewId()) 4598 require.NoError(t, err) 4599 defer ss.Group().DeleteMember(group1.Id, member2.UserId) 4600 4601 countAfter1, err := ss.Group().GroupMemberCount() 4602 require.NoError(t, err) 4603 require.GreaterOrEqual(t, countAfter1, count+1) 4604 4605 member3, err := ss.Group().UpsertMember(group1.Id, member1.UserId) 4606 require.NoError(t, err) 4607 defer ss.Group().DeleteMember(group1.Id, member3.UserId) 4608 4609 countAfter2, err := ss.Group().GroupMemberCount() 4610 require.NoError(t, err) 4611 require.GreaterOrEqual(t, countAfter2, countAfter1) 4612 } 4613 4614 func groupTestGroupCountWithAllowReference(t *testing.T, ss store.Store) { 4615 initialCount, err := ss.Group().GroupCountWithAllowReference() 4616 require.NoError(t, err) 4617 4618 group1, err := ss.Group().Create(&model.Group{ 4619 Name: model.NewString(model.NewId()), 4620 DisplayName: model.NewId(), 4621 Source: model.GroupSourceLdap, 4622 RemoteId: model.NewId(), 4623 }) 4624 require.NoError(t, err) 4625 defer ss.Group().Delete(group1.Id) 4626 4627 count, err := ss.Group().GroupCountWithAllowReference() 4628 require.NoError(t, err) 4629 require.Equal(t, count, initialCount) 4630 4631 group2, err := ss.Group().Create(&model.Group{ 4632 Name: model.NewString(model.NewId()), 4633 DisplayName: model.NewId(), 4634 Source: model.GroupSourceLdap, 4635 RemoteId: model.NewId(), 4636 AllowReference: true, 4637 }) 4638 require.NoError(t, err) 4639 defer ss.Group().Delete(group2.Id) 4640 4641 countAfter, err := ss.Group().GroupCountWithAllowReference() 4642 require.NoError(t, err) 4643 require.Greater(t, countAfter, count) 4644 }