github.com/status-im/status-go@v1.1.0/protocol/communities_events_utils_test.go (about) 1 package protocol 2 3 import ( 4 "context" 5 "errors" 6 "math/big" 7 8 "github.com/stretchr/testify/suite" 9 "go.uber.org/zap" 10 11 gethcommon "github.com/ethereum/go-ethereum/common" 12 hexutil "github.com/ethereum/go-ethereum/common/hexutil" 13 14 "github.com/status-im/status-go/eth-node/types" 15 "github.com/status-im/status-go/protocol/common" 16 "github.com/status-im/status-go/protocol/communities" 17 "github.com/status-im/status-go/protocol/communities/token" 18 "github.com/status-im/status-go/protocol/protobuf" 19 "github.com/status-im/status-go/protocol/requests" 20 "github.com/status-im/status-go/protocol/tt" 21 "github.com/status-im/status-go/services/wallet/bigint" 22 ) 23 24 type CommunityEventsTestsInterface interface { 25 GetControlNode() *Messenger 26 GetEventSender() *Messenger 27 GetMember() *Messenger 28 GetSuite() *suite.Suite 29 GetCollectiblesServiceMock() *CollectiblesServiceMock 30 SetupAdditionalMessengers([]*Messenger) 31 GetAccountsTestData() map[string][]string 32 GetAccountsPasswords() map[string]string 33 } 34 35 const communitiesEventsTestTokenAddress = "0x0400000000000000000000000000000000000000" 36 const aliceAccountAddress = "0x0777100000000000000000000000000000000000" 37 const bobAccountAddress = "0x0330000000000000000000000000000000000000" 38 const eventsSenderAccountAddress = "0x0200000000000000000000000000000000000000" 39 const accountPassword = "qwerty" 40 const commonAccountAddress = "0x0890000000000000000000000000000000000000" 41 42 type MessageResponseValidator func(*MessengerResponse) error 43 44 func WaitMessageCondition(response *MessengerResponse) bool { 45 return len(response.Messages()) > 0 46 } 47 48 func waitOnMessengerResponse(s *suite.Suite, fnWait MessageResponseValidator, user *Messenger) { 49 _, err := WaitOnMessengerResponse( 50 user, 51 func(r *MessengerResponse) bool { 52 err := fnWait(r) 53 if err != nil { 54 user.logger.Error("response error: ", zap.Error(err)) 55 } 56 return err == nil 57 }, 58 "MessengerResponse data not received", 59 ) 60 s.Require().NoError(err) 61 } 62 63 func checkClientsReceivedAdminEvent(base CommunityEventsTestsInterface, fn MessageResponseValidator) { 64 s := base.GetSuite() 65 // Wait and verify Member received community event 66 waitOnMessengerResponse(s, fn, base.GetMember()) 67 // Wait and verify event sender received his own event 68 waitOnMessengerResponse(s, fn, base.GetEventSender()) 69 // Wait and verify ControlNode received community event 70 // ControlNode will publish CommunityDescription update 71 waitOnMessengerResponse(s, fn, base.GetControlNode()) 72 // Wait and verify Member received the ControlNode CommunityDescription update 73 waitOnMessengerResponse(s, fn, base.GetMember()) 74 // Wait and verify event sender received the ControlNode CommunityDescription update 75 waitOnMessengerResponse(s, fn, base.GetEventSender()) 76 // Wait and verify ControlNode received his own CommunityDescription update 77 waitOnMessengerResponse(s, fn, base.GetControlNode()) 78 } 79 80 func refreshMessengerResponses(base CommunityEventsTestsInterface) { 81 _, err := WaitOnMessengerResponse(base.GetControlNode(), func(response *MessengerResponse) bool { 82 return true 83 }, "community description changed message not received") 84 base.GetSuite().Require().NoError(err) 85 86 _, err = WaitOnMessengerResponse(base.GetEventSender(), func(response *MessengerResponse) bool { 87 return true 88 }, "community description changed message not received") 89 base.GetSuite().Require().NoError(err) 90 91 _, err = WaitOnMessengerResponse(base.GetMember(), func(response *MessengerResponse) bool { 92 return true 93 }, "community description changed message not received") 94 base.GetSuite().Require().NoError(err) 95 } 96 97 func createMockedWalletBalance(s *suite.Suite) map[uint64]map[gethcommon.Address]map[gethcommon.Address]*hexutil.Big { 98 eventSenderAddress := gethcommon.HexToAddress(eventsSenderAccountAddress) 99 100 mockedBalances := make(map[uint64]map[gethcommon.Address]map[gethcommon.Address]*hexutil.Big) 101 mockedBalances[testChainID1] = make(map[gethcommon.Address]map[gethcommon.Address]*hexutil.Big) 102 mockedBalances[testChainID1][eventSenderAddress] = make(map[gethcommon.Address]*hexutil.Big) 103 104 // event sender will have token with `communitiesEventsTestTokenAddress`` 105 contractAddress := gethcommon.HexToAddress(communitiesEventsTestTokenAddress) 106 balance, ok := new(big.Int).SetString("200", 10) 107 s.Require().True(ok) 108 decimalsFactor := new(big.Int).Exp(big.NewInt(10), big.NewInt(int64(18)), nil) 109 balance.Mul(balance, decimalsFactor) 110 111 mockedBalances[testChainID1][eventSenderAddress][contractAddress] = (*hexutil.Big)(balance) 112 return mockedBalances 113 } 114 115 func setUpCommunityAndRoles(base CommunityEventsTestsInterface, role protobuf.CommunityMember_Roles) *communities.Community { 116 tcs2, err := base.GetControlNode().communitiesManager.All() 117 suite := base.GetSuite() 118 suite.Require().NoError(err, "eventSender.communitiesManager.All") 119 suite.Len(tcs2, 0, "Must have 0 community") 120 121 // ControlNode creates a community and chat 122 community := createTestCommunity(base, protobuf.CommunityPermissions_AUTO_ACCEPT) 123 refreshMessengerResponses(base) 124 125 // add events sender and member to the community 126 advertiseCommunityToUserOldWay(suite, community, base.GetControlNode(), base.GetEventSender()) 127 advertiseCommunityToUserOldWay(suite, community, base.GetControlNode(), base.GetMember()) 128 129 joinCommunity(suite, community.ID(), base.GetControlNode(), base.GetEventSender(), accountPassword, []string{eventsSenderAccountAddress}) 130 refreshMessengerResponses(base) 131 132 joinCommunity(suite, community.ID(), base.GetControlNode(), base.GetMember(), accountPassword, []string{aliceAccountAddress}) 133 refreshMessengerResponses(base) 134 135 // grant permissions to the event sender 136 grantPermission(suite, community, base.GetControlNode(), base.GetEventSender(), role) 137 refreshMessengerResponses(base) 138 139 return community 140 } 141 142 func createTestCommunity(base CommunityEventsTestsInterface, membershipType protobuf.CommunityPermissions_Access) *communities.Community { 143 description := &requests.CreateCommunity{ 144 Membership: membershipType, 145 Name: "status", 146 Color: "#ffffff", 147 Description: "status community description", 148 PinMessageAllMembersEnabled: false, 149 } 150 response, err := base.GetControlNode().CreateCommunity(description, true) 151 152 suite := base.GetSuite() 153 suite.Require().NoError(err) 154 suite.Require().NotNil(response) 155 suite.Require().Len(response.Communities(), 1) 156 suite.Require().Len(response.Chats(), 1) 157 158 return response.Communities()[0] 159 } 160 161 func getModifiedCommunity(response *MessengerResponse, communityID string) (*communities.Community, error) { 162 if len(response.Communities()) == 0 { 163 return nil, errors.New("community not received") 164 } 165 166 var modifiedCommmunity *communities.Community = nil 167 for _, c := range response.Communities() { 168 if c.IDString() == communityID { 169 modifiedCommmunity = c 170 } 171 } 172 173 if modifiedCommmunity == nil { 174 return nil, errors.New("couldn't find community in response") 175 } 176 177 return modifiedCommmunity, nil 178 } 179 180 func createCommunityChannel(base CommunityEventsTestsInterface, community *communities.Community, newChannel *protobuf.CommunityChat) string { 181 checkChannelCreated := func(response *MessengerResponse) error { 182 modifiedCommmunity, err := getModifiedCommunity(response, community.IDString()) 183 if err != nil { 184 return err 185 } 186 187 for _, chat := range modifiedCommmunity.Chats() { 188 if chat.GetIdentity().GetDisplayName() == newChannel.GetIdentity().GetDisplayName() { 189 return nil 190 } 191 } 192 193 return errors.New("couldn't find created chat in response") 194 } 195 196 response, err := base.GetEventSender().CreateCommunityChat(community.ID(), newChannel) 197 s := base.GetSuite() 198 s.Require().NoError(err) 199 s.Require().NoError(checkChannelCreated(response)) 200 s.Require().Len(response.CommunityChanges, 1) 201 s.Require().Len(response.CommunityChanges[0].ChatsAdded, 1) 202 var addedChatID string 203 for addedChatID = range response.CommunityChanges[0].ChatsAdded { 204 break 205 } 206 207 checkClientsReceivedAdminEvent(base, checkChannelCreated) 208 209 return addedChatID 210 } 211 212 func editCommunityChannel(base CommunityEventsTestsInterface, community *communities.Community, editChannel *protobuf.CommunityChat, channelID string) { 213 checkChannelEdited := func(response *MessengerResponse) error { 214 modifiedCommmunity, err := getModifiedCommunity(response, community.IDString()) 215 if err != nil { 216 return err 217 } 218 219 for _, chat := range modifiedCommmunity.Chats() { 220 if chat.GetIdentity().GetDisplayName() == editChannel.GetIdentity().GetDisplayName() { 221 return nil 222 } 223 } 224 225 return errors.New("couldn't find modified chat in response") 226 } 227 228 response, err := base.GetEventSender().EditCommunityChat(community.ID(), channelID, editChannel) 229 s := base.GetSuite() 230 s.Require().NoError(err) 231 s.Require().NoError(checkChannelEdited(response)) 232 233 checkClientsReceivedAdminEvent(base, checkChannelEdited) 234 } 235 236 func deleteCommunityChannel(base CommunityEventsTestsInterface, community *communities.Community, channelID string) { 237 checkChannelDeleted := func(response *MessengerResponse) error { 238 modifiedCommmunity, err := getModifiedCommunity(response, community.IDString()) 239 if err != nil { 240 return err 241 } 242 243 if _, exists := modifiedCommmunity.Chats()[channelID]; exists { 244 return errors.New("channel was not deleted") 245 } 246 247 return nil 248 } 249 250 response, err := base.GetEventSender().DeleteCommunityChat(community.ID(), channelID) 251 s := base.GetSuite() 252 s.Require().NoError(err) 253 s.Require().NoError(checkChannelDeleted(response)) 254 255 checkClientsReceivedAdminEvent(base, checkChannelDeleted) 256 } 257 258 func createTestPermissionRequest(community *communities.Community, pType protobuf.CommunityTokenPermission_Type) *requests.CreateCommunityTokenPermission { 259 return &requests.CreateCommunityTokenPermission{ 260 CommunityID: community.ID(), 261 Type: pType, 262 TokenCriteria: []*protobuf.TokenCriteria{ 263 { 264 Type: protobuf.CommunityTokenType_ERC20, 265 ContractAddresses: map[uint64]string{uint64(testChainID1): communitiesEventsTestTokenAddress}, 266 Symbol: "TEST", 267 AmountInWei: "100000000000000000000", 268 Decimals: uint64(18), 269 }, 270 }, 271 } 272 } 273 274 func createTokenPermission(base CommunityEventsTestsInterface, community *communities.Community, request *requests.CreateCommunityTokenPermission) (string, *requests.CreateCommunityTokenPermission) { 275 response, err := base.GetEventSender().CreateCommunityTokenPermission(request) 276 s := base.GetSuite() 277 s.Require().NoError(err) 278 s.Require().Len(response.CommunityChanges, 1) 279 s.Require().Len(response.CommunityChanges[0].TokenPermissionsAdded, 1) 280 281 addedPermission := func() *communities.CommunityTokenPermission { 282 for _, permission := range response.CommunityChanges[0].TokenPermissionsAdded { 283 return permission 284 } 285 return nil 286 }() 287 s.Require().NotNil(addedPermission) 288 // Permission added by event must be in pending state 289 s.Require().Equal(communities.TokenPermissionAdditionPending, addedPermission.State) 290 291 responseHasApprovedTokenPermission := func(r *MessengerResponse) bool { 292 if len(r.Communities()) == 0 { 293 return false 294 } 295 296 receivedPermission := r.Communities()[0].TokenPermissionByID(addedPermission.Id) 297 return receivedPermission != nil && receivedPermission.State == communities.TokenPermissionApproved 298 } 299 300 // Control node receives community event & approves it 301 _, err = WaitOnMessengerResponse(base.GetControlNode(), responseHasApprovedTokenPermission, "community with approved permission not found") 302 s.Require().NoError(err) 303 304 // Member receives updated community description 305 _, err = WaitOnMessengerResponse(base.GetMember(), responseHasApprovedTokenPermission, "community with approved permission not found") 306 s.Require().NoError(err) 307 308 // EventSender receives updated community description 309 _, err = WaitOnMessengerResponse(base.GetEventSender(), responseHasApprovedTokenPermission, "community with approved permission not found") 310 s.Require().NoError(err) 311 312 return addedPermission.Id, request 313 } 314 315 func createTestTokenPermission(base CommunityEventsTestsInterface, community *communities.Community, pType protobuf.CommunityTokenPermission_Type) (string, *requests.CreateCommunityTokenPermission) { 316 createTokenPermissionRequest := createTestPermissionRequest(community, pType) 317 return createTokenPermission(base, community, createTokenPermissionRequest) 318 } 319 320 func editTokenPermission(base CommunityEventsTestsInterface, community *communities.Community, request *requests.EditCommunityTokenPermission) { 321 s := base.GetSuite() 322 323 response, err := base.GetEventSender().EditCommunityTokenPermission(request) 324 s.Require().NoError(err) 325 s.Require().Len(response.CommunityChanges, 1) 326 s.Require().Len(response.CommunityChanges[0].TokenPermissionsModified, 1) 327 328 editedPermission := response.CommunityChanges[0].TokenPermissionsModified[request.PermissionID] 329 s.Require().NotNil(editedPermission) 330 // Permission edited by event must be in pending state 331 s.Require().Equal(communities.TokenPermissionUpdatePending, editedPermission.State) 332 333 permissionSatisfyRequest := func(p *communities.CommunityTokenPermission) bool { 334 return request.Type == p.Type && 335 request.TokenCriteria[0].Symbol == p.TokenCriteria[0].Symbol && 336 request.TokenCriteria[0].AmountInWei == p.TokenCriteria[0].AmountInWei && 337 request.TokenCriteria[0].Decimals == p.TokenCriteria[0].Decimals 338 } 339 s.Require().True(permissionSatisfyRequest(editedPermission)) 340 341 responseHasApprovedEditedTokenPermission := func(r *MessengerResponse) bool { 342 if len(r.Communities()) == 0 { 343 return false 344 } 345 346 receivedPermission := r.Communities()[0].TokenPermissionByID(editedPermission.Id) 347 return receivedPermission != nil && receivedPermission.State == communities.TokenPermissionApproved && 348 permissionSatisfyRequest(receivedPermission) 349 } 350 351 // Control node receives community event & approves it 352 _, err = WaitOnMessengerResponse(base.GetControlNode(), responseHasApprovedEditedTokenPermission, "community with approved permission not found") 353 s.Require().NoError(err) 354 355 // Member receives updated community description 356 _, err = WaitOnMessengerResponse(base.GetMember(), responseHasApprovedEditedTokenPermission, "community with approved permission not found") 357 s.Require().NoError(err) 358 359 // EventSender receives updated community description 360 _, err = WaitOnMessengerResponse(base.GetEventSender(), responseHasApprovedEditedTokenPermission, "community with approved permission not found") 361 s.Require().NoError(err) 362 } 363 364 func deleteTokenPermission(base CommunityEventsTestsInterface, community *communities.Community, request *requests.DeleteCommunityTokenPermission) { 365 response, err := base.GetEventSender().DeleteCommunityTokenPermission(request) 366 s := base.GetSuite() 367 s.Require().NoError(err) 368 s.Require().Len(response.CommunityChanges, 1) 369 s.Require().Len(response.CommunityChanges[0].TokenPermissionsModified, 1) 370 371 removedPermission := response.CommunityChanges[0].TokenPermissionsModified[request.PermissionID] 372 s.Require().NotNil(removedPermission) 373 // Permission removed by event must be in pending state 374 s.Require().Equal(communities.TokenPermissionRemovalPending, removedPermission.State) 375 376 responseHasNoTokenPermission := func(r *MessengerResponse) bool { 377 if len(r.Communities()) == 0 { 378 return false 379 } 380 381 return r.Communities()[0].TokenPermissionByID(removedPermission.Id) == nil 382 } 383 384 // Control node receives community event & approves it 385 _, err = WaitOnMessengerResponse(base.GetControlNode(), responseHasNoTokenPermission, "community with approved permission not found") 386 s.Require().NoError(err) 387 388 // Member receives updated community description 389 _, err = WaitOnMessengerResponse(base.GetMember(), responseHasNoTokenPermission, "community with approved permission not found") 390 s.Require().NoError(err) 391 392 // EventSender receives updated community description 393 _, err = WaitOnMessengerResponse(base.GetEventSender(), responseHasNoTokenPermission, "community with approved permission not found") 394 s.Require().NoError(err) 395 } 396 397 func assertCheckTokenPermissionCreated(s *suite.Suite, community *communities.Community, pType protobuf.CommunityTokenPermission_Type) { 398 permissions := community.TokenPermissionsByType(pType) 399 s.Require().Len(permissions, 1) 400 s.Require().Len(permissions[0].TokenCriteria, 1) 401 s.Require().Equal(permissions[0].TokenCriteria[0].Type, protobuf.CommunityTokenType_ERC20) 402 s.Require().Equal(permissions[0].TokenCriteria[0].Symbol, "TEST") 403 s.Require().Equal(permissions[0].TokenCriteria[0].Amount, "100") 404 s.Require().Equal(permissions[0].TokenCriteria[0].Decimals, uint64(18)) 405 } 406 407 func setUpOnRequestCommunityAndRoles(base CommunityEventsTestsInterface, role protobuf.CommunityMember_Roles, additionalEventSenders []*Messenger) *communities.Community { 408 base.SetupAdditionalMessengers(additionalEventSenders) 409 410 tcs2, err := base.GetControlNode().communitiesManager.All() 411 s := base.GetSuite() 412 s.Require().NoError(err, "eventSender.communitiesManager.All") 413 s.Len(tcs2, 0, "Must have 0 community") 414 415 // control node creates a community and chat 416 community := createTestCommunity(base, protobuf.CommunityPermissions_MANUAL_ACCEPT) 417 refreshMessengerResponses(base) 418 419 advertiseCommunityToUserOldWay(s, community, base.GetControlNode(), base.GetEventSender()) 420 advertiseCommunityToUserOldWay(s, community, base.GetControlNode(), base.GetMember()) 421 accountsTestData := base.GetAccountsTestData() 422 accounts := accountsTestData[base.GetEventSender().IdentityPublicKeyString()] 423 accountsPasswords := base.GetAccountsPasswords() 424 password := accountsPasswords[base.GetEventSender().IdentityPublicKeyString()] 425 426 joinOnRequestCommunity(s, community.ID(), base.GetControlNode(), base.GetEventSender(), password, accounts) 427 428 accounts = accountsTestData[base.GetEventSender().IdentityPublicKeyString()] 429 password = accountsPasswords[base.GetEventSender().IdentityPublicKeyString()] 430 431 joinOnRequestCommunity(s, community.ID(), base.GetControlNode(), base.GetMember(), password, accounts) 432 433 checkMemberJoined := func(response *MessengerResponse) error { 434 return checkMemberJoinedToTheCommunity(response, base.GetMember().IdentityPublicKey()) 435 } 436 437 waitOnMessengerResponse(s, checkMemberJoined, base.GetEventSender()) 438 439 // grant permissions to event sender 440 checkPermissionGranted := func(response *MessengerResponse) error { 441 return checkRolePermissionInResponse(response, base.GetEventSender().IdentityPublicKey(), role) 442 } 443 if role != protobuf.CommunityMember_ROLE_NONE { 444 grantPermission(s, community, base.GetControlNode(), base.GetEventSender(), role) 445 waitOnMessengerResponse(s, checkPermissionGranted, base.GetMember()) 446 } 447 448 for _, eventSender := range additionalEventSenders { 449 advertiseCommunityToUserOldWay(s, community, base.GetControlNode(), eventSender) 450 451 accounts = accountsTestData[base.GetEventSender().IdentityPublicKeyString()] 452 password = accountsPasswords[base.GetEventSender().IdentityPublicKeyString()] 453 454 joinOnRequestCommunity(s, community.ID(), base.GetControlNode(), eventSender, password, accounts) 455 456 if role != protobuf.CommunityMember_ROLE_NONE { 457 grantPermission(s, community, base.GetControlNode(), eventSender, role) 458 waitOnMessengerResponse(s, checkPermissionGranted, base.GetMember()) 459 waitOnMessengerResponse(s, checkPermissionGranted, base.GetEventSender()) 460 } 461 } 462 463 return community 464 } 465 466 func createCommunityCategory(base CommunityEventsTestsInterface, community *communities.Community, newCategory *requests.CreateCommunityCategory) string { 467 checkCategoryCreated := func(response *MessengerResponse) error { 468 modifiedCommmunity, err := getModifiedCommunity(response, community.IDString()) 469 if err != nil { 470 return err 471 } 472 473 for _, category := range modifiedCommmunity.Categories() { 474 if category.GetName() == newCategory.CategoryName { 475 return nil 476 } 477 } 478 479 return errors.New("couldn't find created Category in the response") 480 } 481 482 response, err := base.GetEventSender().CreateCommunityCategory(newCategory) 483 484 s := base.GetSuite() 485 s.Require().NoError(err) 486 s.Require().NoError(checkCategoryCreated(response)) 487 s.Require().Len(response.Communities(), 1) 488 s.Require().Len(response.CommunityChanges[0].CategoriesAdded, 1) 489 490 var categoryID string 491 for categoryID = range response.CommunityChanges[0].CategoriesAdded { 492 break 493 } 494 495 checkClientsReceivedAdminEvent(base, checkCategoryCreated) 496 497 return categoryID 498 } 499 500 func editCommunityCategory(base CommunityEventsTestsInterface, communityID string, editCategory *requests.EditCommunityCategory) { 501 checkCategoryEdited := func(response *MessengerResponse) error { 502 modifiedCommmunity, err := getModifiedCommunity(response, communityID) 503 if err != nil { 504 return err 505 } 506 507 for _, category := range modifiedCommmunity.Categories() { 508 if category.GetName() == editCategory.CategoryName { 509 return nil 510 } 511 } 512 513 return errors.New("couldn't find edited Category in the response") 514 } 515 516 response, err := base.GetEventSender().EditCommunityCategory(editCategory) 517 518 s := base.GetSuite() 519 s.Require().NoError(err) 520 s.Require().NoError(checkCategoryEdited(response)) 521 522 checkClientsReceivedAdminEvent(base, checkCategoryEdited) 523 } 524 525 func deleteCommunityCategory(base CommunityEventsTestsInterface, communityID string, deleteCategory *requests.DeleteCommunityCategory) { 526 checkCategoryDeleted := func(response *MessengerResponse) error { 527 modifiedCommmunity, err := getModifiedCommunity(response, communityID) 528 if err != nil { 529 return err 530 } 531 532 if _, exists := modifiedCommmunity.Chats()[deleteCategory.CategoryID]; exists { 533 return errors.New("community was not deleted") 534 } 535 536 return nil 537 } 538 539 response, err := base.GetEventSender().DeleteCommunityCategory(deleteCategory) 540 541 s := base.GetSuite() 542 s.Require().NoError(err) 543 s.Require().NoError(checkCategoryDeleted(response)) 544 545 checkClientsReceivedAdminEvent(base, checkCategoryDeleted) 546 } 547 548 func reorderCategory(base CommunityEventsTestsInterface, reorderRequest *requests.ReorderCommunityCategories) { 549 checkCategoryReorder := func(response *MessengerResponse) error { 550 modifiedCommmunity, err := getModifiedCommunity(response, types.EncodeHex(reorderRequest.CommunityID)) 551 if err != nil { 552 return err 553 } 554 555 category, exist := modifiedCommmunity.Categories()[reorderRequest.CategoryID] 556 if !exist { 557 return errors.New("couldn't find community category") 558 } 559 560 if int(category.Position) != reorderRequest.Position { 561 return errors.New("category was not reordered") 562 } 563 564 return nil 565 } 566 567 response, err := base.GetEventSender().ReorderCommunityCategories(reorderRequest) 568 569 s := base.GetSuite() 570 s.Require().NoError(err) 571 s.Require().NoError(checkCategoryReorder(response)) 572 573 checkClientsReceivedAdminEvent(base, checkCategoryReorder) 574 } 575 576 func reorderChannel(base CommunityEventsTestsInterface, reorderRequest *requests.ReorderCommunityChat) { 577 checkChannelReorder := func(response *MessengerResponse) error { 578 modifiedCommmunity, err := getModifiedCommunity(response, types.EncodeHex(reorderRequest.CommunityID)) 579 if err != nil { 580 return err 581 } 582 583 chat, exist := modifiedCommmunity.Chats()[reorderRequest.ChatID] 584 if !exist { 585 return errors.New("couldn't find community chat") 586 } 587 588 if int(chat.Position) != reorderRequest.Position { 589 return errors.New("chat position was not reordered") 590 } 591 592 if chat.CategoryId != reorderRequest.CategoryID { 593 return errors.New("chat category was not reordered") 594 } 595 596 return nil 597 } 598 599 response, err := base.GetEventSender().ReorderCommunityChat(reorderRequest) 600 601 s := base.GetSuite() 602 s.Require().NoError(err) 603 s.Require().NoError(checkChannelReorder(response)) 604 605 checkClientsReceivedAdminEvent(base, checkChannelReorder) 606 } 607 608 func kickMember(base CommunityEventsTestsInterface, communityID types.HexBytes, pubkey string) { 609 checkKicked := func(response *MessengerResponse) error { 610 modifiedCommmunity, err := getModifiedCommunity(response, types.EncodeHex(communityID)) 611 if err != nil { 612 return err 613 } 614 615 if modifiedCommmunity.HasMember(&base.GetMember().identity.PublicKey) { 616 return errors.New("alice was not kicked") 617 } 618 619 if len(modifiedCommmunity.PendingAndBannedMembers()) > 0 { 620 return errors.New("alice was kicked and should not be presented in the pending list") 621 } 622 623 return nil 624 } 625 626 response, err := base.GetEventSender().RemoveUserFromCommunity( 627 communityID, 628 pubkey, 629 ) 630 631 s := base.GetSuite() 632 s.Require().NoError(err) 633 634 // 1. event sender should get pending state for kicked member 635 modifiedCommmunity, err := getModifiedCommunity(response, types.EncodeHex(communityID)) 636 s.Require().NoError(err) 637 s.Require().True(modifiedCommmunity.HasMember(&base.GetMember().identity.PublicKey)) 638 s.Require().Equal(communities.CommunityMemberKickPending, modifiedCommmunity.PendingAndBannedMembers()[pubkey]) 639 640 // 2. wait for event as a sender 641 waitOnMessengerResponse(s, func(response *MessengerResponse) error { 642 modifiedCommmunity, err := getModifiedCommunity(response, types.EncodeHex(communityID)) 643 if err != nil { 644 return err 645 } 646 647 if !modifiedCommmunity.HasMember(&base.GetMember().identity.PublicKey) { 648 return errors.New("alice should not be not kicked (yet)") 649 } 650 651 if modifiedCommmunity.PendingAndBannedMembers()[pubkey] != communities.CommunityMemberKickPending { 652 return errors.New("alice should be in the pending state") 653 } 654 655 return nil 656 }, base.GetEventSender()) 657 658 // 3. wait for event as the community member and check we are still until control node gets it 659 waitOnMessengerResponse(s, func(response *MessengerResponse) error { 660 modifiedCommmunity, err := getModifiedCommunity(response, types.EncodeHex(communityID)) 661 if err != nil { 662 return err 663 } 664 665 if !modifiedCommmunity.HasMember(&base.GetMember().identity.PublicKey) { 666 return errors.New("alice should not be not kicked (yet)") 667 } 668 669 if len(modifiedCommmunity.PendingAndBannedMembers()) == 0 { 670 return errors.New("alice should know about banned and pending members") 671 } 672 673 return nil 674 }, base.GetMember()) 675 676 // 4. control node should handle event and actually kick member 677 waitOnMessengerResponse(s, checkKicked, base.GetControlNode()) 678 679 // 5. event sender get removed member 680 waitOnMessengerResponse(s, checkKicked, base.GetEventSender()) 681 682 // 6. member should be notified about actual removal 683 waitOnMessengerResponse(s, checkKicked, base.GetMember()) 684 } 685 686 func banMember(base CommunityEventsTestsInterface, banRequest *requests.BanUserFromCommunity) { 687 bannedPK := banRequest.User.String() 688 communityStr := banRequest.CommunityID.String() 689 690 checkBanned := func(response *MessengerResponse) error { 691 modifiedCommmunity, err := getModifiedCommunity(response, types.EncodeHex(banRequest.CommunityID)) 692 if err != nil { 693 return err 694 } 695 696 if modifiedCommmunity.HasMember(&base.GetMember().identity.PublicKey) { 697 return errors.New("alice was not removed from the member list") 698 } 699 700 if !modifiedCommmunity.IsBanned(&base.GetMember().identity.PublicKey) { 701 return errors.New("alice was not added to the banned list") 702 } 703 704 expectedState := communities.CommunityMemberBanned 705 if banRequest.DeleteAllMessages { 706 expectedState = communities.CommunityMemberBanWithAllMessagesDelete 707 } 708 709 if modifiedCommmunity.PendingAndBannedMembers()[bannedPK] != expectedState { 710 return errors.New("alice should be in the pending state") 711 } 712 713 if banRequest.DeleteAllMessages { 714 if len(response.DeletedMessages()) == 0 { 715 return errors.New("alice message must be deleted") 716 } 717 } 718 719 return nil 720 } 721 722 response, err := base.GetEventSender().BanUserFromCommunity(context.Background(), banRequest) 723 724 s := base.GetSuite() 725 s.Require().NoError(err) 726 727 // 1. event sender should get pending state for ban member 728 modifiedCommmunity, err := getModifiedCommunity(response, types.EncodeHex(banRequest.CommunityID)) 729 s.Require().NoError(err) 730 s.Require().True(modifiedCommmunity.HasMember(&base.GetMember().identity.PublicKey)) 731 s.Require().Equal(communities.CommunityMemberBanPending, modifiedCommmunity.PendingAndBannedMembers()[bannedPK]) 732 733 verifier := "event sender" 734 verifyPendingState := func(response *MessengerResponse) error { 735 modifiedCommmunity, err := getModifiedCommunity(response, types.EncodeHex(banRequest.CommunityID)) 736 if err != nil { 737 return err 738 } 739 740 if !modifiedCommmunity.HasMember(&base.GetMember().identity.PublicKey) { 741 return errors.New(verifier + ": alice should not be not banned (yet)") 742 } 743 744 state, exists := modifiedCommmunity.PendingAndBannedMembers()[bannedPK] 745 if !exists { 746 return errors.New(verifier + ": alice is not in the pending and banned members list") 747 } 748 749 if state != communities.CommunityMemberBanPending { 750 return errors.New("event sender: alice has invalid state: " + string(state)) 751 } 752 753 return nil 754 } 755 756 // 2. wait for event as a sender 757 waitOnMessengerResponse(s, verifyPendingState, base.GetEventSender()) 758 759 // 3. wait for event as the community member and check we are still until control node gets it 760 verifier = "alice" 761 waitOnMessengerResponse(s, verifyPendingState, base.GetMember()) 762 763 checkMsgDeletion := func(messenger *Messenger, expectedMsgsCount int) { 764 msgs, err := messenger.persistence.GetCommunityMemberMessagesToDelete(bannedPK, communityStr) 765 s.Require().NoError(err) 766 s.Require().Len(msgs, expectedMsgsCount) 767 } 768 769 if banRequest.DeleteAllMessages { 770 checkMsgDeletion(base.GetEventSender(), 1) 771 checkMsgDeletion(base.GetMember(), 1) 772 } 773 774 // 4. control node should handle event and actually ban member 775 waitOnMessengerResponse(s, checkBanned, base.GetControlNode()) 776 777 // 5. event sender get banned member 778 waitOnMessengerResponse(s, checkBanned, base.GetEventSender()) 779 780 // 6. member should be notified about actual removal 781 waitOnMessengerResponse(s, checkBanned, base.GetMember()) 782 783 if banRequest.DeleteAllMessages { 784 checkMsgDeletion(base.GetEventSender(), 0) 785 checkMsgDeletion(base.GetMember(), 0) 786 checkMsgDeletion(base.GetControlNode(), 0) 787 } 788 } 789 790 func unbanMember(base CommunityEventsTestsInterface, unbanRequest *requests.UnbanUserFromCommunity) { 791 pubkey := common.PubkeyToHex(&base.GetMember().identity.PublicKey) 792 793 checkUnbanned := func(response *MessengerResponse) error { 794 modifiedCommmunity, err := getModifiedCommunity(response, types.EncodeHex(unbanRequest.CommunityID)) 795 if err != nil { 796 return err 797 } 798 799 if modifiedCommmunity.IsBanned(&base.GetMember().identity.PublicKey) { 800 return errors.New("alice was not unbanned") 801 } 802 803 if modifiedCommmunity.PendingAndBannedMembers()[pubkey] != communities.CommunityMemberBanned { 804 return errors.New("alice should be in the pending state") 805 } 806 807 return nil 808 } 809 810 response, err := base.GetEventSender().UnbanUserFromCommunity(unbanRequest) 811 812 s := base.GetSuite() 813 s.Require().NoError(err) 814 815 // 1. event sender should get pending state for unban member 816 modifiedCommmunity, err := getModifiedCommunity(response, types.EncodeHex(unbanRequest.CommunityID)) 817 s.Require().NoError(err) 818 s.Require().Equal(communities.CommunityMemberUnbanPending, modifiedCommmunity.PendingAndBannedMembers()[pubkey]) 819 820 // 2. wait for event as a sender 821 waitOnMessengerResponse(s, func(response *MessengerResponse) error { 822 modifiedCommmunity, err := getModifiedCommunity(response, types.EncodeHex(unbanRequest.CommunityID)) 823 if err != nil { 824 return err 825 } 826 827 if modifiedCommmunity.PendingAndBannedMembers()[pubkey] != communities.CommunityMemberUnbanPending { 828 return errors.New("alice should be in the pending state") 829 } 830 831 return nil 832 }, base.GetEventSender()) 833 834 // 3. wait for event as the community member and check we are still until control node gets it 835 waitOnMessengerResponse(s, func(response *MessengerResponse) error { 836 modifiedCommmunity, err := getModifiedCommunity(response, types.EncodeHex(unbanRequest.CommunityID)) 837 if err != nil { 838 return err 839 } 840 841 if len(modifiedCommmunity.PendingAndBannedMembers()) == 0 { 842 return errors.New("alice should know about banned and pending members") 843 } 844 845 return nil 846 }, base.GetMember()) 847 848 // 4. control node should handle event and actually unban member 849 waitOnMessengerResponse(s, checkUnbanned, base.GetControlNode()) 850 851 // 5. event sender get removed member 852 waitOnMessengerResponse(s, checkUnbanned, base.GetEventSender()) 853 854 // 6. member should be notified about actual removal 855 waitOnMessengerResponse(s, checkUnbanned, base.GetMember()) 856 } 857 858 func controlNodeSendMessage(base CommunityEventsTestsInterface, inputMessage *common.Message) string { 859 response, err := base.GetControlNode().SendChatMessage(context.Background(), inputMessage) 860 861 s := base.GetSuite() 862 s.Require().NoError(err) 863 message := response.Messages()[0] 864 s.Require().Equal(inputMessage.Text, message.Text) 865 messageID := message.ID 866 867 response, err = WaitOnMessengerResponse(base.GetEventSender(), WaitMessageCondition, "messages not received") 868 s.Require().NoError(err) 869 message = response.Messages()[0] 870 s.Require().Equal(inputMessage.Text, message.Text) 871 872 response, err = WaitOnMessengerResponse(base.GetMember(), WaitMessageCondition, "messages not received") 873 s.Require().NoError(err) 874 message = response.Messages()[0] 875 s.Require().Equal(inputMessage.Text, message.Text) 876 877 refreshMessengerResponses(base) 878 879 return messageID 880 } 881 882 func deleteControlNodeMessage(base CommunityEventsTestsInterface, messageID string) { 883 checkMessageDeleted := func(response *MessengerResponse) error { 884 if len(response.RemovedMessages()) > 0 { 885 return nil 886 } 887 return errors.New("message was not deleted") 888 } 889 890 response, err := base.GetEventSender().DeleteMessageAndSend(context.Background(), messageID) 891 892 s := base.GetSuite() 893 s.Require().NoError(err) 894 s.Require().NoError(checkMessageDeleted(response)) 895 896 waitOnMessengerResponse(s, checkMessageDeleted, base.GetMember()) 897 waitOnMessengerResponse(s, checkMessageDeleted, base.GetControlNode()) 898 } 899 900 func pinControlNodeMessage(base CommunityEventsTestsInterface, pinnedMessage *common.PinMessage) { 901 checkPinned := func(response *MessengerResponse) error { 902 if len(response.Messages()) == 0 { 903 return errors.New("no messages in the response") 904 } 905 906 if len(response.PinMessages()) > 0 { 907 return nil 908 } 909 return errors.New("pin messages was not added") 910 } 911 912 response, err := base.GetEventSender().SendPinMessage(context.Background(), pinnedMessage) 913 s := base.GetSuite() 914 s.Require().NoError(err) 915 s.Require().NoError(checkPinned(response)) 916 917 waitOnMessengerResponse(s, checkPinned, base.GetMember()) 918 waitOnMessengerResponse(s, checkPinned, base.GetControlNode()) 919 } 920 921 func editCommunityDescription(base CommunityEventsTestsInterface, community *communities.Community) { 922 expectedName := "edited community name" 923 expectedColor := "#000000" 924 expectedDescr := "edited community description" 925 926 response, err := base.GetEventSender().EditCommunity(&requests.EditCommunity{ 927 CommunityID: community.ID(), 928 CreateCommunity: requests.CreateCommunity{ 929 Membership: protobuf.CommunityPermissions_MANUAL_ACCEPT, 930 Name: expectedName, 931 Color: expectedColor, 932 Description: expectedDescr, 933 }, 934 }) 935 936 checkCommunityEdit := func(response *MessengerResponse) error { 937 if len(response.Communities()) == 0 { 938 return errors.New("community not received") 939 } 940 941 rCommunities := response.Communities() 942 if expectedName != rCommunities[0].Name() { 943 return errors.New("incorrect community name") 944 } 945 946 if expectedColor != rCommunities[0].Color() { 947 return errors.New("incorrect community color") 948 } 949 950 if expectedDescr != rCommunities[0].DescriptionText() { 951 return errors.New("incorrect community description") 952 } 953 954 return nil 955 } 956 957 s := base.GetSuite() 958 s.Require().NoError(err) 959 s.Require().Nil(checkCommunityEdit(response)) 960 961 checkClientsReceivedAdminEvent(base, checkCommunityEdit) 962 } 963 964 func controlNodeCreatesCommunityPermission(base CommunityEventsTestsInterface, community *communities.Community, permissionRequest *requests.CreateCommunityTokenPermission) string { 965 // control node creates permission 966 response, err := base.GetControlNode().CreateCommunityTokenPermission(permissionRequest) 967 s := base.GetSuite() 968 s.Require().NoError(err) 969 970 var tokenPermissionID string 971 for id := range response.CommunityChanges[0].TokenPermissionsAdded { 972 tokenPermissionID = id 973 } 974 s.Require().NotEqual(tokenPermissionID, "") 975 976 ownerCommunity, err := base.GetControlNode().communitiesManager.GetByID(community.ID()) 977 s.Require().NoError(err) 978 assertCheckTokenPermissionCreated(s, ownerCommunity, permissionRequest.Type) 979 980 // then, ensure event sender receives updated community 981 resp, err := WaitOnMessengerResponse( 982 base.GetEventSender(), 983 func(r *MessengerResponse) bool { 984 return len(r.Communities()) > 0 && 985 len(r.Communities()[0].TokenPermissionsByType(permissionRequest.Type)) > 0 && 986 r.Communities()[0].HasPermissionToSendCommunityEvents() 987 }, 988 "event sender did not receive community token permission", 989 ) 990 991 s.Require().NoError(err) 992 s.Require().NotNil(resp) 993 eventSenderCommunity, err := base.GetEventSender().communitiesManager.GetByID(community.ID()) 994 s.Require().NoError(err) 995 assertCheckTokenPermissionCreated(s, eventSenderCommunity, permissionRequest.Type) 996 s.Require().True(eventSenderCommunity.HasPermissionToSendCommunityEvents()) 997 998 return tokenPermissionID 999 } 1000 1001 func testCreateEditDeleteChannels(base CommunityEventsTestsInterface, community *communities.Community) { 1002 newChat := &protobuf.CommunityChat{ 1003 Permissions: &protobuf.CommunityPermissions{ 1004 Access: protobuf.CommunityPermissions_AUTO_ACCEPT, 1005 }, 1006 Identity: &protobuf.ChatIdentity{ 1007 DisplayName: "chat from the event sender", 1008 Emoji: "", 1009 Description: "chat created by an event sender", 1010 }, 1011 } 1012 1013 newChatID := createCommunityChannel(base, community, newChat) 1014 1015 newChat.Identity.DisplayName = "modified chat from event sender" 1016 editCommunityChannel(base, community, newChat, newChatID) 1017 deleteCommunityChannel(base, community, newChatID) 1018 } 1019 1020 func testCreateEditDeleteBecomeMemberPermission(base CommunityEventsTestsInterface, community *communities.Community, pType protobuf.CommunityTokenPermission_Type) { 1021 // first, create token permission 1022 tokenPermissionID, createTokenPermission := createTestTokenPermission(base, community, pType) 1023 1024 createTokenPermission.TokenCriteria[0].Symbol = "UPDATED" 1025 createTokenPermission.TokenCriteria[0].AmountInWei = "200000000000000000000" 1026 1027 editTokenPermissionRequest := &requests.EditCommunityTokenPermission{ 1028 PermissionID: tokenPermissionID, 1029 CreateCommunityTokenPermission: *createTokenPermission, 1030 } 1031 1032 // then, event sender edits the permission 1033 editTokenPermission(base, community, editTokenPermissionRequest) 1034 1035 deleteTokenPermissionRequest := &requests.DeleteCommunityTokenPermission{ 1036 CommunityID: community.ID(), 1037 PermissionID: tokenPermissionID, 1038 } 1039 1040 // then, event sender deletes previously created token permission 1041 deleteTokenPermission(base, community, deleteTokenPermissionRequest) 1042 } 1043 1044 // To be removed in https://github.com/status-im/status-go/issues/4437 1045 func advertiseCommunityToUserOldWay(s *suite.Suite, community *communities.Community, owner *Messenger, user *Messenger) { 1046 1047 chat := CreateOneToOneChat(common.PubkeyToHex(&user.identity.PublicKey), &user.identity.PublicKey, user.transport) 1048 1049 inputMessage := common.NewMessage() 1050 inputMessage.ChatId = chat.ID 1051 inputMessage.Text = "some text" 1052 inputMessage.CommunityID = community.IDString() 1053 1054 err := owner.SaveChat(chat) 1055 s.Require().NoError(err) 1056 _, err = owner.SendChatMessage(context.Background(), inputMessage) 1057 s.Require().NoError(err) 1058 1059 // Ensure community is received 1060 _, err = WaitOnMessengerResponse( 1061 user, 1062 func(r *MessengerResponse) bool { 1063 if len(r.Communities()) != 1 { 1064 return false 1065 } 1066 c := r.Communities()[0] 1067 return c.IDString() == community.IDString() && c.Clock() >= community.Clock() 1068 }, 1069 "no community received", 1070 ) 1071 s.Require().NoError(err) 1072 } 1073 1074 func testAcceptMemberRequestToJoin(base CommunityEventsTestsInterface, community *communities.Community, user *Messenger) { 1075 s := base.GetSuite() 1076 1077 advertiseCommunityToUserOldWay(s, community, base.GetControlNode(), user) 1078 1079 // user sends request to join 1080 requestID := testSendRequestToJoin(base, user, community.ID()) 1081 1082 checkRequestToJoin := func(r *MessengerResponse) bool { 1083 if len(r.RequestsToJoinCommunity()) == 0 { 1084 return false 1085 } 1086 for _, request := range r.RequestsToJoinCommunity() { 1087 if request.PublicKey == user.IdentityPublicKeyString() { 1088 return true 1089 } 1090 } 1091 return false 1092 } 1093 // event sender receives request to join 1094 response, err := WaitOnMessengerResponse( 1095 base.GetEventSender(), 1096 checkRequestToJoin, 1097 "event sender did not receive community request to join", 1098 ) 1099 s.Require().NoError(err) 1100 s.Require().Len(response.RequestsToJoinCommunity(), 1) 1101 1102 // event sender has not accepted request yet 1103 eventSenderCommunity, err := base.GetEventSender().GetCommunityByID(community.ID()) 1104 s.Require().NoError(err) 1105 s.Require().False(eventSenderCommunity.HasMember(&user.identity.PublicKey)) 1106 1107 acceptRequestToJoin := &requests.AcceptRequestToJoinCommunity{ID: requestID} 1108 response, err = base.GetEventSender().AcceptRequestToJoinCommunity(acceptRequestToJoin) 1109 s.Require().NoError(err) 1110 s.Require().NotNil(response) 1111 s.Require().Len(response.Communities(), 1) 1112 // we don't expect `user` to be a member already, because `eventSender` merely 1113 // forwards its accept decision to the control node 1114 s.Require().False(response.Communities()[0].HasMember(&user.identity.PublicKey)) 1115 1116 // at this point, the request to join is marked as accepted by GetEventSender node 1117 acceptedRequestsPending, err := base.GetEventSender().AcceptedPendingRequestsToJoinForCommunity(community.ID()) 1118 s.Require().NoError(err) 1119 s.Require().Len(acceptedRequestsPending, 1) 1120 s.Require().Equal(acceptedRequestsPending[0].PublicKey, common.PubkeyToHex(&user.identity.PublicKey)) 1121 1122 // control node receives community event with accepted membership request 1123 _, err = WaitOnMessengerResponse( 1124 base.GetControlNode(), 1125 func(r *MessengerResponse) bool { 1126 return len(r.Communities()) > 0 && r.Communities()[0].HasMember(&user.identity.PublicKey) 1127 }, 1128 "control node did not receive community request to join response", 1129 ) 1130 s.Require().NoError(err) 1131 1132 // at this point, the request to join is marked as accepted by control node 1133 acceptedRequests, err := base.GetControlNode().AcceptedRequestsToJoinForCommunity(community.ID()) 1134 s.Require().NoError(err) 1135 // we expect 3 here (1 event senders, 1 member + 1 from user) 1136 s.Require().Len(acceptedRequests, 3) 1137 s.Require().Equal(acceptedRequests[2].PublicKey, common.PubkeyToHex(&user.identity.PublicKey)) 1138 1139 // user receives updated community 1140 _, err = WaitOnMessengerResponse( 1141 user, 1142 func(r *MessengerResponse) bool { 1143 return len(r.Communities()) > 0 && r.Communities()[0].HasMember(&user.identity.PublicKey) 1144 }, 1145 "alice did not receive community request to join response", 1146 ) 1147 s.Require().NoError(err) 1148 1149 // event sender receives updated community 1150 _, err = WaitOnMessengerResponse( 1151 base.GetEventSender(), 1152 func(r *MessengerResponse) bool { 1153 return len(r.Communities()) > 0 && r.Communities()[0].HasMember(&user.identity.PublicKey) 1154 }, 1155 "event sender did not receive community with the new member", 1156 ) 1157 s.Require().NoError(err) 1158 1159 // check control node notify event sender about accepting request to join 1160 _, err = WaitOnMessengerResponse( 1161 base.GetEventSender(), 1162 func(r *MessengerResponse) bool { 1163 acceptedRequests, err := base.GetEventSender().AcceptedRequestsToJoinForCommunity(community.ID()) 1164 return err == nil && len(acceptedRequests) == 2 && (acceptedRequests[1].PublicKey == common.PubkeyToHex(&user.identity.PublicKey)) 1165 }, 1166 "no updates from control node", 1167 ) 1168 1169 s.Require().NoError(err) 1170 1171 acceptedRequestsPending, err = base.GetEventSender().AcceptedPendingRequestsToJoinForCommunity(community.ID()) 1172 s.Require().NoError(err) 1173 s.Require().Len(acceptedRequestsPending, 0) 1174 } 1175 1176 func testAcceptMemberRequestToJoinResponseSharedWithOtherEventSenders(base CommunityEventsTestsInterface, community *communities.Community, user *Messenger, additionalEventSender *Messenger) { 1177 s := base.GetSuite() 1178 1179 advertiseCommunityToUserOldWay(s, community, base.GetControlNode(), user) 1180 1181 // user sends request to join 1182 requestID := testSendRequestToJoin(base, user, community.ID()) 1183 checkRequestToJoin := func(r *MessengerResponse) bool { 1184 if len(r.RequestsToJoinCommunity()) == 0 { 1185 return false 1186 } 1187 for _, request := range r.RequestsToJoinCommunity() { 1188 if request.PublicKey == user.IdentityPublicKeyString() { 1189 return true 1190 } 1191 } 1192 return false 1193 } 1194 // event sender receives request to join 1195 _, err := WaitOnMessengerResponse( 1196 base.GetEventSender(), 1197 checkRequestToJoin, 1198 "event sender did not receive community request to join", 1199 ) 1200 s.Require().NoError(err) 1201 1202 // event sender 2 receives request to join 1203 _, err = WaitOnMessengerResponse( 1204 additionalEventSender, 1205 checkRequestToJoin, 1206 "event sender did not receive community request to join", 1207 ) 1208 s.Require().NoError(err) 1209 1210 // event sender 1 accepts request 1211 acceptRequestToJoin := &requests.AcceptRequestToJoinCommunity{ID: requestID} 1212 response, err := base.GetEventSender().AcceptRequestToJoinCommunity(acceptRequestToJoin) 1213 s.Require().NoError(err) 1214 s.Require().NotNil(response) 1215 s.Require().Len(response.Communities(), 1) 1216 1217 // event sender 2 receives decision of other event sender 1218 _, err = WaitOnMessengerResponse( 1219 additionalEventSender, 1220 func(r *MessengerResponse) bool { return len(r.Communities()) > 0 }, 1221 "event sender did not receive community request to join", 1222 ) 1223 s.Require().NoError(err) 1224 1225 // at this point, the request to join is in accepted/pending state for event sender 2 1226 acceptedPendingRequests, err := additionalEventSender.AcceptedPendingRequestsToJoinForCommunity(community.ID()) 1227 s.Require().NoError(err) 1228 s.Require().Len(acceptedPendingRequests, 1) 1229 s.Require().Equal(acceptedPendingRequests[0].PublicKey, common.PubkeyToHex(&user.identity.PublicKey)) 1230 1231 // event sender 1 changes its mind and rejects the request 1232 rejectRequestToJoin := &requests.DeclineRequestToJoinCommunity{ID: requestID} 1233 response, err = base.GetEventSender().DeclineRequestToJoinCommunity(rejectRequestToJoin) 1234 s.Require().NoError(err) 1235 s.Require().NotNil(response) 1236 1237 // event sender 2 receives updated decision of other event sender 1238 _, err = WaitOnMessengerResponse( 1239 additionalEventSender, 1240 func(r *MessengerResponse) bool { return len(r.Communities()) > 0 }, 1241 "event sender did not receive community request to join", 1242 ) 1243 s.Require().NoError(err) 1244 1245 // at this point, the request to join is in declined/pending state for event sender 2 1246 rejectedPendingRequests, err := additionalEventSender.DeclinedPendingRequestsToJoinForCommunity(community.ID()) 1247 s.Require().NoError(err) 1248 s.Require().Len(rejectedPendingRequests, 1) 1249 s.Require().Equal(rejectedPendingRequests[0].PublicKey, common.PubkeyToHex(&user.identity.PublicKey)) 1250 } 1251 1252 func testRejectMemberRequestToJoinResponseSharedWithOtherEventSenders(base CommunityEventsTestsInterface, community *communities.Community, user *Messenger, additionalEventSender *Messenger) { 1253 s := base.GetSuite() 1254 1255 advertiseCommunityToUserOldWay(s, community, base.GetControlNode(), user) 1256 1257 // user sends request to join 1258 requestID := testSendRequestToJoin(base, user, community.ID()) 1259 checkRequestToJoin := func(r *MessengerResponse) bool { 1260 if len(r.RequestsToJoinCommunity()) == 0 { 1261 return false 1262 } 1263 for _, request := range r.RequestsToJoinCommunity() { 1264 if request.PublicKey == user.IdentityPublicKeyString() { 1265 return true 1266 } 1267 } 1268 return false 1269 } 1270 1271 // event sender receives request to join 1272 _, err := WaitOnMessengerResponse( 1273 base.GetEventSender(), 1274 checkRequestToJoin, 1275 "event sender did not receive community request to join", 1276 ) 1277 s.Require().NoError(err) 1278 1279 // event sender 2 receives request to join 1280 _, err = WaitOnMessengerResponse( 1281 additionalEventSender, 1282 checkRequestToJoin, 1283 "event sender did not receive community request to join", 1284 ) 1285 s.Require().NoError(err) 1286 1287 rejectRequestToJoin := &requests.DeclineRequestToJoinCommunity{ID: requestID} 1288 response, err := base.GetEventSender().DeclineRequestToJoinCommunity(rejectRequestToJoin) 1289 s.Require().NoError(err) 1290 s.Require().NotNil(response) 1291 1292 // event sender 2 receives decision of other event sender 1293 _, err = WaitOnMessengerResponse( 1294 additionalEventSender, 1295 func(r *MessengerResponse) bool { return len(r.Communities()) > 0 }, 1296 "event sender did not receive community request to join", 1297 ) 1298 s.Require().NoError(err) 1299 1300 // at this point, the request to join is in declined/pending state for event sender 2 1301 rejectedPendingRequests, err := additionalEventSender.DeclinedPendingRequestsToJoinForCommunity(community.ID()) 1302 s.Require().NoError(err) 1303 s.Require().Len(rejectedPendingRequests, 1) 1304 s.Require().Equal(rejectedPendingRequests[0].PublicKey, common.PubkeyToHex(&user.identity.PublicKey)) 1305 1306 // event sender 1 changes its mind and accepts the request 1307 acceptRequestToJoin := &requests.AcceptRequestToJoinCommunity{ID: requestID} 1308 response, err = base.GetEventSender().AcceptRequestToJoinCommunity(acceptRequestToJoin) 1309 s.Require().NoError(err) 1310 s.Require().NotNil(response) 1311 s.Require().Len(response.Communities(), 1) 1312 1313 // event sender 2 receives updated decision of other event sender 1314 _, err = WaitOnMessengerResponse( 1315 additionalEventSender, 1316 func(r *MessengerResponse) bool { return len(r.Communities()) > 0 }, 1317 "event sender did not receive community request to join", 1318 ) 1319 s.Require().NoError(err) 1320 1321 // at this point, the request to join is in accepted/pending state for event sender 2 1322 acceptedPendingRequests, err := additionalEventSender.AcceptedPendingRequestsToJoinForCommunity(community.ID()) 1323 s.Require().NoError(err) 1324 s.Require().Len(acceptedPendingRequests, 1) 1325 s.Require().Equal(acceptedPendingRequests[0].PublicKey, common.PubkeyToHex(&user.identity.PublicKey)) 1326 } 1327 1328 func testRejectMemberRequestToJoin(base CommunityEventsTestsInterface, community *communities.Community, user *Messenger) { 1329 s := base.GetSuite() 1330 1331 advertiseCommunityToUserOldWay(s, community, base.GetControlNode(), user) 1332 1333 // user sends request to join 1334 requestID := testSendRequestToJoin(base, user, community.ID()) 1335 1336 // event sender receives request to join 1337 response, err := WaitOnMessengerResponse( 1338 base.GetEventSender(), 1339 func(r *MessengerResponse) bool { return len(r.RequestsToJoinCommunity()) > 0 }, 1340 "event sender did not receive community request to join", 1341 ) 1342 s.Require().NoError(err) 1343 s.Require().Len(response.RequestsToJoinCommunity(), 1) 1344 1345 // event sender has not accepted request yet 1346 eventSenderCommunity, err := base.GetEventSender().GetCommunityByID(community.ID()) 1347 s.Require().NoError(err) 1348 s.Require().False(eventSenderCommunity.HasMember(&user.identity.PublicKey)) 1349 1350 // event sender rejects request to join 1351 rejectRequestToJoin := &requests.DeclineRequestToJoinCommunity{ID: requestID} 1352 _, err = base.GetEventSender().DeclineRequestToJoinCommunity(rejectRequestToJoin) 1353 s.Require().NoError(err) 1354 1355 eventSenderCommunity, err = base.GetEventSender().GetCommunityByID(community.ID()) 1356 s.Require().NoError(err) 1357 s.Require().False(eventSenderCommunity.HasMember(&user.identity.PublicKey)) 1358 1359 requests, err := base.GetEventSender().DeclinedPendingRequestsToJoinForCommunity(community.ID()) 1360 s.Require().Len(requests, 1) 1361 s.Require().NoError(err) 1362 1363 // control node receives event sender event and stores rejected request to join 1364 response, err = WaitOnMessengerResponse( 1365 base.GetControlNode(), 1366 func(r *MessengerResponse) bool { 1367 requests, err := base.GetControlNode().DeclinedRequestsToJoinForCommunity(community.ID()) 1368 s.Require().NoError(err) 1369 return len(requests) == 1 && requests[0].State == communities.RequestToJoinStateDeclined 1370 }, 1371 "control node did not receive community request to join update from event sender", 1372 ) 1373 s.Require().NoError(err) 1374 s.Require().False(response.Communities()[0].HasMember(&user.identity.PublicKey)) 1375 1376 requests, err = base.GetControlNode().DeclinedRequestsToJoinForCommunity(community.ID()) 1377 s.Require().Len(requests, 1) 1378 s.Require().NoError(err) 1379 1380 // event sender receives updated community 1381 _, err = WaitOnMessengerResponse( 1382 base.GetEventSender(), 1383 func(r *MessengerResponse) bool { 1384 return len(r.Communities()) > 0 && !r.Communities()[0].HasMember(&user.identity.PublicKey) && 1385 checkRequestToJoinInResponse(r, user, communities.RequestToJoinStateDeclined, 0) 1386 }, 1387 "event sender did not receive community update", 1388 ) 1389 s.Require().NoError(err) 1390 1391 // check control node notify event sender about declined request to join 1392 _, err = WaitOnMessengerResponse( 1393 base.GetEventSender(), 1394 func(r *MessengerResponse) bool { 1395 declinedRequests, err := base.GetEventSender().DeclinedRequestsToJoinForCommunity(community.ID()) 1396 return err == nil && len(declinedRequests) == 1 1397 }, 1398 "no updates from control node", 1399 ) 1400 1401 s.Require().NoError(err) 1402 1403 declinedRequestsPending, err := base.GetEventSender().DeclinedPendingRequestsToJoinForCommunity(community.ID()) 1404 s.Require().NoError(err) 1405 s.Require().Len(declinedRequestsPending, 0) 1406 } 1407 1408 func testControlNodeHandlesMultipleEventSenderRequestToJoinDecisions(base CommunityEventsTestsInterface, community *communities.Community, user *Messenger, additionalEventSender *Messenger) { 1409 _, err := user.Start() 1410 1411 s := base.GetSuite() 1412 s.Require().NoError(err) 1413 defer TearDownMessenger(s, user) 1414 1415 advertiseCommunityToUserOldWay(s, community, base.GetControlNode(), user) 1416 1417 // user sends request to join 1418 requestID := testSendRequestToJoin(base, user, community.ID()) 1419 1420 // event sender receives request to join 1421 _, err = WaitOnMessengerResponse( 1422 base.GetEventSender(), 1423 func(r *MessengerResponse) bool { 1424 return checkRequestToJoinInResponse(r, user, communities.RequestToJoinStatePending, 0) 1425 }, 1426 "event sender did not receive community request to join", 1427 ) 1428 s.Require().NoError(err) 1429 1430 // event sender 2 receives request to join 1431 _, err = WaitOnMessengerResponse( 1432 additionalEventSender, 1433 func(r *MessengerResponse) bool { 1434 return checkRequestToJoinInResponse(r, user, communities.RequestToJoinStatePending, 0) 1435 }, 1436 "event sender 2 did not receive community request to join", 1437 ) 1438 s.Require().NoError(err) 1439 1440 // event sender 1 rejects request to join 1441 rejectRequestToJoin := &requests.DeclineRequestToJoinCommunity{ID: requestID} 1442 _, err = base.GetEventSender().DeclineRequestToJoinCommunity(rejectRequestToJoin) 1443 s.Require().NoError(err) 1444 // request to join is now marked as rejected pending for event sender 1 1445 rejectedPendingRequests, err := base.GetEventSender().DeclinedPendingRequestsToJoinForCommunity(community.ID()) 1446 s.Require().NoError(err) 1447 s.Require().NotNil(rejectedPendingRequests) 1448 s.Require().Len(rejectedPendingRequests, 1) 1449 1450 // control node receives event sender 1's and 2's decision 1451 _, err = WaitOnMessengerResponse( 1452 base.GetControlNode(), 1453 func(r *MessengerResponse) bool { 1454 return checkRequestToJoinInResponse(r, user, communities.RequestToJoinStateDeclinedPending, 0) 1455 }, 1456 "control node did not receive event senders decision", 1457 ) 1458 s.Require().NoError(err) 1459 1460 err = tt.RetryWithBackOff(func() error { 1461 // request to join is now marked as rejected 1462 rejectedRequests, err := base.GetControlNode().DeclinedRequestsToJoinForCommunity(community.ID()) 1463 if err != nil { 1464 return err 1465 } 1466 1467 if len(rejectedRequests) != 1 { 1468 return errors.New("rejected requests should be 1") 1469 } 1470 1471 if rejectedRequests[0].PublicKey != common.PubkeyToHex(&user.identity.PublicKey) { 1472 return errors.New("public key of rejected request not matching") 1473 } 1474 1475 return nil 1476 }) 1477 s.Require().NoError(err) 1478 1479 // event sender 2 accepts request to join 1480 acceptRequestToJoin := &requests.AcceptRequestToJoinCommunity{ID: requestID} 1481 _, err = additionalEventSender.AcceptRequestToJoinCommunity(acceptRequestToJoin) 1482 1483 s.Require().NoError(err) 1484 // request to join is now marked as accepted pending for event sender 2 1485 acceptedPendingRequests, err := additionalEventSender.AcceptedPendingRequestsToJoinForCommunity(community.ID()) 1486 s.Require().NoError(err) 1487 s.Require().NotNil(acceptedPendingRequests) 1488 s.Require().Len(acceptedPendingRequests, 1) 1489 1490 // control node now receives event sender 2's decision 1491 _, err = WaitOnMessengerResponse( 1492 base.GetControlNode(), 1493 func(r *MessengerResponse) bool { return len(r.Communities()) > 0 }, 1494 "control node did not receive event senders decision", 1495 ) 1496 s.Require().NoError(err) 1497 1498 err = tt.RetryWithBackOff(func() error { 1499 rejectedRequests, err := base.GetControlNode().DeclinedRequestsToJoinForCommunity(community.ID()) 1500 if err != nil { 1501 return err 1502 } 1503 if len(rejectedRequests) != 1 { 1504 return errors.New("rejected requests should be 1") 1505 } 1506 // we expect user's request to join still to be rejected 1507 if rejectedRequests[0].PublicKey != common.PubkeyToHex(&user.identity.PublicKey) { 1508 return errors.New("public key of rejected request not matching") 1509 } 1510 return nil 1511 1512 }) 1513 s.Require().NoError(err) 1514 } 1515 1516 func testCreateEditDeleteCategories(base CommunityEventsTestsInterface, community *communities.Community) { 1517 newCategory := &requests.CreateCommunityCategory{ 1518 CommunityID: community.ID(), 1519 CategoryName: "event-sender-category-name", 1520 } 1521 categoryID := createCommunityCategory(base, community, newCategory) 1522 1523 editCategory := &requests.EditCommunityCategory{ 1524 CommunityID: community.ID(), 1525 CategoryID: categoryID, 1526 CategoryName: "edited-event-sender-category-name", 1527 } 1528 1529 editCommunityCategory(base, community.IDString(), editCategory) 1530 1531 deleteCategory := &requests.DeleteCommunityCategory{ 1532 CommunityID: community.ID(), 1533 CategoryID: categoryID, 1534 } 1535 1536 deleteCommunityCategory(base, community.IDString(), deleteCategory) 1537 } 1538 1539 func testReorderChannelsAndCategories(base CommunityEventsTestsInterface, community *communities.Community) { 1540 newCategory := &requests.CreateCommunityCategory{ 1541 CommunityID: community.ID(), 1542 CategoryName: "event-sender-category-name", 1543 } 1544 _ = createCommunityCategory(base, community, newCategory) 1545 1546 newCategory.CategoryName = "event-sender-category-name2" 1547 categoryID2 := createCommunityCategory(base, community, newCategory) 1548 1549 chat := &protobuf.CommunityChat{ 1550 Permissions: &protobuf.CommunityPermissions{ 1551 Access: protobuf.CommunityPermissions_AUTO_ACCEPT, 1552 }, 1553 Identity: &protobuf.ChatIdentity{ 1554 DisplayName: "chat from event-sender", 1555 Emoji: "", 1556 Description: "chat created by an event-sender", 1557 }, 1558 } 1559 1560 chatID := createCommunityChannel(base, community, chat) 1561 1562 reorderCommunityRequest := requests.ReorderCommunityCategories{ 1563 CommunityID: community.ID(), 1564 CategoryID: categoryID2, 1565 Position: 0, 1566 } 1567 1568 reorderCategory(base, &reorderCommunityRequest) 1569 1570 reorderChatRequest := requests.ReorderCommunityChat{ 1571 CommunityID: community.ID(), 1572 CategoryID: categoryID2, 1573 ChatID: chatID, 1574 Position: 0, 1575 } 1576 1577 reorderChannel(base, &reorderChatRequest) 1578 } 1579 1580 func testEventSenderKickTheSameRole(base CommunityEventsTestsInterface, community *communities.Community) { 1581 // event sender tries to kick the member with the same role 1582 _, err := base.GetEventSender().RemoveUserFromCommunity( 1583 community.ID(), 1584 common.PubkeyToHex(&base.GetEventSender().identity.PublicKey), 1585 ) 1586 1587 s := base.GetSuite() 1588 s.Require().Error(err) 1589 s.Require().EqualError(err, "not allowed to remove admin or owner") 1590 } 1591 1592 func testEventSenderKickControlNode(base CommunityEventsTestsInterface, community *communities.Community) { 1593 // event sender tries to kick the control node 1594 _, err := base.GetEventSender().RemoveUserFromCommunity( 1595 community.ID(), 1596 common.PubkeyToHex(&base.GetControlNode().identity.PublicKey), 1597 ) 1598 1599 s := base.GetSuite() 1600 s.Require().Error(err) 1601 s.Require().EqualError(err, "not allowed to remove admin or owner") 1602 } 1603 1604 func testOwnerBanTheSameRole(base CommunityEventsTestsInterface, community *communities.Community) { 1605 _, err := base.GetEventSender().BanUserFromCommunity( 1606 context.Background(), 1607 &requests.BanUserFromCommunity{ 1608 CommunityID: community.ID(), 1609 User: common.PubkeyToHexBytes(&base.GetEventSender().identity.PublicKey), 1610 }, 1611 ) 1612 1613 s := base.GetSuite() 1614 s.Require().Error(err) 1615 s.Require().EqualError(err, "not allowed to ban admin or owner") 1616 } 1617 1618 func testOwnerBanControlNode(base CommunityEventsTestsInterface, community *communities.Community) { 1619 _, err := base.GetEventSender().BanUserFromCommunity( 1620 context.Background(), 1621 &requests.BanUserFromCommunity{ 1622 CommunityID: community.ID(), 1623 User: common.PubkeyToHexBytes(&base.GetControlNode().identity.PublicKey), 1624 }, 1625 ) 1626 1627 s := base.GetSuite() 1628 s.Require().Error(err) 1629 s.Require().EqualError(err, "not allowed to ban admin or owner") 1630 } 1631 1632 func testBanUnbanMember(base CommunityEventsTestsInterface, community *communities.Community) { 1633 // verify that event sender can't ban a control node 1634 _, err := base.GetEventSender().BanUserFromCommunity( 1635 context.Background(), 1636 &requests.BanUserFromCommunity{ 1637 CommunityID: community.ID(), 1638 User: common.PubkeyToHexBytes(&base.GetControlNode().identity.PublicKey), 1639 }, 1640 ) 1641 s := base.GetSuite() 1642 s.Require().Error(err) 1643 1644 banRequest := &requests.BanUserFromCommunity{ 1645 CommunityID: community.ID(), 1646 User: common.PubkeyToHexBytes(&base.GetMember().identity.PublicKey), 1647 } 1648 1649 banMember(base, banRequest) 1650 1651 unbanRequest := &requests.UnbanUserFromCommunity{ 1652 CommunityID: community.ID(), 1653 User: common.PubkeyToHexBytes(&base.GetMember().identity.PublicKey), 1654 } 1655 1656 unbanMember(base, unbanRequest) 1657 } 1658 1659 func testDeleteAnyMessageInTheCommunity(base CommunityEventsTestsInterface, community *communities.Community) { 1660 chatID := community.ChatIDs()[0] 1661 1662 inputMessage := common.NewMessage() 1663 inputMessage.ChatId = chatID 1664 inputMessage.ContentType = protobuf.ChatMessage_TEXT_PLAIN 1665 inputMessage.Text = "control node text" 1666 1667 messageID := controlNodeSendMessage(base, inputMessage) 1668 1669 deleteControlNodeMessage(base, messageID) 1670 } 1671 1672 func testEventSenderPinMessage(base CommunityEventsTestsInterface, community *communities.Community) { 1673 s := base.GetSuite() 1674 s.Require().False(community.AllowsAllMembersToPinMessage()) 1675 chatID := community.ChatIDs()[0] 1676 1677 inputMessage := common.NewMessage() 1678 inputMessage.ChatId = chatID 1679 inputMessage.ContentType = protobuf.ChatMessage_TEXT_PLAIN 1680 inputMessage.Text = "control node text" 1681 1682 messageID := controlNodeSendMessage(base, inputMessage) 1683 1684 pinnedMessage := common.NewPinMessage() 1685 pinnedMessage.MessageId = messageID 1686 pinnedMessage.ChatId = chatID 1687 pinnedMessage.Pinned = true 1688 1689 pinControlNodeMessage(base, pinnedMessage) 1690 } 1691 1692 func testMemberReceiveEventsWhenControlNodeOffline(base CommunityEventsTestsInterface, community *communities.Community) { 1693 // To simulate behavior when control node is offline, we will not use control node for listening new events 1694 // In this scenario member will reveive list of events 1695 1696 s := base.GetSuite() 1697 member := base.GetMember() 1698 eventSender := base.GetEventSender() 1699 1700 newAdminChat := &protobuf.CommunityChat{ 1701 Permissions: &protobuf.CommunityPermissions{ 1702 Access: protobuf.CommunityPermissions_AUTO_ACCEPT, 1703 }, 1704 Identity: &protobuf.ChatIdentity{ 1705 DisplayName: "chat from event sender", 1706 Emoji: "", 1707 Description: "chat created by an event sender", 1708 }, 1709 } 1710 1711 checkChannelCreated := func(response *MessengerResponse) error { 1712 modifiedCommmunity, err := getModifiedCommunity(response, community.IDString()) 1713 if err != nil { 1714 return err 1715 } 1716 1717 for _, chat := range modifiedCommmunity.Chats() { 1718 if chat.GetIdentity().GetDisplayName() == newAdminChat.GetIdentity().GetDisplayName() { 1719 return nil 1720 } 1721 } 1722 1723 return errors.New("couldn't find created chat in response") 1724 } 1725 1726 response, err := eventSender.CreateCommunityChat(community.ID(), newAdminChat) 1727 s.Require().NoError(err) 1728 s.Require().NoError(checkChannelCreated(response)) 1729 s.Require().Len(response.CommunityChanges, 1) 1730 s.Require().Len(response.CommunityChanges[0].ChatsAdded, 1) 1731 var addedChatID string 1732 for addedChatID = range response.CommunityChanges[0].ChatsAdded { 1733 break 1734 } 1735 1736 waitOnMessengerResponse(s, checkChannelCreated, member) 1737 waitOnMessengerResponse(s, checkChannelCreated, eventSender) 1738 1739 newAdminChat.Identity.DisplayName = "modified chat from event sender" 1740 1741 checkChannelEdited := func(response *MessengerResponse) error { 1742 modifiedCommmunity, err := getModifiedCommunity(response, community.IDString()) 1743 if err != nil { 1744 return err 1745 } 1746 1747 for _, chat := range modifiedCommmunity.Chats() { 1748 if chat.GetIdentity().GetDisplayName() == newAdminChat.GetIdentity().GetDisplayName() { 1749 return nil 1750 } 1751 } 1752 1753 return errors.New("couldn't find modified chat in response") 1754 } 1755 1756 response, err = eventSender.EditCommunityChat(community.ID(), addedChatID, newAdminChat) 1757 s.Require().NoError(err) 1758 s.Require().NoError(checkChannelEdited(response)) 1759 1760 waitOnMessengerResponse(s, checkChannelEdited, member) 1761 waitOnMessengerResponse(s, checkChannelEdited, eventSender) 1762 1763 checkChannelDeleted := func(response *MessengerResponse) error { 1764 modifiedCommmunity, err := getModifiedCommunity(response, community.IDString()) 1765 if err != nil { 1766 return err 1767 } 1768 1769 if _, exists := modifiedCommmunity.Chats()[addedChatID]; exists { 1770 return errors.New("channel was not deleted") 1771 } 1772 1773 return nil 1774 } 1775 1776 response, err = eventSender.DeleteCommunityChat(community.ID(), addedChatID) 1777 s.Require().NoError(err) 1778 s.Require().NoError(checkChannelDeleted(response)) 1779 1780 waitOnMessengerResponse(s, checkChannelDeleted, member) 1781 waitOnMessengerResponse(s, checkChannelDeleted, eventSender) 1782 } 1783 1784 func testEventSenderCannotDeletePrivilegedCommunityPermission(base CommunityEventsTestsInterface, community *communities.Community, 1785 testPermissionType protobuf.CommunityTokenPermission_Type, rolePermissionType protobuf.CommunityTokenPermission_Type) { 1786 // Community should have eventSenderRole permission or eventSender will loose his role 1787 // after control node create a new community permission 1788 if testPermissionType != rolePermissionType { 1789 rolePermission := createTestPermissionRequest(community, rolePermissionType) 1790 controlNodeCreatesCommunityPermission(base, community, rolePermission) 1791 } 1792 1793 permissionRequest := createTestPermissionRequest(community, testPermissionType) 1794 tokenPermissionID := controlNodeCreatesCommunityPermission(base, community, permissionRequest) 1795 1796 deleteTokenPermission := &requests.DeleteCommunityTokenPermission{ 1797 CommunityID: community.ID(), 1798 PermissionID: tokenPermissionID, 1799 } 1800 1801 // then event sender tries to delete permission which should fail 1802 response, err := base.GetEventSender().DeleteCommunityTokenPermission(deleteTokenPermission) 1803 s := base.GetSuite() 1804 s.Require().Error(err) 1805 s.Require().Nil(response) 1806 } 1807 1808 func testEventSenderCannotEditPrivilegedCommunityPermission(base CommunityEventsTestsInterface, community *communities.Community, 1809 testPermissionType protobuf.CommunityTokenPermission_Type, rolePermissionType protobuf.CommunityTokenPermission_Type) { 1810 1811 // Community should have eventSenderRole permission or eventSender will loose his role 1812 // after control node create a new community permission 1813 if testPermissionType != rolePermissionType { 1814 rolePermission := createTestPermissionRequest(community, rolePermissionType) 1815 controlNodeCreatesCommunityPermission(base, community, rolePermission) 1816 } 1817 1818 permissionRequest := createTestPermissionRequest(community, testPermissionType) 1819 tokenPermissionID := controlNodeCreatesCommunityPermission(base, community, permissionRequest) 1820 1821 permissionRequest.TokenCriteria[0].Symbol = "UPDATED" 1822 permissionRequest.TokenCriteria[0].AmountInWei = "200000000000000000000" 1823 1824 permissionEditRequest := &requests.EditCommunityTokenPermission{ 1825 PermissionID: tokenPermissionID, 1826 CreateCommunityTokenPermission: *permissionRequest, 1827 } 1828 1829 // then, event sender tries to edit permission 1830 response, err := base.GetEventSender().EditCommunityTokenPermission(permissionEditRequest) 1831 s := base.GetSuite() 1832 s.Require().Error(err) 1833 s.Require().Nil(response) 1834 } 1835 1836 func testAddAndSyncTokenFromControlNode(base CommunityEventsTestsInterface, community *communities.Community, 1837 privilegesLvl token.PrivilegesLevel) { 1838 tokenERC721 := createCommunityToken(community.IDString(), privilegesLvl) 1839 addCommunityTokenToCommunityTokensService(base, tokenERC721) 1840 1841 s := base.GetSuite() 1842 1843 _, err := base.GetControlNode().SaveCommunityToken(tokenERC721, nil) 1844 s.Require().NoError(err) 1845 1846 err = base.GetControlNode().AddCommunityToken(tokenERC721.CommunityID, tokenERC721.ChainID, tokenERC721.Address) 1847 s.Require().NoError(err) 1848 1849 tokens, err := base.GetEventSender().communitiesManager.GetAllCommunityTokens() 1850 s.Require().NoError(err) 1851 s.Require().Len(tokens, 0) 1852 1853 checkTokenAdded := func(response *MessengerResponse) error { 1854 modifiedCommmunity, err := getModifiedCommunity(response, community.IDString()) 1855 if err != nil { 1856 return err 1857 } 1858 1859 if privilegesLvl != token.CommunityLevel && len(modifiedCommmunity.TokenPermissions()) == 0 { 1860 return errors.New("Token permissions was not found") 1861 } 1862 1863 for _, tokenMetadata := range modifiedCommmunity.CommunityTokensMetadata() { 1864 if tokenMetadata.Name == tokenERC721.Name { 1865 return nil 1866 } 1867 } 1868 1869 return errors.New("Token was not found") 1870 } 1871 1872 waitOnMessengerResponse(s, checkTokenAdded, base.GetMember()) 1873 waitOnMessengerResponse(s, checkTokenAdded, base.GetEventSender()) 1874 1875 // check CommunityToken was added to the DB 1876 syncTokens, err := base.GetEventSender().communitiesManager.GetAllCommunityTokens() 1877 s.Require().NoError(err) 1878 s.Require().Len(syncTokens, 1) 1879 s.Require().Equal(syncTokens[0].PrivilegesLevel, privilegesLvl) 1880 1881 // check CommunityToken was added to the DB 1882 syncTokens, err = base.GetMember().communitiesManager.GetAllCommunityTokens() 1883 s.Require().NoError(err) 1884 s.Require().Len(syncTokens, 1) 1885 } 1886 1887 func testAddAndSyncOwnerTokenFromControlNode(base CommunityEventsTestsInterface, community *communities.Community, 1888 privilegesLvl token.PrivilegesLevel) { 1889 tokenERC721 := createCommunityToken(community.IDString(), privilegesLvl) 1890 addCommunityTokenToCommunityTokensService(base, tokenERC721) 1891 1892 s := base.GetSuite() 1893 1894 _, err := base.GetControlNode().SaveCommunityToken(tokenERC721, nil) 1895 s.Require().NoError(err) 1896 1897 err = base.GetControlNode().AddCommunityToken(tokenERC721.CommunityID, tokenERC721.ChainID, tokenERC721.Address) 1898 s.Require().NoError(err) 1899 1900 tokens, err := base.GetEventSender().communitiesManager.GetAllCommunityTokens() 1901 s.Require().NoError(err) 1902 s.Require().Len(tokens, 0) 1903 1904 // we only check that the community has been queued for validation 1905 checkTokenAdded := func(response *MessengerResponse) error { 1906 member := base.GetMember() 1907 communitiesToValidate, err := member.communitiesManager.CommunitiesToValidate() 1908 if err != nil { 1909 return err 1910 } 1911 if len(communitiesToValidate) == 0 || communitiesToValidate[community.IDString()] == nil { 1912 1913 return errors.New("no communities to validate") 1914 } 1915 1916 return nil 1917 } 1918 1919 waitOnMessengerResponse(s, checkTokenAdded, base.GetMember()) 1920 } 1921 1922 func testEventSenderCannotCreatePrivilegedCommunityPermission(base CommunityEventsTestsInterface, community *communities.Community, pType protobuf.CommunityTokenPermission_Type) { 1923 permissionRequest := createTestPermissionRequest(community, pType) 1924 1925 response, err := base.GetEventSender().CreateCommunityTokenPermission(permissionRequest) 1926 s := base.GetSuite() 1927 s.Require().Nil(response) 1928 s.Require().Error(err) 1929 } 1930 1931 func createCommunityToken(communityID string, privilegesLevel token.PrivilegesLevel) *token.CommunityToken { 1932 return &token.CommunityToken{ 1933 CommunityID: communityID, 1934 TokenType: protobuf.CommunityTokenType_ERC721, 1935 Address: "0x123", 1936 Name: "StatusToken", 1937 Symbol: "STT", 1938 Description: "desc", 1939 Supply: &bigint.BigInt{Int: big.NewInt(123)}, 1940 InfiniteSupply: false, 1941 Transferable: true, 1942 RemoteSelfDestruct: true, 1943 ChainID: 1, 1944 DeployState: token.Deployed, 1945 Base64Image: "ABCD", 1946 PrivilegesLevel: privilegesLevel, 1947 } 1948 } 1949 1950 func testAddAndSyncTokenFromEventSenderByControlNode(base CommunityEventsTestsInterface, community *communities.Community, 1951 privilegesLvl token.PrivilegesLevel) { 1952 tokenERC721 := createCommunityToken(community.IDString(), privilegesLvl) 1953 addCommunityTokenToCommunityTokensService(base, tokenERC721) 1954 1955 s := base.GetSuite() 1956 1957 _, err := base.GetEventSender().SaveCommunityToken(tokenERC721, nil) 1958 s.Require().NoError(err) 1959 1960 err = base.GetEventSender().AddCommunityToken(tokenERC721.CommunityID, tokenERC721.ChainID, tokenERC721.Address) 1961 s.Require().NoError(err) 1962 1963 tokens, err := base.GetControlNode().communitiesManager.GetAllCommunityTokens() 1964 s.Require().NoError(err) 1965 s.Require().Len(tokens, 0) 1966 1967 checkTokenAdded := func(response *MessengerResponse) error { 1968 modifiedCommmunity, err := getModifiedCommunity(response, community.IDString()) 1969 if err != nil { 1970 return err 1971 } 1972 1973 for _, tokenMetadata := range modifiedCommmunity.CommunityTokensMetadata() { 1974 if tokenMetadata.Name == tokenERC721.Name { 1975 return nil 1976 } 1977 } 1978 1979 return errors.New("Token was not found") 1980 } 1981 1982 checkClientsReceivedAdminEvent(base, checkTokenAdded) 1983 1984 // check event sender sent sync message to the control node 1985 _, err = WaitOnMessengerResponse( 1986 base.GetControlNode(), 1987 func(r *MessengerResponse) bool { 1988 tokens, err := base.GetControlNode().communitiesManager.GetAllCommunityTokens() 1989 return err == nil && len(tokens) == 1 1990 }, 1991 "no token sync message from event sender", 1992 ) 1993 1994 s.Require().NoError(err) 1995 1996 // check member received sync message with the token 1997 _, err = WaitOnMessengerResponse( 1998 base.GetMember(), 1999 func(r *MessengerResponse) bool { 2000 tokens, err := base.GetMember().communitiesManager.GetAllCommunityTokens() 2001 return err == nil && len(tokens) == 1 2002 }, 2003 "no token sync message from event sender", 2004 ) 2005 2006 s.Require().NoError(err) 2007 } 2008 2009 func testEventSenderAddTokenMasterAndOwnerToken(base CommunityEventsTestsInterface, community *communities.Community) { 2010 ownerToken := createCommunityToken(community.IDString(), token.OwnerLevel) 2011 addCommunityTokenToCommunityTokensService(base, ownerToken) 2012 2013 s := base.GetSuite() 2014 2015 _, err := base.GetEventSender().SaveCommunityToken(ownerToken, nil) 2016 s.Require().NoError(err) 2017 2018 err = base.GetEventSender().AddCommunityToken(ownerToken.CommunityID, ownerToken.ChainID, ownerToken.Address) 2019 s.Require().Error(err, communities.ErrInvalidManageTokensPermission) 2020 2021 tokenMasterToken := ownerToken 2022 tokenMasterToken.PrivilegesLevel = token.MasterLevel 2023 tokenMasterToken.Address = "0x124" 2024 2025 _, err = base.GetEventSender().SaveCommunityToken(tokenMasterToken, nil) 2026 s.Require().NoError(err) 2027 2028 err = base.GetEventSender().AddCommunityToken(ownerToken.CommunityID, ownerToken.ChainID, ownerToken.Address) 2029 s.Require().Error(err, communities.ErrInvalidManageTokensPermission) 2030 } 2031 2032 func addCommunityTokenToCommunityTokensService(base CommunityEventsTestsInterface, token *token.CommunityToken) { 2033 data := &communities.CollectibleContractData{ 2034 TotalSupply: token.Supply, 2035 Transferable: token.Transferable, 2036 RemoteBurnable: token.RemoteSelfDestruct, 2037 InfiniteSupply: token.InfiniteSupply, 2038 } 2039 2040 base.GetCollectiblesServiceMock().SetMockCollectibleContractData(uint64(token.ChainID), token.Address, data) 2041 } 2042 2043 func testJoinedPrivilegedMemberReceiveRequestsToJoin(base CommunityEventsTestsInterface, community *communities.Community, 2044 bob *Messenger, newPrivilegedUser *Messenger, tokenPermissionType protobuf.CommunityTokenPermission_Type) { 2045 s := base.GetSuite() 2046 // create community permission 2047 rolePermission := createTestPermissionRequest(community, tokenPermissionType) 2048 controlNodeCreatesCommunityPermission(base, community, rolePermission) 2049 2050 advertiseCommunityToUserOldWay(s, community, base.GetControlNode(), bob) 2051 advertiseCommunityToUserOldWay(s, community, base.GetControlNode(), newPrivilegedUser) 2052 2053 requestID := testSendRequestToJoin(base, newPrivilegedUser, community.ID()) 2054 2055 // accept join request 2056 acceptRequestToJoin := &requests.AcceptRequestToJoinCommunity{ID: requestID} 2057 response, err := base.GetControlNode().AcceptRequestToJoinCommunity(acceptRequestToJoin) 2058 s.Require().NoError(err) 2059 s.Require().NotNil(response) 2060 2061 updatedCommunity := response.Communities()[0] 2062 s.Require().NotNil(updatedCommunity) 2063 s.Require().True(updatedCommunity.HasMember(&newPrivilegedUser.identity.PublicKey)) 2064 2065 s.Require().NoError(err) 2066 2067 _, err = WaitOnMessengerResponse( 2068 newPrivilegedUser, 2069 func(r *MessengerResponse) bool { 2070 return len(r.Communities()) > 0 && 2071 r.Communities()[0].HasPermissionToSendCommunityEvents() 2072 }, 2073 "newPrivilegedUser did not receive privileged role", 2074 ) 2075 s.Require().NoError(err) 2076 2077 expectedLength := 3 2078 // newPrivilegedUser user should receive all requests to join with shared addresses from the control node 2079 waitAndCheckRequestsToJoin(s, newPrivilegedUser, expectedLength, community.ID(), tokenPermissionType == protobuf.CommunityTokenPermission_BECOME_TOKEN_MASTER) 2080 2081 // bob joins the community 2082 requestID = testSendRequestToJoin(base, bob, community.ID()) 2083 2084 // accept join request 2085 acceptRequestToJoin = &requests.AcceptRequestToJoinCommunity{ID: requestID} 2086 _, err = base.GetControlNode().AcceptRequestToJoinCommunity(acceptRequestToJoin) 2087 s.Require().NoError(err) 2088 2089 expectedLength = 4 2090 waitAndCheckRequestsToJoin(s, newPrivilegedUser, expectedLength, community.ID(), tokenPermissionType == protobuf.CommunityTokenPermission_BECOME_TOKEN_MASTER) 2091 } 2092 2093 func testMemberReceiveRequestsToJoinAfterGettingNewRole(base CommunityEventsTestsInterface, bob *Messenger, tokenPermissionType protobuf.CommunityTokenPermission_Type) { 2094 tcs2, err := base.GetControlNode().communitiesManager.All() 2095 s := base.GetSuite() 2096 s.Require().NoError(err, "eventSender.communitiesManager.All") 2097 s.Len(tcs2, 0, "Must have 0 community") 2098 2099 // control node creates a community and chat 2100 community := createTestCommunity(base, protobuf.CommunityPermissions_MANUAL_ACCEPT) 2101 2102 advertiseCommunityToUserOldWay(s, community, base.GetControlNode(), base.GetEventSender()) 2103 advertiseCommunityToUserOldWay(s, community, base.GetControlNode(), base.GetMember()) 2104 advertiseCommunityToUserOldWay(s, community, base.GetControlNode(), bob) 2105 2106 _ = testSendRequestToJoin(base, base.GetMember(), community.ID()) 2107 2108 _ = testSendRequestToJoin(base, bob, community.ID()) 2109 2110 accounts := base.GetAccountsTestData()[base.GetEventSender().IdentityPublicKeyString()] 2111 password := base.GetAccountsPasswords()[base.GetEventSender().IdentityPublicKeyString()] 2112 2113 // event sender joins as simple user 2114 joinOnRequestCommunity(s, community.ID(), base.GetControlNode(), base.GetEventSender(), password, accounts) 2115 2116 // create community permission 2117 rolePermission := createTestPermissionRequest(community, tokenPermissionType) 2118 2119 response, err := base.GetControlNode().CreateCommunityTokenPermission(rolePermission) 2120 s.Require().NoError(err) 2121 2122 var tokenPermissionID string 2123 for id := range response.CommunityChanges[0].TokenPermissionsAdded { 2124 tokenPermissionID = id 2125 } 2126 s.Require().NotEqual(tokenPermissionID, "") 2127 2128 ownerCommunity, err := base.GetControlNode().communitiesManager.GetByID(community.ID()) 2129 s.Require().NoError(err) 2130 assertCheckTokenPermissionCreated(s, ownerCommunity, rolePermission.Type) 2131 2132 _, err = WaitOnMessengerResponse( 2133 base.GetEventSender(), 2134 func(r *MessengerResponse) bool { 2135 return len(r.Communities()) > 0 && 2136 len(r.Communities()[0].TokenPermissionsByType(tokenPermissionType)) > 0 && 2137 r.Communities()[0].HasPermissionToSendCommunityEvents() 2138 }, 2139 "event sender did not receive privileged role", 2140 ) 2141 2142 s.Require().NoError(err) 2143 2144 expectedLength := 3 2145 // if request to join state pending - privileged members should not receive revealed addresses 2146 waitAndCheckRequestsToJoin(s, base.GetEventSender(), expectedLength, community.ID(), false) 2147 } 2148 2149 func waitAndCheckRequestsToJoin(s *suite.Suite, user *Messenger, expectedLength int, communityID types.HexBytes, checkRevealedAddresses bool) { 2150 _, err := WaitOnMessengerResponse( 2151 user, 2152 func(r *MessengerResponse) bool { 2153 requestsToJoin, err := user.communitiesManager.GetCommunityRequestsToJoinWithRevealedAddresses(communityID) 2154 if err != nil { 2155 return false 2156 } 2157 if len(requestsToJoin) != expectedLength { 2158 s.T().Log("invalid requests to join count:", len(requestsToJoin)) 2159 return false 2160 } 2161 2162 for _, request := range requestsToJoin { 2163 if request.PublicKey == common.PubkeyToHex(&user.identity.PublicKey) { 2164 if len(request.RevealedAccounts) != 1 { 2165 s.T().Log("our own requests to join must always have accounts revealed") 2166 return false 2167 } 2168 } else if checkRevealedAddresses && request.State != communities.RequestToJoinStatePending { 2169 if len(request.RevealedAccounts) != 1 { 2170 s.T().Log("no accounts revealed") 2171 return false 2172 } 2173 } else { 2174 if len(request.RevealedAccounts) != 0 { 2175 s.T().Log("unexpected accounts revealed") 2176 return false 2177 } 2178 } 2179 } 2180 return true 2181 }, 2182 "user did not receive all requests to join from the control node", 2183 ) 2184 s.Require().NoError(err) 2185 } 2186 2187 func testPrivilegedMemberAcceptsRequestToJoinAfterMemberLeave(base CommunityEventsTestsInterface, community *communities.Community, user *Messenger) { 2188 s := base.GetSuite() 2189 2190 advertiseCommunityToUserOldWay(s, community, base.GetControlNode(), user) 2191 2192 userPk := user.IdentityPublicKeyString() 2193 userPassword := base.GetAccountsPasswords()[userPk] 2194 userAccounts := base.GetAccountsTestData()[userPk] 2195 requestToJoin := createRequestToJoinCommunity(s, community.ID(), user, userPassword, userAccounts) 2196 response, err := user.RequestToJoinCommunity(requestToJoin) 2197 s.Require().NoError(err) 2198 s.Require().NotNil(response) 2199 s.Require().Len(response.RequestsToJoinCommunity(), 1) 2200 2201 sentRequest := response.RequestsToJoinCommunity()[0] 2202 2203 checkRequestToJoin := func(r *MessengerResponse) bool { 2204 if len(r.RequestsToJoinCommunity()) == 0 { 2205 return false 2206 } 2207 for _, request := range r.RequestsToJoinCommunity() { 2208 if request.PublicKey == sentRequest.PublicKey { 2209 return true 2210 } 2211 } 2212 return false 2213 } 2214 // event sender receives request to join 2215 response, err = WaitOnMessengerResponse( 2216 base.GetEventSender(), 2217 checkRequestToJoin, 2218 "event sender did not receive community request to join", 2219 ) 2220 s.Require().NoError(err) 2221 s.Require().Len(response.RequestsToJoinCommunity(), 1) 2222 2223 // control node receives request to join 2224 _, err = WaitOnMessengerResponse( 2225 base.GetControlNode(), 2226 checkRequestToJoin, 2227 "control node did not receive community request to join", 2228 ) 2229 s.Require().NoError(err) 2230 2231 acceptRequestToJoin := &requests.AcceptRequestToJoinCommunity{ID: sentRequest.ID} 2232 response, err = base.GetEventSender().AcceptRequestToJoinCommunity(acceptRequestToJoin) 2233 s.Require().NoError(err) 2234 s.Require().NotNil(response) 2235 s.Require().Len(response.Communities(), 1) 2236 // we don't expect `user` to be a member already, because `eventSender` merely 2237 // forwards its accept decision to the control node 2238 s.Require().False(response.Communities()[0].HasMember(&user.identity.PublicKey)) 2239 2240 // at this point, the request to join is marked as accepted by GetEventSender node 2241 acceptedRequestsPending, err := base.GetEventSender().AcceptedPendingRequestsToJoinForCommunity(community.ID()) 2242 s.Require().NoError(err) 2243 s.Require().Len(acceptedRequestsPending, 1) 2244 s.Require().Equal(acceptedRequestsPending[0].PublicKey, common.PubkeyToHex(&user.identity.PublicKey)) 2245 2246 // control node receives community event with accepted membership request 2247 _, err = WaitOnMessengerResponse( 2248 base.GetControlNode(), 2249 func(r *MessengerResponse) bool { 2250 return len(r.Communities()) > 0 && r.Communities()[0].HasMember(&user.identity.PublicKey) 2251 }, 2252 "control node did not receive community request to join response", 2253 ) 2254 s.Require().NoError(err) 2255 2256 // at this point, the request to join is marked as accepted by control node 2257 acceptedRequests, err := base.GetControlNode().AcceptedRequestsToJoinForCommunity(community.ID()) 2258 s.Require().NoError(err) 2259 // we expect 3 here (1 event senders, 1 member + 1 from user) 2260 s.Require().Len(acceptedRequests, 3) 2261 s.Require().Equal(acceptedRequests[2].PublicKey, common.PubkeyToHex(&user.identity.PublicKey)) 2262 2263 // user receives updated community 2264 _, err = WaitOnMessengerResponse( 2265 user, 2266 func(r *MessengerResponse) bool { 2267 return len(r.Communities()) > 0 && r.Communities()[0].HasMember(&user.identity.PublicKey) 2268 }, 2269 "alice did not receive community request to join response", 2270 ) 2271 s.Require().NoError(err) 2272 2273 // event sender receives updated community 2274 _, err = WaitOnMessengerResponse( 2275 base.GetEventSender(), 2276 func(r *MessengerResponse) bool { 2277 return len(r.Communities()) > 0 && r.Communities()[0].HasMember(&user.identity.PublicKey) 2278 }, 2279 "event sender did not receive community with the new member", 2280 ) 2281 s.Require().NoError(err) 2282 2283 // check control node notify event sender about accepting request to join 2284 _, err = WaitOnMessengerResponse( 2285 base.GetEventSender(), 2286 func(r *MessengerResponse) bool { 2287 acceptedRequests, err := base.GetEventSender().AcceptedRequestsToJoinForCommunity(community.ID()) 2288 return err == nil && len(acceptedRequests) == 2 && (acceptedRequests[1].PublicKey == common.PubkeyToHex(&user.identity.PublicKey)) 2289 }, 2290 "no updates from control node", 2291 ) 2292 2293 s.Require().NoError(err) 2294 2295 acceptedRequestsPending, err = base.GetEventSender().AcceptedPendingRequestsToJoinForCommunity(community.ID()) 2296 s.Require().NoError(err) 2297 s.Require().Len(acceptedRequestsPending, 0) 2298 2299 // user leaves the community 2300 response, err = user.LeaveCommunity(community.ID()) 2301 s.Require().NoError(err) 2302 s.Require().Len(response.Communities(), 1) 2303 s.Require().False(response.Communities()[0].Joined()) 2304 2305 checkMemberLeave := func(r *MessengerResponse) bool { 2306 return len(r.Communities()) > 0 && !r.Communities()[0].HasMember(&user.identity.PublicKey) 2307 } 2308 2309 // check control node received member leave msg 2310 _, err = WaitOnMessengerResponse( 2311 base.GetControlNode(), 2312 checkMemberLeave, 2313 "control node did not receive member leave msg", 2314 ) 2315 s.Require().NoError(err) 2316 2317 // check event sender received member leave update from ControlNode 2318 _, err = WaitOnMessengerResponse( 2319 base.GetEventSender(), 2320 checkMemberLeave, 2321 "event sender did not receive member leave update", 2322 ) 2323 s.Require().NoError(err) 2324 2325 // user tries to rejoin again 2326 response, err = user.RequestToJoinCommunity(requestToJoin) 2327 s.Require().NoError(err) 2328 s.Require().NotNil(response) 2329 s.Require().Len(response.RequestsToJoinCommunity(), 1) 2330 2331 // event sender receives request to join 2332 response, err = WaitOnMessengerResponse( 2333 base.GetEventSender(), 2334 checkRequestToJoin, 2335 "event sender did not receive community request to join", 2336 ) 2337 s.Require().NoError(err) 2338 s.Require().Len(response.RequestsToJoinCommunity(), 1) 2339 2340 // control node receives request to join 2341 _, err = WaitOnMessengerResponse( 2342 base.GetControlNode(), 2343 checkRequestToJoin, 2344 "event sender did not receive community request to join", 2345 ) 2346 s.Require().NoError(err) 2347 2348 response, err = base.GetEventSender().AcceptRequestToJoinCommunity(acceptRequestToJoin) 2349 s.Require().NoError(err) 2350 s.Require().NotNil(response) 2351 s.Require().Len(response.Communities(), 1) 2352 // we don't expect `user` to be a member already, because `eventSender` merely 2353 // forwards its accept decision to the control node 2354 s.Require().False(response.Communities()[0].HasMember(&user.identity.PublicKey)) 2355 2356 // at this point, the request to join is marked as accepted pending by GetEventSender node 2357 acceptedRequestsPending, err = base.GetEventSender().AcceptedPendingRequestsToJoinForCommunity(community.ID()) 2358 s.Require().NoError(err) 2359 s.Require().Len(acceptedRequestsPending, 1) 2360 s.Require().Equal(acceptedRequestsPending[0].PublicKey, common.PubkeyToHex(&user.identity.PublicKey)) 2361 2362 // control node receives community event with accepted membership request 2363 _, err = WaitOnMessengerResponse( 2364 base.GetControlNode(), 2365 func(r *MessengerResponse) bool { 2366 return len(r.Communities()) > 0 && r.Communities()[0].HasMember(&user.identity.PublicKey) 2367 }, 2368 "control node did not receive community request to join response", 2369 ) 2370 s.Require().NoError(err) 2371 2372 // at this point, the request to join is marked as accepted by control node 2373 acceptedRequests, err = base.GetControlNode().AcceptedRequestsToJoinForCommunity(community.ID()) 2374 s.Require().NoError(err) 2375 // we expect 3 here (1 event senders, 1 member + 1 from user) 2376 s.Require().Len(acceptedRequests, 3) 2377 s.Require().Equal(acceptedRequests[2].PublicKey, common.PubkeyToHex(&user.identity.PublicKey)) 2378 2379 // user receives updated community 2380 _, err = WaitOnMessengerResponse( 2381 user, 2382 func(r *MessengerResponse) bool { 2383 return len(r.Communities()) > 0 && r.Communities()[0].HasMember(&user.identity.PublicKey) 2384 }, 2385 "user did not receive community request to join response", 2386 ) 2387 s.Require().NoError(err) 2388 2389 // event sender receives updated community 2390 _, err = WaitOnMessengerResponse( 2391 base.GetEventSender(), 2392 func(r *MessengerResponse) bool { 2393 return len(r.Communities()) > 0 && r.Communities()[0].HasMember(&user.identity.PublicKey) 2394 }, 2395 "event sender did not receive community with the new member", 2396 ) 2397 s.Require().NoError(err) 2398 2399 // check control node notify event sender about accepting request to join 2400 _, err = WaitOnMessengerResponse( 2401 base.GetEventSender(), 2402 func(r *MessengerResponse) bool { 2403 acceptedRequests, err := base.GetEventSender().AcceptedRequestsToJoinForCommunity(community.ID()) 2404 return err == nil && len(acceptedRequests) == 2 && (acceptedRequests[1].PublicKey == common.PubkeyToHex(&user.identity.PublicKey)) 2405 }, 2406 "no updates from control node", 2407 ) 2408 2409 s.Require().NoError(err) 2410 2411 acceptedRequestsPending, err = base.GetEventSender().AcceptedPendingRequestsToJoinForCommunity(community.ID()) 2412 s.Require().NoError(err) 2413 s.Require().Len(acceptedRequestsPending, 0) 2414 } 2415 2416 func testBanMemberWithDeletingAllMessages(base CommunityEventsTestsInterface, community *communities.Community) { 2417 // verify that event sender can't ban a control node and delete his messages 2418 banRequest := &requests.BanUserFromCommunity{ 2419 CommunityID: community.ID(), 2420 User: common.PubkeyToHexBytes(&base.GetControlNode().identity.PublicKey), 2421 DeleteAllMessages: true, 2422 } 2423 2424 _, err := base.GetEventSender().BanUserFromCommunity( 2425 context.Background(), 2426 banRequest, 2427 ) 2428 s := base.GetSuite() 2429 s.Require().Error(err) 2430 2431 chatIds := community.ChatIDs() 2432 s.Require().Len(chatIds, 1) 2433 chat := base.GetEventSender().Chat(chatIds[0]) 2434 s.Require().NotNil(chat) 2435 2436 inputMessage := buildTestMessage(*chat) 2437 2438 sendResponse, err := base.GetMember().SendChatMessage(context.Background(), inputMessage) 2439 s.NoError(err) 2440 s.Require().NotNil(sendResponse) 2441 s.Require().Len(sendResponse.Messages(), 1) 2442 messageID := sendResponse.Messages()[0].ID 2443 2444 checkMsgDelivered := func(response *MessengerResponse) error { 2445 if len(response.Messages()) == 0 { 2446 return errors.New("response does not contain message") 2447 } 2448 2449 for _, message := range response.Messages() { 2450 if message.ID == messageID { 2451 return nil 2452 } 2453 } 2454 return errors.New("messages was not found in the response") 2455 } 2456 2457 waitOnMessengerResponse(s, checkMsgDelivered, base.GetControlNode()) 2458 2459 waitOnMessengerResponse(s, checkMsgDelivered, base.GetEventSender()) 2460 2461 banRequest.User = common.PubkeyToHexBytes(&base.GetMember().identity.PublicKey) 2462 2463 banMember(base, banRequest) 2464 } 2465 2466 func testSendRequestToJoin(base CommunityEventsTestsInterface, user *Messenger, communityID types.HexBytes) types.HexBytes { 2467 s := base.GetSuite() 2468 userPk := user.IdentityPublicKeyString() 2469 userPassword := base.GetAccountsPasswords()[userPk] 2470 userAccounts := base.GetAccountsTestData()[userPk] 2471 requestToJoin := createRequestToJoinCommunity(s, communityID, user, userPassword, userAccounts) 2472 return requestToJoinCommunity(s, base.GetControlNode(), user, requestToJoin) 2473 }