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

     1  package protocol
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/suite"
    10  
    11  	"github.com/status-im/status-go/protocol/common"
    12  	"github.com/status-im/status-go/protocol/protobuf"
    13  	"github.com/status-im/status-go/server"
    14  )
    15  
    16  func TestMessengerPrepareMessage(t *testing.T) {
    17  	suite.Run(t, new(TestMessengerPrepareMessageSuite))
    18  }
    19  
    20  type TestMessengerPrepareMessageSuite struct {
    21  	MessengerBaseTestSuite
    22  	chatID string
    23  	p      *sqlitePersistence
    24  }
    25  
    26  func (s *TestMessengerPrepareMessageSuite) SetupTest() {
    27  	s.MessengerBaseTestSuite.SetupTest()
    28  	s.chatID, s.p = s.setUpTestDatabase()
    29  }
    30  
    31  func (s *TestMessengerPrepareMessageSuite) setUpTestDatabase() (string, *sqlitePersistence) {
    32  	chat := CreatePublicChat("test-chat", s.m.transport)
    33  	err := s.m.SaveChat(chat)
    34  	s.NoError(err)
    35  
    36  	db, err := openTestDB()
    37  	s.NoError(err)
    38  
    39  	p := newSQLitePersistence(db)
    40  	return chat.ID, p
    41  }
    42  
    43  func (s *TestMessengerPrepareMessageSuite) generateTextMessage(ID string, From string, Clock uint64, responseTo string) *common.Message {
    44  	return &common.Message{
    45  		ID:          ID,
    46  		From:        From,
    47  		LocalChatID: s.chatID,
    48  		ChatMessage: &protobuf.ChatMessage{
    49  			Text:       RandomLettersString(5),
    50  			Clock:      Clock,
    51  			ResponseTo: responseTo,
    52  		},
    53  	}
    54  }
    55  
    56  func (s *TestMessengerPrepareMessageSuite) testMessageContainsImage(testAlbum bool) {
    57  	message1 := s.generateTextMessage("id-1", "1", 1, "")
    58  	message1.ContentType = protobuf.ChatMessage_IMAGE
    59  	message1.Payload = &protobuf.ChatMessage_Image{
    60  		Image: &protobuf.ImageMessage{
    61  			Format:  1,
    62  			Payload: RandomBytes(10),
    63  		},
    64  	}
    65  
    66  	message2 := s.generateTextMessage("id-2", "2", 2, message1.ID)
    67  	messages := []*common.Message{message1, message2}
    68  
    69  	var message3 *common.Message
    70  
    71  	if testAlbum {
    72  		albumID := RandomLettersString(5)
    73  		message1.GetImage().AlbumId = albumID
    74  
    75  		message3 = s.generateTextMessage("id-3", "1", 0, "")
    76  		message3.ContentType = protobuf.ChatMessage_IMAGE
    77  		message3.Payload = &protobuf.ChatMessage_Image{
    78  			Image: &protobuf.ImageMessage{
    79  				Format:  1,
    80  				Payload: RandomBytes(10),
    81  				AlbumId: albumID,
    82  			},
    83  		}
    84  
    85  		messages = append(messages, message3)
    86  	}
    87  
    88  	err := s.m.SaveMessages(messages)
    89  	s.Require().NoError(err)
    90  
    91  	err = s.p.SaveMessages(messages)
    92  	s.Require().NoError(err)
    93  
    94  	mediaServer, err := server.NewMediaServer(s.m.database, nil, nil, nil)
    95  	s.Require().NoError(err)
    96  	s.Require().NoError(mediaServer.Start())
    97  
    98  	retrievedMessages, _, err := s.p.MessageByChatID(s.chatID, "", 10)
    99  	s.Require().NoError(err)
   100  	if testAlbum {
   101  		s.Require().Len(retrievedMessages, 3)
   102  	} else {
   103  		s.Require().Len(retrievedMessages, 2)
   104  	}
   105  	s.Require().Equal(message2.ID, retrievedMessages[0].ID)
   106  	s.Require().Equal(message1.ID, retrievedMessages[0].ResponseTo)
   107  
   108  	err = s.m.prepareMessage(retrievedMessages[0], mediaServer)
   109  	s.Require().NoError(err)
   110  
   111  	mediaServerImageLink := func(messageID string) string {
   112  		return fmt.Sprintf(`https://Localhost:%d/messages/images?messageId=%s`,
   113  			mediaServer.GetPort(),
   114  			messageID)
   115  	}
   116  
   117  	if testAlbum {
   118  		expectedJSON := fmt.Sprintf(`["%s","%s"]`,
   119  			mediaServerImageLink(message1.ID),
   120  			mediaServerImageLink(message3.ID),
   121  		)
   122  		s.Require().Equal(json.RawMessage(expectedJSON), retrievedMessages[0].QuotedMessage.AlbumImages)
   123  	} else {
   124  		expectedURL := mediaServerImageLink(message1.ID)
   125  		s.Require().Equal(expectedURL, retrievedMessages[0].QuotedMessage.ImageLocalURL)
   126  	}
   127  }
   128  
   129  func (s *TestMessengerPrepareMessageSuite) Test_WHEN_MessageContainsImage_THEN_preparedMessageAddsAlbumImageWithImageGeneratedLink() {
   130  	testCases := []struct {
   131  		name  string
   132  		album bool
   133  	}{
   134  		{
   135  			name:  "single image",
   136  			album: false,
   137  		},
   138  		{
   139  			name:  "album",
   140  			album: true,
   141  		},
   142  	}
   143  
   144  	for _, tc := range testCases {
   145  		s.Run(tc.name, func() {
   146  			s.testMessageContainsImage(tc.album)
   147  		})
   148  	}
   149  }
   150  
   151  func (s *TestMessengerPrepareMessageSuite) Test_WHEN_NoQuotedMessage_THEN_RetrievedMessageDoesNotContainQuotedMessage() {
   152  	message1 := s.generateTextMessage("id-1", "1", 1, "")
   153  	message2 := s.generateTextMessage("id-2", "2", 2, "")
   154  	messages := []*common.Message{message1, message2}
   155  
   156  	err := s.m.SaveMessages([]*common.Message{message1, message2})
   157  	s.Require().NoError(err)
   158  
   159  	err = s.p.SaveMessages(messages)
   160  	s.Require().NoError(err)
   161  
   162  	mediaServer, err := server.NewMediaServer(s.m.database, nil, nil, nil)
   163  	s.Require().NoError(err)
   164  	s.Require().NoError(mediaServer.Start())
   165  
   166  	retrievedMessages, _, err := s.p.MessageByChatID(s.chatID, "", 10)
   167  	s.Require().NoError(err)
   168  	s.Require().Equal(message2.ID, retrievedMessages[0].ID)
   169  	s.Require().Empty(retrievedMessages[0].ResponseTo)
   170  
   171  	err = s.m.prepareMessage(retrievedMessages[0], mediaServer)
   172  	s.Require().NoError(err)
   173  
   174  	s.Require().Equal((*common.QuotedMessage)(nil), retrievedMessages[0].QuotedMessage)
   175  }
   176  
   177  func (s *TestMessengerPrepareMessageSuite) Test_WHEN_QuotedMessageDoesNotContainsImage_THEN_RetrievedMessageContainsNoImages() {
   178  	message1 := s.generateTextMessage("id-1", "1", 1, "")
   179  	message2 := s.generateTextMessage("id-2", "2", 2, message1.ID)
   180  	messages := []*common.Message{message1, message2}
   181  
   182  	err := s.m.SaveMessages([]*common.Message{message1, message2})
   183  	s.Require().NoError(err)
   184  
   185  	err = s.p.SaveMessages(messages)
   186  	s.Require().NoError(err)
   187  
   188  	mediaServer, err := server.NewMediaServer(s.m.database, nil, nil, nil)
   189  	s.Require().NoError(err)
   190  	s.Require().NoError(mediaServer.Start())
   191  
   192  	retrievedMessages, _, err := s.p.MessageByChatID(s.chatID, "", 10)
   193  	s.Require().NoError(err)
   194  	s.Require().Equal(message2.ID, retrievedMessages[0].ID)
   195  	s.Require().Equal(message1.ID, retrievedMessages[0].ResponseTo)
   196  
   197  	err = s.m.prepareMessage(retrievedMessages[0], mediaServer)
   198  	s.Require().NoError(err)
   199  
   200  	s.Require().Equal(json.RawMessage(nil), retrievedMessages[0].QuotedMessage.AlbumImages)
   201  }
   202  
   203  func (s *TestMessengerPrepareMessageSuite) Test_WHEN_MessageContainsImage_THEN_PreparedMessageByIDContainsLink() {
   204  	// GIVEN: message with image saved to DB
   205  	message := s.generateTextMessage("id-1", "1", 1, "")
   206  	message.ContentType = protobuf.ChatMessage_IMAGE
   207  	message.Payload = &protobuf.ChatMessage_Image{
   208  		Image: &protobuf.ImageMessage{
   209  			Format:  1,
   210  			Payload: RandomBytes(100),
   211  		},
   212  	}
   213  
   214  	err := s.m.SaveMessages([]*common.Message{message})
   215  	s.Require().NoError(err)
   216  
   217  	mediaServer, err := server.NewMediaServer(s.m.database, nil, nil, nil)
   218  	s.Require().NoError(err)
   219  	s.Require().NoError(mediaServer.Start())
   220  	s.m.SetMediaServer(mediaServer)
   221  
   222  	// WHEN: message is prepared
   223  	loadedMessage, err := s.m.MessageByID(message.ID)
   224  	s.Require().NoError(err)
   225  
   226  	// THEN: message contains image link
   227  	s.Require().True(strings.HasPrefix(loadedMessage.ImageLocalURL, "https://Localhost"))
   228  }