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