status-go/protocol/messenger_sync_contact_requ...

101 lines
3.3 KiB
Go

package protocol
import (
"context"
"testing"
"github.com/stretchr/testify/suite"
"github.com/ethereum/go-ethereum/crypto"
"github.com/status-im/status-go/eth-node/types"
"github.com/status-im/status-go/protocol/common"
"github.com/status-im/status-go/protocol/protobuf"
"github.com/status-im/status-go/protocol/requests"
)
type MessengerSyncContactRequestDecisionSuite struct {
MessengerBaseTestSuite
m2 *Messenger
}
func TestMessengerSyncContactRequestDecision(t *testing.T) {
suite.Run(t, new(MessengerSyncContactRequestDecisionSuite))
}
func (s *MessengerSyncContactRequestDecisionSuite) SetupTest() {
s.MessengerBaseTestSuite.SetupTest()
m2, err := newMessengerWithKey(s.shh, s.privateKey, s.logger, nil)
s.Require().NoError(err)
s.m2 = m2
PairDevices(&s.Suite, m2, s.m)
PairDevices(&s.Suite, s.m, m2)
}
func (s *MessengerSyncContactRequestDecisionSuite) TearDownTest() {
s.Require().NoError(s.m2.Shutdown())
s.MessengerBaseTestSuite.TearDownTest()
}
func (s *MessengerSyncContactRequestDecisionSuite) createUserB() *Messenger {
key, err := crypto.GenerateKey()
s.Require().NoError(err)
userB, err := newMessengerWithKey(s.shh, key, s.logger, nil)
s.Require().NoError(err)
return userB
}
func (s *MessengerSyncContactRequestDecisionSuite) TestSyncAcceptContactRequest() {
userB := s.createUserB()
defer func() {
s.Require().NoError(userB.Shutdown())
}()
numM1DispatchedAcceptContactRequest := 0
numM2DispatchedAcceptContactRequest := 0
s.m.dispatchMessageTestCallback = func(message common.RawMessage) {
if message.MessageType == protobuf.ApplicationMetadataMessage_ACCEPT_CONTACT_REQUEST {
numM1DispatchedAcceptContactRequest++
}
}
s.m2.dispatchMessageTestCallback = func(message common.RawMessage) {
if message.MessageType == protobuf.ApplicationMetadataMessage_ACCEPT_CONTACT_REQUEST {
numM2DispatchedAcceptContactRequest++
}
}
// send contact request to m/m2, m and m2 are paired
request := &requests.AddContact{ID: common.PubkeyToHex(&s.m2.identity.PublicKey)}
_, err := userB.AddContact(context.Background(), request)
s.Require().NoError(err)
// check m and m2 received contact request
var contactRequestMessageID types.HexBytes
receivedContactRequestCondition := func(r *MessengerResponse) bool {
for _, n := range r.ActivityCenterNotifications() {
if n.Type == ActivityCenterNotificationTypeContactRequest {
contactRequestMessageID = n.ID
return true
}
}
return false
}
_, err = WaitOnMessengerResponse(s.m, receivedContactRequestCondition, "contact request not received on device 1")
s.Require().NoError(err)
_, err = WaitOnMessengerResponse(s.m2, receivedContactRequestCondition, "contact request not received on device 2")
s.Require().NoError(err)
// m accept contact request from userB
_, err = s.m.AcceptContactRequest(context.Background(), &requests.AcceptContactRequest{ID: contactRequestMessageID})
s.Require().NoError(err)
// check sync contact request decision processed for m2
_, err = WaitOnMessengerResponse(s.m2, func(r *MessengerResponse) bool {
return len(r.Contacts) > 0
}, "contact request not accepted on device 2")
s.Require().NoError(err)
s.Require().Equal(1, numM1DispatchedAcceptContactRequest, "we should dispatch only 1 accept contact request message")
s.Require().Equal(0, numM2DispatchedAcceptContactRequest, "we should not dispatch accept contact request message")
}