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

     1  package protocol
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/status-im/status-go/protocol/encryption/multidevice"
    10  	"github.com/status-im/status-go/protocol/tt"
    11  	"github.com/status-im/status-go/services/browsers"
    12  
    13  	"github.com/stretchr/testify/suite"
    14  )
    15  
    16  func TestMessengerSyncBookmarkSuite(t *testing.T) {
    17  	suite.Run(t, new(MessengerSyncBookmarkSuite))
    18  }
    19  
    20  type MessengerSyncBookmarkSuite struct {
    21  	MessengerBaseTestSuite
    22  }
    23  
    24  func (s *MessengerSyncBookmarkSuite) TestSyncBookmark() {
    25  	//add bookmark
    26  	bookmark := browsers.Bookmark{
    27  		Name:    "status official site",
    28  		URL:     "https://status.im",
    29  		Removed: false,
    30  	}
    31  	_, err := s.m.browserDatabase.StoreBookmark(bookmark)
    32  	s.Require().NoError(err)
    33  
    34  	// pair
    35  	theirMessenger, err := newMessengerWithKey(s.shh, s.privateKey, s.logger, nil)
    36  	s.Require().NoError(err)
    37  
    38  	err = theirMessenger.SetInstallationMetadata(theirMessenger.installationID, &multidevice.InstallationMetadata{
    39  		Name:       "their-name",
    40  		DeviceType: "their-device-type",
    41  	})
    42  	s.Require().NoError(err)
    43  	response, err := theirMessenger.SendPairInstallation(context.Background(), nil)
    44  	s.Require().NoError(err)
    45  	s.Require().NotNil(response)
    46  	s.Require().Len(response.Chats(), 1)
    47  	s.Require().False(response.Chats()[0].Active)
    48  
    49  	// Wait for the message to reach its destination
    50  	response, err = WaitOnMessengerResponse(
    51  		s.m,
    52  		func(r *MessengerResponse) bool { return len(r.Installations()) > 0 },
    53  		"installation not received",
    54  	)
    55  
    56  	s.Require().NoError(err)
    57  	actualInstallation := response.Installations()[0]
    58  	s.Require().Equal(theirMessenger.installationID, actualInstallation.ID)
    59  	s.Require().NotNil(actualInstallation.InstallationMetadata)
    60  	s.Require().Equal("their-name", actualInstallation.InstallationMetadata.Name)
    61  	s.Require().Equal("their-device-type", actualInstallation.InstallationMetadata.DeviceType)
    62  
    63  	err = s.m.EnableInstallation(theirMessenger.installationID)
    64  	s.Require().NoError(err)
    65  
    66  	// sync
    67  	err = s.m.SyncBookmark(context.Background(), &bookmark, s.m.dispatchMessage)
    68  	s.Require().NoError(err)
    69  
    70  	// Wait for the message to reach its destination
    71  	err = tt.RetryWithBackOff(func() error {
    72  		response, err = theirMessenger.RetrieveAll()
    73  		if err != nil {
    74  			return err
    75  		}
    76  		if response.Bookmarks != nil {
    77  			return nil
    78  		}
    79  		return errors.New("Not received all bookmarks")
    80  	})
    81  
    82  	s.Require().NoError(err)
    83  
    84  	bookmarks, err := theirMessenger.browserDatabase.GetBookmarks()
    85  	s.Require().NoError(err)
    86  	s.Require().Equal(1, len(bookmarks))
    87  	s.Require().False(bookmarks[0].Removed)
    88  
    89  	// sync removed state
    90  	bookmark.Removed = true
    91  	err = s.m.SyncBookmark(context.Background(), &bookmark, s.m.dispatchMessage)
    92  	s.Require().NoError(err)
    93  
    94  	// Wait for the message to reach its destination
    95  	err = tt.RetryWithBackOff(func() error {
    96  		response, err = theirMessenger.RetrieveAll()
    97  		if err != nil {
    98  			return err
    99  		}
   100  		if response.Bookmarks != nil {
   101  			return nil
   102  		}
   103  		return errors.New("Not received all bookmarks")
   104  	})
   105  	bookmarks, err = theirMessenger.browserDatabase.GetBookmarks()
   106  	s.Require().NoError(err)
   107  	s.Require().Equal(1, len(bookmarks))
   108  	s.Require().True(bookmarks[0].Removed)
   109  
   110  	s.Require().NoError(theirMessenger.Shutdown())
   111  
   112  }
   113  
   114  func (s *MessengerSyncBookmarkSuite) TestGarbageCollectRemovedBookmarks() {
   115  
   116  	now := time.Now()
   117  
   118  	// Create bookmarks that are flagged as deleted for more than 30 days
   119  	bookmark1 := browsers.Bookmark{
   120  		Name:      "status official site",
   121  		URL:       "https://status.im",
   122  		Removed:   true,
   123  		DeletedAt: uint64(now.AddDate(0, 0, -31).Unix()),
   124  	}
   125  
   126  	bookmark2 := browsers.Bookmark{
   127  		Name:      "Uniswap",
   128  		URL:       "https://uniswap.org",
   129  		Removed:   true,
   130  		DeletedAt: uint64(now.AddDate(0, 0, -31).Unix()),
   131  	}
   132  
   133  	// This one is flagged for deletion less than 30 days
   134  	bookmark3 := browsers.Bookmark{
   135  		Name:      "Maker DAO",
   136  		URL:       "https://makerdao.com",
   137  		Removed:   true,
   138  		DeletedAt: uint64(now.AddDate(0, 0, -29).Unix()),
   139  	}
   140  
   141  	// Store bookmarks
   142  	_, err := s.m.browserDatabase.StoreBookmark(bookmark1)
   143  	s.Require().NoError(err)
   144  
   145  	_, err = s.m.browserDatabase.StoreBookmark(bookmark2)
   146  	s.Require().NoError(err)
   147  
   148  	_, err = s.m.browserDatabase.StoreBookmark(bookmark3)
   149  	s.Require().NoError(err)
   150  
   151  	bookmarks, err := s.m.browserDatabase.GetBookmarks()
   152  	s.Require().NoError(err)
   153  	s.Require().Len(bookmarks, 3)
   154  
   155  	// err = s.m.GarbageCollectRemovedBookmarks(&now)
   156  	err = s.m.GarbageCollectRemovedBookmarks()
   157  	s.Require().NoError(err)
   158  
   159  	bookmarks, err = s.m.browserDatabase.GetBookmarks()
   160  	s.Require().NoError(err)
   161  	s.Require().Len(bookmarks, 1)
   162  }