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 }