github.com/haalcala/mattermost-server-change-repo@v0.0.0-20210713015153-16753fbeee5f/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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 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) 1488 require.NoError(t, err) 1489 require.Empty(t, teamMembers) 1490 } 1491 1492 func testTeamMembersToAddSingleTeam(t *testing.T, ss store.Store) { 1493 group1, err := ss.Group().Create(&model.Group{ 1494 Name: model.NewString(model.NewId()), 1495 DisplayName: "TeamMembersToAdd Test Group", 1496 RemoteId: model.NewId(), 1497 Source: model.GroupSourceLdap, 1498 }) 1499 require.NoError(t, err) 1500 1501 group2, err := ss.Group().Create(&model.Group{ 1502 Name: model.NewString(model.NewId()), 1503 DisplayName: "TeamMembersToAdd Test Group", 1504 RemoteId: model.NewId(), 1505 Source: model.GroupSourceLdap, 1506 }) 1507 require.NoError(t, err) 1508 1509 user1 := &model.User{ 1510 Email: MakeEmail(), 1511 Username: model.NewId(), 1512 } 1513 user1, nErr := ss.User().Save(user1) 1514 require.NoError(t, nErr) 1515 1516 user2 := &model.User{ 1517 Email: MakeEmail(), 1518 Username: model.NewId(), 1519 } 1520 user2, nErr = ss.User().Save(user2) 1521 require.NoError(t, nErr) 1522 1523 user3 := &model.User{ 1524 Email: MakeEmail(), 1525 Username: model.NewId(), 1526 } 1527 user3, nErr = ss.User().Save(user3) 1528 require.NoError(t, nErr) 1529 1530 for _, user := range []*model.User{user1, user2} { 1531 _, err = ss.Group().UpsertMember(group1.Id, user.Id) 1532 require.NoError(t, err) 1533 } 1534 _, err = ss.Group().UpsertMember(group2.Id, user3.Id) 1535 require.NoError(t, err) 1536 1537 team1 := &model.Team{ 1538 DisplayName: "Name", 1539 Description: "Some description", 1540 CompanyName: "Some company name", 1541 AllowOpenInvite: false, 1542 InviteId: "inviteid0", 1543 Name: "z-z-" + model.NewId() + "a", 1544 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 1545 Type: model.TEAM_OPEN, 1546 } 1547 team1, nErr = ss.Team().Save(team1) 1548 require.NoError(t, nErr) 1549 1550 team2 := &model.Team{ 1551 DisplayName: "Name", 1552 Description: "Some description", 1553 CompanyName: "Some company name", 1554 AllowOpenInvite: false, 1555 InviteId: "inviteid0", 1556 Name: "z-z-" + model.NewId() + "a", 1557 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 1558 Type: model.TEAM_OPEN, 1559 } 1560 team2, nErr = ss.Team().Save(team2) 1561 require.NoError(t, nErr) 1562 1563 _, err = ss.Group().CreateGroupSyncable(model.NewGroupTeam(group1.Id, team1.Id, true)) 1564 require.NoError(t, err) 1565 1566 _, err = ss.Group().CreateGroupSyncable(model.NewGroupTeam(group2.Id, team2.Id, true)) 1567 require.NoError(t, err) 1568 1569 teamMembers, err := ss.Group().TeamMembersToAdd(0, nil) 1570 require.NoError(t, err) 1571 require.Len(t, teamMembers, 3) 1572 1573 teamMembers, err = ss.Group().TeamMembersToAdd(0, &team1.Id) 1574 require.NoError(t, err) 1575 require.Len(t, teamMembers, 2) 1576 1577 teamMembers, err = ss.Group().TeamMembersToAdd(0, &team2.Id) 1578 require.NoError(t, err) 1579 require.Len(t, teamMembers, 1) 1580 } 1581 1582 func testChannelMembersToAdd(t *testing.T, ss store.Store) { 1583 // Create Group 1584 group, err := ss.Group().Create(&model.Group{ 1585 Name: model.NewString(model.NewId()), 1586 DisplayName: "ChannelMembersToAdd Test Group", 1587 RemoteId: model.NewId(), 1588 Source: model.GroupSourceLdap, 1589 }) 1590 require.NoError(t, err) 1591 1592 // Create User 1593 user := &model.User{ 1594 Email: MakeEmail(), 1595 Username: model.NewId(), 1596 } 1597 user, nErr := ss.User().Save(user) 1598 require.NoError(t, nErr) 1599 1600 // Create GroupMember 1601 _, err = ss.Group().UpsertMember(group.Id, user.Id) 1602 require.NoError(t, err) 1603 1604 // Create Channel 1605 channel := &model.Channel{ 1606 TeamId: model.NewId(), 1607 DisplayName: "A Name", 1608 Name: model.NewId(), 1609 Type: model.CHANNEL_OPEN, // Query does not look at type so this shouldn't matter. 1610 } 1611 channel, nErr = ss.Channel().Save(channel, 9999) 1612 require.NoError(t, nErr) 1613 1614 // Create GroupChannel 1615 syncable, err := ss.Group().CreateGroupSyncable(model.NewGroupChannel(group.Id, channel.Id, true)) 1616 require.NoError(t, err) 1617 1618 // Time before syncable was created 1619 channelMembers, err := ss.Group().ChannelMembersToAdd(syncable.CreateAt-1, nil) 1620 require.NoError(t, err) 1621 require.Len(t, channelMembers, 1) 1622 require.Equal(t, user.Id, channelMembers[0].UserID) 1623 require.Equal(t, channel.Id, channelMembers[0].ChannelID) 1624 1625 // Time after syncable was created 1626 channelMembers, err = ss.Group().ChannelMembersToAdd(syncable.CreateAt+1, nil) 1627 require.NoError(t, err) 1628 require.Empty(t, channelMembers) 1629 1630 // Delete and restore GroupMember should return result 1631 _, err = ss.Group().DeleteMember(group.Id, user.Id) 1632 require.NoError(t, err) 1633 _, err = ss.Group().UpsertMember(group.Id, user.Id) 1634 require.NoError(t, err) 1635 channelMembers, err = ss.Group().ChannelMembersToAdd(syncable.CreateAt+1, nil) 1636 require.NoError(t, err) 1637 require.Len(t, channelMembers, 1) 1638 1639 pristineSyncable := *syncable 1640 1641 _, err = ss.Group().UpdateGroupSyncable(syncable) 1642 require.NoError(t, err) 1643 1644 // Time before syncable was updated 1645 channelMembers, err = ss.Group().ChannelMembersToAdd(syncable.UpdateAt-1, nil) 1646 require.NoError(t, err) 1647 require.Len(t, channelMembers, 1) 1648 require.Equal(t, user.Id, channelMembers[0].UserID) 1649 require.Equal(t, channel.Id, channelMembers[0].ChannelID) 1650 1651 // Time after syncable was updated 1652 channelMembers, err = ss.Group().ChannelMembersToAdd(syncable.UpdateAt+1, nil) 1653 require.NoError(t, err) 1654 require.Empty(t, channelMembers) 1655 1656 // Only includes if auto-add 1657 syncable.AutoAdd = false 1658 _, err = ss.Group().UpdateGroupSyncable(syncable) 1659 require.NoError(t, err) 1660 channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil) 1661 require.NoError(t, err) 1662 require.Empty(t, channelMembers) 1663 1664 // reset state of syncable and verify 1665 _, err = ss.Group().UpdateGroupSyncable(&pristineSyncable) 1666 require.NoError(t, err) 1667 channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil) 1668 require.NoError(t, err) 1669 require.Len(t, channelMembers, 1) 1670 1671 // No result if Group deleted 1672 _, err = ss.Group().Delete(group.Id) 1673 require.NoError(t, err) 1674 channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil) 1675 require.NoError(t, err) 1676 require.Empty(t, channelMembers) 1677 1678 // reset state of group and verify 1679 group.DeleteAt = 0 1680 _, err = ss.Group().Update(group) 1681 require.NoError(t, err) 1682 channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil) 1683 require.NoError(t, err) 1684 require.Len(t, channelMembers, 1) 1685 1686 // No result if Channel deleted 1687 nErr = ss.Channel().Delete(channel.Id, model.GetMillis()) 1688 require.NoError(t, nErr) 1689 channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil) 1690 require.NoError(t, err) 1691 require.Empty(t, channelMembers) 1692 1693 // reset state of channel and verify 1694 channel.DeleteAt = 0 1695 _, nErr = ss.Channel().Update(channel) 1696 require.NoError(t, nErr) 1697 channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil) 1698 require.NoError(t, err) 1699 require.Len(t, channelMembers, 1) 1700 1701 // No result if GroupChannel deleted 1702 _, err = ss.Group().DeleteGroupSyncable(group.Id, channel.Id, model.GroupSyncableTypeChannel) 1703 require.NoError(t, err) 1704 channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil) 1705 require.NoError(t, err) 1706 require.Empty(t, channelMembers) 1707 1708 // reset GroupChannel and verify 1709 _, err = ss.Group().UpdateGroupSyncable(&pristineSyncable) 1710 require.NoError(t, err) 1711 channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil) 1712 require.NoError(t, err) 1713 require.Len(t, channelMembers, 1) 1714 1715 // No result if GroupMember deleted 1716 _, err = ss.Group().DeleteMember(group.Id, user.Id) 1717 require.NoError(t, err) 1718 channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil) 1719 require.NoError(t, err) 1720 require.Empty(t, channelMembers) 1721 1722 // restore group member and verify 1723 _, err = ss.Group().UpsertMember(group.Id, user.Id) 1724 require.NoError(t, err) 1725 channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil) 1726 require.NoError(t, err) 1727 require.Len(t, channelMembers, 1) 1728 1729 // Adding Channel (ChannelMemberHistory) should stop returning result 1730 nErr = ss.ChannelMemberHistory().LogJoinEvent(user.Id, channel.Id, model.GetMillis()) 1731 require.NoError(t, nErr) 1732 channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil) 1733 require.NoError(t, err) 1734 require.Empty(t, channelMembers) 1735 1736 // Leaving Channel (ChannelMemberHistory) should still not return result 1737 nErr = ss.ChannelMemberHistory().LogLeaveEvent(user.Id, channel.Id, model.GetMillis()) 1738 require.NoError(t, nErr) 1739 channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil) 1740 require.NoError(t, err) 1741 require.Empty(t, channelMembers) 1742 1743 // Purging ChannelMemberHistory re-returns the result 1744 _, nErr = ss.ChannelMemberHistory().PermanentDeleteBatch(model.GetMillis()+1, 100) 1745 require.NoError(t, nErr) 1746 channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil) 1747 require.NoError(t, err) 1748 require.Len(t, channelMembers, 1) 1749 } 1750 1751 func testChannelMembersToAddSingleChannel(t *testing.T, ss store.Store) { 1752 group1, err := ss.Group().Create(&model.Group{ 1753 Name: model.NewString(model.NewId()), 1754 DisplayName: "TeamMembersToAdd Test Group", 1755 RemoteId: model.NewId(), 1756 Source: model.GroupSourceLdap, 1757 }) 1758 require.NoError(t, err) 1759 1760 group2, err := ss.Group().Create(&model.Group{ 1761 Name: model.NewString(model.NewId()), 1762 DisplayName: "TeamMembersToAdd Test Group", 1763 RemoteId: model.NewId(), 1764 Source: model.GroupSourceLdap, 1765 }) 1766 require.NoError(t, err) 1767 1768 user1 := &model.User{ 1769 Email: MakeEmail(), 1770 Username: model.NewId(), 1771 } 1772 user1, nErr := ss.User().Save(user1) 1773 require.NoError(t, nErr) 1774 1775 user2 := &model.User{ 1776 Email: MakeEmail(), 1777 Username: model.NewId(), 1778 } 1779 user2, nErr = ss.User().Save(user2) 1780 require.NoError(t, nErr) 1781 1782 user3 := &model.User{ 1783 Email: MakeEmail(), 1784 Username: model.NewId(), 1785 } 1786 user3, nErr = ss.User().Save(user3) 1787 require.NoError(t, nErr) 1788 1789 for _, user := range []*model.User{user1, user2} { 1790 _, err = ss.Group().UpsertMember(group1.Id, user.Id) 1791 require.NoError(t, err) 1792 } 1793 _, err = ss.Group().UpsertMember(group2.Id, user3.Id) 1794 require.NoError(t, err) 1795 1796 channel1 := &model.Channel{ 1797 DisplayName: "Name", 1798 Name: "z-z-" + model.NewId() + "a", 1799 Type: model.CHANNEL_OPEN, 1800 } 1801 channel1, nErr = ss.Channel().Save(channel1, 999) 1802 require.NoError(t, nErr) 1803 1804 channel2 := &model.Channel{ 1805 DisplayName: "Name", 1806 Name: "z-z-" + model.NewId() + "a", 1807 Type: model.CHANNEL_OPEN, 1808 } 1809 channel2, nErr = ss.Channel().Save(channel2, 999) 1810 require.NoError(t, nErr) 1811 1812 _, err = ss.Group().CreateGroupSyncable(model.NewGroupChannel(group1.Id, channel1.Id, true)) 1813 require.NoError(t, err) 1814 1815 _, err = ss.Group().CreateGroupSyncable(model.NewGroupChannel(group2.Id, channel2.Id, true)) 1816 require.NoError(t, err) 1817 1818 channelMembers, err := ss.Group().ChannelMembersToAdd(0, nil) 1819 require.NoError(t, err) 1820 require.GreaterOrEqual(t, len(channelMembers), 3) 1821 1822 channelMembers, err = ss.Group().ChannelMembersToAdd(0, &channel1.Id) 1823 require.NoError(t, err) 1824 require.Len(t, channelMembers, 2) 1825 1826 channelMembers, err = ss.Group().ChannelMembersToAdd(0, &channel2.Id) 1827 require.NoError(t, err) 1828 require.Len(t, channelMembers, 1) 1829 } 1830 1831 func testTeamMembersToRemove(t *testing.T, ss store.Store) { 1832 data := pendingMemberRemovalsDataSetup(t, ss) 1833 1834 // one result when both users are in the group (for user C) 1835 teamMembers, err := ss.Group().TeamMembersToRemove(nil) 1836 require.NoError(t, err) 1837 require.Len(t, teamMembers, 1) 1838 require.Equal(t, data.UserC.Id, teamMembers[0].UserId) 1839 1840 _, err = ss.Group().DeleteMember(data.Group.Id, data.UserB.Id) 1841 require.NoError(t, err) 1842 1843 // user b and c should now be returned 1844 teamMembers, err = ss.Group().TeamMembersToRemove(nil) 1845 require.NoError(t, err) 1846 require.Len(t, teamMembers, 2) 1847 1848 var userIDs []string 1849 for _, item := range teamMembers { 1850 userIDs = append(userIDs, item.UserId) 1851 } 1852 require.Contains(t, userIDs, data.UserB.Id) 1853 require.Contains(t, userIDs, data.UserC.Id) 1854 require.Equal(t, data.ConstrainedTeam.Id, teamMembers[0].TeamId) 1855 require.Equal(t, data.ConstrainedTeam.Id, teamMembers[1].TeamId) 1856 1857 _, err = ss.Group().DeleteMember(data.Group.Id, data.UserA.Id) 1858 require.NoError(t, err) 1859 1860 teamMembers, err = ss.Group().TeamMembersToRemove(nil) 1861 require.NoError(t, err) 1862 require.Len(t, teamMembers, 3) 1863 1864 // Make one of them a bot 1865 teamMembers, err = ss.Group().TeamMembersToRemove(nil) 1866 require.NoError(t, err) 1867 teamMember := teamMembers[0] 1868 bot := &model.Bot{ 1869 UserId: teamMember.UserId, 1870 Username: "un_" + model.NewId(), 1871 DisplayName: "dn_" + model.NewId(), 1872 OwnerId: teamMember.UserId, 1873 } 1874 bot, nErr := ss.Bot().Save(bot) 1875 require.NoError(t, nErr) 1876 1877 // verify that bot is not returned in results 1878 teamMembers, err = ss.Group().TeamMembersToRemove(nil) 1879 require.NoError(t, err) 1880 require.Len(t, teamMembers, 2) 1881 1882 // delete the bot 1883 nErr = ss.Bot().PermanentDelete(bot.UserId) 1884 require.NoError(t, nErr) 1885 1886 // Should be back to 3 users 1887 teamMembers, err = ss.Group().TeamMembersToRemove(nil) 1888 require.NoError(t, err) 1889 require.Len(t, teamMembers, 3) 1890 1891 // add users back to groups 1892 res := ss.Team().RemoveMember(data.ConstrainedTeam.Id, data.UserA.Id) 1893 require.NoError(t, res) 1894 res = ss.Team().RemoveMember(data.ConstrainedTeam.Id, data.UserB.Id) 1895 require.NoError(t, res) 1896 res = ss.Team().RemoveMember(data.ConstrainedTeam.Id, data.UserC.Id) 1897 require.NoError(t, res) 1898 nErr = ss.Channel().RemoveMember(data.ConstrainedChannel.Id, data.UserA.Id) 1899 require.NoError(t, nErr) 1900 nErr = ss.Channel().RemoveMember(data.ConstrainedChannel.Id, data.UserB.Id) 1901 require.NoError(t, nErr) 1902 nErr = ss.Channel().RemoveMember(data.ConstrainedChannel.Id, data.UserC.Id) 1903 require.NoError(t, nErr) 1904 } 1905 1906 func testTeamMembersToRemoveSingleTeam(t *testing.T, ss store.Store) { 1907 user1 := &model.User{ 1908 Email: MakeEmail(), 1909 Username: model.NewId(), 1910 } 1911 user1, err := ss.User().Save(user1) 1912 require.NoError(t, err) 1913 1914 user2 := &model.User{ 1915 Email: MakeEmail(), 1916 Username: model.NewId(), 1917 } 1918 user2, err = ss.User().Save(user2) 1919 require.NoError(t, err) 1920 1921 user3 := &model.User{ 1922 Email: MakeEmail(), 1923 Username: model.NewId(), 1924 } 1925 user3, err = ss.User().Save(user3) 1926 require.NoError(t, err) 1927 1928 team1 := &model.Team{ 1929 DisplayName: "Name", 1930 Description: "Some description", 1931 CompanyName: "Some company name", 1932 AllowOpenInvite: false, 1933 InviteId: "inviteid0", 1934 Name: "z-z-" + model.NewId() + "a", 1935 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 1936 Type: model.TEAM_OPEN, 1937 GroupConstrained: model.NewBool(true), 1938 } 1939 team1, nErr := ss.Team().Save(team1) 1940 require.NoError(t, nErr) 1941 1942 team2 := &model.Team{ 1943 DisplayName: "Name", 1944 Description: "Some description", 1945 CompanyName: "Some company name", 1946 AllowOpenInvite: false, 1947 InviteId: "inviteid0", 1948 Name: "z-z-" + model.NewId() + "a", 1949 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 1950 Type: model.TEAM_OPEN, 1951 GroupConstrained: model.NewBool(true), 1952 } 1953 team2, nErr = ss.Team().Save(team2) 1954 require.NoError(t, nErr) 1955 1956 for _, user := range []*model.User{user1, user2} { 1957 _, nErr = ss.Team().SaveMember(&model.TeamMember{ 1958 TeamId: team1.Id, 1959 UserId: user.Id, 1960 }, 999) 1961 require.NoError(t, nErr) 1962 } 1963 1964 _, nErr = ss.Team().SaveMember(&model.TeamMember{ 1965 TeamId: team2.Id, 1966 UserId: user3.Id, 1967 }, 999) 1968 require.NoError(t, nErr) 1969 1970 teamMembers, err := ss.Group().TeamMembersToRemove(nil) 1971 require.NoError(t, err) 1972 require.Len(t, teamMembers, 3) 1973 1974 teamMembers, err = ss.Group().TeamMembersToRemove(&team1.Id) 1975 require.NoError(t, err) 1976 require.Len(t, teamMembers, 2) 1977 1978 teamMembers, err = ss.Group().TeamMembersToRemove(&team2.Id) 1979 require.NoError(t, err) 1980 require.Len(t, teamMembers, 1) 1981 } 1982 1983 func testChannelMembersToRemove(t *testing.T, ss store.Store) { 1984 data := pendingMemberRemovalsDataSetup(t, ss) 1985 1986 // one result when both users are in the group (for user C) 1987 channelMembers, err := ss.Group().ChannelMembersToRemove(nil) 1988 require.NoError(t, err) 1989 require.Len(t, channelMembers, 1) 1990 require.Equal(t, data.UserC.Id, channelMembers[0].UserId) 1991 1992 _, err = ss.Group().DeleteMember(data.Group.Id, data.UserB.Id) 1993 require.NoError(t, err) 1994 1995 // user b and c should now be returned 1996 channelMembers, err = ss.Group().ChannelMembersToRemove(nil) 1997 require.NoError(t, err) 1998 require.Len(t, channelMembers, 2) 1999 2000 var userIDs []string 2001 for _, item := range channelMembers { 2002 userIDs = append(userIDs, item.UserId) 2003 } 2004 require.Contains(t, userIDs, data.UserB.Id) 2005 require.Contains(t, userIDs, data.UserC.Id) 2006 require.Equal(t, data.ConstrainedChannel.Id, channelMembers[0].ChannelId) 2007 require.Equal(t, data.ConstrainedChannel.Id, channelMembers[1].ChannelId) 2008 2009 _, err = ss.Group().DeleteMember(data.Group.Id, data.UserA.Id) 2010 require.NoError(t, err) 2011 2012 channelMembers, err = ss.Group().ChannelMembersToRemove(nil) 2013 require.NoError(t, err) 2014 require.Len(t, channelMembers, 3) 2015 2016 // Make one of them a bot 2017 channelMembers, err = ss.Group().ChannelMembersToRemove(nil) 2018 require.NoError(t, err) 2019 channelMember := channelMembers[0] 2020 bot := &model.Bot{ 2021 UserId: channelMember.UserId, 2022 Username: "un_" + model.NewId(), 2023 DisplayName: "dn_" + model.NewId(), 2024 OwnerId: channelMember.UserId, 2025 } 2026 bot, nErr := ss.Bot().Save(bot) 2027 require.NoError(t, nErr) 2028 2029 // verify that bot is not returned in results 2030 channelMembers, err = ss.Group().ChannelMembersToRemove(nil) 2031 require.NoError(t, err) 2032 require.Len(t, channelMembers, 2) 2033 2034 // delete the bot 2035 nErr = ss.Bot().PermanentDelete(bot.UserId) 2036 require.NoError(t, nErr) 2037 2038 // Should be back to 3 users 2039 channelMembers, err = ss.Group().ChannelMembersToRemove(nil) 2040 require.NoError(t, err) 2041 require.Len(t, channelMembers, 3) 2042 2043 // add users back to groups 2044 res := ss.Team().RemoveMember(data.ConstrainedTeam.Id, data.UserA.Id) 2045 require.NoError(t, res) 2046 res = ss.Team().RemoveMember(data.ConstrainedTeam.Id, data.UserB.Id) 2047 require.NoError(t, res) 2048 res = ss.Team().RemoveMember(data.ConstrainedTeam.Id, data.UserC.Id) 2049 require.NoError(t, res) 2050 nErr = ss.Channel().RemoveMember(data.ConstrainedChannel.Id, data.UserA.Id) 2051 require.NoError(t, nErr) 2052 nErr = ss.Channel().RemoveMember(data.ConstrainedChannel.Id, data.UserB.Id) 2053 require.NoError(t, nErr) 2054 nErr = ss.Channel().RemoveMember(data.ConstrainedChannel.Id, data.UserC.Id) 2055 require.NoError(t, nErr) 2056 } 2057 2058 func testChannelMembersToRemoveSingleChannel(t *testing.T, ss store.Store) { 2059 user1 := &model.User{ 2060 Email: MakeEmail(), 2061 Username: model.NewId(), 2062 } 2063 user1, err := ss.User().Save(user1) 2064 require.NoError(t, err) 2065 2066 user2 := &model.User{ 2067 Email: MakeEmail(), 2068 Username: model.NewId(), 2069 } 2070 user2, err = ss.User().Save(user2) 2071 require.NoError(t, err) 2072 2073 user3 := &model.User{ 2074 Email: MakeEmail(), 2075 Username: model.NewId(), 2076 } 2077 user3, err = ss.User().Save(user3) 2078 require.NoError(t, err) 2079 2080 channel1 := &model.Channel{ 2081 DisplayName: "Name", 2082 Name: "z-z-" + model.NewId() + "a", 2083 Type: model.CHANNEL_OPEN, 2084 GroupConstrained: model.NewBool(true), 2085 } 2086 channel1, nErr := ss.Channel().Save(channel1, 999) 2087 require.NoError(t, nErr) 2088 2089 channel2 := &model.Channel{ 2090 DisplayName: "Name", 2091 Name: "z-z-" + model.NewId() + "a", 2092 Type: model.CHANNEL_OPEN, 2093 GroupConstrained: model.NewBool(true), 2094 } 2095 channel2, nErr = ss.Channel().Save(channel2, 999) 2096 require.NoError(t, nErr) 2097 2098 for _, user := range []*model.User{user1, user2} { 2099 _, nErr = ss.Channel().SaveMember(&model.ChannelMember{ 2100 ChannelId: channel1.Id, 2101 UserId: user.Id, 2102 NotifyProps: model.GetDefaultChannelNotifyProps(), 2103 }) 2104 require.NoError(t, nErr) 2105 } 2106 2107 _, nErr = ss.Channel().SaveMember(&model.ChannelMember{ 2108 ChannelId: channel2.Id, 2109 UserId: user3.Id, 2110 NotifyProps: model.GetDefaultChannelNotifyProps(), 2111 }) 2112 require.NoError(t, nErr) 2113 2114 channelMembers, err := ss.Group().ChannelMembersToRemove(nil) 2115 require.NoError(t, err) 2116 require.Len(t, channelMembers, 3) 2117 2118 channelMembers, err = ss.Group().ChannelMembersToRemove(&channel1.Id) 2119 require.NoError(t, err) 2120 require.Len(t, channelMembers, 2) 2121 2122 channelMembers, err = ss.Group().ChannelMembersToRemove(&channel2.Id) 2123 require.NoError(t, err) 2124 require.Len(t, channelMembers, 1) 2125 } 2126 2127 type removalsData struct { 2128 UserA *model.User 2129 UserB *model.User 2130 UserC *model.User 2131 ConstrainedChannel *model.Channel 2132 UnconstrainedChannel *model.Channel 2133 ConstrainedTeam *model.Team 2134 UnconstrainedTeam *model.Team 2135 Group *model.Group 2136 } 2137 2138 func pendingMemberRemovalsDataSetup(t *testing.T, ss store.Store) *removalsData { 2139 // create group 2140 group, err := ss.Group().Create(&model.Group{ 2141 Name: model.NewString(model.NewId()), 2142 DisplayName: "Pending[Channel|Team]MemberRemovals Test Group", 2143 RemoteId: model.NewId(), 2144 Source: model.GroupSourceLdap, 2145 }) 2146 require.NoError(t, err) 2147 2148 // create users 2149 // userA will get removed from the group 2150 userA := &model.User{ 2151 Email: MakeEmail(), 2152 Username: model.NewId(), 2153 } 2154 userA, nErr := ss.User().Save(userA) 2155 require.NoError(t, nErr) 2156 2157 // userB will not get removed from the group 2158 userB := &model.User{ 2159 Email: MakeEmail(), 2160 Username: model.NewId(), 2161 } 2162 userB, nErr = ss.User().Save(userB) 2163 require.NoError(t, nErr) 2164 2165 // userC was never in the group 2166 userC := &model.User{ 2167 Email: MakeEmail(), 2168 Username: model.NewId(), 2169 } 2170 userC, nErr = ss.User().Save(userC) 2171 require.NoError(t, nErr) 2172 2173 // add users to group (but not userC) 2174 _, err = ss.Group().UpsertMember(group.Id, userA.Id) 2175 require.NoError(t, err) 2176 2177 _, err = ss.Group().UpsertMember(group.Id, userB.Id) 2178 require.NoError(t, err) 2179 2180 // create channels 2181 channelConstrained := &model.Channel{ 2182 TeamId: model.NewId(), 2183 DisplayName: "A Name", 2184 Name: model.NewId(), 2185 Type: model.CHANNEL_PRIVATE, 2186 GroupConstrained: model.NewBool(true), 2187 } 2188 channelConstrained, nErr = ss.Channel().Save(channelConstrained, 9999) 2189 require.NoError(t, nErr) 2190 2191 channelUnconstrained := &model.Channel{ 2192 TeamId: model.NewId(), 2193 DisplayName: "A Name", 2194 Name: model.NewId(), 2195 Type: model.CHANNEL_PRIVATE, 2196 } 2197 channelUnconstrained, nErr = ss.Channel().Save(channelUnconstrained, 9999) 2198 require.NoError(t, nErr) 2199 2200 // create teams 2201 teamConstrained := &model.Team{ 2202 DisplayName: "Name", 2203 Description: "Some description", 2204 CompanyName: "Some company name", 2205 AllowOpenInvite: false, 2206 InviteId: "inviteid0", 2207 Name: "z-z-" + model.NewId() + "a", 2208 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 2209 Type: model.TEAM_INVITE, 2210 GroupConstrained: model.NewBool(true), 2211 } 2212 teamConstrained, nErr = ss.Team().Save(teamConstrained) 2213 require.NoError(t, nErr) 2214 2215 teamUnconstrained := &model.Team{ 2216 DisplayName: "Name", 2217 Description: "Some description", 2218 CompanyName: "Some company name", 2219 AllowOpenInvite: false, 2220 InviteId: "inviteid1", 2221 Name: "z-z-" + model.NewId() + "a", 2222 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 2223 Type: model.TEAM_INVITE, 2224 } 2225 teamUnconstrained, nErr = ss.Team().Save(teamUnconstrained) 2226 require.NoError(t, nErr) 2227 2228 // create groupteams 2229 _, err = ss.Group().CreateGroupSyncable(model.NewGroupTeam(group.Id, teamConstrained.Id, true)) 2230 require.NoError(t, err) 2231 2232 _, err = ss.Group().CreateGroupSyncable(model.NewGroupTeam(group.Id, teamUnconstrained.Id, true)) 2233 require.NoError(t, err) 2234 2235 // create groupchannels 2236 _, err = ss.Group().CreateGroupSyncable(model.NewGroupChannel(group.Id, channelConstrained.Id, true)) 2237 require.NoError(t, err) 2238 2239 _, err = ss.Group().CreateGroupSyncable(model.NewGroupChannel(group.Id, channelUnconstrained.Id, true)) 2240 require.NoError(t, err) 2241 2242 // add users to teams 2243 userIDTeamIDs := [][]string{ 2244 {userA.Id, teamConstrained.Id}, 2245 {userB.Id, teamConstrained.Id}, 2246 {userC.Id, teamConstrained.Id}, 2247 {userA.Id, teamUnconstrained.Id}, 2248 {userB.Id, teamUnconstrained.Id}, 2249 {userC.Id, teamUnconstrained.Id}, 2250 } 2251 2252 for _, item := range userIDTeamIDs { 2253 _, nErr = ss.Team().SaveMember(&model.TeamMember{ 2254 UserId: item[0], 2255 TeamId: item[1], 2256 }, 99) 2257 require.NoError(t, nErr) 2258 } 2259 2260 // add users to channels 2261 userIDChannelIDs := [][]string{ 2262 {userA.Id, channelConstrained.Id}, 2263 {userB.Id, channelConstrained.Id}, 2264 {userC.Id, channelConstrained.Id}, 2265 {userA.Id, channelUnconstrained.Id}, 2266 {userB.Id, channelUnconstrained.Id}, 2267 {userC.Id, channelUnconstrained.Id}, 2268 } 2269 2270 for _, item := range userIDChannelIDs { 2271 _, err := ss.Channel().SaveMember(&model.ChannelMember{ 2272 UserId: item[0], 2273 ChannelId: item[1], 2274 NotifyProps: model.GetDefaultChannelNotifyProps(), 2275 }) 2276 require.NoError(t, err) 2277 } 2278 2279 return &removalsData{ 2280 UserA: userA, 2281 UserB: userB, 2282 UserC: userC, 2283 ConstrainedChannel: channelConstrained, 2284 UnconstrainedChannel: channelUnconstrained, 2285 ConstrainedTeam: teamConstrained, 2286 UnconstrainedTeam: teamUnconstrained, 2287 Group: group, 2288 } 2289 } 2290 2291 func testGetGroupsByChannel(t *testing.T, ss store.Store) { 2292 // Create Channel1 2293 channel1 := &model.Channel{ 2294 TeamId: model.NewId(), 2295 DisplayName: "Channel1", 2296 Name: model.NewId(), 2297 Type: model.CHANNEL_OPEN, 2298 } 2299 channel1, err := ss.Channel().Save(channel1, 9999) 2300 require.NoError(t, err) 2301 2302 // Create Groups 1, 2 and a deleted group 2303 group1, err := ss.Group().Create(&model.Group{ 2304 Name: model.NewString(model.NewId()), 2305 DisplayName: "group-1", 2306 RemoteId: model.NewId(), 2307 Source: model.GroupSourceLdap, 2308 AllowReference: true, 2309 }) 2310 require.NoError(t, err) 2311 2312 group2, err := ss.Group().Create(&model.Group{ 2313 Name: model.NewString(model.NewId()), 2314 DisplayName: "group-2", 2315 RemoteId: model.NewId(), 2316 Source: model.GroupSourceLdap, 2317 AllowReference: false, 2318 }) 2319 require.NoError(t, err) 2320 2321 deletedGroup, err := ss.Group().Create(&model.Group{ 2322 Name: model.NewString(model.NewId()), 2323 DisplayName: "group-deleted", 2324 RemoteId: model.NewId(), 2325 Source: model.GroupSourceLdap, 2326 AllowReference: true, 2327 DeleteAt: 1, 2328 }) 2329 require.NoError(t, err) 2330 2331 // And associate them with Channel1 2332 for _, g := range []*model.Group{group1, group2, deletedGroup} { 2333 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 2334 AutoAdd: true, 2335 SyncableId: channel1.Id, 2336 Type: model.GroupSyncableTypeChannel, 2337 GroupId: g.Id, 2338 }) 2339 require.NoError(t, err) 2340 } 2341 2342 // Create Channel2 2343 channel2 := &model.Channel{ 2344 TeamId: model.NewId(), 2345 DisplayName: "Channel2", 2346 Name: model.NewId(), 2347 Type: model.CHANNEL_OPEN, 2348 } 2349 channel2, nErr := ss.Channel().Save(channel2, 9999) 2350 require.NoError(t, nErr) 2351 2352 // Create Group3 2353 group3, err := ss.Group().Create(&model.Group{ 2354 Name: model.NewString(model.NewId()), 2355 DisplayName: "group-3", 2356 RemoteId: model.NewId(), 2357 Source: model.GroupSourceLdap, 2358 AllowReference: true, 2359 }) 2360 require.NoError(t, err) 2361 2362 // And associate it to Channel2 2363 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 2364 AutoAdd: true, 2365 SyncableId: channel2.Id, 2366 Type: model.GroupSyncableTypeChannel, 2367 GroupId: group3.Id, 2368 }) 2369 require.NoError(t, err) 2370 2371 // add members 2372 u1 := &model.User{ 2373 Email: MakeEmail(), 2374 Username: model.NewId(), 2375 } 2376 user1, err := ss.User().Save(u1) 2377 require.NoError(t, err) 2378 2379 u2 := &model.User{ 2380 Email: MakeEmail(), 2381 Username: model.NewId(), 2382 } 2383 user2, err := ss.User().Save(u2) 2384 require.NoError(t, err) 2385 2386 _, err = ss.Group().UpsertMember(group1.Id, user1.Id) 2387 require.NoError(t, err) 2388 2389 _, err = ss.Group().UpsertMember(group1.Id, user2.Id) 2390 require.NoError(t, err) 2391 2392 user2.DeleteAt = 1 2393 _, err = ss.User().Update(user2, true) 2394 require.NoError(t, err) 2395 2396 group1WithMemberCount := *group1 2397 group1WithMemberCount.MemberCount = model.NewInt(1) 2398 2399 group2WithMemberCount := *group2 2400 group2WithMemberCount.MemberCount = model.NewInt(0) 2401 2402 group1WSA := &model.GroupWithSchemeAdmin{Group: *group1, SchemeAdmin: model.NewBool(false)} 2403 group2WSA := &model.GroupWithSchemeAdmin{Group: *group2, SchemeAdmin: model.NewBool(false)} 2404 group3WSA := &model.GroupWithSchemeAdmin{Group: *group3, SchemeAdmin: model.NewBool(false)} 2405 2406 testCases := []struct { 2407 Name string 2408 ChannelId string 2409 Page int 2410 PerPage int 2411 Result []*model.GroupWithSchemeAdmin 2412 Opts model.GroupSearchOpts 2413 TotalCount *int64 2414 }{ 2415 { 2416 Name: "Get the two Groups for Channel1", 2417 ChannelId: channel1.Id, 2418 Opts: model.GroupSearchOpts{}, 2419 Page: 0, 2420 PerPage: 60, 2421 Result: []*model.GroupWithSchemeAdmin{group1WSA, group2WSA}, 2422 TotalCount: model.NewInt64(2), 2423 }, 2424 { 2425 Name: "Get first Group for Channel1 with page 0 with 1 element", 2426 ChannelId: channel1.Id, 2427 Opts: model.GroupSearchOpts{}, 2428 Page: 0, 2429 PerPage: 1, 2430 Result: []*model.GroupWithSchemeAdmin{group1WSA}, 2431 }, 2432 { 2433 Name: "Get second Group for Channel1 with page 1 with 1 element", 2434 ChannelId: channel1.Id, 2435 Opts: model.GroupSearchOpts{}, 2436 Page: 1, 2437 PerPage: 1, 2438 Result: []*model.GroupWithSchemeAdmin{group2WSA}, 2439 }, 2440 { 2441 Name: "Get third Group for Channel2", 2442 ChannelId: channel2.Id, 2443 Opts: model.GroupSearchOpts{}, 2444 Page: 0, 2445 PerPage: 60, 2446 Result: []*model.GroupWithSchemeAdmin{group3WSA}, 2447 }, 2448 { 2449 Name: "Get empty Groups for a fake id", 2450 ChannelId: model.NewId(), 2451 Opts: model.GroupSearchOpts{}, 2452 Page: 0, 2453 PerPage: 60, 2454 Result: []*model.GroupWithSchemeAdmin{}, 2455 TotalCount: model.NewInt64(0), 2456 }, 2457 { 2458 Name: "Get group matching name", 2459 ChannelId: channel1.Id, 2460 Opts: model.GroupSearchOpts{Q: string([]rune(*group1.Name)[2:10])}, // very low change of a name collision 2461 Page: 0, 2462 PerPage: 100, 2463 Result: []*model.GroupWithSchemeAdmin{group1WSA}, 2464 TotalCount: model.NewInt64(1), 2465 }, 2466 { 2467 Name: "Get group matching display name", 2468 ChannelId: channel1.Id, 2469 Opts: model.GroupSearchOpts{Q: "rouP-1"}, 2470 Page: 0, 2471 PerPage: 100, 2472 Result: []*model.GroupWithSchemeAdmin{group1WSA}, 2473 TotalCount: model.NewInt64(1), 2474 }, 2475 { 2476 Name: "Get group matching multiple display names", 2477 ChannelId: channel1.Id, 2478 Opts: model.GroupSearchOpts{Q: "roUp-"}, 2479 Page: 0, 2480 PerPage: 100, 2481 Result: []*model.GroupWithSchemeAdmin{group1WSA, group2WSA}, 2482 TotalCount: model.NewInt64(2), 2483 }, 2484 { 2485 Name: "Include member counts", 2486 ChannelId: channel1.Id, 2487 Opts: model.GroupSearchOpts{IncludeMemberCount: true}, 2488 Page: 0, 2489 PerPage: 2, 2490 Result: []*model.GroupWithSchemeAdmin{ 2491 {Group: group1WithMemberCount, SchemeAdmin: model.NewBool(false)}, 2492 {Group: group2WithMemberCount, SchemeAdmin: model.NewBool(false)}, 2493 }, 2494 }, 2495 { 2496 Name: "Include allow reference", 2497 ChannelId: channel1.Id, 2498 Opts: model.GroupSearchOpts{FilterAllowReference: true}, 2499 Page: 0, 2500 PerPage: 100, 2501 Result: []*model.GroupWithSchemeAdmin{group1WSA}, 2502 }, 2503 } 2504 2505 for _, tc := range testCases { 2506 t.Run(tc.Name, func(t *testing.T) { 2507 if tc.Opts.PageOpts == nil { 2508 tc.Opts.PageOpts = &model.PageOpts{} 2509 } 2510 tc.Opts.PageOpts.Page = tc.Page 2511 tc.Opts.PageOpts.PerPage = tc.PerPage 2512 groups, err := ss.Group().GetGroupsByChannel(tc.ChannelId, tc.Opts) 2513 require.NoError(t, err) 2514 require.ElementsMatch(t, tc.Result, groups) 2515 if tc.TotalCount != nil { 2516 var count int64 2517 count, err = ss.Group().CountGroupsByChannel(tc.ChannelId, tc.Opts) 2518 require.NoError(t, err) 2519 require.Equal(t, *tc.TotalCount, count) 2520 } 2521 }) 2522 } 2523 } 2524 2525 func testGetGroupsAssociatedToChannelsByTeam(t *testing.T, ss store.Store) { 2526 // Create Team1 2527 team1 := &model.Team{ 2528 DisplayName: "Team1", 2529 Description: model.NewId(), 2530 CompanyName: model.NewId(), 2531 AllowOpenInvite: false, 2532 InviteId: model.NewId(), 2533 Name: "zz" + model.NewId(), 2534 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 2535 Type: model.TEAM_OPEN, 2536 } 2537 team1, errt := ss.Team().Save(team1) 2538 require.NoError(t, errt) 2539 2540 // Create Channel1 2541 channel1 := &model.Channel{ 2542 TeamId: team1.Id, 2543 DisplayName: "Channel1", 2544 Name: model.NewId(), 2545 Type: model.CHANNEL_OPEN, 2546 } 2547 channel1, err := ss.Channel().Save(channel1, 9999) 2548 require.NoError(t, err) 2549 2550 // Create Groups 1, 2 and a deleted group 2551 group1, err := ss.Group().Create(&model.Group{ 2552 Name: model.NewString(model.NewId()), 2553 DisplayName: "group-1", 2554 RemoteId: model.NewId(), 2555 Source: model.GroupSourceLdap, 2556 AllowReference: false, 2557 }) 2558 require.NoError(t, err) 2559 2560 group2, err := ss.Group().Create(&model.Group{ 2561 Name: model.NewString(model.NewId()), 2562 DisplayName: "group-2", 2563 RemoteId: model.NewId(), 2564 Source: model.GroupSourceLdap, 2565 AllowReference: true, 2566 }) 2567 require.NoError(t, err) 2568 2569 deletedGroup, err := ss.Group().Create(&model.Group{ 2570 Name: model.NewString(model.NewId()), 2571 DisplayName: "group-deleted", 2572 RemoteId: model.NewId(), 2573 Source: model.GroupSourceLdap, 2574 AllowReference: true, 2575 DeleteAt: 1, 2576 }) 2577 require.NoError(t, err) 2578 2579 // And associate them with Channel1 2580 for _, g := range []*model.Group{group1, group2, deletedGroup} { 2581 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 2582 AutoAdd: true, 2583 SyncableId: channel1.Id, 2584 Type: model.GroupSyncableTypeChannel, 2585 GroupId: g.Id, 2586 }) 2587 require.NoError(t, err) 2588 } 2589 2590 // Create Channel2 2591 channel2 := &model.Channel{ 2592 TeamId: team1.Id, 2593 DisplayName: "Channel2", 2594 Name: model.NewId(), 2595 Type: model.CHANNEL_OPEN, 2596 } 2597 channel2, err = ss.Channel().Save(channel2, 9999) 2598 require.NoError(t, err) 2599 2600 // Create Group3 2601 group3, err := ss.Group().Create(&model.Group{ 2602 Name: model.NewString(model.NewId()), 2603 DisplayName: "group-3", 2604 RemoteId: model.NewId(), 2605 Source: model.GroupSourceLdap, 2606 AllowReference: true, 2607 }) 2608 require.NoError(t, err) 2609 2610 // And associate it to Channel2 2611 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 2612 AutoAdd: true, 2613 SyncableId: channel2.Id, 2614 Type: model.GroupSyncableTypeChannel, 2615 GroupId: group3.Id, 2616 }) 2617 require.NoError(t, err) 2618 2619 // add members 2620 u1 := &model.User{ 2621 Email: MakeEmail(), 2622 Username: model.NewId(), 2623 } 2624 user1, err := ss.User().Save(u1) 2625 require.NoError(t, err) 2626 2627 u2 := &model.User{ 2628 Email: MakeEmail(), 2629 Username: model.NewId(), 2630 } 2631 user2, err := ss.User().Save(u2) 2632 require.NoError(t, err) 2633 2634 _, err = ss.Group().UpsertMember(group1.Id, user1.Id) 2635 require.NoError(t, err) 2636 2637 _, err = ss.Group().UpsertMember(group1.Id, user2.Id) 2638 require.NoError(t, err) 2639 2640 user2.DeleteAt = 1 2641 _, err = ss.User().Update(user2, true) 2642 require.NoError(t, err) 2643 2644 group1WithMemberCount := *group1 2645 group1WithMemberCount.MemberCount = model.NewInt(1) 2646 2647 group2WithMemberCount := *group2 2648 group2WithMemberCount.MemberCount = model.NewInt(0) 2649 2650 group3WithMemberCount := *group3 2651 group3WithMemberCount.MemberCount = model.NewInt(0) 2652 2653 group1WSA := &model.GroupWithSchemeAdmin{Group: *group1, SchemeAdmin: model.NewBool(false)} 2654 group2WSA := &model.GroupWithSchemeAdmin{Group: *group2, SchemeAdmin: model.NewBool(false)} 2655 group3WSA := &model.GroupWithSchemeAdmin{Group: *group3, SchemeAdmin: model.NewBool(false)} 2656 2657 testCases := []struct { 2658 Name string 2659 TeamId string 2660 Page int 2661 PerPage int 2662 Result map[string][]*model.GroupWithSchemeAdmin 2663 Opts model.GroupSearchOpts 2664 }{ 2665 { 2666 Name: "Get the groups for Channel1 and Channel2", 2667 TeamId: team1.Id, 2668 Opts: model.GroupSearchOpts{}, 2669 Page: 0, 2670 PerPage: 60, 2671 Result: map[string][]*model.GroupWithSchemeAdmin{channel1.Id: {group1WSA, group2WSA}, channel2.Id: {group3WSA}}, 2672 }, 2673 { 2674 Name: "Get first Group for Channel1 with page 0 with 1 element", 2675 TeamId: team1.Id, 2676 Opts: model.GroupSearchOpts{}, 2677 Page: 0, 2678 PerPage: 1, 2679 Result: map[string][]*model.GroupWithSchemeAdmin{channel1.Id: {group1WSA}}, 2680 }, 2681 { 2682 Name: "Get second Group for Channel1 with page 1 with 1 element", 2683 TeamId: team1.Id, 2684 Opts: model.GroupSearchOpts{}, 2685 Page: 1, 2686 PerPage: 1, 2687 Result: map[string][]*model.GroupWithSchemeAdmin{channel1.Id: {group2WSA}}, 2688 }, 2689 { 2690 Name: "Get empty Groups for a fake id", 2691 TeamId: model.NewId(), 2692 Opts: model.GroupSearchOpts{}, 2693 Page: 0, 2694 PerPage: 60, 2695 Result: map[string][]*model.GroupWithSchemeAdmin{}, 2696 }, 2697 { 2698 Name: "Get group matching name", 2699 TeamId: team1.Id, 2700 Opts: model.GroupSearchOpts{Q: string([]rune(*group1.Name)[2:10])}, // very low chance of a name collision 2701 Page: 0, 2702 PerPage: 100, 2703 Result: map[string][]*model.GroupWithSchemeAdmin{channel1.Id: {group1WSA}}, 2704 }, 2705 { 2706 Name: "Get group matching display name", 2707 TeamId: team1.Id, 2708 Opts: model.GroupSearchOpts{Q: "rouP-1"}, 2709 Page: 0, 2710 PerPage: 100, 2711 Result: map[string][]*model.GroupWithSchemeAdmin{channel1.Id: {group1WSA}}, 2712 }, 2713 { 2714 Name: "Get group matching multiple display names", 2715 TeamId: team1.Id, 2716 Opts: model.GroupSearchOpts{Q: "roUp-"}, 2717 Page: 0, 2718 PerPage: 100, 2719 Result: map[string][]*model.GroupWithSchemeAdmin{channel1.Id: {group1WSA, group2WSA}, channel2.Id: {group3WSA}}, 2720 }, 2721 { 2722 Name: "Include member counts", 2723 TeamId: team1.Id, 2724 Opts: model.GroupSearchOpts{IncludeMemberCount: true}, 2725 Page: 0, 2726 PerPage: 10, 2727 Result: map[string][]*model.GroupWithSchemeAdmin{ 2728 channel1.Id: { 2729 {Group: group1WithMemberCount, SchemeAdmin: model.NewBool(false)}, 2730 {Group: group2WithMemberCount, SchemeAdmin: model.NewBool(false)}, 2731 }, 2732 channel2.Id: { 2733 {Group: group3WithMemberCount, SchemeAdmin: model.NewBool(false)}, 2734 }, 2735 }, 2736 }, 2737 { 2738 Name: "Include allow reference", 2739 TeamId: team1.Id, 2740 Opts: model.GroupSearchOpts{FilterAllowReference: true}, 2741 Page: 0, 2742 PerPage: 2, 2743 Result: map[string][]*model.GroupWithSchemeAdmin{ 2744 channel1.Id: { 2745 group2WSA, 2746 }, 2747 channel2.Id: { 2748 group3WSA, 2749 }, 2750 }, 2751 }, 2752 } 2753 2754 for _, tc := range testCases { 2755 t.Run(tc.Name, func(t *testing.T) { 2756 if tc.Opts.PageOpts == nil { 2757 tc.Opts.PageOpts = &model.PageOpts{} 2758 } 2759 tc.Opts.PageOpts.Page = tc.Page 2760 tc.Opts.PageOpts.PerPage = tc.PerPage 2761 groups, err := ss.Group().GetGroupsAssociatedToChannelsByTeam(tc.TeamId, tc.Opts) 2762 require.NoError(t, err) 2763 assert.Equal(t, tc.Result, groups) 2764 }) 2765 } 2766 } 2767 2768 func testGetGroupsByTeam(t *testing.T, ss store.Store) { 2769 // Create Team1 2770 team1 := &model.Team{ 2771 DisplayName: "Team1", 2772 Description: model.NewId(), 2773 CompanyName: model.NewId(), 2774 AllowOpenInvite: false, 2775 InviteId: model.NewId(), 2776 Name: "zz" + model.NewId(), 2777 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 2778 Type: model.TEAM_OPEN, 2779 } 2780 team1, err := ss.Team().Save(team1) 2781 require.NoError(t, err) 2782 2783 // Create Groups 1, 2 and a deleted group 2784 group1, err := ss.Group().Create(&model.Group{ 2785 Name: model.NewString(model.NewId()), 2786 DisplayName: "group-1", 2787 RemoteId: model.NewId(), 2788 Source: model.GroupSourceLdap, 2789 AllowReference: false, 2790 }) 2791 require.NoError(t, err) 2792 2793 group2, err := ss.Group().Create(&model.Group{ 2794 Name: model.NewString(model.NewId()), 2795 DisplayName: "group-2", 2796 RemoteId: model.NewId(), 2797 Source: model.GroupSourceLdap, 2798 AllowReference: true, 2799 }) 2800 require.NoError(t, err) 2801 2802 deletedGroup, err := ss.Group().Create(&model.Group{ 2803 Name: model.NewString(model.NewId()), 2804 DisplayName: "group-deleted", 2805 RemoteId: model.NewId(), 2806 Source: model.GroupSourceLdap, 2807 AllowReference: true, 2808 DeleteAt: 1, 2809 }) 2810 require.NoError(t, err) 2811 2812 // And associate them with Team1 2813 for _, g := range []*model.Group{group1, group2, deletedGroup} { 2814 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 2815 AutoAdd: true, 2816 SyncableId: team1.Id, 2817 Type: model.GroupSyncableTypeTeam, 2818 GroupId: g.Id, 2819 }) 2820 require.NoError(t, err) 2821 } 2822 2823 // Create Team2 2824 team2 := &model.Team{ 2825 DisplayName: "Team2", 2826 Description: model.NewId(), 2827 CompanyName: model.NewId(), 2828 AllowOpenInvite: false, 2829 InviteId: model.NewId(), 2830 Name: "zz" + model.NewId(), 2831 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 2832 Type: model.TEAM_INVITE, 2833 } 2834 team2, err = ss.Team().Save(team2) 2835 require.NoError(t, err) 2836 2837 // Create Group3 2838 group3, err := ss.Group().Create(&model.Group{ 2839 Name: model.NewString(model.NewId()), 2840 DisplayName: "group-3", 2841 RemoteId: model.NewId(), 2842 Source: model.GroupSourceLdap, 2843 AllowReference: true, 2844 }) 2845 require.NoError(t, err) 2846 2847 // And associate it to Team2 2848 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 2849 AutoAdd: true, 2850 SyncableId: team2.Id, 2851 Type: model.GroupSyncableTypeTeam, 2852 GroupId: group3.Id, 2853 }) 2854 require.NoError(t, err) 2855 2856 // add members 2857 u1 := &model.User{ 2858 Email: MakeEmail(), 2859 Username: model.NewId(), 2860 } 2861 user1, err := ss.User().Save(u1) 2862 require.NoError(t, err) 2863 2864 u2 := &model.User{ 2865 Email: MakeEmail(), 2866 Username: model.NewId(), 2867 } 2868 user2, err := ss.User().Save(u2) 2869 require.NoError(t, err) 2870 2871 _, err = ss.Group().UpsertMember(group1.Id, user1.Id) 2872 require.NoError(t, err) 2873 2874 _, err = ss.Group().UpsertMember(group1.Id, user2.Id) 2875 require.NoError(t, err) 2876 2877 user2.DeleteAt = 1 2878 _, err = ss.User().Update(user2, true) 2879 require.NoError(t, err) 2880 2881 _, err = ss.Group().UpsertMember(deletedGroup.Id, user1.Id) 2882 require.NoError(t, err) 2883 2884 group1WithMemberCount := *group1 2885 group1WithMemberCount.MemberCount = model.NewInt(1) 2886 2887 group2WithMemberCount := *group2 2888 group2WithMemberCount.MemberCount = model.NewInt(0) 2889 2890 group1WSA := &model.GroupWithSchemeAdmin{Group: *group1, SchemeAdmin: model.NewBool(false)} 2891 group2WSA := &model.GroupWithSchemeAdmin{Group: *group2, SchemeAdmin: model.NewBool(false)} 2892 group3WSA := &model.GroupWithSchemeAdmin{Group: *group3, SchemeAdmin: model.NewBool(false)} 2893 2894 testCases := []struct { 2895 Name string 2896 TeamId string 2897 Page int 2898 PerPage int 2899 Opts model.GroupSearchOpts 2900 Result []*model.GroupWithSchemeAdmin 2901 TotalCount *int64 2902 }{ 2903 { 2904 Name: "Get the two Groups for Team1", 2905 TeamId: team1.Id, 2906 Opts: model.GroupSearchOpts{}, 2907 Page: 0, 2908 PerPage: 60, 2909 Result: []*model.GroupWithSchemeAdmin{group1WSA, group2WSA}, 2910 TotalCount: model.NewInt64(2), 2911 }, 2912 { 2913 Name: "Get first Group for Team1 with page 0 with 1 element", 2914 TeamId: team1.Id, 2915 Opts: model.GroupSearchOpts{}, 2916 Page: 0, 2917 PerPage: 1, 2918 Result: []*model.GroupWithSchemeAdmin{group1WSA}, 2919 }, 2920 { 2921 Name: "Get second Group for Team1 with page 1 with 1 element", 2922 TeamId: team1.Id, 2923 Opts: model.GroupSearchOpts{}, 2924 Page: 1, 2925 PerPage: 1, 2926 Result: []*model.GroupWithSchemeAdmin{group2WSA}, 2927 }, 2928 { 2929 Name: "Get third Group for Team2", 2930 TeamId: team2.Id, 2931 Opts: model.GroupSearchOpts{}, 2932 Page: 0, 2933 PerPage: 60, 2934 Result: []*model.GroupWithSchemeAdmin{group3WSA}, 2935 TotalCount: model.NewInt64(1), 2936 }, 2937 { 2938 Name: "Get empty Groups for a fake id", 2939 TeamId: model.NewId(), 2940 Opts: model.GroupSearchOpts{}, 2941 Page: 0, 2942 PerPage: 60, 2943 Result: []*model.GroupWithSchemeAdmin{}, 2944 TotalCount: model.NewInt64(0), 2945 }, 2946 { 2947 Name: "Get group matching name", 2948 TeamId: team1.Id, 2949 Opts: model.GroupSearchOpts{Q: string([]rune(*group1.Name)[2:10])}, // very low change of a name collision 2950 Page: 0, 2951 PerPage: 100, 2952 Result: []*model.GroupWithSchemeAdmin{group1WSA}, 2953 TotalCount: model.NewInt64(1), 2954 }, 2955 { 2956 Name: "Get group matching display name", 2957 TeamId: team1.Id, 2958 Opts: model.GroupSearchOpts{Q: "rouP-1"}, 2959 Page: 0, 2960 PerPage: 100, 2961 Result: []*model.GroupWithSchemeAdmin{group1WSA}, 2962 TotalCount: model.NewInt64(1), 2963 }, 2964 { 2965 Name: "Get group matching multiple display names", 2966 TeamId: team1.Id, 2967 Opts: model.GroupSearchOpts{Q: "roUp-"}, 2968 Page: 0, 2969 PerPage: 100, 2970 Result: []*model.GroupWithSchemeAdmin{group1WSA, group2WSA}, 2971 TotalCount: model.NewInt64(2), 2972 }, 2973 { 2974 Name: "Include member counts", 2975 TeamId: team1.Id, 2976 Opts: model.GroupSearchOpts{IncludeMemberCount: true}, 2977 Page: 0, 2978 PerPage: 2, 2979 Result: []*model.GroupWithSchemeAdmin{ 2980 {Group: group1WithMemberCount, SchemeAdmin: model.NewBool(false)}, 2981 {Group: group2WithMemberCount, SchemeAdmin: model.NewBool(false)}, 2982 }, 2983 }, 2984 { 2985 Name: "Include allow reference", 2986 TeamId: team1.Id, 2987 Opts: model.GroupSearchOpts{FilterAllowReference: true}, 2988 Page: 0, 2989 PerPage: 100, 2990 Result: []*model.GroupWithSchemeAdmin{group2WSA}, 2991 }, 2992 } 2993 2994 for _, tc := range testCases { 2995 t.Run(tc.Name, func(t *testing.T) { 2996 if tc.Opts.PageOpts == nil { 2997 tc.Opts.PageOpts = &model.PageOpts{} 2998 } 2999 tc.Opts.PageOpts.Page = tc.Page 3000 tc.Opts.PageOpts.PerPage = tc.PerPage 3001 groups, err := ss.Group().GetGroupsByTeam(tc.TeamId, tc.Opts) 3002 require.NoError(t, err) 3003 require.ElementsMatch(t, tc.Result, groups) 3004 if tc.TotalCount != nil { 3005 var count int64 3006 count, err = ss.Group().CountGroupsByTeam(tc.TeamId, tc.Opts) 3007 require.NoError(t, err) 3008 require.Equal(t, *tc.TotalCount, count) 3009 } 3010 }) 3011 } 3012 } 3013 3014 func testGetGroups(t *testing.T, ss store.Store) { 3015 // Create Team1 3016 team1 := &model.Team{ 3017 DisplayName: "Team1", 3018 Description: model.NewId(), 3019 CompanyName: model.NewId(), 3020 AllowOpenInvite: false, 3021 InviteId: model.NewId(), 3022 Name: "zz" + model.NewId(), 3023 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 3024 Type: model.TEAM_OPEN, 3025 GroupConstrained: model.NewBool(true), 3026 } 3027 team1, err := ss.Team().Save(team1) 3028 require.NoError(t, err) 3029 3030 startCreateTime := team1.UpdateAt - 1 3031 3032 // Create Channel1 3033 channel1 := &model.Channel{ 3034 TeamId: model.NewId(), 3035 DisplayName: "Channel1", 3036 Name: model.NewId(), 3037 Type: model.CHANNEL_PRIVATE, 3038 } 3039 channel1, nErr := ss.Channel().Save(channel1, 9999) 3040 require.NoError(t, nErr) 3041 3042 // Create Groups 1 and 2 3043 group1, err := ss.Group().Create(&model.Group{ 3044 Name: model.NewString(model.NewId()), 3045 DisplayName: "group-1", 3046 RemoteId: model.NewId(), 3047 Source: model.GroupSourceLdap, 3048 AllowReference: true, 3049 }) 3050 require.NoError(t, err) 3051 3052 group2, err := ss.Group().Create(&model.Group{ 3053 Name: model.NewString(model.NewId() + "-group-2"), 3054 DisplayName: "group-2", 3055 RemoteId: model.NewId(), 3056 Source: model.GroupSourceLdap, 3057 AllowReference: false, 3058 }) 3059 require.NoError(t, err) 3060 3061 deletedGroup, err := ss.Group().Create(&model.Group{ 3062 Name: model.NewString(model.NewId() + "-group-deleted"), 3063 DisplayName: "group-deleted", 3064 RemoteId: model.NewId(), 3065 Source: model.GroupSourceLdap, 3066 AllowReference: false, 3067 DeleteAt: 1, 3068 }) 3069 require.NoError(t, err) 3070 3071 // And associate them with Team1 3072 for _, g := range []*model.Group{group1, group2, deletedGroup} { 3073 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 3074 AutoAdd: true, 3075 SyncableId: team1.Id, 3076 Type: model.GroupSyncableTypeTeam, 3077 GroupId: g.Id, 3078 }) 3079 require.NoError(t, err) 3080 } 3081 3082 // Create Team2 3083 team2 := &model.Team{ 3084 DisplayName: "Team2", 3085 Description: model.NewId(), 3086 CompanyName: model.NewId(), 3087 AllowOpenInvite: false, 3088 InviteId: model.NewId(), 3089 Name: "zz" + model.NewId(), 3090 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 3091 Type: model.TEAM_INVITE, 3092 } 3093 team2, err = ss.Team().Save(team2) 3094 require.NoError(t, err) 3095 3096 // Create Channel2 3097 channel2 := &model.Channel{ 3098 TeamId: model.NewId(), 3099 DisplayName: "Channel2", 3100 Name: model.NewId(), 3101 Type: model.CHANNEL_PRIVATE, 3102 } 3103 channel2, nErr = ss.Channel().Save(channel2, 9999) 3104 require.NoError(t, nErr) 3105 3106 // Create Channel3 3107 channel3 := &model.Channel{ 3108 TeamId: team1.Id, 3109 DisplayName: "Channel3", 3110 Name: model.NewId(), 3111 Type: model.CHANNEL_PRIVATE, 3112 } 3113 channel3, nErr = ss.Channel().Save(channel3, 9999) 3114 require.NoError(t, nErr) 3115 3116 // Create Group3 3117 group3, err := ss.Group().Create(&model.Group{ 3118 Name: model.NewString(model.NewId() + "-group-3"), 3119 DisplayName: "group-3", 3120 RemoteId: model.NewId(), 3121 Source: model.GroupSourceLdap, 3122 AllowReference: true, 3123 }) 3124 require.NoError(t, err) 3125 3126 // And associate it to Team2 3127 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 3128 AutoAdd: true, 3129 SyncableId: team2.Id, 3130 Type: model.GroupSyncableTypeTeam, 3131 GroupId: group3.Id, 3132 }) 3133 require.NoError(t, err) 3134 3135 // And associate Group1 to Channel2 3136 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 3137 AutoAdd: true, 3138 SyncableId: channel2.Id, 3139 Type: model.GroupSyncableTypeChannel, 3140 GroupId: group1.Id, 3141 }) 3142 require.NoError(t, err) 3143 3144 // And associate Group2 and Group3 to Channel1 3145 for _, g := range []*model.Group{group2, group3} { 3146 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 3147 AutoAdd: true, 3148 SyncableId: channel1.Id, 3149 Type: model.GroupSyncableTypeChannel, 3150 GroupId: g.Id, 3151 }) 3152 require.NoError(t, err) 3153 } 3154 3155 // add members 3156 u1 := &model.User{ 3157 Email: MakeEmail(), 3158 Username: model.NewId(), 3159 } 3160 user1, err := ss.User().Save(u1) 3161 require.NoError(t, err) 3162 3163 u2 := &model.User{ 3164 Email: MakeEmail(), 3165 Username: model.NewId(), 3166 } 3167 user2, err := ss.User().Save(u2) 3168 require.NoError(t, err) 3169 3170 _, err = ss.Group().UpsertMember(group1.Id, user1.Id) 3171 require.NoError(t, err) 3172 3173 _, err = ss.Group().UpsertMember(group1.Id, user2.Id) 3174 require.NoError(t, err) 3175 3176 _, err = ss.Group().UpsertMember(deletedGroup.Id, user1.Id) 3177 require.NoError(t, err) 3178 3179 user2.DeleteAt = 1 3180 u2Update, _ := ss.User().Update(user2, true) 3181 3182 group2NameSubstring := "group-2" 3183 3184 endCreateTime := u2Update.New.UpdateAt + 1 3185 3186 // Create Team3 3187 team3 := &model.Team{ 3188 DisplayName: "Team3", 3189 Description: model.NewId(), 3190 CompanyName: model.NewId(), 3191 AllowOpenInvite: false, 3192 InviteId: model.NewId(), 3193 Name: "zz" + model.NewId(), 3194 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 3195 Type: model.TEAM_INVITE, 3196 } 3197 team3, err = ss.Team().Save(team3) 3198 require.NoError(t, err) 3199 3200 channel4 := &model.Channel{ 3201 TeamId: team3.Id, 3202 DisplayName: "Channel4", 3203 Name: model.NewId(), 3204 Type: model.CHANNEL_PRIVATE, 3205 } 3206 channel4, nErr = ss.Channel().Save(channel4, 9999) 3207 require.NoError(t, nErr) 3208 3209 testCases := []struct { 3210 Name string 3211 Page int 3212 PerPage int 3213 Opts model.GroupSearchOpts 3214 Resultf func([]*model.Group) bool 3215 }{ 3216 { 3217 Name: "Get all the Groups", 3218 Opts: model.GroupSearchOpts{}, 3219 Page: 0, 3220 PerPage: 3, 3221 Resultf: func(groups []*model.Group) bool { return len(groups) == 3 }, 3222 }, 3223 { 3224 Name: "Get first Group with page 0 with 1 element", 3225 Opts: model.GroupSearchOpts{}, 3226 Page: 0, 3227 PerPage: 1, 3228 Resultf: func(groups []*model.Group) bool { return len(groups) == 1 }, 3229 }, 3230 { 3231 Name: "Get single result from page 1", 3232 Opts: model.GroupSearchOpts{}, 3233 Page: 1, 3234 PerPage: 1, 3235 Resultf: func(groups []*model.Group) bool { return len(groups) == 1 }, 3236 }, 3237 { 3238 Name: "Get multiple results from page 1", 3239 Opts: model.GroupSearchOpts{}, 3240 Page: 1, 3241 PerPage: 2, 3242 Resultf: func(groups []*model.Group) bool { return len(groups) == 2 }, 3243 }, 3244 { 3245 Name: "Get group matching name", 3246 Opts: model.GroupSearchOpts{Q: group2NameSubstring}, 3247 Page: 0, 3248 PerPage: 100, 3249 Resultf: func(groups []*model.Group) bool { 3250 for _, g := range groups { 3251 if !strings.Contains(*g.Name, group2NameSubstring) && !strings.Contains(g.DisplayName, group2NameSubstring) { 3252 return false 3253 } 3254 } 3255 return true 3256 }, 3257 }, 3258 { 3259 Name: "Get group matching display name", 3260 Opts: model.GroupSearchOpts{Q: "rouP-3"}, 3261 Page: 0, 3262 PerPage: 100, 3263 Resultf: func(groups []*model.Group) bool { 3264 for _, g := range groups { 3265 if !strings.Contains(strings.ToLower(g.DisplayName), "roup-3") { 3266 return false 3267 } 3268 } 3269 return true 3270 }, 3271 }, 3272 { 3273 Name: "Get group matching multiple display names", 3274 Opts: model.GroupSearchOpts{Q: "groUp"}, 3275 Page: 0, 3276 PerPage: 100, 3277 Resultf: func(groups []*model.Group) bool { 3278 for _, g := range groups { 3279 if !strings.Contains(strings.ToLower(g.DisplayName), "group") { 3280 return false 3281 } 3282 } 3283 return true 3284 }, 3285 }, 3286 { 3287 Name: "Include member counts", 3288 Opts: model.GroupSearchOpts{IncludeMemberCount: true}, 3289 Page: 0, 3290 PerPage: 100, 3291 Resultf: func(groups []*model.Group) bool { 3292 for _, g := range groups { 3293 if g.MemberCount == nil { 3294 return false 3295 } 3296 if g.Id == group1.Id && *g.MemberCount != 1 { 3297 return false 3298 } 3299 if g.DeleteAt != 0 { 3300 return false 3301 } 3302 } 3303 return true 3304 }, 3305 }, 3306 { 3307 Name: "Not associated to team", 3308 Opts: model.GroupSearchOpts{NotAssociatedToTeam: team2.Id}, 3309 Page: 0, 3310 PerPage: 100, 3311 Resultf: func(groups []*model.Group) bool { 3312 if len(groups) == 0 { 3313 return false 3314 } 3315 for _, g := range groups { 3316 if g.Id == group3.Id { 3317 return false 3318 } 3319 if g.DeleteAt != 0 { 3320 return false 3321 } 3322 } 3323 return true 3324 }, 3325 }, 3326 { 3327 Name: "Not associated to other team", 3328 Opts: model.GroupSearchOpts{NotAssociatedToTeam: team1.Id}, 3329 Page: 0, 3330 PerPage: 100, 3331 Resultf: func(groups []*model.Group) bool { 3332 if len(groups) == 0 { 3333 return false 3334 } 3335 for _, g := range groups { 3336 if g.Id == group1.Id || g.Id == group2.Id { 3337 return false 3338 } 3339 if g.DeleteAt != 0 { 3340 return false 3341 } 3342 } 3343 return true 3344 }, 3345 }, 3346 { 3347 Name: "Include allow reference", 3348 Opts: model.GroupSearchOpts{FilterAllowReference: true}, 3349 Page: 0, 3350 PerPage: 100, 3351 Resultf: func(groups []*model.Group) bool { 3352 if len(groups) == 0 { 3353 return false 3354 } 3355 for _, g := range groups { 3356 if !g.AllowReference { 3357 return false 3358 } 3359 if g.DeleteAt != 0 { 3360 return false 3361 } 3362 } 3363 return true 3364 }, 3365 }, 3366 { 3367 Name: "Use Since return all", 3368 Opts: model.GroupSearchOpts{FilterAllowReference: true, Since: startCreateTime}, 3369 Page: 0, 3370 PerPage: 100, 3371 Resultf: func(groups []*model.Group) bool { 3372 if len(groups) == 0 { 3373 return false 3374 } 3375 for _, g := range groups { 3376 if g.DeleteAt != 0 { 3377 return false 3378 } 3379 } 3380 return true 3381 }, 3382 }, 3383 { 3384 Name: "Use Since return none", 3385 Opts: model.GroupSearchOpts{FilterAllowReference: true, Since: endCreateTime}, 3386 Page: 0, 3387 PerPage: 100, 3388 Resultf: func(groups []*model.Group) bool { 3389 return len(groups) == 0 3390 }, 3391 }, 3392 { 3393 Name: "Filter groups from group-constrained teams", 3394 Opts: model.GroupSearchOpts{NotAssociatedToChannel: channel3.Id, FilterParentTeamPermitted: true}, 3395 Page: 0, 3396 PerPage: 100, 3397 Resultf: func(groups []*model.Group) bool { 3398 return len(groups) == 2 && groups[0].Id == group1.Id && groups[1].Id == group2.Id 3399 }, 3400 }, 3401 { 3402 Name: "Filter groups from group-constrained page 0", 3403 Opts: model.GroupSearchOpts{NotAssociatedToChannel: channel3.Id, FilterParentTeamPermitted: true}, 3404 Page: 0, 3405 PerPage: 1, 3406 Resultf: func(groups []*model.Group) bool { 3407 return groups[0].Id == group1.Id 3408 }, 3409 }, 3410 { 3411 Name: "Filter groups from group-constrained page 1", 3412 Opts: model.GroupSearchOpts{NotAssociatedToChannel: channel3.Id, FilterParentTeamPermitted: true}, 3413 Page: 1, 3414 PerPage: 1, 3415 Resultf: func(groups []*model.Group) bool { 3416 return groups[0].Id == group2.Id 3417 }, 3418 }, 3419 { 3420 Name: "Non-group constrained team with no associated groups still returns groups for the child channel", 3421 Opts: model.GroupSearchOpts{NotAssociatedToChannel: channel4.Id, FilterParentTeamPermitted: true}, 3422 Page: 0, 3423 PerPage: 100, 3424 Resultf: func(groups []*model.Group) bool { 3425 return len(groups) > 0 3426 }, 3427 }, 3428 } 3429 3430 for _, tc := range testCases { 3431 t.Run(tc.Name, func(t *testing.T) { 3432 groups, err := ss.Group().GetGroups(tc.Page, tc.PerPage, tc.Opts) 3433 require.NoError(t, err) 3434 require.True(t, tc.Resultf(groups)) 3435 }) 3436 } 3437 } 3438 3439 func testTeamMembersMinusGroupMembers(t *testing.T, ss store.Store) { 3440 const numberOfGroups = 3 3441 const numberOfUsers = 4 3442 3443 groups := []*model.Group{} 3444 users := []*model.User{} 3445 3446 team := &model.Team{ 3447 DisplayName: model.NewId(), 3448 Description: model.NewId(), 3449 CompanyName: model.NewId(), 3450 AllowOpenInvite: false, 3451 InviteId: model.NewId(), 3452 Name: "zz" + model.NewId(), 3453 Email: model.NewId() + "@simulator.amazonses.com", 3454 Type: model.TEAM_OPEN, 3455 GroupConstrained: model.NewBool(true), 3456 } 3457 team, err := ss.Team().Save(team) 3458 require.NoError(t, err) 3459 3460 for i := 0; i < numberOfUsers; i++ { 3461 user := &model.User{ 3462 Email: MakeEmail(), 3463 Username: fmt.Sprintf("%d_%s", i, model.NewId()), 3464 } 3465 user, err = ss.User().Save(user) 3466 require.NoError(t, err) 3467 users = append(users, user) 3468 3469 trueOrFalse := int(math.Mod(float64(i), 2)) == 0 3470 _, nErr := ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: user.Id, SchemeUser: trueOrFalse, SchemeAdmin: !trueOrFalse}, 999) 3471 require.NoError(t, nErr) 3472 } 3473 3474 // Extra user outside of the group member users. 3475 user := &model.User{ 3476 Email: MakeEmail(), 3477 Username: "99_" + model.NewId(), 3478 } 3479 user, err = ss.User().Save(user) 3480 require.NoError(t, err) 3481 users = append(users, user) 3482 _, nErr := ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: user.Id, SchemeUser: true, SchemeAdmin: false}, 999) 3483 require.NoError(t, nErr) 3484 3485 for i := 0; i < numberOfGroups; i++ { 3486 group := &model.Group{ 3487 Name: model.NewString(fmt.Sprintf("n_%d_%s", i, model.NewId())), 3488 DisplayName: model.NewId(), 3489 Source: model.GroupSourceLdap, 3490 Description: model.NewId(), 3491 RemoteId: model.NewId(), 3492 } 3493 group, err := ss.Group().Create(group) 3494 require.NoError(t, err) 3495 groups = append(groups, group) 3496 } 3497 3498 sort.Slice(users, func(i, j int) bool { 3499 return users[i].Username < users[j].Username 3500 }) 3501 3502 // Add even users to even group, and the inverse 3503 for i := 0; i < numberOfUsers; i++ { 3504 groupIndex := int(math.Mod(float64(i), 2)) 3505 _, err := ss.Group().UpsertMember(groups[groupIndex].Id, users[i].Id) 3506 require.NoError(t, err) 3507 3508 // Add everyone to group 2 3509 _, err = ss.Group().UpsertMember(groups[numberOfGroups-1].Id, users[i].Id) 3510 require.NoError(t, err) 3511 } 3512 3513 testCases := map[string]struct { 3514 expectedUserIDs []string 3515 expectedTotalCount int64 3516 groupIDs []string 3517 page int 3518 perPage int 3519 setup func() 3520 teardown func() 3521 }{ 3522 "No group IDs, all members": { 3523 expectedUserIDs: []string{users[0].Id, users[1].Id, users[2].Id, users[3].Id, user.Id}, 3524 expectedTotalCount: numberOfUsers + 1, 3525 groupIDs: []string{}, 3526 page: 0, 3527 perPage: 100, 3528 }, 3529 "All members, page 1": { 3530 expectedUserIDs: []string{users[0].Id, users[1].Id, users[2].Id}, 3531 expectedTotalCount: numberOfUsers + 1, 3532 groupIDs: []string{}, 3533 page: 0, 3534 perPage: 3, 3535 }, 3536 "All members, page 2": { 3537 expectedUserIDs: []string{users[3].Id, users[4].Id}, 3538 expectedTotalCount: numberOfUsers + 1, 3539 groupIDs: []string{}, 3540 page: 1, 3541 perPage: 3, 3542 }, 3543 "Group 1, even users would be removed": { 3544 expectedUserIDs: []string{users[0].Id, users[2].Id, users[4].Id}, 3545 expectedTotalCount: 3, 3546 groupIDs: []string{groups[1].Id}, 3547 page: 0, 3548 perPage: 100, 3549 }, 3550 "Group 0, odd users would be removed": { 3551 expectedUserIDs: []string{users[1].Id, users[3].Id, users[4].Id}, 3552 expectedTotalCount: 3, 3553 groupIDs: []string{groups[0].Id}, 3554 page: 0, 3555 perPage: 100, 3556 }, 3557 "All groups, no users would be removed": { 3558 expectedUserIDs: []string{users[4].Id}, 3559 expectedTotalCount: 1, 3560 groupIDs: []string{groups[0].Id, groups[1].Id}, 3561 page: 0, 3562 perPage: 100, 3563 }, 3564 } 3565 3566 mapUserIDs := func(users []*model.UserWithGroups) []string { 3567 ids := []string{} 3568 for _, user := range users { 3569 ids = append(ids, user.Id) 3570 } 3571 return ids 3572 } 3573 3574 for tcName, tc := range testCases { 3575 t.Run(tcName, func(t *testing.T) { 3576 if tc.setup != nil { 3577 tc.setup() 3578 } 3579 3580 if tc.teardown != nil { 3581 defer tc.teardown() 3582 } 3583 3584 actual, err := ss.Group().TeamMembersMinusGroupMembers(team.Id, tc.groupIDs, tc.page, tc.perPage) 3585 require.NoError(t, err) 3586 require.ElementsMatch(t, tc.expectedUserIDs, mapUserIDs(actual)) 3587 3588 actualCount, err := ss.Group().CountTeamMembersMinusGroupMembers(team.Id, tc.groupIDs) 3589 require.NoError(t, err) 3590 require.Equal(t, tc.expectedTotalCount, actualCount) 3591 }) 3592 } 3593 } 3594 3595 func testChannelMembersMinusGroupMembers(t *testing.T, ss store.Store) { 3596 const numberOfGroups = 3 3597 const numberOfUsers = 4 3598 3599 groups := []*model.Group{} 3600 users := []*model.User{} 3601 3602 channel := &model.Channel{ 3603 TeamId: model.NewId(), 3604 DisplayName: "A Name", 3605 Name: model.NewId(), 3606 Type: model.CHANNEL_PRIVATE, 3607 GroupConstrained: model.NewBool(true), 3608 } 3609 channel, err := ss.Channel().Save(channel, 9999) 3610 require.NoError(t, err) 3611 3612 for i := 0; i < numberOfUsers; i++ { 3613 user := &model.User{ 3614 Email: MakeEmail(), 3615 Username: fmt.Sprintf("%d_%s", i, model.NewId()), 3616 } 3617 user, err = ss.User().Save(user) 3618 require.NoError(t, err) 3619 users = append(users, user) 3620 3621 trueOrFalse := int(math.Mod(float64(i), 2)) == 0 3622 _, err = ss.Channel().SaveMember(&model.ChannelMember{ 3623 ChannelId: channel.Id, 3624 UserId: user.Id, 3625 SchemeUser: trueOrFalse, 3626 SchemeAdmin: !trueOrFalse, 3627 NotifyProps: model.GetDefaultChannelNotifyProps(), 3628 }) 3629 require.NoError(t, err) 3630 } 3631 3632 // Extra user outside of the group member users. 3633 user, err := ss.User().Save(&model.User{ 3634 Email: MakeEmail(), 3635 Username: "99_" + model.NewId(), 3636 }) 3637 require.NoError(t, err) 3638 users = append(users, user) 3639 _, err = ss.Channel().SaveMember(&model.ChannelMember{ 3640 ChannelId: channel.Id, 3641 UserId: user.Id, 3642 SchemeUser: true, 3643 SchemeAdmin: false, 3644 NotifyProps: model.GetDefaultChannelNotifyProps(), 3645 }) 3646 require.NoError(t, err) 3647 3648 for i := 0; i < numberOfGroups; i++ { 3649 group := &model.Group{ 3650 Name: model.NewString(fmt.Sprintf("n_%d_%s", i, model.NewId())), 3651 DisplayName: model.NewId(), 3652 Source: model.GroupSourceLdap, 3653 Description: model.NewId(), 3654 RemoteId: model.NewId(), 3655 } 3656 group, err := ss.Group().Create(group) 3657 require.NoError(t, err) 3658 groups = append(groups, group) 3659 } 3660 3661 sort.Slice(users, func(i, j int) bool { 3662 return users[i].Username < users[j].Username 3663 }) 3664 3665 // Add even users to even group, and the inverse 3666 for i := 0; i < numberOfUsers; i++ { 3667 groupIndex := int(math.Mod(float64(i), 2)) 3668 _, err := ss.Group().UpsertMember(groups[groupIndex].Id, users[i].Id) 3669 require.NoError(t, err) 3670 3671 // Add everyone to group 2 3672 _, err = ss.Group().UpsertMember(groups[numberOfGroups-1].Id, users[i].Id) 3673 require.NoError(t, err) 3674 } 3675 3676 testCases := map[string]struct { 3677 expectedUserIDs []string 3678 expectedTotalCount int64 3679 groupIDs []string 3680 page int 3681 perPage int 3682 setup func() 3683 teardown func() 3684 }{ 3685 "No group IDs, all members": { 3686 expectedUserIDs: []string{users[0].Id, users[1].Id, users[2].Id, users[3].Id, users[4].Id}, 3687 expectedTotalCount: numberOfUsers + 1, 3688 groupIDs: []string{}, 3689 page: 0, 3690 perPage: 100, 3691 }, 3692 "All members, page 1": { 3693 expectedUserIDs: []string{users[0].Id, users[1].Id, users[2].Id}, 3694 expectedTotalCount: numberOfUsers + 1, 3695 groupIDs: []string{}, 3696 page: 0, 3697 perPage: 3, 3698 }, 3699 "All members, page 2": { 3700 expectedUserIDs: []string{users[3].Id, users[4].Id}, 3701 expectedTotalCount: numberOfUsers + 1, 3702 groupIDs: []string{}, 3703 page: 1, 3704 perPage: 3, 3705 }, 3706 "Group 1, even users would be removed": { 3707 expectedUserIDs: []string{users[0].Id, users[2].Id, users[4].Id}, 3708 expectedTotalCount: 3, 3709 groupIDs: []string{groups[1].Id}, 3710 page: 0, 3711 perPage: 100, 3712 }, 3713 "Group 0, odd users would be removed": { 3714 expectedUserIDs: []string{users[1].Id, users[3].Id, users[4].Id}, 3715 expectedTotalCount: 3, 3716 groupIDs: []string{groups[0].Id}, 3717 page: 0, 3718 perPage: 100, 3719 }, 3720 "All groups, no users would be removed": { 3721 expectedUserIDs: []string{users[4].Id}, 3722 expectedTotalCount: 1, 3723 groupIDs: []string{groups[0].Id, groups[1].Id}, 3724 page: 0, 3725 perPage: 100, 3726 }, 3727 } 3728 3729 mapUserIDs := func(users []*model.UserWithGroups) []string { 3730 ids := []string{} 3731 for _, user := range users { 3732 ids = append(ids, user.Id) 3733 } 3734 return ids 3735 } 3736 3737 for tcName, tc := range testCases { 3738 t.Run(tcName, func(t *testing.T) { 3739 if tc.setup != nil { 3740 tc.setup() 3741 } 3742 3743 if tc.teardown != nil { 3744 defer tc.teardown() 3745 } 3746 3747 actual, err := ss.Group().ChannelMembersMinusGroupMembers(channel.Id, tc.groupIDs, tc.page, tc.perPage) 3748 require.NoError(t, err) 3749 require.ElementsMatch(t, tc.expectedUserIDs, mapUserIDs(actual)) 3750 3751 actualCount, err := ss.Group().CountChannelMembersMinusGroupMembers(channel.Id, tc.groupIDs) 3752 require.NoError(t, err) 3753 require.Equal(t, tc.expectedTotalCount, actualCount) 3754 }) 3755 } 3756 } 3757 3758 func groupTestGetMemberCount(t *testing.T, ss store.Store) { 3759 group := &model.Group{ 3760 Name: model.NewString(model.NewId()), 3761 DisplayName: model.NewId(), 3762 Source: model.GroupSourceLdap, 3763 Description: model.NewId(), 3764 RemoteId: model.NewId(), 3765 } 3766 group, err := ss.Group().Create(group) 3767 require.NoError(t, err) 3768 3769 var user *model.User 3770 var nErr error 3771 for i := 0; i < 2; i++ { 3772 user = &model.User{ 3773 Email: MakeEmail(), 3774 Username: fmt.Sprintf("%d_%s", i, model.NewId()), 3775 } 3776 user, nErr = ss.User().Save(user) 3777 require.NoError(t, nErr) 3778 3779 _, err = ss.Group().UpsertMember(group.Id, user.Id) 3780 require.NoError(t, err) 3781 } 3782 3783 count, err := ss.Group().GetMemberCount(group.Id) 3784 require.NoError(t, err) 3785 require.Equal(t, int64(2), count) 3786 3787 user.DeleteAt = 1 3788 _, nErr = ss.User().Update(user, true) 3789 require.NoError(t, nErr) 3790 3791 count, err = ss.Group().GetMemberCount(group.Id) 3792 require.NoError(t, err) 3793 require.Equal(t, int64(1), count) 3794 } 3795 3796 func groupTestAdminRoleGroupsForSyncableMemberChannel(t *testing.T, ss store.Store) { 3797 user := &model.User{ 3798 Email: MakeEmail(), 3799 Username: model.NewId(), 3800 } 3801 user, err := ss.User().Save(user) 3802 require.NoError(t, err) 3803 3804 group1 := &model.Group{ 3805 Name: model.NewString(model.NewId()), 3806 DisplayName: model.NewId(), 3807 Source: model.GroupSourceLdap, 3808 Description: model.NewId(), 3809 RemoteId: model.NewId(), 3810 } 3811 group1, err = ss.Group().Create(group1) 3812 require.NoError(t, err) 3813 3814 _, err = ss.Group().UpsertMember(group1.Id, user.Id) 3815 require.NoError(t, err) 3816 3817 group2 := &model.Group{ 3818 Name: model.NewString(model.NewId()), 3819 DisplayName: model.NewId(), 3820 Source: model.GroupSourceLdap, 3821 Description: model.NewId(), 3822 RemoteId: model.NewId(), 3823 } 3824 group2, err = ss.Group().Create(group2) 3825 require.NoError(t, err) 3826 3827 _, err = ss.Group().UpsertMember(group2.Id, user.Id) 3828 require.NoError(t, err) 3829 3830 channel := &model.Channel{ 3831 TeamId: model.NewId(), 3832 DisplayName: "A Name", 3833 Name: model.NewId(), 3834 Type: model.CHANNEL_OPEN, 3835 } 3836 channel, nErr := ss.Channel().Save(channel, 9999) 3837 require.NoError(t, nErr) 3838 3839 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 3840 AutoAdd: true, 3841 SyncableId: channel.Id, 3842 Type: model.GroupSyncableTypeChannel, 3843 GroupId: group1.Id, 3844 SchemeAdmin: true, 3845 }) 3846 require.NoError(t, err) 3847 3848 groupSyncable2, err := ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 3849 AutoAdd: true, 3850 SyncableId: channel.Id, 3851 Type: model.GroupSyncableTypeChannel, 3852 GroupId: group2.Id, 3853 }) 3854 require.NoError(t, err) 3855 3856 // User is a member of both groups but only one is SchmeAdmin: true 3857 actualGroupIDs, err := ss.Group().AdminRoleGroupsForSyncableMember(user.Id, channel.Id, model.GroupSyncableTypeChannel) 3858 require.NoError(t, err) 3859 require.ElementsMatch(t, []string{group1.Id}, actualGroupIDs) 3860 3861 // Update the second group syncable to be SchemeAdmin: true and both groups should be returned 3862 groupSyncable2.SchemeAdmin = true 3863 _, err = ss.Group().UpdateGroupSyncable(groupSyncable2) 3864 require.NoError(t, err) 3865 actualGroupIDs, err = ss.Group().AdminRoleGroupsForSyncableMember(user.Id, channel.Id, model.GroupSyncableTypeChannel) 3866 require.NoError(t, err) 3867 require.ElementsMatch(t, []string{group1.Id, group2.Id}, actualGroupIDs) 3868 3869 // Deleting membership from group should stop the group from being returned 3870 _, err = ss.Group().DeleteMember(group1.Id, user.Id) 3871 require.NoError(t, err) 3872 actualGroupIDs, err = ss.Group().AdminRoleGroupsForSyncableMember(user.Id, channel.Id, model.GroupSyncableTypeChannel) 3873 require.NoError(t, err) 3874 require.ElementsMatch(t, []string{group2.Id}, actualGroupIDs) 3875 3876 // Deleting group syncable should stop it being returned 3877 _, err = ss.Group().DeleteGroupSyncable(group2.Id, channel.Id, model.GroupSyncableTypeChannel) 3878 require.NoError(t, err) 3879 actualGroupIDs, err = ss.Group().AdminRoleGroupsForSyncableMember(user.Id, channel.Id, model.GroupSyncableTypeChannel) 3880 require.NoError(t, err) 3881 require.ElementsMatch(t, []string{}, actualGroupIDs) 3882 } 3883 3884 func groupTestAdminRoleGroupsForSyncableMemberTeam(t *testing.T, ss store.Store) { 3885 user := &model.User{ 3886 Email: MakeEmail(), 3887 Username: model.NewId(), 3888 } 3889 user, err := ss.User().Save(user) 3890 require.NoError(t, err) 3891 3892 group1 := &model.Group{ 3893 Name: model.NewString(model.NewId()), 3894 DisplayName: model.NewId(), 3895 Source: model.GroupSourceLdap, 3896 Description: model.NewId(), 3897 RemoteId: model.NewId(), 3898 } 3899 group1, err = ss.Group().Create(group1) 3900 require.NoError(t, err) 3901 3902 _, err = ss.Group().UpsertMember(group1.Id, user.Id) 3903 require.NoError(t, err) 3904 3905 group2 := &model.Group{ 3906 Name: model.NewString(model.NewId()), 3907 DisplayName: model.NewId(), 3908 Source: model.GroupSourceLdap, 3909 Description: model.NewId(), 3910 RemoteId: model.NewId(), 3911 } 3912 group2, err = ss.Group().Create(group2) 3913 require.NoError(t, err) 3914 3915 _, err = ss.Group().UpsertMember(group2.Id, user.Id) 3916 require.NoError(t, err) 3917 3918 team := &model.Team{ 3919 DisplayName: "A Name", 3920 Name: "zz" + model.NewId(), 3921 Type: model.CHANNEL_OPEN, 3922 } 3923 team, nErr := ss.Team().Save(team) 3924 require.NoError(t, nErr) 3925 3926 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 3927 AutoAdd: true, 3928 SyncableId: team.Id, 3929 Type: model.GroupSyncableTypeTeam, 3930 GroupId: group1.Id, 3931 SchemeAdmin: true, 3932 }) 3933 require.NoError(t, err) 3934 3935 groupSyncable2, err := ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 3936 AutoAdd: true, 3937 SyncableId: team.Id, 3938 Type: model.GroupSyncableTypeTeam, 3939 GroupId: group2.Id, 3940 }) 3941 require.NoError(t, err) 3942 3943 // User is a member of both groups but only one is SchmeAdmin: true 3944 actualGroupIDs, err := ss.Group().AdminRoleGroupsForSyncableMember(user.Id, team.Id, model.GroupSyncableTypeTeam) 3945 require.NoError(t, err) 3946 require.ElementsMatch(t, []string{group1.Id}, actualGroupIDs) 3947 3948 // Update the second group syncable to be SchemeAdmin: true and both groups should be returned 3949 groupSyncable2.SchemeAdmin = true 3950 _, err = ss.Group().UpdateGroupSyncable(groupSyncable2) 3951 require.NoError(t, err) 3952 actualGroupIDs, err = ss.Group().AdminRoleGroupsForSyncableMember(user.Id, team.Id, model.GroupSyncableTypeTeam) 3953 require.NoError(t, err) 3954 require.ElementsMatch(t, []string{group1.Id, group2.Id}, actualGroupIDs) 3955 3956 // Deleting membership from group should stop the group from being returned 3957 _, err = ss.Group().DeleteMember(group1.Id, user.Id) 3958 require.NoError(t, err) 3959 actualGroupIDs, err = ss.Group().AdminRoleGroupsForSyncableMember(user.Id, team.Id, model.GroupSyncableTypeTeam) 3960 require.NoError(t, err) 3961 require.ElementsMatch(t, []string{group2.Id}, actualGroupIDs) 3962 3963 // Deleting group syncable should stop it being returned 3964 _, err = ss.Group().DeleteGroupSyncable(group2.Id, team.Id, model.GroupSyncableTypeTeam) 3965 require.NoError(t, err) 3966 actualGroupIDs, err = ss.Group().AdminRoleGroupsForSyncableMember(user.Id, team.Id, model.GroupSyncableTypeTeam) 3967 require.NoError(t, err) 3968 require.ElementsMatch(t, []string{}, actualGroupIDs) 3969 } 3970 3971 func groupTestPermittedSyncableAdminsTeam(t *testing.T, ss store.Store) { 3972 user1 := &model.User{ 3973 Email: MakeEmail(), 3974 Username: model.NewId(), 3975 } 3976 user1, err := ss.User().Save(user1) 3977 require.NoError(t, err) 3978 3979 user2 := &model.User{ 3980 Email: MakeEmail(), 3981 Username: model.NewId(), 3982 } 3983 user2, err = ss.User().Save(user2) 3984 require.NoError(t, err) 3985 3986 user3 := &model.User{ 3987 Email: MakeEmail(), 3988 Username: model.NewId(), 3989 } 3990 user3, err = ss.User().Save(user3) 3991 require.NoError(t, err) 3992 3993 group1 := &model.Group{ 3994 Name: model.NewString(model.NewId()), 3995 DisplayName: model.NewId(), 3996 Source: model.GroupSourceLdap, 3997 Description: model.NewId(), 3998 RemoteId: model.NewId(), 3999 } 4000 group1, err = ss.Group().Create(group1) 4001 require.NoError(t, err) 4002 4003 _, err = ss.Group().UpsertMember(group1.Id, user1.Id) 4004 require.NoError(t, err) 4005 _, err = ss.Group().UpsertMember(group1.Id, user2.Id) 4006 require.NoError(t, err) 4007 4008 group2 := &model.Group{ 4009 Name: model.NewString(model.NewId()), 4010 DisplayName: model.NewId(), 4011 Source: model.GroupSourceLdap, 4012 Description: model.NewId(), 4013 RemoteId: model.NewId(), 4014 } 4015 group2, err = ss.Group().Create(group2) 4016 require.NoError(t, err) 4017 4018 _, err = ss.Group().UpsertMember(group2.Id, user3.Id) 4019 require.NoError(t, err) 4020 4021 team := &model.Team{ 4022 DisplayName: "A Name", 4023 Name: "zz" + model.NewId(), 4024 Type: model.CHANNEL_OPEN, 4025 } 4026 team, nErr := ss.Team().Save(team) 4027 require.NoError(t, nErr) 4028 4029 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 4030 AutoAdd: true, 4031 SyncableId: team.Id, 4032 Type: model.GroupSyncableTypeTeam, 4033 GroupId: group1.Id, 4034 SchemeAdmin: true, 4035 }) 4036 require.NoError(t, err) 4037 4038 groupSyncable2, err := ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 4039 AutoAdd: true, 4040 SyncableId: team.Id, 4041 Type: model.GroupSyncableTypeTeam, 4042 GroupId: group2.Id, 4043 SchemeAdmin: false, 4044 }) 4045 require.NoError(t, err) 4046 4047 // group 1's users are returned because groupsyncable 2 has SchemeAdmin false. 4048 actualUserIDs, err := ss.Group().PermittedSyncableAdmins(team.Id, model.GroupSyncableTypeTeam) 4049 require.NoError(t, err) 4050 require.ElementsMatch(t, []string{user1.Id, user2.Id}, actualUserIDs) 4051 4052 // update groupsyncable 2 to be SchemeAdmin true 4053 groupSyncable2.SchemeAdmin = true 4054 _, err = ss.Group().UpdateGroupSyncable(groupSyncable2) 4055 require.NoError(t, err) 4056 4057 // group 2's users are now included in return value 4058 actualUserIDs, err = ss.Group().PermittedSyncableAdmins(team.Id, model.GroupSyncableTypeTeam) 4059 require.NoError(t, err) 4060 require.ElementsMatch(t, []string{user1.Id, user2.Id, user3.Id}, actualUserIDs) 4061 4062 // deleted group member should not be included 4063 ss.Group().DeleteMember(group1.Id, user2.Id) 4064 require.NoError(t, err) 4065 actualUserIDs, err = ss.Group().PermittedSyncableAdmins(team.Id, model.GroupSyncableTypeTeam) 4066 require.NoError(t, err) 4067 require.ElementsMatch(t, []string{user1.Id, user3.Id}, actualUserIDs) 4068 4069 // deleted group syncable no longer includes group members 4070 _, err = ss.Group().DeleteGroupSyncable(group1.Id, team.Id, model.GroupSyncableTypeTeam) 4071 require.NoError(t, err) 4072 actualUserIDs, err = ss.Group().PermittedSyncableAdmins(team.Id, model.GroupSyncableTypeTeam) 4073 require.NoError(t, err) 4074 require.ElementsMatch(t, []string{user3.Id}, actualUserIDs) 4075 } 4076 4077 func groupTestPermittedSyncableAdminsChannel(t *testing.T, ss store.Store) { 4078 user1 := &model.User{ 4079 Email: MakeEmail(), 4080 Username: model.NewId(), 4081 } 4082 user1, err := ss.User().Save(user1) 4083 require.NoError(t, err) 4084 4085 user2 := &model.User{ 4086 Email: MakeEmail(), 4087 Username: model.NewId(), 4088 } 4089 user2, err = ss.User().Save(user2) 4090 require.NoError(t, err) 4091 4092 user3 := &model.User{ 4093 Email: MakeEmail(), 4094 Username: model.NewId(), 4095 } 4096 user3, err = ss.User().Save(user3) 4097 require.NoError(t, err) 4098 4099 group1 := &model.Group{ 4100 Name: model.NewString(model.NewId()), 4101 DisplayName: model.NewId(), 4102 Source: model.GroupSourceLdap, 4103 Description: model.NewId(), 4104 RemoteId: model.NewId(), 4105 } 4106 group1, err = ss.Group().Create(group1) 4107 require.NoError(t, err) 4108 4109 _, err = ss.Group().UpsertMember(group1.Id, user1.Id) 4110 require.NoError(t, err) 4111 _, err = ss.Group().UpsertMember(group1.Id, user2.Id) 4112 require.NoError(t, err) 4113 4114 group2 := &model.Group{ 4115 Name: model.NewString(model.NewId()), 4116 DisplayName: model.NewId(), 4117 Source: model.GroupSourceLdap, 4118 Description: model.NewId(), 4119 RemoteId: model.NewId(), 4120 } 4121 group2, err = ss.Group().Create(group2) 4122 require.NoError(t, err) 4123 4124 _, err = ss.Group().UpsertMember(group2.Id, user3.Id) 4125 require.NoError(t, err) 4126 4127 channel := &model.Channel{ 4128 TeamId: model.NewId(), 4129 DisplayName: "A Name", 4130 Name: model.NewId(), 4131 Type: model.CHANNEL_OPEN, 4132 } 4133 channel, nErr := ss.Channel().Save(channel, 9999) 4134 require.NoError(t, nErr) 4135 4136 _, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 4137 AutoAdd: true, 4138 SyncableId: channel.Id, 4139 Type: model.GroupSyncableTypeChannel, 4140 GroupId: group1.Id, 4141 SchemeAdmin: true, 4142 }) 4143 require.NoError(t, err) 4144 4145 groupSyncable2, err := ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 4146 AutoAdd: true, 4147 SyncableId: channel.Id, 4148 Type: model.GroupSyncableTypeChannel, 4149 GroupId: group2.Id, 4150 SchemeAdmin: false, 4151 }) 4152 require.NoError(t, err) 4153 4154 // group 1's users are returned because groupsyncable 2 has SchemeAdmin false. 4155 actualUserIDs, err := ss.Group().PermittedSyncableAdmins(channel.Id, model.GroupSyncableTypeChannel) 4156 require.NoError(t, err) 4157 require.ElementsMatch(t, []string{user1.Id, user2.Id}, actualUserIDs) 4158 4159 // update groupsyncable 2 to be SchemeAdmin true 4160 groupSyncable2.SchemeAdmin = true 4161 _, err = ss.Group().UpdateGroupSyncable(groupSyncable2) 4162 require.NoError(t, err) 4163 4164 // group 2's users are now included in return value 4165 actualUserIDs, err = ss.Group().PermittedSyncableAdmins(channel.Id, model.GroupSyncableTypeChannel) 4166 require.NoError(t, err) 4167 require.ElementsMatch(t, []string{user1.Id, user2.Id, user3.Id}, actualUserIDs) 4168 4169 // deleted group member should not be included 4170 ss.Group().DeleteMember(group1.Id, user2.Id) 4171 require.NoError(t, err) 4172 actualUserIDs, err = ss.Group().PermittedSyncableAdmins(channel.Id, model.GroupSyncableTypeChannel) 4173 require.NoError(t, err) 4174 require.ElementsMatch(t, []string{user1.Id, user3.Id}, actualUserIDs) 4175 4176 // deleted group syncable no longer includes group members 4177 _, err = ss.Group().DeleteGroupSyncable(group1.Id, channel.Id, model.GroupSyncableTypeChannel) 4178 require.NoError(t, err) 4179 actualUserIDs, err = ss.Group().PermittedSyncableAdmins(channel.Id, model.GroupSyncableTypeChannel) 4180 require.NoError(t, err) 4181 require.ElementsMatch(t, []string{user3.Id}, actualUserIDs) 4182 } 4183 4184 func groupTestpUpdateMembersRoleTeam(t *testing.T, ss store.Store) { 4185 team := &model.Team{ 4186 DisplayName: "Name", 4187 Description: "Some description", 4188 CompanyName: "Some company name", 4189 AllowOpenInvite: false, 4190 InviteId: "inviteid0", 4191 Name: "z-z-" + model.NewId() + "a", 4192 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 4193 Type: model.TEAM_OPEN, 4194 } 4195 team, err := ss.Team().Save(team) 4196 require.NoError(t, err) 4197 4198 user1 := &model.User{ 4199 Email: MakeEmail(), 4200 Username: model.NewId(), 4201 } 4202 user1, err = ss.User().Save(user1) 4203 require.NoError(t, err) 4204 4205 user2 := &model.User{ 4206 Email: MakeEmail(), 4207 Username: model.NewId(), 4208 } 4209 user2, err = ss.User().Save(user2) 4210 require.NoError(t, err) 4211 4212 user3 := &model.User{ 4213 Email: MakeEmail(), 4214 Username: model.NewId(), 4215 } 4216 user3, err = ss.User().Save(user3) 4217 require.NoError(t, err) 4218 4219 user4 := &model.User{ 4220 Email: MakeEmail(), 4221 Username: model.NewId(), 4222 } 4223 user4, err = ss.User().Save(user4) 4224 require.NoError(t, err) 4225 4226 for _, user := range []*model.User{user1, user2, user3} { 4227 _, nErr := ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: user.Id}, 9999) 4228 require.NoError(t, nErr) 4229 } 4230 4231 _, nErr := ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: user4.Id, SchemeGuest: true}, 9999) 4232 require.NoError(t, nErr) 4233 4234 tests := []struct { 4235 testName string 4236 inUserIDs []string 4237 targetSchemeAdminValue bool 4238 }{ 4239 { 4240 "Given users are admins", 4241 []string{user1.Id, user2.Id}, 4242 true, 4243 }, 4244 { 4245 "Given users are members", 4246 []string{user2.Id}, 4247 false, 4248 }, 4249 { 4250 "Non-given users are admins", 4251 []string{user2.Id}, 4252 false, 4253 }, 4254 { 4255 "Non-given users are members", 4256 []string{user2.Id}, 4257 false, 4258 }, 4259 } 4260 4261 for _, tt := range tests { 4262 t.Run(tt.testName, func(t *testing.T) { 4263 err = ss.Team().UpdateMembersRole(team.Id, tt.inUserIDs) 4264 require.NoError(t, err) 4265 4266 members, err := ss.Team().GetMembers(team.Id, 0, 100, nil) 4267 require.NoError(t, err) 4268 require.GreaterOrEqual(t, len(members), 4) // sanity check for team membership 4269 4270 for _, member := range members { 4271 if utils.StringInSlice(member.UserId, tt.inUserIDs) { 4272 require.True(t, member.SchemeAdmin) 4273 } else { 4274 require.False(t, member.SchemeAdmin) 4275 } 4276 4277 // Ensure guest account never changes. 4278 if member.UserId == user4.Id { 4279 require.False(t, member.SchemeUser) 4280 require.False(t, member.SchemeAdmin) 4281 require.True(t, member.SchemeGuest) 4282 } 4283 } 4284 }) 4285 } 4286 } 4287 4288 func groupTestpUpdateMembersRoleChannel(t *testing.T, ss store.Store) { 4289 channel := &model.Channel{ 4290 TeamId: model.NewId(), 4291 DisplayName: "A Name", 4292 Name: model.NewId(), 4293 Type: model.CHANNEL_OPEN, // Query does not look at type so this shouldn't matter. 4294 } 4295 channel, err := ss.Channel().Save(channel, 9999) 4296 require.NoError(t, err) 4297 4298 user1 := &model.User{ 4299 Email: MakeEmail(), 4300 Username: model.NewId(), 4301 } 4302 user1, err = ss.User().Save(user1) 4303 require.NoError(t, err) 4304 4305 user2 := &model.User{ 4306 Email: MakeEmail(), 4307 Username: model.NewId(), 4308 } 4309 user2, err = ss.User().Save(user2) 4310 require.NoError(t, err) 4311 4312 user3 := &model.User{ 4313 Email: MakeEmail(), 4314 Username: model.NewId(), 4315 } 4316 user3, err = ss.User().Save(user3) 4317 require.NoError(t, err) 4318 4319 user4 := &model.User{ 4320 Email: MakeEmail(), 4321 Username: model.NewId(), 4322 } 4323 user4, err = ss.User().Save(user4) 4324 require.NoError(t, err) 4325 4326 for _, user := range []*model.User{user1, user2, user3} { 4327 _, err = ss.Channel().SaveMember(&model.ChannelMember{ 4328 ChannelId: channel.Id, 4329 UserId: user.Id, 4330 NotifyProps: model.GetDefaultChannelNotifyProps(), 4331 }) 4332 require.NoError(t, err) 4333 } 4334 4335 _, err = ss.Channel().SaveMember(&model.ChannelMember{ 4336 ChannelId: channel.Id, 4337 UserId: user4.Id, 4338 NotifyProps: model.GetDefaultChannelNotifyProps(), 4339 SchemeGuest: true, 4340 }) 4341 require.NoError(t, err) 4342 4343 tests := []struct { 4344 testName string 4345 inUserIDs []string 4346 targetSchemeAdminValue bool 4347 }{ 4348 { 4349 "Given users are admins", 4350 []string{user1.Id, user2.Id}, 4351 true, 4352 }, 4353 { 4354 "Given users are members", 4355 []string{user2.Id}, 4356 false, 4357 }, 4358 { 4359 "Non-given users are admins", 4360 []string{user2.Id}, 4361 false, 4362 }, 4363 { 4364 "Non-given users are members", 4365 []string{user2.Id}, 4366 false, 4367 }, 4368 } 4369 4370 for _, tt := range tests { 4371 t.Run(tt.testName, func(t *testing.T) { 4372 err = ss.Channel().UpdateMembersRole(channel.Id, tt.inUserIDs) 4373 require.NoError(t, err) 4374 4375 members, err := ss.Channel().GetMembers(channel.Id, 0, 100) 4376 require.NoError(t, err) 4377 4378 require.GreaterOrEqual(t, len(*members), 4) // sanity check for channel membership 4379 4380 for _, member := range *members { 4381 if utils.StringInSlice(member.UserId, tt.inUserIDs) { 4382 require.True(t, member.SchemeAdmin) 4383 } else { 4384 require.False(t, member.SchemeAdmin) 4385 } 4386 4387 // Ensure guest account never changes. 4388 if member.UserId == user4.Id { 4389 require.False(t, member.SchemeUser) 4390 require.False(t, member.SchemeAdmin) 4391 require.True(t, member.SchemeGuest) 4392 } 4393 } 4394 }) 4395 } 4396 } 4397 4398 func groupTestGroupCount(t *testing.T, ss store.Store) { 4399 group1, err := ss.Group().Create(&model.Group{ 4400 Name: model.NewString(model.NewId()), 4401 DisplayName: model.NewId(), 4402 Source: model.GroupSourceLdap, 4403 RemoteId: model.NewId(), 4404 }) 4405 require.NoError(t, err) 4406 defer ss.Group().Delete(group1.Id) 4407 4408 count, err := ss.Group().GroupCount() 4409 require.NoError(t, err) 4410 require.GreaterOrEqual(t, count, int64(1)) 4411 4412 group2, err := ss.Group().Create(&model.Group{ 4413 Name: model.NewString(model.NewId()), 4414 DisplayName: model.NewId(), 4415 Source: model.GroupSourceLdap, 4416 RemoteId: model.NewId(), 4417 }) 4418 require.NoError(t, err) 4419 defer ss.Group().Delete(group2.Id) 4420 4421 countAfter, err := ss.Group().GroupCount() 4422 require.NoError(t, err) 4423 require.GreaterOrEqual(t, countAfter, count+1) 4424 } 4425 4426 func groupTestGroupTeamCount(t *testing.T, ss store.Store) { 4427 team, err := ss.Team().Save(&model.Team{ 4428 DisplayName: model.NewId(), 4429 Description: model.NewId(), 4430 AllowOpenInvite: false, 4431 InviteId: model.NewId(), 4432 Name: "zz" + model.NewId(), 4433 Email: model.NewId() + "@simulator.amazonses.com", 4434 Type: model.TEAM_OPEN, 4435 }) 4436 require.NoError(t, err) 4437 defer ss.Team().PermanentDelete(team.Id) 4438 4439 group1, err := ss.Group().Create(&model.Group{ 4440 Name: model.NewString(model.NewId()), 4441 DisplayName: model.NewId(), 4442 Source: model.GroupSourceLdap, 4443 RemoteId: model.NewId(), 4444 }) 4445 require.NoError(t, err) 4446 defer ss.Group().Delete(group1.Id) 4447 4448 group2, err := ss.Group().Create(&model.Group{ 4449 Name: model.NewString(model.NewId()), 4450 DisplayName: model.NewId(), 4451 Source: model.GroupSourceLdap, 4452 RemoteId: model.NewId(), 4453 }) 4454 require.NoError(t, err) 4455 defer ss.Group().Delete(group2.Id) 4456 4457 groupSyncable1, err := ss.Group().CreateGroupSyncable(model.NewGroupTeam(group1.Id, team.Id, false)) 4458 require.NoError(t, err) 4459 defer ss.Group().DeleteGroupSyncable(groupSyncable1.GroupId, groupSyncable1.SyncableId, groupSyncable1.Type) 4460 4461 count, err := ss.Group().GroupTeamCount() 4462 require.NoError(t, err) 4463 require.GreaterOrEqual(t, count, int64(1)) 4464 4465 groupSyncable2, err := ss.Group().CreateGroupSyncable(model.NewGroupTeam(group2.Id, team.Id, false)) 4466 require.NoError(t, err) 4467 defer ss.Group().DeleteGroupSyncable(groupSyncable2.GroupId, groupSyncable2.SyncableId, groupSyncable2.Type) 4468 4469 countAfter, err := ss.Group().GroupTeamCount() 4470 require.NoError(t, err) 4471 require.GreaterOrEqual(t, countAfter, count+1) 4472 } 4473 4474 func groupTestGroupChannelCount(t *testing.T, ss store.Store) { 4475 channel, err := ss.Channel().Save(&model.Channel{ 4476 TeamId: model.NewId(), 4477 DisplayName: model.NewId(), 4478 Name: model.NewId(), 4479 Type: model.CHANNEL_OPEN, 4480 }, 9999) 4481 require.NoError(t, err) 4482 defer ss.Channel().Delete(channel.Id, 0) 4483 4484 group1, err := ss.Group().Create(&model.Group{ 4485 Name: model.NewString(model.NewId()), 4486 DisplayName: model.NewId(), 4487 Source: model.GroupSourceLdap, 4488 RemoteId: model.NewId(), 4489 }) 4490 require.NoError(t, err) 4491 defer ss.Group().Delete(group1.Id) 4492 4493 group2, err := ss.Group().Create(&model.Group{ 4494 Name: model.NewString(model.NewId()), 4495 DisplayName: model.NewId(), 4496 Source: model.GroupSourceLdap, 4497 RemoteId: model.NewId(), 4498 }) 4499 require.NoError(t, err) 4500 defer ss.Group().Delete(group2.Id) 4501 4502 groupSyncable1, err := ss.Group().CreateGroupSyncable(model.NewGroupChannel(group1.Id, channel.Id, false)) 4503 require.NoError(t, err) 4504 defer ss.Group().DeleteGroupSyncable(groupSyncable1.GroupId, groupSyncable1.SyncableId, groupSyncable1.Type) 4505 4506 count, err := ss.Group().GroupChannelCount() 4507 require.NoError(t, err) 4508 require.GreaterOrEqual(t, count, int64(1)) 4509 4510 groupSyncable2, err := ss.Group().CreateGroupSyncable(model.NewGroupChannel(group2.Id, channel.Id, false)) 4511 require.NoError(t, err) 4512 defer ss.Group().DeleteGroupSyncable(groupSyncable2.GroupId, groupSyncable2.SyncableId, groupSyncable2.Type) 4513 4514 countAfter, err := ss.Group().GroupChannelCount() 4515 require.NoError(t, err) 4516 require.GreaterOrEqual(t, countAfter, count+1) 4517 } 4518 4519 func groupTestGroupMemberCount(t *testing.T, ss store.Store) { 4520 group, err := ss.Group().Create(&model.Group{ 4521 Name: model.NewString(model.NewId()), 4522 DisplayName: model.NewId(), 4523 Source: model.GroupSourceLdap, 4524 RemoteId: model.NewId(), 4525 }) 4526 require.NoError(t, err) 4527 defer ss.Group().Delete(group.Id) 4528 4529 member1, err := ss.Group().UpsertMember(group.Id, model.NewId()) 4530 require.NoError(t, err) 4531 defer ss.Group().DeleteMember(group.Id, member1.UserId) 4532 4533 count, err := ss.Group().GroupMemberCount() 4534 require.NoError(t, err) 4535 require.GreaterOrEqual(t, count, int64(1)) 4536 4537 member2, err := ss.Group().UpsertMember(group.Id, model.NewId()) 4538 require.NoError(t, err) 4539 defer ss.Group().DeleteMember(group.Id, member2.UserId) 4540 4541 countAfter, err := ss.Group().GroupMemberCount() 4542 require.NoError(t, err) 4543 require.GreaterOrEqual(t, countAfter, count+1) 4544 } 4545 4546 func groupTestDistinctGroupMemberCount(t *testing.T, ss store.Store) { 4547 group1, err := ss.Group().Create(&model.Group{ 4548 Name: model.NewString(model.NewId()), 4549 DisplayName: model.NewId(), 4550 Source: model.GroupSourceLdap, 4551 RemoteId: model.NewId(), 4552 }) 4553 require.NoError(t, err) 4554 defer ss.Group().Delete(group1.Id) 4555 4556 group2, err := ss.Group().Create(&model.Group{ 4557 Name: model.NewString(model.NewId()), 4558 DisplayName: model.NewId(), 4559 Source: model.GroupSourceLdap, 4560 RemoteId: model.NewId(), 4561 }) 4562 require.NoError(t, err) 4563 defer ss.Group().Delete(group2.Id) 4564 4565 member1, err := ss.Group().UpsertMember(group1.Id, model.NewId()) 4566 require.NoError(t, err) 4567 defer ss.Group().DeleteMember(group1.Id, member1.UserId) 4568 4569 count, err := ss.Group().GroupMemberCount() 4570 require.NoError(t, err) 4571 require.GreaterOrEqual(t, count, int64(1)) 4572 4573 member2, err := ss.Group().UpsertMember(group1.Id, model.NewId()) 4574 require.NoError(t, err) 4575 defer ss.Group().DeleteMember(group1.Id, member2.UserId) 4576 4577 countAfter1, err := ss.Group().GroupMemberCount() 4578 require.NoError(t, err) 4579 require.GreaterOrEqual(t, countAfter1, count+1) 4580 4581 member3, err := ss.Group().UpsertMember(group1.Id, member1.UserId) 4582 require.NoError(t, err) 4583 defer ss.Group().DeleteMember(group1.Id, member3.UserId) 4584 4585 countAfter2, err := ss.Group().GroupMemberCount() 4586 require.NoError(t, err) 4587 require.GreaterOrEqual(t, countAfter2, countAfter1) 4588 } 4589 4590 func groupTestGroupCountWithAllowReference(t *testing.T, ss store.Store) { 4591 initialCount, err := ss.Group().GroupCountWithAllowReference() 4592 require.NoError(t, err) 4593 4594 group1, err := ss.Group().Create(&model.Group{ 4595 Name: model.NewString(model.NewId()), 4596 DisplayName: model.NewId(), 4597 Source: model.GroupSourceLdap, 4598 RemoteId: model.NewId(), 4599 }) 4600 require.NoError(t, err) 4601 defer ss.Group().Delete(group1.Id) 4602 4603 count, err := ss.Group().GroupCountWithAllowReference() 4604 require.NoError(t, err) 4605 require.Equal(t, count, initialCount) 4606 4607 group2, err := ss.Group().Create(&model.Group{ 4608 Name: model.NewString(model.NewId()), 4609 DisplayName: model.NewId(), 4610 Source: model.GroupSourceLdap, 4611 RemoteId: model.NewId(), 4612 AllowReference: true, 4613 }) 4614 require.NoError(t, err) 4615 defer ss.Group().Delete(group2.Id) 4616 4617 countAfter, err := ss.Group().GroupCountWithAllowReference() 4618 require.NoError(t, err) 4619 require.Greater(t, countAfter, count) 4620 }