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  }