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

     1  package protocol
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/suite"
    10  
    11  	"github.com/status-im/status-go/eth-node/crypto"
    12  	"github.com/status-im/status-go/eth-node/types"
    13  	"github.com/status-im/status-go/multiaccounts"
    14  	"github.com/status-im/status-go/protocol/common"
    15  	"github.com/status-im/status-go/protocol/protobuf"
    16  )
    17  
    18  func TestMessengerEmojiSuite(t *testing.T) {
    19  	suite.Run(t, new(MessengerEmojiSuite))
    20  }
    21  
    22  type MessengerEmojiSuite struct {
    23  	MessengerBaseTestSuite
    24  }
    25  
    26  func (s *MessengerEmojiSuite) TestSendEmoji() {
    27  	alice := s.m
    28  	alice.account = &multiaccounts.Account{KeyUID: "0xdeadbeef"}
    29  	key, err := crypto.GenerateKey()
    30  	s.Require().NoError(err)
    31  
    32  	bob, err := newMessengerWithKey(s.shh, key, s.logger, nil)
    33  	s.Require().NoError(err)
    34  	defer TearDownMessenger(&s.Suite, bob)
    35  
    36  	chatID := statusChatID
    37  
    38  	chat := CreatePublicChat(chatID, alice.transport)
    39  
    40  	err = alice.SaveChat(chat)
    41  	s.Require().NoError(err)
    42  
    43  	_, err = alice.Join(chat)
    44  	s.Require().NoError(err)
    45  
    46  	err = bob.SaveChat(chat)
    47  	s.Require().NoError(err)
    48  
    49  	_, err = bob.Join(chat)
    50  	s.Require().NoError(err)
    51  
    52  	// Send chat message from alice to bob
    53  
    54  	message := buildTestMessage(*chat)
    55  	_, err = alice.SendChatMessage(context.Background(), message)
    56  	s.NoError(err)
    57  
    58  	// Wait for message to arrive to bob
    59  	response, err := WaitOnMessengerResponse(
    60  		bob,
    61  		func(r *MessengerResponse) bool { return len(r.Messages()) > 0 },
    62  		"no messages",
    63  	)
    64  	s.Require().NoError(err)
    65  
    66  	s.Require().Len(response.Messages(), 1)
    67  
    68  	messageID := response.Messages()[0].ID
    69  
    70  	// Respond with an emoji, donald trump style
    71  
    72  	response, err = bob.SendEmojiReaction(context.Background(), chat.ID, messageID, protobuf.EmojiReaction_SAD)
    73  	s.Require().NoError(err)
    74  	s.Require().Len(response.EmojiReactions(), 1)
    75  
    76  	emojiID := response.EmojiReactions()[0].ID()
    77  
    78  	// Wait for the emoji to arrive to alice
    79  	response, err = WaitOnMessengerResponse(
    80  		alice,
    81  		func(r *MessengerResponse) bool { return len(r.EmojiReactions()) == 1 },
    82  		"no emoji",
    83  	)
    84  	s.Require().NoError(err)
    85  
    86  	s.Require().Len(response.EmojiReactions(), 1)
    87  	s.Require().Equal(response.EmojiReactions()[0].ID(), emojiID)
    88  	s.Require().Equal(response.EmojiReactions()[0].Type, protobuf.EmojiReaction_SAD)
    89  
    90  	// Retract the emoji
    91  	response, err = bob.SendEmojiReactionRetraction(context.Background(), emojiID)
    92  	s.Require().NoError(err)
    93  	s.Require().Len(response.EmojiReactions(), 1)
    94  	s.Require().True(response.EmojiReactions()[0].Retracted)
    95  
    96  	// Wait for the emoji to arrive to alice
    97  	response, err = WaitOnMessengerResponse(
    98  		alice,
    99  		func(r *MessengerResponse) bool { return len(r.EmojiReactions()) == 1 },
   100  		"no emoji",
   101  	)
   102  	s.Require().NoError(err)
   103  
   104  	s.Require().Len(response.EmojiReactions(), 1)
   105  	s.Require().Equal(response.EmojiReactions()[0].ID(), emojiID)
   106  	s.Require().Equal(response.EmojiReactions()[0].Type, protobuf.EmojiReaction_SAD)
   107  	s.Require().True(response.EmojiReactions()[0].Retracted)
   108  }
   109  
   110  func (s *MessengerEmojiSuite) TestEmojiPrivateGroup() {
   111  	bob := s.m
   112  	alice := s.newMessenger()
   113  	defer TearDownMessenger(&s.Suite, alice)
   114  	response, err := bob.CreateGroupChatWithMembers(context.Background(), "test", []string{})
   115  	s.NoError(err)
   116  
   117  	s.Require().NoError(makeMutualContact(bob, &alice.identity.PublicKey))
   118  
   119  	chat := response.Chats()[0]
   120  	members := []string{types.EncodeHex(crypto.FromECDSAPub(&alice.identity.PublicKey))}
   121  	_, err = bob.AddMembersToGroupChat(context.Background(), chat.ID, members)
   122  	s.NoError(err)
   123  
   124  	// Retrieve their messages so that the chat is created
   125  	_, err = WaitOnMessengerResponse(
   126  		alice,
   127  		func(r *MessengerResponse) bool { return len(r.Chats()) > 0 },
   128  		"chat invitation not received",
   129  	)
   130  	s.Require().NoError(err)
   131  
   132  	_, err = alice.ConfirmJoiningGroup(context.Background(), chat.ID)
   133  	s.NoError(err)
   134  
   135  	// Wait for the message to reach its destination
   136  	_, err = WaitOnMessengerResponse(
   137  		bob,
   138  		func(r *MessengerResponse) bool { return len(r.Chats()) > 0 },
   139  		"no joining group event received",
   140  	)
   141  	s.Require().NoError(err)
   142  
   143  	inputMessage := buildTestMessage(*chat)
   144  	_, err = bob.SendChatMessage(context.Background(), inputMessage)
   145  	s.NoError(err)
   146  
   147  	// Wait for the message to reach its destination
   148  	response, err = WaitOnMessengerResponse(
   149  		alice,
   150  		func(r *MessengerResponse) bool { return len(r.Messages()) > 0 },
   151  		"no message received",
   152  	)
   153  	s.Require().NoError(err)
   154  	messageID := response.Messages()[0].ID
   155  
   156  	_, err = bob.SendEmojiReaction(context.Background(), chat.ID, messageID, protobuf.EmojiReaction_SAD)
   157  	s.Require().NoError(err)
   158  
   159  	// Wait for the message to reach its destination
   160  	_, err = WaitOnMessengerResponse(
   161  		alice,
   162  		func(r *MessengerResponse) bool { return len(r.EmojiReactions()) == 1 },
   163  		"no emoji reaction received",
   164  	)
   165  	s.Require().NoError(err)
   166  }
   167  
   168  func (s *MessengerEmojiSuite) TestCompressedKeyReturnedWithEmoji() {
   169  	emojiReaction := NewEmojiReaction()
   170  	id, err := crypto.GenerateKey()
   171  	s.Require().NoError(err)
   172  
   173  	emojiReaction.From = common.PubkeyToHex(&id.PublicKey)
   174  	emojiReaction.LocalChatID = testPublicChatID
   175  	encodedReaction, err := json.Marshal(emojiReaction)
   176  	s.Require().NoError(err)
   177  
   178  	// Check that compressedKey and emojiHash exists
   179  	s.Require().True(strings.Contains(string(encodedReaction), "compressedKey\":\"zQ"))
   180  	s.Require().True(strings.Contains(string(encodedReaction), "emojiHash"))
   181  }