github.com/status-im/status-go@v1.1.0/protocol/messenger_send_images_album_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/types" 10 "github.com/status-im/status-go/protocol/common" 11 "github.com/status-im/status-go/protocol/communities" 12 "github.com/status-im/status-go/protocol/protobuf" 13 "github.com/status-im/status-go/protocol/requests" 14 ) 15 16 func TestMessengerSendImagesAlbumSuite(t *testing.T) { 17 suite.Run(t, new(MessengerSendImagesAlbumSuite)) 18 } 19 20 type MessengerSendImagesAlbumSuite struct { 21 CommunitiesMessengerTestSuiteBase 22 m *Messenger // main instance of Messenger 23 } 24 25 func (s *MessengerSendImagesAlbumSuite) SetupTest() { 26 s.CommunitiesMessengerTestSuiteBase.SetupTest() 27 s.m = s.newMessenger("", []string{}) 28 _, err := s.m.Start() 29 s.Require().NoError(err) 30 } 31 32 func (s *MessengerSendImagesAlbumSuite) TearDownTest() { 33 TearDownMessenger(&s.Suite, s.m) 34 s.CommunitiesMessengerTestSuiteBase.TearDownTest() 35 } 36 37 func (s *MessengerSendImagesAlbumSuite) advertiseCommunityTo(community *communities.Community, user *Messenger) { 38 advertiseCommunityTo(&s.Suite, community, s.m, user) 39 } 40 41 func (s *MessengerSendImagesAlbumSuite) joinCommunity(community *communities.Community, user *Messenger) { 42 s.CommunitiesMessengerTestSuiteBase.joinCommunity(community, s.m, user) 43 } 44 45 func (s *MessengerSendImagesAlbumSuite) TestAlbumImageMessagesSend() { 46 theirMessenger := s.newMessenger(accountPassword, []string{commonAccountAddress}) 47 _, err := theirMessenger.Start() 48 s.Require().NoError(err) 49 defer TearDownMessenger(&s.Suite, theirMessenger) 50 51 theirChat := CreateOneToOneChat("Their 1TO1", s.m.IdentityPublicKey(), s.m.transport) 52 err = theirMessenger.SaveChat(theirChat) 53 s.Require().NoError(err) 54 55 ourChat := CreateOneToOneChat("Our 1TO1", &theirMessenger.identity.PublicKey, s.m.transport) 56 err = s.m.SaveChat(ourChat) 57 s.Require().NoError(err) 58 59 const messageCount = 3 60 var album []*common.Message 61 62 for i := 0; i < messageCount; i++ { 63 image, err := buildImageWithoutAlbumIDMessage(*ourChat) 64 s.NoError(err) 65 album = append(album, image) 66 } 67 68 err = s.m.SaveChat(ourChat) 69 s.NoError(err) 70 response, err := s.m.SendChatMessages(context.Background(), album) 71 s.NoError(err) 72 73 // Check that album count was the number of the images sent 74 imagesCount := uint32(0) 75 for _, message := range response.Messages() { 76 if message.ContentType == protobuf.ChatMessage_IMAGE { 77 imagesCount++ 78 } 79 } 80 for _, message := range response.Messages() { 81 s.Require().NotNil(message.GetImage()) 82 s.Require().Equal(message.GetImage().AlbumImagesCount, imagesCount) 83 } 84 85 s.Require().Equal(messageCount, len(response.Messages()), "it returns the messages") 86 s.Require().NoError(err) 87 s.Require().Len(response.Messages(), messageCount) 88 89 response, err = WaitOnMessengerResponse( 90 theirMessenger, 91 func(r *MessengerResponse) bool { return len(r.messages) == messageCount }, 92 "no messages", 93 ) 94 95 s.Require().NoError(err) 96 s.Require().Len(response.Chats(), 1) 97 s.Require().Len(response.Messages(), messageCount) 98 for _, message := range response.Messages() { 99 image := message.GetImage() 100 s.Require().NotNil(image, "Message.ID=%s", message.ID) 101 s.Require().Equal(image.AlbumImagesCount, imagesCount) 102 s.Require().NotEmpty(image.AlbumId, "Message.ID=%s", message.ID) 103 } 104 } 105 106 func (s *MessengerSendImagesAlbumSuite) TestAlbumImageMessagesWithMentionSend() { 107 theirMessenger := s.newMessenger(accountPassword, []string{commonAccountAddress}) 108 _, err := theirMessenger.Start() 109 s.Require().NoError(err) 110 defer TearDownMessenger(&s.Suite, theirMessenger) 111 112 theirChat := CreateOneToOneChat("Their 1TO1", s.m.IdentityPublicKey(), s.m.transport) 113 err = theirMessenger.SaveChat(theirChat) 114 s.Require().NoError(err) 115 116 ourChat := CreateOneToOneChat("Our 1TO1", &theirMessenger.identity.PublicKey, s.m.transport) 117 err = s.m.SaveChat(ourChat) 118 s.Require().NoError(err) 119 120 const messageCount = 3 121 var album []*common.Message 122 123 for i := 0; i < messageCount; i++ { 124 outgoingMessage, err := buildImageWithoutAlbumIDMessage(*ourChat) 125 s.NoError(err) 126 outgoingMessage.Mentioned = true 127 outgoingMessage.Text = "hey @" + common.PubkeyToHex(&theirMessenger.identity.PublicKey) 128 album = append(album, outgoingMessage) 129 } 130 131 err = s.m.SaveChat(ourChat) 132 s.NoError(err) 133 response, err := s.m.SendChatMessages(context.Background(), album) 134 s.NoError(err) 135 s.Require().Equal(messageCount, len(response.Messages()), "it returns the messages") 136 s.Require().NoError(err) 137 s.Require().Len(response.Messages(), messageCount) 138 139 response, err = WaitOnMessengerResponse( 140 theirMessenger, 141 func(r *MessengerResponse) bool { return len(r.messages) > 0 }, 142 "no messages", 143 ) 144 145 s.Require().NoError(err) 146 s.Require().Len(response.Chats(), 1) 147 s.Require().Len(response.Messages(), messageCount) 148 149 for _, message := range response.Messages() { 150 image := message.GetImage() 151 s.Require().NotNil(image, "Message.ID=%s", message.ID) 152 s.Require().NotEmpty(image.AlbumId, "Message.ID=%s", message.ID) 153 } 154 155 s.Require().Equal(uint(1), response.Chats()[0].UnviewedMessagesCount, "Just one unread message") 156 } 157 158 // This test makes sure that if you get a mention with an image ina community, it sends it correctly and has a notif 159 func (s *MessengerSendImagesAlbumSuite) TestSingleImageMessageWithMentionInCommunitySend() { 160 theirMessenger := s.newMessenger(accountPassword, []string{commonAccountAddress}) 161 _, err := theirMessenger.Start() 162 s.Require().NoError(err) 163 defer TearDownMessenger(&s.Suite, theirMessenger) 164 165 community, chat := createCommunity(&s.Suite, s.m) 166 167 s.advertiseCommunityTo(community, theirMessenger) 168 169 s.joinCommunity(community, theirMessenger) 170 171 const messageCount = 1 172 var album []*common.Message 173 174 for i := 0; i < messageCount; i++ { 175 outgoingMessage, err := buildImageWithoutAlbumIDMessage(*chat) 176 s.NoError(err) 177 outgoingMessage.Mentioned = true 178 outgoingMessage.Text = "hey @" + common.PubkeyToHex(&theirMessenger.identity.PublicKey) 179 album = append(album, outgoingMessage) 180 } 181 182 err = s.m.SaveChat(chat) 183 s.NoError(err) 184 response, err := s.m.SendChatMessages(context.Background(), album) 185 s.NoError(err) 186 s.Require().Equal(messageCount, len(response.Messages()), "it returns the messages") 187 s.Require().NoError(err) 188 s.Require().Len(response.Messages(), messageCount) 189 190 response, err = WaitOnMessengerResponse( 191 theirMessenger, 192 func(r *MessengerResponse) bool { return len(r.messages) == messageCount }, 193 "no messages", 194 ) 195 196 s.Require().NoError(err) 197 s.Require().Len(response.Chats(), 1) 198 s.Require().Len(response.Messages(), messageCount) 199 s.Require().Len(response.ActivityCenterNotifications(), messageCount) 200 201 for _, message := range response.Messages() { 202 image := message.GetImage() 203 s.Require().NotNil(image, "Message.ID=%s", message.ID) 204 s.Require().Empty(image.AlbumId) 205 } 206 207 s.Require().Equal(uint(1), response.Chats()[0].UnviewedMessagesCount, "Just one unread message") 208 } 209 210 func (s *MessengerSendImagesAlbumSuite) TestAlbumImageEditText() { 211 theirMessenger := s.newMessenger(accountPassword, []string{commonAccountAddress}) 212 _, err := theirMessenger.Start() 213 s.Require().NoError(err) 214 defer TearDownMessenger(&s.Suite, theirMessenger) 215 216 theirChat := CreateOneToOneChat("Their 1TO1", s.m.IdentityPublicKey(), s.m.transport) 217 err = theirMessenger.SaveChat(theirChat) 218 s.Require().NoError(err) 219 220 ourChat := CreateOneToOneChat("Our 1TO1", &theirMessenger.identity.PublicKey, s.m.transport) 221 err = s.m.SaveChat(ourChat) 222 s.Require().NoError(err) 223 224 const messageCount = 3 225 var album []*common.Message 226 227 for i := 0; i < messageCount; i++ { 228 outgoingMessage, err := buildImageWithoutAlbumIDMessage(*ourChat) 229 s.NoError(err) 230 outgoingMessage.Text = "You can edit me now" 231 album = append(album, outgoingMessage) 232 } 233 234 err = s.m.SaveChat(ourChat) 235 s.NoError(err) 236 response, err := s.m.SendChatMessages(context.Background(), album) 237 s.NoError(err) 238 s.Require().Equal(messageCount, len(response.Messages()), "it returns the messages") 239 s.Require().NoError(err) 240 s.Require().Len(response.Messages(), messageCount) 241 242 response, err = WaitOnMessengerResponse( 243 theirMessenger, 244 func(r *MessengerResponse) bool { return len(r.messages) > 0 }, 245 "no messages", 246 ) 247 248 s.Require().NoError(err) 249 s.Require().Len(response.Chats(), 1) 250 s.Require().Len(response.Messages(), messageCount) 251 252 for _, message := range response.Messages() { 253 image := message.GetImage() 254 s.Require().NotNil(image, "Message.ID=%s", message.ID) 255 s.Require().NotEmpty(image.AlbumId, "Message.ID=%s", message.ID) 256 } 257 258 firstMessageID, err := types.DecodeHex(album[0].ID) 259 s.Require().NoError(err) 260 261 editedText := "edited" 262 editedMessage := &requests.EditMessage{ 263 ID: firstMessageID, 264 Text: editedText, 265 } 266 267 sendResponse, err := s.m.EditMessage(context.Background(), editedMessage) 268 269 s.Require().NoError(err) 270 s.Require().Len(sendResponse.Messages(), messageCount) 271 272 for _, message := range sendResponse.Messages() { 273 s.Require().NotEmpty(message.EditedAt) 274 s.Require().Equal(message.Text, editedText) 275 } 276 277 response, err = WaitOnMessengerResponse( 278 theirMessenger, 279 func(r *MessengerResponse) bool { return len(r.messages) > 0 }, 280 "no messages", 281 ) 282 283 s.Require().NoError(err) 284 s.Require().Len(response.Chats(), 1) 285 s.Require().Len(response.Messages(), messageCount) 286 287 for _, message := range response.Messages() { 288 s.Require().NotEmpty(message.EditedAt) 289 s.Require().Equal(message.Text, editedText) 290 } 291 } 292 293 // This test makes sure that if you get a mention with an album of images in a community, it sends it correctly and has correct AC notif with album 294 func (s *MessengerSendImagesAlbumSuite) TestAlbumImagesMessageWithMentionInCommunitySend() { 295 theirMessenger := s.newMessenger(accountPassword, []string{commonAccountAddress}) 296 _, err := theirMessenger.Start() 297 s.Require().NoError(err) 298 defer TearDownMessenger(&s.Suite, theirMessenger) 299 300 community, chat := createCommunity(&s.Suite, s.m) 301 302 s.advertiseCommunityTo(community, theirMessenger) 303 304 s.joinCommunity(community, theirMessenger) 305 306 const messageCount = 3 307 var album []*common.Message 308 309 for i := 0; i < messageCount; i++ { 310 outgoingMessage, err := buildImageWithoutAlbumIDMessage(*chat) 311 s.NoError(err) 312 outgoingMessage.Mentioned = true 313 outgoingMessage.Text = "hey @" + common.PubkeyToHex(&theirMessenger.identity.PublicKey) 314 album = append(album, outgoingMessage) 315 } 316 317 err = s.m.SaveChat(chat) 318 s.NoError(err) 319 response, err := s.m.SendChatMessages(context.Background(), album) 320 s.NoError(err) 321 s.Require().Equal(messageCount, len(response.Messages()), "it returns the messages") 322 s.Require().NoError(err) 323 s.Require().Len(response.Messages(), messageCount) 324 325 response, err = WaitOnMessengerResponse( 326 theirMessenger, 327 func(r *MessengerResponse) bool { return len(r.messages) == messageCount }, 328 "no messages", 329 ) 330 331 s.Require().NoError(err) 332 s.Require().Len(response.Chats(), 1) 333 s.Require().Len(response.Messages(), messageCount) 334 s.Require().Len(response.ActivityCenterNotifications(), 1) 335 336 for _, notif := range response.ActivityCenterNotifications() { 337 s.Require().Equal(messageCount, len(notif.AlbumMessages), "AC notification should have AlbumMessages") 338 } 339 340 for _, message := range response.Messages() { 341 image := message.GetImage() 342 s.Require().NotNil(image, "Message.ID=%s", message.ID) 343 s.Require().NotEmpty(image.AlbumId) 344 } 345 346 s.Require().Equal(uint(1), response.Chats()[0].UnviewedMessagesCount, "Just one unread message") 347 }