@@ -211,6 +211,13 @@ func (s *MessengerLocalBackupSuite) TestLocalBackup() {
211211 alice := s .newMessenger ()
212212 defer TearDownMessenger (& s .Suite , alice )
213213
214+ err = makeMutualContacts (bob1 , alice )
215+ s .Require ().NoError (err )
216+
217+ aliceContact := bob1 .GetContactByID (alice .selfContact .ID )
218+ err = bob1 .persistence .SaveContact (aliceContact , nil )
219+ s .Require ().NoError (err )
220+
214221 ourOneOneChat := CreateOneToOneChat ("Our 1TO1" , & alice .identity .PublicKey , alice .getTimesource ())
215222 err = bob1 .SaveChat (ourOneOneChat )
216223 s .Require ().NoError (err )
@@ -223,6 +230,46 @@ func (s *MessengerLocalBackupSuite) TestLocalBackup() {
223230 _ , err = bob1 .SendChatMessage (ctx , transactionMessage )
224231 s .Require ().NoError (err )
225232
233+ // Alice sends a message to bob1
234+ inputMessage = buildTestMessage (* theirChat )
235+ inputMessage .Text = "some text from alice"
236+ sendResponse , err = alice .SendChatMessage (context .Background (), inputMessage )
237+ s .NoError (err )
238+ s .Require ().Len (sendResponse .Messages (), 1 )
239+
240+ response , err = WaitOnMessengerResponse (
241+ bob1 ,
242+ func (r * MessengerResponse ) bool {
243+ return len (r .messages ) > 0 && r .Messages ()[0 ].Text == "some text from alice"
244+ },
245+ "no messages" ,
246+ )
247+ s .Require ().NoError (err )
248+ s .Require ().Len (response .Chats (), 1 )
249+ s .Require ().Len (response .Messages (), 1 )
250+
251+ // Validate contacts on bob1
252+ contact1 := bob1 .GetContactByID (contactID1 )
253+ s .Require ().NotNil (contact1 )
254+ s .Require ().Equal (ContactRequestStateSent , contact1 .ContactRequestLocalState )
255+ s .Require ().Equal (ContactRequestStateNone , contact1 .ContactRequestRemoteState )
256+ s .Require ().True (contact1 .added ())
257+
258+ contact2 := bob1 .GetContactByID (contactID2 )
259+ s .Require ().NotNil (contact2 )
260+ s .Require ().Equal (ContactRequestStateSent , contact2 .ContactRequestLocalState )
261+ s .Require ().Equal (ContactRequestStateNone , contact2 .ContactRequestRemoteState )
262+ s .Require ().True (contact2 .added ())
263+
264+ aliceContact = bob1 .GetContactByID (alice .selfContact .ID )
265+ s .Require ().NotNil (aliceContact )
266+ s .Require ().Equal (ContactRequestStateSent , aliceContact .ContactRequestLocalState )
267+ s .Require ().Equal (ContactRequestStateReceived , aliceContact .ContactRequestRemoteState )
268+ s .Require ().True (aliceContact .added ())
269+
270+ // Check that bob2 has no contacts
271+ s .Require ().Len (bob2 .Contacts (), 0 )
272+
226273 // -------------------- BACKUP --------------------
227274 // Backup
228275 marshalledBackup , err := bob1 .ExportBackup ()
@@ -234,7 +281,23 @@ func (s *MessengerLocalBackupSuite) TestLocalBackup() {
234281
235282 // -------------------- VALIDATE BACKUP --------------------
236283 // Validate contacts on bob2
237- s .Require ().Len (bob2 .Contacts (), 2 )
284+ contact1 = bob2 .GetContactByID (contactID1 )
285+ s .Require ().NotNil (contact1 )
286+ s .Require ().Equal (ContactRequestStateSent , contact1 .ContactRequestLocalState )
287+ s .Require ().Equal (ContactRequestStateNone , contact1 .ContactRequestRemoteState )
288+ s .Require ().True (contact1 .added ())
289+
290+ contact2 = bob2 .GetContactByID (contactID2 )
291+ s .Require ().NotNil (contact2 )
292+ s .Require ().Equal (ContactRequestStateSent , contact2 .ContactRequestLocalState )
293+ s .Require ().Equal (ContactRequestStateNone , contact2 .ContactRequestRemoteState )
294+ s .Require ().True (contact2 .added ())
295+
296+ aliceContact = bob2 .GetContactByID (alice .selfContact .ID )
297+ s .Require ().NotNil (aliceContact )
298+ s .Require ().Equal (ContactRequestStateSent , aliceContact .ContactRequestLocalState )
299+ s .Require ().Equal (ContactRequestStateReceived , aliceContact .ContactRequestRemoteState )
300+ s .Require ().True (aliceContact .added ())
238301
239302 // Validate communities on bob2
240303 communities , err = bob2 .JoinedCommunities ()
@@ -254,43 +317,54 @@ func (s *MessengerLocalBackupSuite) TestLocalBackup() {
254317 s .Require ().Equal ("" , chat .Name )
255318
256319 // Validate messages
257- s .Require ().NoError (err )
258320 messages , err := bob2 .persistence .AllMessagesForBackup ()
259321 s .Require ().NoError (err )
260322 s .Require ().Len (messages , 14 )
261323
262- textMessageFound := false
263- mdMessageFound := false
264- imageMessageFound := false
265- stickerMessageFound := false
266- emojiMessageFound := false
267- txMessageFound := false
268- pinnedSystemMessageFound := false
324+ // Build a map for easier assertions
325+ messageMap := make (map [string ]* protobuf.BackedUpMessage )
269326 for _ , msg := range messages {
270- if msg .ContentType == int64 (protobuf .ChatMessage_TEXT_PLAIN ) && msg .Text == "some text" {
271- textMessageFound = true
272- s .Require ().True (msg .PinnedBy == bob2 .selfContact .ID )
273- } else if msg .ContentType == int64 (protobuf .ChatMessage_TEXT_PLAIN ) && msg .Text == "some *markdown* text" {
274- mdMessageFound = true
275- } else if msg .ContentType == int64 (protobuf .ChatMessage_IMAGE ) && msg .Text == "some image" {
276- imageMessageFound = true
277- } else if msg .ContentType == int64 (protobuf .ChatMessage_STICKER ) && msg .Text == "some sticker" {
278- stickerMessageFound = true
279- } else if msg .ContentType == int64 (protobuf .ChatMessage_EMOJI ) && msg .Text == ":+1:" {
280- emojiMessageFound = true
281- } else if msg .ContentType == int64 (protobuf .ChatMessage_TRANSACTION_COMMAND ) && msg .Text == "some transaction" {
282- txMessageFound = true
283- } else if msg .ContentType == int64 (protobuf .ChatMessage_SYSTEM_MESSAGE_PINNED_MESSAGE ) && msg .Text == "" {
284- pinnedSystemMessageFound = true
327+ if msg .ContentType == int64 (protobuf .ChatMessage_SYSTEM_MESSAGE_PINNED_MESSAGE ) && msg .Text == "" {
328+ // For system pinned message, Text is empty so we use a custom key
329+ messageMap ["systemPin" ] = msg
330+ continue
285331 }
332+ messageMap [msg .Text ] = msg
286333 }
287- s .Require ().True (textMessageFound )
288- s .Require ().True (mdMessageFound )
289- s .Require ().True (imageMessageFound )
290- s .Require ().True (stickerMessageFound )
291- s .Require ().True (emojiMessageFound )
292- s .Require ().True (txMessageFound )
293- s .Require ().True (pinnedSystemMessageFound )
334+
335+ // Assert each message type exists and has expected properties
336+ textMsg , ok := messageMap ["some text" ]
337+ s .Require ().True (ok )
338+ s .Require ().Equal (int64 (protobuf .ChatMessage_TEXT_PLAIN ), textMsg .ContentType )
339+ s .Require ().Equal (bob2 .selfContact .ID , textMsg .PinnedBy )
340+
341+ mdMsg , ok := messageMap ["some *markdown* text" ]
342+ s .Require ().True (ok )
343+ s .Require ().Equal (int64 (protobuf .ChatMessage_TEXT_PLAIN ), mdMsg .ContentType )
344+
345+ imageMsg , ok := messageMap ["some image" ]
346+ s .Require ().True (ok )
347+ s .Require ().Equal (int64 (protobuf .ChatMessage_IMAGE ), imageMsg .ContentType )
348+
349+ stickerMsg , ok := messageMap ["some sticker" ]
350+ s .Require ().True (ok )
351+ s .Require ().Equal (int64 (protobuf .ChatMessage_STICKER ), stickerMsg .ContentType )
352+
353+ emojiMsg , ok := messageMap [":+1:" ]
354+ s .Require ().True (ok )
355+ s .Require ().Equal (int64 (protobuf .ChatMessage_EMOJI ), emojiMsg .ContentType )
356+
357+ txMsg , ok := messageMap ["some transaction" ]
358+ s .Require ().True (ok )
359+ s .Require ().Equal (int64 (protobuf .ChatMessage_TRANSACTION_COMMAND ), txMsg .ContentType )
360+
361+ aliceMsg , ok := messageMap ["some text from alice" ]
362+ s .Require ().True (ok )
363+ s .Require ().Equal (int64 (protobuf .ChatMessage_TEXT_PLAIN ), aliceMsg .ContentType )
364+
365+ systemPinMsg , ok := messageMap ["systemPin" ]
366+ s .Require ().True (ok )
367+ s .Require ().Equal ("" , systemPinMsg .Text )
294368
295369 // Validate pinned messages
296370 pinnedMessages , _ , err := bob2 .PinnedMessageByChatID (chatID , "" , 10 )
0 commit comments