github.com/mad-app/mattermost-server@v5.11.1+incompatible/store/storetest/group_supplier.go (about) 1 // Copyright (c) 2018-present Mattermost, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package storetest 5 6 import ( 7 "strings" 8 "testing" 9 10 "github.com/mattermost/mattermost-server/model" 11 "github.com/mattermost/mattermost-server/store" 12 "github.com/stretchr/testify/assert" 13 ) 14 15 func TestGroupStore(t *testing.T, ss store.Store) { 16 t.Run("Create", func(t *testing.T) { testGroupStoreCreate(t, ss) }) 17 t.Run("Get", func(t *testing.T) { testGroupStoreGet(t, ss) }) 18 t.Run("GetByRemoteID", func(t *testing.T) { testGroupStoreGetByRemoteID(t, ss) }) 19 t.Run("GetAllBySource", func(t *testing.T) { testGroupStoreGetAllByType(t, ss) }) 20 t.Run("Update", func(t *testing.T) { testGroupStoreUpdate(t, ss) }) 21 t.Run("Delete", func(t *testing.T) { testGroupStoreDelete(t, ss) }) 22 23 t.Run("GetMemberUsers", func(t *testing.T) { testGroupGetMemberUsers(t, ss) }) 24 t.Run("GetMemberUsersPage", func(t *testing.T) { testGroupGetMemberUsersPage(t, ss) }) 25 t.Run("CreateOrRestoreMember", func(t *testing.T) { testGroupCreateOrRestoreMember(t, ss) }) 26 t.Run("DeleteMember", func(t *testing.T) { testGroupDeleteMember(t, ss) }) 27 28 t.Run("CreateGroupSyncable", func(t *testing.T) { testCreateGroupSyncable(t, ss) }) 29 t.Run("GetGroupSyncable", func(t *testing.T) { testGetGroupSyncable(t, ss) }) 30 t.Run("GetAllGroupSyncablesByGroupId", func(t *testing.T) { testGetAllGroupSyncablesByGroup(t, ss) }) 31 t.Run("UpdateGroupSyncable", func(t *testing.T) { testUpdateGroupSyncable(t, ss) }) 32 t.Run("DeleteGroupSyncable", func(t *testing.T) { testDeleteGroupSyncable(t, ss) }) 33 34 t.Run("PendingAutoAddTeamMembers", func(t *testing.T) { testPendingAutoAddTeamMembers(t, ss) }) 35 t.Run("PendingAutoAddChannelMembers", func(t *testing.T) { testPendingAutoAddChannelMembers(t, ss) }) 36 } 37 38 func testGroupStoreCreate(t *testing.T, ss store.Store) { 39 // Save a new group 40 g1 := &model.Group{ 41 Name: model.NewId(), 42 DisplayName: model.NewId(), 43 Source: model.GroupSourceLdap, 44 Description: model.NewId(), 45 RemoteId: model.NewId(), 46 } 47 48 // Happy path 49 res1 := <-ss.Group().Create(g1) 50 assert.Nil(t, res1.Err) 51 d1 := res1.Data.(*model.Group) 52 assert.Len(t, d1.Id, 26) 53 assert.Equal(t, g1.Name, d1.Name) 54 assert.Equal(t, g1.DisplayName, d1.DisplayName) 55 assert.Equal(t, g1.Description, d1.Description) 56 assert.Equal(t, g1.RemoteId, d1.RemoteId) 57 assert.NotZero(t, d1.CreateAt) 58 assert.NotZero(t, d1.UpdateAt) 59 assert.Zero(t, d1.DeleteAt) 60 61 // Requires name and display name 62 g2 := &model.Group{ 63 Name: "", 64 DisplayName: model.NewId(), 65 Source: model.GroupSourceLdap, 66 RemoteId: model.NewId(), 67 } 68 res2 := <-ss.Group().Create(g2) 69 assert.Nil(t, res2.Data) 70 assert.NotNil(t, res2.Err) 71 assert.Equal(t, res2.Err.Id, "model.group.name.app_error") 72 73 g2.Name = model.NewId() 74 g2.DisplayName = "" 75 res3 := <-ss.Group().Create(g2) 76 assert.Nil(t, res3.Data) 77 assert.NotNil(t, res3.Err) 78 assert.Equal(t, res3.Err.Id, "model.group.display_name.app_error") 79 80 // Won't accept a duplicate name 81 g4 := &model.Group{ 82 Name: model.NewId(), 83 DisplayName: model.NewId(), 84 Source: model.GroupSourceLdap, 85 RemoteId: model.NewId(), 86 } 87 res5 := <-ss.Group().Create(g4) 88 assert.Nil(t, res5.Err) 89 g4b := &model.Group{ 90 Name: g4.Name, 91 DisplayName: model.NewId(), 92 Source: model.GroupSourceLdap, 93 RemoteId: model.NewId(), 94 } 95 res5b := <-ss.Group().Create(g4b) 96 assert.Nil(t, res5b.Data) 97 assert.Equal(t, res5b.Err.Id, "store.sql_group.unique_constraint") 98 99 // Fields cannot be greater than max values 100 g5 := &model.Group{ 101 Name: strings.Repeat("x", model.GroupNameMaxLength), 102 DisplayName: strings.Repeat("x", model.GroupDisplayNameMaxLength), 103 Description: strings.Repeat("x", model.GroupDescriptionMaxLength), 104 Source: model.GroupSourceLdap, 105 RemoteId: model.NewId(), 106 } 107 assert.Nil(t, g5.IsValidForCreate()) 108 109 g5.Name = g5.Name + "x" 110 assert.Equal(t, g5.IsValidForCreate().Id, "model.group.name.app_error") 111 g5.Name = model.NewId() 112 assert.Nil(t, g5.IsValidForCreate()) 113 114 g5.DisplayName = g5.DisplayName + "x" 115 assert.Equal(t, g5.IsValidForCreate().Id, "model.group.display_name.app_error") 116 g5.DisplayName = model.NewId() 117 assert.Nil(t, g5.IsValidForCreate()) 118 119 g5.Description = g5.Description + "x" 120 assert.Equal(t, g5.IsValidForCreate().Id, "model.group.description.app_error") 121 g5.Description = model.NewId() 122 assert.Nil(t, g5.IsValidForCreate()) 123 124 // Must use a valid type 125 g6 := &model.Group{ 126 Name: model.NewId(), 127 DisplayName: model.NewId(), 128 Description: model.NewId(), 129 Source: model.GroupSource("fake"), 130 RemoteId: model.NewId(), 131 } 132 assert.Equal(t, g6.IsValidForCreate().Id, "model.group.source.app_error") 133 } 134 135 func testGroupStoreGet(t *testing.T, ss store.Store) { 136 // Create a group 137 g1 := &model.Group{ 138 Name: model.NewId(), 139 DisplayName: model.NewId(), 140 Description: model.NewId(), 141 Source: model.GroupSourceLdap, 142 RemoteId: model.NewId(), 143 } 144 res1 := <-ss.Group().Create(g1) 145 assert.Nil(t, res1.Err) 146 d1 := res1.Data.(*model.Group) 147 assert.Len(t, d1.Id, 26) 148 149 // Get the group 150 res2 := <-ss.Group().Get(d1.Id) 151 assert.Nil(t, res2.Err) 152 d2 := res2.Data.(*model.Group) 153 assert.Equal(t, d1.Id, d2.Id) 154 assert.Equal(t, d1.Name, d2.Name) 155 assert.Equal(t, d1.DisplayName, d2.DisplayName) 156 assert.Equal(t, d1.Description, d2.Description) 157 assert.Equal(t, d1.RemoteId, d2.RemoteId) 158 assert.Equal(t, d1.CreateAt, d2.CreateAt) 159 assert.Equal(t, d1.UpdateAt, d2.UpdateAt) 160 assert.Equal(t, d1.DeleteAt, d2.DeleteAt) 161 162 // Get an invalid group 163 res3 := <-ss.Group().Get(model.NewId()) 164 assert.NotNil(t, res3.Err) 165 assert.Equal(t, res3.Err.Id, "store.sql_group.no_rows") 166 } 167 168 func testGroupStoreGetByRemoteID(t *testing.T, ss store.Store) { 169 // Create a group 170 g1 := &model.Group{ 171 Name: model.NewId(), 172 DisplayName: model.NewId(), 173 Description: model.NewId(), 174 Source: model.GroupSourceLdap, 175 RemoteId: model.NewId(), 176 } 177 res1 := <-ss.Group().Create(g1) 178 assert.Nil(t, res1.Err) 179 d1 := res1.Data.(*model.Group) 180 assert.Len(t, d1.Id, 26) 181 182 // Get the group 183 res2 := <-ss.Group().GetByRemoteID(d1.RemoteId, model.GroupSourceLdap) 184 assert.Nil(t, res2.Err) 185 d2 := res2.Data.(*model.Group) 186 assert.Equal(t, d1.Id, d2.Id) 187 assert.Equal(t, d1.Name, d2.Name) 188 assert.Equal(t, d1.DisplayName, d2.DisplayName) 189 assert.Equal(t, d1.Description, d2.Description) 190 assert.Equal(t, d1.RemoteId, d2.RemoteId) 191 assert.Equal(t, d1.CreateAt, d2.CreateAt) 192 assert.Equal(t, d1.UpdateAt, d2.UpdateAt) 193 assert.Equal(t, d1.DeleteAt, d2.DeleteAt) 194 195 // Get an invalid group 196 res3 := <-ss.Group().GetByRemoteID(model.NewId(), model.GroupSource("fake")) 197 assert.NotNil(t, res3.Err) 198 assert.Equal(t, res3.Err.Id, "store.sql_group.no_rows") 199 } 200 201 func testGroupStoreGetAllByType(t *testing.T, ss store.Store) { 202 numGroups := 10 203 204 groups := []*model.Group{} 205 206 // Create groups 207 for i := 0; i < numGroups; i++ { 208 g := &model.Group{ 209 Name: model.NewId(), 210 DisplayName: model.NewId(), 211 Description: model.NewId(), 212 Source: model.GroupSourceLdap, 213 RemoteId: model.NewId(), 214 } 215 groups = append(groups, g) 216 res := <-ss.Group().Create(g) 217 assert.Nil(t, res.Err) 218 } 219 220 // Returns all the groups 221 res1 := <-ss.Group().GetAllBySource(model.GroupSourceLdap) 222 d1 := res1.Data.([]*model.Group) 223 assert.Condition(t, func() bool { return len(d1) >= numGroups }) 224 for _, expectedGroup := range groups { 225 present := false 226 for _, dbGroup := range d1 { 227 if dbGroup.Id == expectedGroup.Id { 228 present = true 229 break 230 } 231 } 232 assert.True(t, present) 233 } 234 } 235 236 func testGroupStoreUpdate(t *testing.T, ss store.Store) { 237 // Save a new group 238 g1 := &model.Group{ 239 Name: "g1-test", 240 DisplayName: model.NewId(), 241 Source: model.GroupSourceLdap, 242 Description: model.NewId(), 243 RemoteId: model.NewId(), 244 } 245 246 // Create a group 247 res := <-ss.Group().Create(g1) 248 assert.Nil(t, res.Err) 249 d1 := res.Data.(*model.Group) 250 251 // Update happy path 252 g1Update := &model.Group{} 253 *g1Update = *g1 254 g1Update.Name = model.NewId() 255 g1Update.DisplayName = model.NewId() 256 g1Update.Description = model.NewId() 257 g1Update.RemoteId = model.NewId() 258 259 res2 := <-ss.Group().Update(g1Update) 260 assert.Nil(t, res2.Err) 261 ud1 := res2.Data.(*model.Group) 262 // Not changed... 263 assert.Equal(t, d1.Id, ud1.Id) 264 assert.Equal(t, d1.CreateAt, ud1.CreateAt) 265 assert.Equal(t, d1.Source, ud1.Source) 266 // Still zero... 267 assert.Zero(t, ud1.DeleteAt) 268 // Updated... 269 assert.Equal(t, g1Update.Name, ud1.Name) 270 assert.Equal(t, g1Update.DisplayName, ud1.DisplayName) 271 assert.Equal(t, g1Update.Description, ud1.Description) 272 assert.Equal(t, g1Update.RemoteId, ud1.RemoteId) 273 274 // Requires name and display name 275 res3 := <-ss.Group().Update(&model.Group{ 276 Id: d1.Id, 277 Name: "", 278 DisplayName: model.NewId(), 279 Source: model.GroupSourceLdap, 280 RemoteId: model.NewId(), 281 Description: model.NewId(), 282 }) 283 assert.Nil(t, res3.Data) 284 assert.NotNil(t, res3.Err) 285 assert.Equal(t, res3.Err.Id, "model.group.name.app_error") 286 287 res4 := <-ss.Group().Update(&model.Group{ 288 Id: d1.Id, 289 Name: model.NewId(), 290 DisplayName: "", 291 Source: model.GroupSourceLdap, 292 RemoteId: model.NewId(), 293 }) 294 assert.Nil(t, res4.Data) 295 assert.NotNil(t, res4.Err) 296 assert.Equal(t, res4.Err.Id, "model.group.display_name.app_error") 297 298 // Create another Group 299 g2 := &model.Group{ 300 Name: model.NewId(), 301 DisplayName: model.NewId(), 302 Source: model.GroupSourceLdap, 303 Description: model.NewId(), 304 RemoteId: model.NewId(), 305 } 306 res5 := <-ss.Group().Create(g2) 307 assert.Nil(t, res5.Err) 308 d2 := res5.Data.(*model.Group) 309 310 // Can't update the name to be a duplicate of an existing group's name 311 res6 := <-ss.Group().Update(&model.Group{ 312 Id: d2.Id, 313 Name: g1Update.Name, 314 DisplayName: model.NewId(), 315 Source: model.GroupSourceLdap, 316 Description: model.NewId(), 317 RemoteId: model.NewId(), 318 }) 319 assert.Equal(t, res6.Err.Id, "store.update_error") 320 321 // Cannot update CreateAt 322 someVal := model.GetMillis() 323 d1.CreateAt = someVal 324 res7 := <-ss.Group().Update(d1) 325 d3 := res7.Data.(*model.Group) 326 assert.NotEqual(t, someVal, d3.CreateAt) 327 328 // Cannot update DeleteAt to non-zero 329 d1.DeleteAt = 1 330 res9 := <-ss.Group().Update(d1) 331 assert.Equal(t, "model.group.delete_at.app_error", res9.Err.Id) 332 333 //...except for 0 for DeleteAt 334 d1.DeleteAt = 0 335 res8 := <-ss.Group().Update(d1) 336 assert.Nil(t, res8.Err) 337 d4 := res8.Data.(*model.Group) 338 assert.Zero(t, d4.DeleteAt) 339 } 340 341 func testGroupStoreDelete(t *testing.T, ss store.Store) { 342 // Save a group 343 g1 := &model.Group{ 344 Name: model.NewId(), 345 DisplayName: model.NewId(), 346 Description: model.NewId(), 347 Source: model.GroupSourceLdap, 348 RemoteId: model.NewId(), 349 } 350 351 res1 := <-ss.Group().Create(g1) 352 assert.Nil(t, res1.Err) 353 d1 := res1.Data.(*model.Group) 354 assert.Len(t, d1.Id, 26) 355 356 // Check the group is retrievable 357 res2 := <-ss.Group().Get(d1.Id) 358 assert.Nil(t, res2.Err) 359 360 // Get the before count 361 res7 := <-ss.Group().GetAllBySource(model.GroupSourceLdap) 362 d7 := res7.Data.([]*model.Group) 363 beforeCount := len(d7) 364 365 // Delete the group 366 res3 := <-ss.Group().Delete(d1.Id) 367 assert.Nil(t, res3.Err) 368 369 // Check the group is deleted 370 res4 := <-ss.Group().Get(d1.Id) 371 d4 := res4.Data.(*model.Group) 372 assert.NotZero(t, d4.DeleteAt) 373 374 // Check the after count 375 res5 := <-ss.Group().GetAllBySource(model.GroupSourceLdap) 376 d5 := res5.Data.([]*model.Group) 377 afterCount := len(d5) 378 assert.Condition(t, func() bool { return beforeCount == afterCount+1 }) 379 380 // Try and delete a nonexistent group 381 res6 := <-ss.Group().Delete(model.NewId()) 382 assert.NotNil(t, res6.Err) 383 assert.Equal(t, res6.Err.Id, "store.sql_group.no_rows") 384 385 // Cannot delete again 386 res8 := <-ss.Group().Delete(d1.Id) 387 assert.Equal(t, res8.Err.Id, "store.sql_group.no_rows") 388 } 389 390 func testGroupGetMemberUsers(t *testing.T, ss store.Store) { 391 // Save a group 392 g1 := &model.Group{ 393 Name: model.NewId(), 394 DisplayName: model.NewId(), 395 Description: model.NewId(), 396 Source: model.GroupSourceLdap, 397 RemoteId: model.NewId(), 398 } 399 res := <-ss.Group().Create(g1) 400 assert.Nil(t, res.Err) 401 group := res.Data.(*model.Group) 402 403 u1 := &model.User{ 404 Email: MakeEmail(), 405 Username: model.NewId(), 406 } 407 res = <-ss.User().Save(u1) 408 assert.Nil(t, res.Err) 409 user1 := res.Data.(*model.User) 410 411 res = <-ss.Group().CreateOrRestoreMember(group.Id, user1.Id) 412 assert.Nil(t, res.Err) 413 414 u2 := &model.User{ 415 Email: MakeEmail(), 416 Username: model.NewId(), 417 } 418 res = <-ss.User().Save(u2) 419 assert.Nil(t, res.Err) 420 user2 := res.Data.(*model.User) 421 422 res = <-ss.Group().CreateOrRestoreMember(group.Id, user2.Id) 423 assert.Nil(t, res.Err) 424 425 // Check returns members 426 res = <-ss.Group().GetMemberUsers(group.Id) 427 assert.Nil(t, res.Err) 428 groupMembers := res.Data.([]*model.User) 429 assert.Equal(t, 2, len(groupMembers)) 430 431 // Check madeup id 432 res = <-ss.Group().GetMemberUsers(model.NewId()) 433 assert.Equal(t, 0, len(res.Data.([]*model.User))) 434 435 // Delete a member 436 <-ss.Group().DeleteMember(group.Id, user1.Id) 437 438 // Should not return deleted members 439 res = <-ss.Group().GetMemberUsers(group.Id) 440 groupMembers = res.Data.([]*model.User) 441 assert.Equal(t, 1, len(groupMembers)) 442 } 443 444 func testGroupGetMemberUsersPage(t *testing.T, ss store.Store) { 445 // Save a group 446 g1 := &model.Group{ 447 Name: model.NewId(), 448 DisplayName: model.NewId(), 449 Description: model.NewId(), 450 Source: model.GroupSourceLdap, 451 RemoteId: model.NewId(), 452 } 453 res := <-ss.Group().Create(g1) 454 assert.Nil(t, res.Err) 455 group := res.Data.(*model.Group) 456 457 u1 := &model.User{ 458 Email: MakeEmail(), 459 Username: model.NewId(), 460 } 461 res = <-ss.User().Save(u1) 462 assert.Nil(t, res.Err) 463 user1 := res.Data.(*model.User) 464 465 res = <-ss.Group().CreateOrRestoreMember(group.Id, user1.Id) 466 assert.Nil(t, res.Err) 467 468 u2 := &model.User{ 469 Email: MakeEmail(), 470 Username: model.NewId(), 471 } 472 res = <-ss.User().Save(u2) 473 assert.Nil(t, res.Err) 474 user2 := res.Data.(*model.User) 475 476 res = <-ss.Group().CreateOrRestoreMember(group.Id, user2.Id) 477 assert.Nil(t, res.Err) 478 479 // Check returns members 480 res = <-ss.Group().GetMemberUsersPage(group.Id, 0, 100) 481 assert.Nil(t, res.Err) 482 groupMembers := res.Data.([]*model.User) 483 assert.Equal(t, 2, len(groupMembers)) 484 485 // Check page 1 486 res = <-ss.Group().GetMemberUsersPage(group.Id, 0, 1) 487 assert.Nil(t, res.Err) 488 groupMembers = res.Data.([]*model.User) 489 assert.Equal(t, 1, len(groupMembers)) 490 assert.Equal(t, user2.Id, groupMembers[0].Id) 491 492 // Check page 2 493 res = <-ss.Group().GetMemberUsersPage(group.Id, 1, 1) 494 assert.Nil(t, res.Err) 495 groupMembers = res.Data.([]*model.User) 496 assert.Equal(t, 1, len(groupMembers)) 497 assert.Equal(t, user1.Id, groupMembers[0].Id) 498 499 // Check madeup id 500 res = <-ss.Group().GetMemberUsersPage(model.NewId(), 0, 100) 501 assert.Equal(t, 0, len(res.Data.([]*model.User))) 502 503 // Delete a member 504 <-ss.Group().DeleteMember(group.Id, user1.Id) 505 506 // Should not return deleted members 507 res = <-ss.Group().GetMemberUsersPage(group.Id, 0, 100) 508 groupMembers = res.Data.([]*model.User) 509 assert.Equal(t, 1, len(groupMembers)) 510 } 511 512 func testGroupCreateOrRestoreMember(t *testing.T, ss store.Store) { 513 // Create group 514 g1 := &model.Group{ 515 Name: model.NewId(), 516 DisplayName: model.NewId(), 517 Source: model.GroupSourceLdap, 518 RemoteId: model.NewId(), 519 } 520 res1 := <-ss.Group().Create(g1) 521 assert.Nil(t, res1.Err) 522 group := res1.Data.(*model.Group) 523 524 // Create user 525 u1 := &model.User{ 526 Email: MakeEmail(), 527 Username: model.NewId(), 528 } 529 res2 := <-ss.User().Save(u1) 530 assert.Nil(t, res2.Err) 531 user := res2.Data.(*model.User) 532 533 // Happy path 534 res3 := <-ss.Group().CreateOrRestoreMember(group.Id, user.Id) 535 assert.Nil(t, res3.Err) 536 d2 := res3.Data.(*model.GroupMember) 537 assert.Equal(t, d2.GroupId, group.Id) 538 assert.Equal(t, d2.UserId, user.Id) 539 assert.NotZero(t, d2.CreateAt) 540 assert.Zero(t, d2.DeleteAt) 541 542 // Duplicate composite key (GroupId, UserId) 543 res4 := <-ss.Group().CreateOrRestoreMember(group.Id, user.Id) 544 assert.Equal(t, res4.Err.Id, "store.sql_group.uniqueness_error") 545 546 // Invalid GroupId 547 res6 := <-ss.Group().CreateOrRestoreMember(model.NewId(), user.Id) 548 assert.Equal(t, res6.Err.Id, "store.insert_error") 549 550 // Restores a deleted member 551 res := <-ss.Group().CreateOrRestoreMember(group.Id, user.Id) 552 assert.NotNil(t, res.Err) 553 554 res = <-ss.Group().DeleteMember(group.Id, user.Id) 555 assert.Nil(t, res.Err) 556 557 res = <-ss.Group().GetMemberUsers(group.Id) 558 beforeRestoreCount := len(res.Data.([]*model.User)) 559 560 res = <-ss.Group().CreateOrRestoreMember(group.Id, user.Id) 561 assert.Nil(t, res.Err) 562 563 res = <-ss.Group().GetMemberUsers(group.Id) 564 afterRestoreCount := len(res.Data.([]*model.User)) 565 566 assert.Equal(t, beforeRestoreCount+1, afterRestoreCount) 567 } 568 569 func testGroupDeleteMember(t *testing.T, ss store.Store) { 570 // Create group 571 g1 := &model.Group{ 572 Name: model.NewId(), 573 DisplayName: model.NewId(), 574 Source: model.GroupSourceLdap, 575 RemoteId: model.NewId(), 576 } 577 res1 := <-ss.Group().Create(g1) 578 assert.Nil(t, res1.Err) 579 group := res1.Data.(*model.Group) 580 581 // Create user 582 u1 := &model.User{ 583 Email: MakeEmail(), 584 Username: model.NewId(), 585 } 586 res2 := <-ss.User().Save(u1) 587 assert.Nil(t, res2.Err) 588 user := res2.Data.(*model.User) 589 590 // Create member 591 res3 := <-ss.Group().CreateOrRestoreMember(group.Id, user.Id) 592 assert.Nil(t, res3.Err) 593 d1 := res3.Data.(*model.GroupMember) 594 595 // Happy path 596 res4 := <-ss.Group().DeleteMember(group.Id, user.Id) 597 assert.Nil(t, res4.Err) 598 d2 := res4.Data.(*model.GroupMember) 599 assert.Equal(t, d2.GroupId, group.Id) 600 assert.Equal(t, d2.UserId, user.Id) 601 assert.Equal(t, d2.CreateAt, d1.CreateAt) 602 assert.NotZero(t, d2.DeleteAt) 603 604 // Delete an already deleted member 605 res5 := <-ss.Group().DeleteMember(group.Id, user.Id) 606 assert.Equal(t, res5.Err.Id, "store.sql_group.no_rows") 607 608 // Delete with non-existent User 609 res8 := <-ss.Group().DeleteMember(group.Id, model.NewId()) 610 assert.Equal(t, res8.Err.Id, "store.sql_group.no_rows") 611 612 // Delete non-existent Group 613 res9 := <-ss.Group().DeleteMember(model.NewId(), group.Id) 614 assert.Equal(t, res9.Err.Id, "store.sql_group.no_rows") 615 } 616 617 func testCreateGroupSyncable(t *testing.T, ss store.Store) { 618 // Invalid GroupID 619 res2 := <-ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 620 GroupId: "x", 621 SyncableId: string(model.NewId()), 622 Type: model.GroupSyncableTypeTeam, 623 }) 624 assert.Equal(t, res2.Err.Id, "model.group_syncable.group_id.app_error") 625 626 // Create Group 627 g1 := &model.Group{ 628 Name: model.NewId(), 629 DisplayName: model.NewId(), 630 Source: model.GroupSourceLdap, 631 RemoteId: model.NewId(), 632 } 633 res4 := <-ss.Group().Create(g1) 634 assert.Nil(t, res4.Err) 635 group := res4.Data.(*model.Group) 636 637 // Create Team 638 t1 := &model.Team{ 639 DisplayName: "Name", 640 Description: "Some description", 641 CompanyName: "Some company name", 642 AllowOpenInvite: false, 643 InviteId: "inviteid0", 644 Name: "z-z-" + model.NewId() + "a", 645 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 646 Type: model.TEAM_OPEN, 647 } 648 res5 := <-ss.Team().Save(t1) 649 assert.Nil(t, res5.Err) 650 team := res5.Data.(*model.Team) 651 652 // New GroupSyncable, happy path 653 gt1 := &model.GroupSyncable{ 654 GroupId: group.Id, 655 AutoAdd: false, 656 SyncableId: string(team.Id), 657 Type: model.GroupSyncableTypeTeam, 658 } 659 res6 := <-ss.Group().CreateGroupSyncable(gt1) 660 assert.Nil(t, res6.Err) 661 d1 := res6.Data.(*model.GroupSyncable) 662 assert.Equal(t, gt1.SyncableId, d1.SyncableId) 663 assert.Equal(t, gt1.GroupId, d1.GroupId) 664 assert.Equal(t, gt1.AutoAdd, d1.AutoAdd) 665 assert.NotZero(t, d1.CreateAt) 666 assert.Zero(t, d1.DeleteAt) 667 } 668 669 func testGetGroupSyncable(t *testing.T, ss store.Store) { 670 // Create a group 671 g1 := &model.Group{ 672 Name: model.NewId(), 673 DisplayName: model.NewId(), 674 Description: model.NewId(), 675 Source: model.GroupSourceLdap, 676 RemoteId: model.NewId(), 677 } 678 res1 := <-ss.Group().Create(g1) 679 assert.Nil(t, res1.Err) 680 group := res1.Data.(*model.Group) 681 682 // Create Team 683 t1 := &model.Team{ 684 DisplayName: "Name", 685 Description: "Some description", 686 CompanyName: "Some company name", 687 AllowOpenInvite: false, 688 InviteId: "inviteid0", 689 Name: "z-z-" + model.NewId() + "a", 690 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 691 Type: model.TEAM_OPEN, 692 } 693 res2 := <-ss.Team().Save(t1) 694 assert.Nil(t, res2.Err) 695 team := res2.Data.(*model.Team) 696 697 // Create GroupSyncable 698 gt1 := &model.GroupSyncable{ 699 GroupId: group.Id, 700 AutoAdd: false, 701 SyncableId: string(team.Id), 702 Type: model.GroupSyncableTypeTeam, 703 } 704 res3 := <-ss.Group().CreateGroupSyncable(gt1) 705 assert.Nil(t, res3.Err) 706 groupTeam := res3.Data.(*model.GroupSyncable) 707 708 // Get GroupSyncable 709 res4 := <-ss.Group().GetGroupSyncable(groupTeam.GroupId, groupTeam.SyncableId, model.GroupSyncableTypeTeam) 710 assert.Nil(t, res4.Err) 711 dgt := res4.Data.(*model.GroupSyncable) 712 assert.Equal(t, gt1.GroupId, dgt.GroupId) 713 assert.Equal(t, gt1.SyncableId, dgt.SyncableId) 714 assert.Equal(t, gt1.AutoAdd, dgt.AutoAdd) 715 assert.NotZero(t, gt1.CreateAt) 716 assert.NotZero(t, gt1.UpdateAt) 717 assert.Zero(t, gt1.DeleteAt) 718 } 719 720 func testGetAllGroupSyncablesByGroup(t *testing.T, ss store.Store) { 721 numGroupSyncables := 10 722 723 // Create group 724 g := &model.Group{ 725 Name: model.NewId(), 726 DisplayName: model.NewId(), 727 Description: model.NewId(), 728 Source: model.GroupSourceLdap, 729 RemoteId: model.NewId(), 730 } 731 res1 := <-ss.Group().Create(g) 732 assert.Nil(t, res1.Err) 733 group := res1.Data.(*model.Group) 734 735 groupTeams := []*model.GroupSyncable{} 736 737 // Create groupTeams 738 for i := 0; i < numGroupSyncables; i++ { 739 // Create Team 740 t1 := &model.Team{ 741 DisplayName: "Name", 742 Description: "Some description", 743 CompanyName: "Some company name", 744 AllowOpenInvite: false, 745 InviteId: "inviteid0", 746 Name: "z-z-" + model.NewId() + "a", 747 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 748 Type: model.TEAM_OPEN, 749 } 750 res2 := <-ss.Team().Save(t1) 751 assert.Nil(t, res2.Err) 752 team := res2.Data.(*model.Team) 753 754 // create groupteam 755 res3 := <-ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 756 GroupId: group.Id, 757 SyncableId: string(team.Id), 758 Type: model.GroupSyncableTypeTeam, 759 }) 760 assert.Nil(t, res3.Err) 761 groupTeam := res3.Data.(*model.GroupSyncable) 762 groupTeams = append(groupTeams, groupTeam) 763 } 764 765 // Returns all the group teams 766 res4 := <-ss.Group().GetAllGroupSyncablesByGroupId(group.Id, model.GroupSyncableTypeTeam) 767 d1 := res4.Data.([]*model.GroupSyncable) 768 assert.Condition(t, func() bool { return len(d1) >= numGroupSyncables }) 769 for _, expectedGroupTeam := range groupTeams { 770 present := false 771 for _, dbGroupTeam := range d1 { 772 if dbGroupTeam.GroupId == expectedGroupTeam.GroupId && dbGroupTeam.SyncableId == expectedGroupTeam.SyncableId { 773 present = true 774 break 775 } 776 } 777 assert.True(t, present) 778 } 779 } 780 781 func testUpdateGroupSyncable(t *testing.T, ss store.Store) { 782 // Create Group 783 g1 := &model.Group{ 784 Name: model.NewId(), 785 DisplayName: model.NewId(), 786 Source: model.GroupSourceLdap, 787 RemoteId: model.NewId(), 788 } 789 res4 := <-ss.Group().Create(g1) 790 assert.Nil(t, res4.Err) 791 group := res4.Data.(*model.Group) 792 793 // Create Team 794 t1 := &model.Team{ 795 DisplayName: "Name", 796 Description: "Some description", 797 CompanyName: "Some company name", 798 AllowOpenInvite: false, 799 InviteId: "inviteid0", 800 Name: "z-z-" + model.NewId() + "a", 801 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 802 Type: model.TEAM_OPEN, 803 } 804 res5 := <-ss.Team().Save(t1) 805 assert.Nil(t, res5.Err) 806 team := res5.Data.(*model.Team) 807 808 // New GroupSyncable, happy path 809 gt1 := &model.GroupSyncable{ 810 GroupId: group.Id, 811 AutoAdd: false, 812 SyncableId: string(team.Id), 813 Type: model.GroupSyncableTypeTeam, 814 } 815 res6 := <-ss.Group().CreateGroupSyncable(gt1) 816 assert.Nil(t, res6.Err) 817 d1 := res6.Data.(*model.GroupSyncable) 818 819 // Update existing group team 820 gt1.AutoAdd = true 821 res7 := <-ss.Group().UpdateGroupSyncable(gt1) 822 assert.Nil(t, res7.Err) 823 d2 := res7.Data.(*model.GroupSyncable) 824 assert.True(t, d2.AutoAdd) 825 826 // Non-existent Group 827 gt2 := &model.GroupSyncable{ 828 GroupId: model.NewId(), 829 AutoAdd: false, 830 SyncableId: string(team.Id), 831 Type: model.GroupSyncableTypeTeam, 832 } 833 res9 := <-ss.Group().UpdateGroupSyncable(gt2) 834 assert.Equal(t, res9.Err.Id, "store.sql_group.no_rows") 835 836 // Non-existent Team 837 gt3 := &model.GroupSyncable{ 838 GroupId: group.Id, 839 AutoAdd: false, 840 SyncableId: string(model.NewId()), 841 Type: model.GroupSyncableTypeTeam, 842 } 843 res10 := <-ss.Group().UpdateGroupSyncable(gt3) 844 assert.Equal(t, res10.Err.Id, "store.sql_group.no_rows") 845 846 // Cannot update CreateAt or DeleteAt 847 origCreateAt := d1.CreateAt 848 d1.CreateAt = model.GetMillis() 849 d1.AutoAdd = true 850 res11 := <-ss.Group().UpdateGroupSyncable(d1) 851 assert.Nil(t, res11.Err) 852 d3 := res11.Data.(*model.GroupSyncable) 853 assert.Equal(t, origCreateAt, d3.CreateAt) 854 855 // Cannot update DeleteAt to arbitrary value 856 d1.DeleteAt = 1 857 res12 := <-ss.Group().UpdateGroupSyncable(d1) 858 assert.Equal(t, "model.group.delete_at.app_error", res12.Err.Id) 859 860 // Can update DeleteAt to 0 861 d1.DeleteAt = 0 862 res13 := <-ss.Group().UpdateGroupSyncable(d1) 863 assert.Nil(t, res13.Err) 864 d4 := res13.Data.(*model.GroupSyncable) 865 assert.Zero(t, d4.DeleteAt) 866 } 867 868 func testDeleteGroupSyncable(t *testing.T, ss store.Store) { 869 // Create Group 870 g1 := &model.Group{ 871 Name: model.NewId(), 872 DisplayName: model.NewId(), 873 Source: model.GroupSourceLdap, 874 RemoteId: model.NewId(), 875 } 876 res1 := <-ss.Group().Create(g1) 877 assert.Nil(t, res1.Err) 878 group := res1.Data.(*model.Group) 879 880 // Create Team 881 t1 := &model.Team{ 882 DisplayName: "Name", 883 Description: "Some description", 884 CompanyName: "Some company name", 885 AllowOpenInvite: false, 886 InviteId: "inviteid0", 887 Name: "z-z-" + model.NewId() + "a", 888 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 889 Type: model.TEAM_OPEN, 890 } 891 res2 := <-ss.Team().Save(t1) 892 assert.Nil(t, res2.Err) 893 team := res2.Data.(*model.Team) 894 895 // Create GroupSyncable 896 gt1 := &model.GroupSyncable{ 897 GroupId: group.Id, 898 AutoAdd: false, 899 SyncableId: string(team.Id), 900 Type: model.GroupSyncableTypeTeam, 901 } 902 res7 := <-ss.Group().CreateGroupSyncable(gt1) 903 assert.Nil(t, res7.Err) 904 groupTeam := res7.Data.(*model.GroupSyncable) 905 906 // Non-existent Group 907 res5 := <-ss.Group().DeleteGroupSyncable(model.NewId(), groupTeam.SyncableId, model.GroupSyncableTypeTeam) 908 assert.Equal(t, res5.Err.Id, "store.sql_group.no_rows") 909 910 // Non-existent Team 911 res6 := <-ss.Group().DeleteGroupSyncable(groupTeam.GroupId, string(model.NewId()), model.GroupSyncableTypeTeam) 912 assert.Equal(t, res6.Err.Id, "store.sql_group.no_rows") 913 914 // Happy path... 915 res8 := <-ss.Group().DeleteGroupSyncable(groupTeam.GroupId, groupTeam.SyncableId, model.GroupSyncableTypeTeam) 916 assert.Nil(t, res8.Err) 917 d1 := res8.Data.(*model.GroupSyncable) 918 assert.NotZero(t, d1.DeleteAt) 919 assert.Equal(t, d1.GroupId, groupTeam.GroupId) 920 assert.Equal(t, d1.SyncableId, groupTeam.SyncableId) 921 assert.Equal(t, d1.AutoAdd, groupTeam.AutoAdd) 922 assert.Equal(t, d1.CreateAt, groupTeam.CreateAt) 923 assert.Condition(t, func() bool { return d1.UpdateAt > groupTeam.UpdateAt }) 924 925 // Record already deleted 926 res9 := <-ss.Group().DeleteGroupSyncable(d1.GroupId, d1.SyncableId, d1.Type) 927 assert.NotNil(t, res9.Err) 928 assert.Equal(t, res9.Err.Id, "store.sql_group.group_syncable_already_deleted") 929 } 930 931 func testPendingAutoAddTeamMembers(t *testing.T, ss store.Store) { 932 // Create Group 933 res := <-ss.Group().Create(&model.Group{ 934 Name: model.NewId(), 935 DisplayName: "PendingAutoAddTeamMembers Test Group", 936 RemoteId: model.NewId(), 937 Source: model.GroupSourceLdap, 938 }) 939 assert.Nil(t, res.Err) 940 group := res.Data.(*model.Group) 941 942 // Create User 943 user := &model.User{ 944 Email: MakeEmail(), 945 Username: model.NewId(), 946 } 947 res = <-ss.User().Save(user) 948 assert.Nil(t, res.Err) 949 user = res.Data.(*model.User) 950 951 // Create GroupMember 952 res = <-ss.Group().CreateOrRestoreMember(group.Id, user.Id) 953 assert.Nil(t, res.Err) 954 955 // Create Team 956 team := &model.Team{ 957 DisplayName: "Name", 958 Description: "Some description", 959 CompanyName: "Some company name", 960 AllowOpenInvite: false, 961 InviteId: "inviteid0", 962 Name: "z-z-" + model.NewId() + "a", 963 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 964 Type: model.TEAM_OPEN, 965 } 966 res = <-ss.Team().Save(team) 967 assert.Nil(t, res.Err) 968 team = res.Data.(*model.Team) 969 970 // Create GroupTeam 971 res = <-ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 972 AutoAdd: true, 973 SyncableId: team.Id, 974 Type: model.GroupSyncableTypeTeam, 975 GroupId: group.Id, 976 }) 977 assert.Nil(t, res.Err) 978 syncable := res.Data.(*model.GroupSyncable) 979 980 // Time before syncable was created 981 res = <-ss.Group().PendingAutoAddTeamMembers(syncable.CreateAt - 1) 982 assert.Nil(t, res.Err) 983 userTeamIDs := res.Data.([]*model.UserTeamIDPair) 984 assert.Len(t, userTeamIDs, 1) 985 assert.Equal(t, user.Id, userTeamIDs[0].UserID) 986 assert.Equal(t, team.Id, userTeamIDs[0].TeamID) 987 988 // Time after syncable was created 989 res = <-ss.Group().PendingAutoAddTeamMembers(syncable.CreateAt + 1) 990 assert.Nil(t, res.Err) 991 assert.Len(t, res.Data, 0) 992 993 // Delete and restore GroupMember should return result 994 res = <-ss.Group().DeleteMember(group.Id, user.Id) 995 assert.Nil(t, res.Err) 996 res = <-ss.Group().CreateOrRestoreMember(group.Id, user.Id) 997 assert.Nil(t, res.Err) 998 res = <-ss.Group().PendingAutoAddTeamMembers(syncable.CreateAt + 1) 999 assert.Nil(t, res.Err) 1000 assert.Len(t, res.Data, 1) 1001 1002 pristineSyncable := *syncable 1003 1004 res = <-ss.Group().UpdateGroupSyncable(syncable) 1005 assert.Nil(t, res.Err) 1006 1007 // Time before syncable was updated 1008 res = <-ss.Group().PendingAutoAddTeamMembers(syncable.UpdateAt - 1) 1009 assert.Nil(t, res.Err) 1010 userTeamIDs = res.Data.([]*model.UserTeamIDPair) 1011 assert.Len(t, userTeamIDs, 1) 1012 assert.Equal(t, user.Id, userTeamIDs[0].UserID) 1013 assert.Equal(t, team.Id, userTeamIDs[0].TeamID) 1014 1015 // Time after syncable was updated 1016 res = <-ss.Group().PendingAutoAddTeamMembers(syncable.UpdateAt + 1) 1017 assert.Nil(t, res.Err) 1018 assert.Len(t, res.Data, 0) 1019 1020 // Only includes if auto-add 1021 syncable.AutoAdd = false 1022 res = <-ss.Group().UpdateGroupSyncable(syncable) 1023 assert.Nil(t, res.Err) 1024 res = <-ss.Group().PendingAutoAddTeamMembers(0) 1025 assert.Nil(t, res.Err) 1026 assert.Len(t, res.Data, 0) 1027 1028 // reset state of syncable and verify 1029 res = <-ss.Group().UpdateGroupSyncable(&pristineSyncable) 1030 assert.Nil(t, res.Err) 1031 res = <-ss.Group().PendingAutoAddTeamMembers(0) 1032 assert.Nil(t, res.Err) 1033 assert.Len(t, res.Data, 1) 1034 1035 // No result if Group deleted 1036 res = <-ss.Group().Delete(group.Id) 1037 assert.Nil(t, res.Err) 1038 res = <-ss.Group().PendingAutoAddTeamMembers(0) 1039 assert.Nil(t, res.Err) 1040 assert.Len(t, res.Data, 0) 1041 1042 // reset state of group and verify 1043 group.DeleteAt = 0 1044 res = <-ss.Group().Update(group) 1045 res = <-ss.Group().PendingAutoAddTeamMembers(0) 1046 assert.Nil(t, res.Err) 1047 assert.Len(t, res.Data, 1) 1048 1049 // No result if Team deleted 1050 team.DeleteAt = model.GetMillis() 1051 res = <-ss.Team().Update(team) 1052 assert.Nil(t, res.Err) 1053 res = <-ss.Group().PendingAutoAddTeamMembers(0) 1054 assert.Nil(t, res.Err) 1055 assert.Len(t, res.Data, 0) 1056 1057 // reset state of team and verify 1058 team.DeleteAt = 0 1059 res = <-ss.Team().Update(team) 1060 assert.Nil(t, res.Err) 1061 res = <-ss.Group().PendingAutoAddTeamMembers(0) 1062 assert.Nil(t, res.Err) 1063 assert.Len(t, res.Data, 1) 1064 1065 // No result if GroupTeam deleted 1066 res = <-ss.Group().DeleteGroupSyncable(group.Id, team.Id, model.GroupSyncableTypeTeam) 1067 assert.Nil(t, res.Err) 1068 res = <-ss.Group().PendingAutoAddTeamMembers(0) 1069 assert.Nil(t, res.Err) 1070 assert.Len(t, res.Data, 0) 1071 1072 // reset GroupTeam and verify 1073 res = <-ss.Group().UpdateGroupSyncable(&pristineSyncable) 1074 assert.Nil(t, res.Err) 1075 res = <-ss.Group().PendingAutoAddTeamMembers(0) 1076 assert.Nil(t, res.Err) 1077 assert.Len(t, res.Data, 1) 1078 1079 // No result if GroupMember deleted 1080 res = <-ss.Group().DeleteMember(group.Id, user.Id) 1081 assert.Nil(t, res.Err) 1082 res = <-ss.Group().PendingAutoAddTeamMembers(0) 1083 assert.Nil(t, res.Err) 1084 assert.Len(t, res.Data, 0) 1085 1086 // restore group member and verify 1087 res = <-ss.Group().CreateOrRestoreMember(group.Id, user.Id) 1088 res = <-ss.Group().PendingAutoAddTeamMembers(0) 1089 assert.Nil(t, res.Err) 1090 assert.Len(t, res.Data, 1) 1091 1092 // adding team membership stops returning result 1093 res = <-ss.Team().SaveMember(&model.TeamMember{ 1094 TeamId: team.Id, 1095 UserId: user.Id, 1096 }, 999) 1097 assert.Nil(t, res.Err) 1098 res = <-ss.Group().PendingAutoAddTeamMembers(0) 1099 assert.Nil(t, res.Err) 1100 assert.Len(t, res.Data, 0) 1101 } 1102 1103 func testPendingAutoAddChannelMembers(t *testing.T, ss store.Store) { 1104 // Create Group 1105 res := <-ss.Group().Create(&model.Group{ 1106 Name: model.NewId(), 1107 DisplayName: "PendingAutoAddChannelMembers Test Group", 1108 RemoteId: model.NewId(), 1109 Source: model.GroupSourceLdap, 1110 }) 1111 assert.Nil(t, res.Err) 1112 group := res.Data.(*model.Group) 1113 1114 // Create User 1115 user := &model.User{ 1116 Email: MakeEmail(), 1117 Username: model.NewId(), 1118 } 1119 res = <-ss.User().Save(user) 1120 assert.Nil(t, res.Err) 1121 user = res.Data.(*model.User) 1122 1123 // Create GroupMember 1124 res = <-ss.Group().CreateOrRestoreMember(group.Id, user.Id) 1125 assert.Nil(t, res.Err) 1126 1127 // Create Channel 1128 channel := &model.Channel{ 1129 TeamId: model.NewId(), 1130 DisplayName: "A Name", 1131 Name: model.NewId(), 1132 Type: model.CHANNEL_OPEN, // Query does not look at type so this shouldn't matter. 1133 } 1134 res = <-ss.Channel().Save(channel, 9999) 1135 assert.Nil(t, res.Err) 1136 channel = res.Data.(*model.Channel) 1137 1138 // Create GroupChannel 1139 res = <-ss.Group().CreateGroupSyncable(&model.GroupSyncable{ 1140 AutoAdd: true, 1141 SyncableId: channel.Id, 1142 Type: model.GroupSyncableTypeChannel, 1143 GroupId: group.Id, 1144 }) 1145 assert.Nil(t, res.Err) 1146 syncable := res.Data.(*model.GroupSyncable) 1147 1148 // Time before syncable was created 1149 res = <-ss.Group().PendingAutoAddChannelMembers(syncable.CreateAt - 1) 1150 assert.Nil(t, res.Err) 1151 userChannelIDs := res.Data.([]*model.UserChannelIDPair) 1152 assert.Len(t, userChannelIDs, 1) 1153 assert.Equal(t, user.Id, userChannelIDs[0].UserID) 1154 assert.Equal(t, channel.Id, userChannelIDs[0].ChannelID) 1155 1156 // Time after syncable was created 1157 res = <-ss.Group().PendingAutoAddChannelMembers(syncable.CreateAt + 1) 1158 assert.Nil(t, res.Err) 1159 assert.Len(t, res.Data, 0) 1160 1161 // Delete and restore GroupMember should return result 1162 res = <-ss.Group().DeleteMember(group.Id, user.Id) 1163 assert.Nil(t, res.Err) 1164 res = <-ss.Group().CreateOrRestoreMember(group.Id, user.Id) 1165 assert.Nil(t, res.Err) 1166 res = <-ss.Group().PendingAutoAddChannelMembers(syncable.CreateAt + 1) 1167 assert.Nil(t, res.Err) 1168 assert.Len(t, res.Data, 1) 1169 1170 pristineSyncable := *syncable 1171 1172 res = <-ss.Group().UpdateGroupSyncable(syncable) 1173 assert.Nil(t, res.Err) 1174 1175 // Time before syncable was updated 1176 res = <-ss.Group().PendingAutoAddChannelMembers(syncable.UpdateAt - 1) 1177 assert.Nil(t, res.Err) 1178 userChannelIDs = res.Data.([]*model.UserChannelIDPair) 1179 assert.Len(t, userChannelIDs, 1) 1180 assert.Equal(t, user.Id, userChannelIDs[0].UserID) 1181 assert.Equal(t, channel.Id, userChannelIDs[0].ChannelID) 1182 1183 // Time after syncable was updated 1184 res = <-ss.Group().PendingAutoAddChannelMembers(syncable.UpdateAt + 1) 1185 assert.Nil(t, res.Err) 1186 assert.Len(t, res.Data, 0) 1187 1188 // Only includes if auto-add 1189 syncable.AutoAdd = false 1190 res = <-ss.Group().UpdateGroupSyncable(syncable) 1191 assert.Nil(t, res.Err) 1192 res = <-ss.Group().PendingAutoAddChannelMembers(0) 1193 assert.Nil(t, res.Err) 1194 assert.Len(t, res.Data, 0) 1195 1196 // reset state of syncable and verify 1197 res = <-ss.Group().UpdateGroupSyncable(&pristineSyncable) 1198 assert.Nil(t, res.Err) 1199 res = <-ss.Group().PendingAutoAddChannelMembers(0) 1200 assert.Nil(t, res.Err) 1201 assert.Len(t, res.Data, 1) 1202 1203 // No result if Group deleted 1204 res = <-ss.Group().Delete(group.Id) 1205 assert.Nil(t, res.Err) 1206 res = <-ss.Group().PendingAutoAddChannelMembers(0) 1207 assert.Nil(t, res.Err) 1208 assert.Len(t, res.Data, 0) 1209 1210 // reset state of group and verify 1211 group.DeleteAt = 0 1212 res = <-ss.Group().Update(group) 1213 res = <-ss.Group().PendingAutoAddChannelMembers(0) 1214 assert.Nil(t, res.Err) 1215 assert.Len(t, res.Data, 1) 1216 1217 // No result if Channel deleted 1218 res = <-ss.Channel().Delete(channel.Id, model.GetMillis()) 1219 assert.Nil(t, res.Err) 1220 res = <-ss.Group().PendingAutoAddChannelMembers(0) 1221 assert.Nil(t, res.Err) 1222 assert.Len(t, res.Data, 0) 1223 1224 // reset state of channel and verify 1225 channel.DeleteAt = 0 1226 res = <-ss.Channel().Update(channel) 1227 assert.Nil(t, res.Err) 1228 res = <-ss.Group().PendingAutoAddChannelMembers(0) 1229 assert.Nil(t, res.Err) 1230 assert.Len(t, res.Data, 1) 1231 1232 // No result if GroupChannel deleted 1233 res = <-ss.Group().DeleteGroupSyncable(group.Id, channel.Id, model.GroupSyncableTypeChannel) 1234 assert.Nil(t, res.Err) 1235 res = <-ss.Group().PendingAutoAddChannelMembers(0) 1236 assert.Nil(t, res.Err) 1237 assert.Len(t, res.Data, 0) 1238 1239 // reset GroupChannel and verify 1240 res = <-ss.Group().UpdateGroupSyncable(&pristineSyncable) 1241 assert.Nil(t, res.Err) 1242 res = <-ss.Group().PendingAutoAddChannelMembers(0) 1243 assert.Nil(t, res.Err) 1244 assert.Len(t, res.Data, 1) 1245 1246 // No result if GroupMember deleted 1247 res = <-ss.Group().DeleteMember(group.Id, user.Id) 1248 assert.Nil(t, res.Err) 1249 res = <-ss.Group().PendingAutoAddChannelMembers(0) 1250 assert.Nil(t, res.Err) 1251 assert.Len(t, res.Data, 0) 1252 1253 // restore group member and verify 1254 res = <-ss.Group().CreateOrRestoreMember(group.Id, user.Id) 1255 assert.Nil(t, res.Err) 1256 res = <-ss.Group().PendingAutoAddChannelMembers(0) 1257 assert.Nil(t, res.Err) 1258 assert.Len(t, res.Data, 1) 1259 1260 // Adding Channel (ChannelMemberHistory) should stop returning result 1261 res = <-ss.ChannelMemberHistory().LogJoinEvent(user.Id, channel.Id, model.GetMillis()) 1262 assert.Nil(t, res.Err) 1263 res = <-ss.Group().PendingAutoAddChannelMembers(0) 1264 assert.Nil(t, res.Err) 1265 assert.Len(t, res.Data, 0) 1266 1267 // Leaving Channel (ChannelMemberHistory) should still not return result 1268 res = <-ss.ChannelMemberHistory().LogLeaveEvent(user.Id, channel.Id, model.GetMillis()) 1269 assert.Nil(t, res.Err) 1270 res = <-ss.Group().PendingAutoAddChannelMembers(0) 1271 assert.Nil(t, res.Err) 1272 assert.Len(t, res.Data, 0) 1273 1274 // Purging ChannelMemberHistory re-returns the result 1275 res = <-ss.ChannelMemberHistory().PermanentDeleteBatch(model.GetMillis()+1, 100) 1276 assert.Nil(t, res.Err) 1277 res = <-ss.Group().PendingAutoAddChannelMembers(0) 1278 assert.Nil(t, res.Err) 1279 assert.Len(t, res.Data, 1) 1280 }