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  }