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 }