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  }