github.com/status-im/status-go@v1.1.0/protocol/communities_messenger_test_suite_base_test.go (about) 1 package protocol 2 3 import ( 4 "crypto/ecdsa" 5 "math/big" 6 7 "github.com/stretchr/testify/suite" 8 "go.uber.org/zap" 9 10 gethcommon "github.com/ethereum/go-ethereum/common" 11 hexutil "github.com/ethereum/go-ethereum/common/hexutil" 12 13 gethbridge "github.com/status-im/status-go/eth-node/bridge/geth" 14 "github.com/status-im/status-go/eth-node/crypto" 15 "github.com/status-im/status-go/eth-node/types" 16 "github.com/status-im/status-go/protocol/communities" 17 "github.com/status-im/status-go/protocol/protobuf" 18 "github.com/status-im/status-go/protocol/requests" 19 "github.com/status-im/status-go/protocol/tt" 20 "github.com/status-im/status-go/waku" 21 ) 22 23 // TODO: in future adapt this struct to use waku v2 and switch all tests to waku v2 24 type CommunitiesMessengerTestSuiteBase struct { 25 suite.Suite 26 // If one wants to send messages between different instances of Messenger, 27 // a single Waku service should be shared. 28 shh types.Waku 29 logger *zap.Logger 30 mockedBalances communities.BalancesByChain 31 mockedCollectibles communities.CollectiblesByChain 32 collectiblesServiceMock *CollectiblesServiceMock 33 collectiblesManagerMock *CollectiblesManagerMock 34 accountsTestData map[string][]string 35 accountsPasswords map[string]string 36 } 37 38 func (s *CommunitiesMessengerTestSuiteBase) SetupTest() { 39 s.logger = tt.MustCreateTestLogger() 40 s.collectiblesServiceMock = &CollectiblesServiceMock{} 41 s.accountsTestData = make(map[string][]string) 42 s.accountsPasswords = make(map[string]string) 43 s.mockedCollectibles = make(communities.CollectiblesByChain) 44 s.collectiblesManagerMock = &CollectiblesManagerMock{ 45 Collectibles: &s.mockedCollectibles, 46 } 47 48 s.mockedBalances = make(communities.BalancesByChain) 49 50 config := waku.DefaultConfig 51 config.MinimumAcceptedPoW = 0 52 shh := waku.New(&config, s.logger) 53 s.shh = gethbridge.NewGethWakuWrapper(shh) 54 s.Require().NoError(shh.Start()) 55 } 56 57 func (s *CommunitiesMessengerTestSuiteBase) TearDownTest() { 58 _ = s.logger.Sync() 59 } 60 61 func (s *CommunitiesMessengerTestSuiteBase) newMessenger(password string, walletAddresses []string) *Messenger { 62 privateKey, err := crypto.GenerateKey() 63 s.Require().NoError(err) 64 65 return s.newMessengerWithConfig(testMessengerConfig{ 66 logger: s.logger, 67 privateKey: privateKey, 68 }, password, walletAddresses) 69 } 70 71 func (s *CommunitiesMessengerTestSuiteBase) newMessengerWithKey(privateKey *ecdsa.PrivateKey, password string, walletAddresses []string) *Messenger { 72 return s.newMessengerWithConfig(testMessengerConfig{ 73 privateKey: privateKey, 74 logger: s.logger, 75 }, password, walletAddresses) 76 } 77 78 func (s *CommunitiesMessengerTestSuiteBase) newMessengerWithConfig(config testMessengerConfig, password string, walletAddresses []string) *Messenger { 79 messenger := newTestCommunitiesMessenger(&s.Suite, s.shh, testCommunitiesMessengerConfig{ 80 testMessengerConfig: config, 81 password: password, 82 walletAddresses: walletAddresses, 83 mockedBalances: &s.mockedBalances, 84 collectiblesService: s.collectiblesServiceMock, 85 collectiblesManager: s.collectiblesManagerMock, 86 }) 87 88 publicKey := messenger.IdentityPublicKeyString() 89 s.accountsTestData[publicKey] = walletAddresses 90 s.accountsPasswords[publicKey] = password 91 return messenger 92 } 93 94 func (s *CommunitiesMessengerTestSuiteBase) joinCommunity(community *communities.Community, controlNode *Messenger, user *Messenger) { 95 userPk := user.IdentityPublicKeyString() 96 addresses, exists := s.accountsTestData[userPk] 97 s.Require().True(exists) 98 password, exists := s.accountsPasswords[userPk] 99 s.Require().True(exists) 100 joinCommunity(&s.Suite, community.ID(), controlNode, user, password, addresses) 101 } 102 103 func (s *CommunitiesMessengerTestSuiteBase) joinOnRequestCommunity(community *communities.Community, controlNode *Messenger, user *Messenger) { 104 userPk := user.IdentityPublicKeyString() 105 addresses, exists := s.accountsTestData[userPk] 106 s.Require().True(exists) 107 password, exists := s.accountsPasswords[userPk] 108 s.Require().True(exists) 109 joinOnRequestCommunity(&s.Suite, community.ID(), controlNode, user, password, addresses) 110 } 111 112 func (s *CommunitiesMessengerTestSuiteBase) createRequestToJoinCommunity(communityID types.HexBytes, user *Messenger) *requests.RequestToJoinCommunity { 113 userPk := user.IdentityPublicKeyString() 114 addresses, exists := s.accountsTestData[userPk] 115 s.Require().True(exists) 116 password, exists := s.accountsPasswords[userPk] 117 s.Require().True(exists) 118 return createRequestToJoinCommunity(&s.Suite, communityID, user, password, addresses) 119 } 120 121 func (s *CommunitiesMessengerTestSuiteBase) makeAddressSatisfyTheCriteria(chainID uint64, address string, criteria *protobuf.TokenCriteria) { 122 walletAddress := gethcommon.HexToAddress(address) 123 contractAddress := gethcommon.HexToAddress(criteria.ContractAddresses[chainID]) 124 balance, ok := new(big.Int).SetString(criteria.AmountInWei, 10) 125 s.Require().True(ok) 126 127 if _, exists := s.mockedBalances[chainID]; !exists { 128 s.mockedBalances[chainID] = make(map[gethcommon.Address]map[gethcommon.Address]*hexutil.Big) 129 } 130 131 if _, exists := s.mockedBalances[chainID][walletAddress]; !exists { 132 s.mockedBalances[chainID][walletAddress] = make(map[gethcommon.Address]*hexutil.Big) 133 } 134 135 if _, exists := s.mockedBalances[chainID][walletAddress][contractAddress]; !exists { 136 s.mockedBalances[chainID][walletAddress][contractAddress] = (*hexutil.Big)(balance) 137 } 138 139 makeAddressSatisfyTheCriteria(&s.Suite, s.mockedBalances, s.mockedCollectibles, chainID, address, criteria) 140 }