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

     1  package protocol
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/suite"
     8  
     9  	"github.com/status-im/status-go/eth-node/crypto"
    10  	"github.com/status-im/status-go/multiaccounts"
    11  )
    12  
    13  func TestMessengerReplySuite(t *testing.T) {
    14  	suite.Run(t, new(MessengerReplySuite))
    15  }
    16  
    17  type MessengerReplySuite struct {
    18  	MessengerBaseTestSuite
    19  }
    20  
    21  func (s *MessengerReplySuite) TestReceiveReply() {
    22  	alice := s.m
    23  	alice.account = &multiaccounts.Account{KeyUID: "0xdeadbeef"}
    24  	key, err := crypto.GenerateKey()
    25  	s.Require().NoError(err)
    26  
    27  	bob, err := newMessengerWithKey(s.shh, key, s.logger, nil)
    28  	s.Require().NoError(err)
    29  
    30  	chatID := statusChatID
    31  
    32  	chat := CreatePublicChat(chatID, alice.transport)
    33  
    34  	err = alice.SaveChat(chat)
    35  	s.Require().NoError(err)
    36  
    37  	_, err = alice.Join(chat)
    38  	s.Require().NoError(err)
    39  
    40  	err = bob.SaveChat(chat)
    41  	s.Require().NoError(err)
    42  
    43  	_, err = bob.Join(chat)
    44  	s.Require().NoError(err)
    45  
    46  	// Send chat message from alice to bob
    47  	message := buildTestMessage(*chat)
    48  	_, err = alice.SendChatMessage(context.Background(), message)
    49  	s.NoError(err)
    50  
    51  	// Wait for message to arrive to bob
    52  	response, err := WaitOnMessengerResponse(
    53  		bob,
    54  		func(r *MessengerResponse) bool { return len(r.Messages()) > 0 },
    55  		"no messages",
    56  	)
    57  	s.Require().NoError(err)
    58  
    59  	s.Require().Len(response.Messages(), 1)
    60  	s.Require().False(response.Messages()[0].Replied)
    61  
    62  	messageID := response.Messages()[0].ID
    63  
    64  	// Bob replies to the message
    65  	replyMessage := buildTestMessage(*chat)
    66  	replyMessage.ResponseTo = messageID
    67  	_, err = bob.SendChatMessage(context.Background(), replyMessage)
    68  	s.NoError(err)
    69  
    70  	// Wait for reply to arrive to alice
    71  	response, err = WaitOnMessengerResponse(
    72  		alice,
    73  		func(r *MessengerResponse) bool { return len(r.Messages()) > 0 },
    74  		"no messages",
    75  	)
    76  	s.Require().NoError(err)
    77  
    78  	messages := response.Messages()
    79  	s.Require().Len(messages, 2)
    80  	//* Verify that the reply reponds to the original message
    81  	messageToCheck := messages[0]
    82  	if messageToCheck.ResponseTo == "" || messageToCheck.ResponseTo != messageID {
    83  		// We need to use the second message in the response. They got out of order by accident
    84  		messageToCheck = messages[1]
    85  	}
    86  	s.Require().True(messageToCheck.ResponseTo == messageID)
    87  	// Verify that it's replied
    88  	s.Require().True(messageToCheck.Replied)
    89  
    90  	s.Require().NoError(bob.Shutdown())
    91  }