status-go/multiaccounts/settings_social_links/database_test.go

236 lines
6.6 KiB
Go

package sociallinkssettings
import (
"testing"
"github.com/stretchr/testify/require"
"github.com/status-im/status-go/appdatabase"
"github.com/status-im/status-go/protocol/identity"
)
func openTestDB(t *testing.T) (*SocialLinksSettings, func()) {
db, stop, err := appdatabase.SetupTestSQLDB("settings-social-links-tests-")
if err != nil {
require.NoError(t, stop())
}
require.NoError(t, err)
socialLinkSettings := NewSocialLinksSettings(db)
if err != nil {
require.NoError(t, stop())
}
require.NoError(t, err)
return socialLinkSettings, func() {
require.NoError(t, stop())
}
}
func profileSocialLinks() identity.SocialLinks {
return identity.SocialLinks{
{
Text: identity.TwitterID,
URL: "https://twitter.com/ethstatus",
},
{
Text: identity.TwitterID,
URL: "https://twitter.com/StatusIMBlog",
},
{
Text: identity.TelegramID,
URL: "dummy.telegram",
},
{
Text: identity.YoutubeID,
URL: "https://www.youtube.com/@Statusim",
},
{
Text: identity.YoutubeID,
URL: "https://www.youtube.com/@EthereumProtocol",
},
{
Text: "customLink",
URL: "customLink.com",
},
}
}
func TestProfileSocialLinksSaveAndGet(t *testing.T) {
socialLinkSettings, stop := openTestDB(t)
defer stop()
// db is empty at the beginning
links, err := socialLinkSettings.GetSocialLinks()
require.NoError(t, err)
require.Len(t, links, 0)
clock := uint64(1)
// add profile social links with new clock
profileSocialLinks1 := profileSocialLinks()[:2]
err = socialLinkSettings.AddOrReplaceSocialLinksIfNewer(profileSocialLinks1, clock)
require.NoError(t, err)
// check social links
links, err = socialLinkSettings.GetSocialLinks()
require.NoError(t, err)
require.Len(t, links, len(profileSocialLinks1))
require.True(t, profileSocialLinks1.Equal(links))
oldClock := uint64(0)
// delete add profile social links with old clock
profileSocialLinks2 := profileSocialLinks()
err = socialLinkSettings.AddOrReplaceSocialLinksIfNewer(profileSocialLinks2, oldClock)
require.Error(t, err)
require.Equal(t, err, ErrOlderSocialLinksProvided)
// check social links
links, err = socialLinkSettings.GetSocialLinks()
require.NoError(t, err)
require.Len(t, links, len(profileSocialLinks1))
require.True(t, profileSocialLinks1.Equal(links))
// check clock
dbClock, err := socialLinkSettings.GetSocialLinksClock()
require.NoError(t, err)
require.Equal(t, clock, dbClock)
}
func TestProfileSocialLinksUpdate(t *testing.T) {
socialLinkSettings, stop := openTestDB(t)
defer stop()
// db is empty at the beginning
links, err := socialLinkSettings.GetSocialLinks()
require.NoError(t, err)
require.Len(t, links, 0)
clock := uint64(1)
// add profile social links
profileSocialLinks := profileSocialLinks()
err = socialLinkSettings.AddOrReplaceSocialLinksIfNewer(profileSocialLinks, clock)
require.NoError(t, err)
clock = 2
// test social link update
updateLinkAtIndex := 2
profileSocialLinks[updateLinkAtIndex].Text = identity.GithubID
profileSocialLinks[updateLinkAtIndex].URL = "https://github.com/status-im"
err = socialLinkSettings.AddOrReplaceSocialLinksIfNewer(profileSocialLinks, clock)
require.NoError(t, err)
// check social links
links, err = socialLinkSettings.GetSocialLinks()
require.NoError(t, err)
require.Len(t, links, len(profileSocialLinks))
require.True(t, profileSocialLinks.Equal(links))
// check clock
dbClock, err := socialLinkSettings.GetSocialLinksClock()
require.NoError(t, err)
require.Equal(t, clock, dbClock)
}
func TestProfileSocialLinksDelete(t *testing.T) {
socialLinkSettings, stop := openTestDB(t)
defer stop()
// db is empty at the beginning
links, err := socialLinkSettings.GetSocialLinks()
require.NoError(t, err)
require.Len(t, links, 0)
clock := uint64(1)
// add profile social links
profileSocialLinks := profileSocialLinks()
totalLinks := len(profileSocialLinks)
err = socialLinkSettings.AddOrReplaceSocialLinksIfNewer(profileSocialLinks, clock)
require.NoError(t, err)
// check
links, err = socialLinkSettings.GetSocialLinks()
require.NoError(t, err)
require.Len(t, links, totalLinks)
require.True(t, profileSocialLinks.Equal(links))
// prepare new links to save
removeLinkAtIndex := 2
removedLink := profileSocialLinks[removeLinkAtIndex]
profileSocialLinks = append(profileSocialLinks[:removeLinkAtIndex], profileSocialLinks[removeLinkAtIndex+1:]...)
oldClock := uint64(0)
// test delete with old clock
err = socialLinkSettings.AddOrReplaceSocialLinksIfNewer(profileSocialLinks, oldClock)
require.Error(t, err)
require.Equal(t, err, ErrOlderSocialLinksProvided)
// check
links, err = socialLinkSettings.GetSocialLinks()
require.NoError(t, err)
require.Len(t, links, totalLinks)
require.True(t, links.Contains(removedLink))
clock = 2
// test delete link new clock
err = socialLinkSettings.AddOrReplaceSocialLinksIfNewer(profileSocialLinks, clock)
require.NoError(t, err)
// check social links
links, err = socialLinkSettings.GetSocialLinks()
require.NoError(t, err)
require.Len(t, links, totalLinks-1)
require.True(t, profileSocialLinks.Equal(links))
require.False(t, links.Contains(removedLink))
// check clock
dbClock, err := socialLinkSettings.GetSocialLinksClock()
require.NoError(t, err)
require.Equal(t, clock, dbClock)
}
func TestProfileSocialLinksReorder(t *testing.T) {
socialLinkSettings, stop := openTestDB(t)
defer stop()
// db is empty at the beginning
links, err := socialLinkSettings.GetSocialLinks()
require.NoError(t, err)
require.Len(t, links, 0)
clock := uint64(1)
// add profile social links
profileSocialLinks := profileSocialLinks()
totalLinks := len(profileSocialLinks)
err = socialLinkSettings.AddOrReplaceSocialLinksIfNewer(profileSocialLinks, clock)
require.NoError(t, err)
// check social links
links, err = socialLinkSettings.GetSocialLinks()
require.NoError(t, err)
require.Len(t, links, len(profileSocialLinks))
require.True(t, profileSocialLinks.Equal(links))
var randomLinksOrder identity.SocialLinks
for i := len(profileSocialLinks) - 1; i >= 3; i-- {
randomLinksOrder = append(randomLinksOrder, profileSocialLinks[i])
}
randomLinksOrder = append(randomLinksOrder, profileSocialLinks[:3]...)
clock = 2
// test reorder links
err = socialLinkSettings.AddOrReplaceSocialLinksIfNewer(randomLinksOrder, clock)
require.NoError(t, err)
// check social links
links, err = socialLinkSettings.GetSocialLinks()
require.NoError(t, err)
require.Len(t, randomLinksOrder, totalLinks)
require.True(t, randomLinksOrder.Equal(links))
// check clock
dbClock, err := socialLinkSettings.GetSocialLinksClock()
require.NoError(t, err)
require.Equal(t, clock, dbClock)
}