github.com/status-im/status-go@v1.1.0/protocol/messenger_sync_contact_request_decision_test.go (about)

     1  package protocol
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/suite"
     8  
     9  	"github.com/ethereum/go-ethereum/crypto"
    10  	"github.com/status-im/status-go/eth-node/types"
    11  	"github.com/status-im/status-go/protocol/common"
    12  	"github.com/status-im/status-go/protocol/protobuf"
    13  	"github.com/status-im/status-go/protocol/requests"
    14  )
    15  
    16  type MessengerSyncContactRequestDecisionSuite struct {
    17  	MessengerBaseTestSuite
    18  	m2 *Messenger
    19  }
    20  
    21  func TestMessengerSyncContactRequestDecision(t *testing.T) {
    22  	suite.Run(t, new(MessengerSyncContactRequestDecisionSuite))
    23  }
    24  
    25  func (s *MessengerSyncContactRequestDecisionSuite) SetupTest() {
    26  	s.MessengerBaseTestSuite.SetupTest()
    27  
    28  	m2, err := newMessengerWithKey(s.shh, s.privateKey, s.logger, nil)
    29  	s.Require().NoError(err)
    30  	s.m2 = m2
    31  
    32  	PairDevices(&s.Suite, m2, s.m)
    33  	PairDevices(&s.Suite, s.m, m2)
    34  }
    35  
    36  func (s *MessengerSyncContactRequestDecisionSuite) TearDownTest() {
    37  	s.Require().NoError(s.m2.Shutdown())
    38  	s.MessengerBaseTestSuite.TearDownTest()
    39  }
    40  
    41  func (s *MessengerSyncContactRequestDecisionSuite) createUserB() *Messenger {
    42  	key, err := crypto.GenerateKey()
    43  	s.Require().NoError(err)
    44  	userB, err := newMessengerWithKey(s.shh, key, s.logger, nil)
    45  	s.Require().NoError(err)
    46  	return userB
    47  }
    48  
    49  func (s *MessengerSyncContactRequestDecisionSuite) TestSyncAcceptContactRequest() {
    50  	userB := s.createUserB()
    51  	defer func() {
    52  		s.Require().NoError(userB.Shutdown())
    53  	}()
    54  
    55  	numM1DispatchedAcceptContactRequest := 0
    56  	numM2DispatchedAcceptContactRequest := 0
    57  	s.m.dispatchMessageTestCallback = func(message common.RawMessage) {
    58  		if message.MessageType == protobuf.ApplicationMetadataMessage_ACCEPT_CONTACT_REQUEST {
    59  			numM1DispatchedAcceptContactRequest++
    60  		}
    61  	}
    62  	s.m2.dispatchMessageTestCallback = func(message common.RawMessage) {
    63  		if message.MessageType == protobuf.ApplicationMetadataMessage_ACCEPT_CONTACT_REQUEST {
    64  			numM2DispatchedAcceptContactRequest++
    65  		}
    66  	}
    67  	// send contact request to m/m2, m and m2 are paired
    68  	request := &requests.AddContact{ID: common.PubkeyToHex(&s.m2.identity.PublicKey)}
    69  	_, err := userB.AddContact(context.Background(), request)
    70  	s.Require().NoError(err)
    71  
    72  	// check m and m2 received contact request
    73  	var contactRequestMessageID types.HexBytes
    74  	receivedContactRequestCondition := func(r *MessengerResponse) bool {
    75  		for _, n := range r.ActivityCenterNotifications() {
    76  			if n.Type == ActivityCenterNotificationTypeContactRequest {
    77  				contactRequestMessageID = n.ID
    78  				return true
    79  			}
    80  		}
    81  		return false
    82  	}
    83  	_, err = WaitOnMessengerResponse(s.m, receivedContactRequestCondition, "contact request not received on device 1")
    84  	s.Require().NoError(err)
    85  	_, err = WaitOnMessengerResponse(s.m2, receivedContactRequestCondition, "contact request not received on device 2")
    86  	s.Require().NoError(err)
    87  
    88  	// m accept contact request from userB
    89  	_, err = s.m.AcceptContactRequest(context.Background(), &requests.AcceptContactRequest{ID: contactRequestMessageID})
    90  	s.Require().NoError(err)
    91  
    92  	// check sync contact request decision processed for m2
    93  	_, err = WaitOnMessengerResponse(s.m2, func(r *MessengerResponse) bool {
    94  		return len(r.Contacts) > 0
    95  	}, "contact request not accepted on device 2")
    96  	s.Require().NoError(err)
    97  
    98  	s.Require().Equal(1, numM1DispatchedAcceptContactRequest, "we should dispatch only 1 accept contact request message")
    99  	s.Require().Equal(0, numM2DispatchedAcceptContactRequest, "we should not dispatch accept contact request message")
   100  }