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 }