status-im/status-go

View on GitHub
protocol/messenger_sync_contact_request_decision_test.go

Summary

Maintainability
A
0 mins
Test Coverage
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")
}