status-go/multiaccounts/settings_wallet/database_test.go

468 lines
16 KiB
Go

package walletsettings
import (
"encoding/json"
"testing"
"github.com/stretchr/testify/require"
"github.com/status-im/status-go/appdatabase"
"github.com/status-im/status-go/multiaccounts/settings"
"github.com/status-im/status-go/params"
"github.com/status-im/status-go/t/helpers"
)
var (
config = params.NodeConfig{
NetworkID: 10,
DataDir: "test",
}
networks = json.RawMessage("{}")
settingsObj = settings.Settings{
Networks: &networks,
}
)
func setupTestDB(t *testing.T) (*WalletSettings, func()) {
db, stop, err := helpers.SetupTestSQLDB(appdatabase.DbInitializer{}, "settings-wallet-tests-")
require.NoError(t, err)
settDb, err := settings.MakeNewDB(db)
require.NoError(t, err)
err = settDb.CreateSettings(settingsObj, config)
require.NoError(t, err)
walletSettings := NewWalletSettings(db)
return walletSettings, func() { require.NoError(t, stop()) }
}
func TestSetClockOfLastTokenPreferencesChange(t *testing.T) {
walletSettings, stop := setupTestDB(t)
defer stop()
clock, err := walletSettings.GetClockOfLastTokenPreferencesChange()
require.NoError(t, err)
require.Equal(t, uint64(0), clock)
err = walletSettings.setClockOfLastTokenPreferencesChange(nil, 123)
require.Error(t, err)
tx, err := walletSettings.db.Begin()
require.NoError(t, err)
err = walletSettings.setClockOfLastTokenPreferencesChange(tx, 123)
require.NoError(t, err)
err = tx.Commit()
require.NoError(t, err)
clock, err = walletSettings.GetClockOfLastTokenPreferencesChange()
require.NoError(t, err)
require.Equal(t, uint64(123), clock)
}
func TestGetTokenPreferencesEmpty(t *testing.T) {
walletSettings, stop := setupTestDB(t)
defer stop()
preferences, err := walletSettings.GetTokenPreferences(true)
require.NoError(t, err)
require.Equal(t, 0, len(preferences))
preferences, err = walletSettings.GetTokenPreferences(false)
require.NoError(t, err)
require.Equal(t, 0, len(preferences))
}
func TestUpdateTokenPreferencesEmpty(t *testing.T) {
walletSettings, stop := setupTestDB(t)
defer stop()
err := walletSettings.UpdateTokenPreferences([]TokenPreferences{}, false, false, 0)
require.Error(t, err)
err = walletSettings.UpdateTokenPreferences([]TokenPreferences{}, false, true, 0)
require.Error(t, err)
}
func TestUpdateTokenPreferencesTestnet(t *testing.T) {
walletSettings, stop := setupTestDB(t)
defer stop()
err := walletSettings.UpdateTokenPreferences([]TokenPreferences{
{"SNT", 0, -1, false, ""},
}, false, true, 0)
require.NoError(t, err)
// Mainnet is not affected by testnet preferences
preferences, err := walletSettings.GetTokenPreferences(false)
require.NoError(t, err)
require.Equal(t, 0, len(preferences))
preferences, err = walletSettings.GetTokenPreferences(true)
require.NoError(t, err)
require.Equal(t, 1, len(preferences))
require.Equal(t, "SNT", preferences[0].Key)
require.Equal(t, 0, preferences[0].Position)
require.Equal(t, -1, preferences[0].GroupPosition)
require.Equal(t, false, preferences[0].Visible)
require.Equal(t, "", preferences[0].CommunityID)
// Inserting into testnet doesn't affect mainnet
err = walletSettings.UpdateTokenPreferences([]TokenPreferences{
{"ABC0", 0, -1, true, ""},
{"ABC1", 1, -1, true, ""},
}, false, false, 0)
require.NoError(t, err)
err = walletSettings.UpdateTokenPreferences([]TokenPreferences{
{"ABC0", 1, -1, true, ""},
{"ABC1", 0, -1, true, ""},
}, false, true, 0)
require.NoError(t, err)
// Having same symbols on mainnet and testnet is allowed
preferences, err = walletSettings.GetTokenPreferences(true)
require.NoError(t, err)
require.Equal(t, 2, len(preferences))
require.Equal(t, "ABC0", preferences[0].Key)
require.Equal(t, 1, preferences[0].Position)
require.Equal(t, -1, preferences[0].GroupPosition)
require.Equal(t, true, preferences[0].Visible)
require.Equal(t, "", preferences[0].CommunityID)
require.Equal(t, "ABC1", preferences[1].Key)
require.Equal(t, 0, preferences[1].Position)
require.Equal(t, -1, preferences[1].GroupPosition)
require.Equal(t, true, preferences[1].Visible)
require.Equal(t, "", preferences[1].CommunityID)
preferences, err = walletSettings.GetTokenPreferences(false)
require.NoError(t, err)
require.Equal(t, 2, len(preferences))
require.Equal(t, "ABC0", preferences[0].Key)
require.Equal(t, 0, preferences[0].Position)
require.Equal(t, -1, preferences[0].GroupPosition)
require.Equal(t, true, preferences[0].Visible)
require.Equal(t, "", preferences[0].CommunityID)
require.Equal(t, "ABC1", preferences[1].Key)
require.Equal(t, 1, preferences[1].Position)
require.Equal(t, -1, preferences[1].GroupPosition)
require.Equal(t, true, preferences[1].Visible)
require.Equal(t, "", preferences[1].CommunityID)
}
func TestUpdateTokenPreferencesRollback(t *testing.T) {
db, stop := setupTestDB(t)
defer stop()
err := db.UpdateTokenPreferences([]TokenPreferences{
{"SNT", 0, -1, false, ""},
}, false, true, 0)
require.NoError(t, err)
// Duplicate is not allowed
err = db.UpdateTokenPreferences([]TokenPreferences{
{"ABC", 0, -1, false, ""},
{"ABC", 0, -1, true, ""},
}, false, true, 0)
require.Error(t, err)
// Rolled back to previous state
preferences, err := db.GetTokenPreferences(true)
require.NoError(t, err)
require.Equal(t, 1, len(preferences))
require.Equal(t, "SNT", preferences[0].Key)
require.Equal(t, 0, preferences[0].Position)
require.Equal(t, -1, preferences[0].GroupPosition)
require.Equal(t, false, preferences[0].Visible)
require.Equal(t, "", preferences[0].CommunityID)
}
func TestTokenPrefrencesGroupByCommunity(t *testing.T) {
walletSettings, stop := setupTestDB(t)
defer stop()
communityID01 := "0x000001"
communityID02 := "0x000002"
err := walletSettings.UpdateTokenPreferences([]TokenPreferences{
{"SNT", 0, -1, true, ""},
{"ETH", 1, -1, true, ""},
{"T01", 0, -1, true, communityID01},
{"T02", 1, -1, true, communityID01},
}, false, true, 0)
require.NoError(t, err)
preferences, err := walletSettings.GetTokenPreferences(true)
require.NoError(t, err)
require.Equal(t, 4, len(preferences))
require.Equal(t, "SNT", preferences[0].Key)
require.Equal(t, 0, preferences[0].Position)
require.Equal(t, -1, preferences[0].GroupPosition)
require.Equal(t, true, preferences[0].Visible)
require.Equal(t, "", preferences[0].CommunityID)
require.Equal(t, "ETH", preferences[1].Key)
require.Equal(t, 1, preferences[1].Position)
require.Equal(t, -1, preferences[1].GroupPosition)
require.Equal(t, true, preferences[1].Visible)
require.Equal(t, "", preferences[1].CommunityID)
require.Equal(t, "T01", preferences[2].Key)
require.Equal(t, 0, preferences[2].Position)
require.Equal(t, -1, preferences[2].GroupPosition)
require.Equal(t, true, preferences[2].Visible)
require.Equal(t, communityID01, preferences[2].CommunityID)
require.Equal(t, "T02", preferences[3].Key)
require.Equal(t, 1, preferences[3].Position)
require.Equal(t, -1, preferences[3].GroupPosition)
require.Equal(t, true, preferences[3].Visible)
require.Equal(t, communityID01, preferences[3].CommunityID)
err = walletSettings.UpdateTokenPreferences([]TokenPreferences{
{"SNT", 0, -1, true, ""},
{"ETH", 1, -1, true, ""},
{"T01", 0, 1, true, communityID01},
{"T02", 1, 0, true, communityID01},
{"T03", 0, 0, true, communityID02},
}, false, true, 0)
require.NoError(t, err)
preferences, err = walletSettings.GetTokenPreferences(true)
require.NoError(t, err)
require.Equal(t, 5, len(preferences))
require.Equal(t, "SNT", preferences[0].Key)
require.Equal(t, 0, preferences[0].Position)
require.Equal(t, -1, preferences[0].GroupPosition)
require.Equal(t, true, preferences[0].Visible)
require.Equal(t, "", preferences[0].CommunityID)
require.Equal(t, "ETH", preferences[1].Key)
require.Equal(t, 1, preferences[1].Position)
require.Equal(t, -1, preferences[1].GroupPosition)
require.Equal(t, true, preferences[1].Visible)
require.Equal(t, "", preferences[1].CommunityID)
require.Equal(t, "T01", preferences[2].Key)
require.Equal(t, 0, preferences[2].Position)
require.Equal(t, 1, preferences[2].GroupPosition)
require.Equal(t, true, preferences[2].Visible)
require.Equal(t, communityID01, preferences[2].CommunityID)
require.Equal(t, "T02", preferences[3].Key)
require.Equal(t, 1, preferences[3].Position)
require.Equal(t, 0, preferences[3].GroupPosition)
require.Equal(t, true, preferences[3].Visible)
require.Equal(t, communityID01, preferences[3].CommunityID)
require.Equal(t, "T03", preferences[4].Key)
require.Equal(t, 0, preferences[4].Position)
require.Equal(t, 0, preferences[4].GroupPosition)
require.Equal(t, true, preferences[4].Visible)
require.Equal(t, communityID02, preferences[4].CommunityID)
// Insert not full group positioning (one group has -1 group position)
err = walletSettings.UpdateTokenPreferences([]TokenPreferences{
{"SNT", 0, -1, true, ""},
{"ETH", 1, -1, true, ""},
{"T01", 0, 1, true, communityID01},
{"T02", 1, 0, true, communityID01},
{"T03", 0, -1, true, communityID02},
}, true, true, 0)
require.Error(t, err)
// Group by community is disabled so there's no check for proper grouping
err = walletSettings.UpdateTokenPreferences([]TokenPreferences{
{"SNT", 0, -1, true, ""},
{"ETH", 1, -1, true, ""},
{"T01", 0, 1, true, communityID01},
{"T02", 1, 0, true, communityID01},
{"T03", 0, -1, true, communityID02},
}, false, true, 0)
require.NoError(t, err)
// Insert not full group positioning with invsibile item set
err = walletSettings.UpdateTokenPreferences([]TokenPreferences{
{"SNT", 0, -1, true, ""},
{"ETH", 1, -1, true, ""},
{"T01", 0, 1, true, communityID01},
{"T02", 1, 0, true, communityID01},
{"T03", 0, -1, false, communityID02},
}, true, true, 0)
require.NoError(t, err)
}
func TestUpdateTokenPreferencesSettings(t *testing.T) {
walletSettings, stop := setupTestDB(t)
defer stop()
preferences := []TokenPreferences{
{"SNT", 0, -1, true, ""},
{"ETH", 1, -1, true, ""},
{"T01", 0, 1, true, "0x000001"},
{"T02", 1, 0, true, "0x000001"},
}
err := walletSettings.UpdateTokenPreferences(preferences, true, true, 123)
require.NoError(t, err)
// Verify that the preferences are updated correctly
prefs, err := walletSettings.GetTokenPreferences(true)
require.NoError(t, err)
require.Equal(t, len(preferences), len(prefs))
for i := range preferences {
require.Equal(t, preferences[i], prefs[i])
}
// Verify that the clock is updated
clock, err := walletSettings.GetClockOfLastTokenPreferencesChange()
require.NoError(t, err)
require.True(t, clock > 0)
}
func TestSetClockOfLastCollectiblePreferencesChange(t *testing.T) {
walletSettings, stop := setupTestDB(t)
defer stop()
clock, err := walletSettings.GetClockOfLastCollectiblePreferencesChange()
require.NoError(t, err)
require.Equal(t, uint64(0), clock)
err = walletSettings.setClockOfLastCollectiblePreferencesChange(nil, 123)
require.Error(t, err)
tx, err := walletSettings.db.Begin()
require.NoError(t, err)
err = walletSettings.setClockOfLastCollectiblePreferencesChange(tx, 123)
require.NoError(t, err)
err = tx.Commit()
require.NoError(t, err)
clock, err = walletSettings.GetClockOfLastCollectiblePreferencesChange()
require.NoError(t, err)
require.Equal(t, uint64(123), clock)
}
func TestGetCollectiblePreferencesEmpty(t *testing.T) {
walletSettings, stop := setupTestDB(t)
defer stop()
preferences, err := walletSettings.GetCollectiblePreferences(true)
require.NoError(t, err)
require.Equal(t, 0, len(preferences))
preferences, err = walletSettings.GetCollectiblePreferences(false)
require.NoError(t, err)
require.Equal(t, 0, len(preferences))
}
func TestUpdateCollectiblePreferencesEmpty(t *testing.T) {
walletSettings, stop := setupTestDB(t)
defer stop()
err := walletSettings.UpdateCollectiblePreferences([]CollectiblePreferences{}, false, false, false, 0)
require.Error(t, err)
err = walletSettings.UpdateCollectiblePreferences([]CollectiblePreferences{}, false, false, true, 0)
require.Error(t, err)
}
func TestUpdateCollectiblePreferencesTestnet(t *testing.T) {
walletSettings, stop := setupTestDB(t)
defer stop()
err := walletSettings.UpdateCollectiblePreferences([]CollectiblePreferences{
{CollectiblePreferencesTypeNonCommunityCollectible, "First", 0, false},
}, false, false, true, 0)
require.NoError(t, err)
// Mainnet is not affected by testnet preferences
preferences, err := walletSettings.GetCollectiblePreferences(false)
require.NoError(t, err)
require.Equal(t, 0, len(preferences))
preferences, err = walletSettings.GetCollectiblePreferences(true)
require.NoError(t, err)
require.Equal(t, 1, len(preferences))
require.Equal(t, CollectiblePreferencesTypeNonCommunityCollectible, preferences[0].Type)
require.Equal(t, "First", preferences[0].Key)
require.Equal(t, 0, preferences[0].Position)
require.Equal(t, false, preferences[0].Visible)
// Inserting into testnet doesn't affect mainnet
err = walletSettings.UpdateCollectiblePreferences([]CollectiblePreferences{
{CollectiblePreferencesTypeNonCommunityCollectible, "First", 0, true},
{CollectiblePreferencesTypeNonCommunityCollectible, "Second", 1, true},
}, false, false, false, 0)
require.NoError(t, err)
err = walletSettings.UpdateCollectiblePreferences([]CollectiblePreferences{
{CollectiblePreferencesTypeCommunityCollectible, "First", 1, true},
{CollectiblePreferencesTypeCommunityCollectible, "Second", 2, true},
}, false, false, true, 0)
require.NoError(t, err)
// Having same symbols on mainnet and testnet is allowed
preferences, err = walletSettings.GetCollectiblePreferences(true)
require.NoError(t, err)
require.Equal(t, 2, len(preferences))
require.Equal(t, CollectiblePreferencesTypeCommunityCollectible, preferences[0].Type)
require.Equal(t, "First", preferences[0].Key)
require.Equal(t, 1, preferences[0].Position)
require.Equal(t, true, preferences[0].Visible)
require.Equal(t, CollectiblePreferencesTypeCommunityCollectible, preferences[1].Type)
require.Equal(t, "Second", preferences[1].Key)
require.Equal(t, 2, preferences[1].Position)
require.Equal(t, true, preferences[1].Visible)
preferences, err = walletSettings.GetCollectiblePreferences(false)
require.NoError(t, err)
require.Equal(t, 2, len(preferences))
require.Equal(t, CollectiblePreferencesTypeNonCommunityCollectible, preferences[0].Type)
require.Equal(t, "First", preferences[0].Key)
require.Equal(t, 0, preferences[0].Position)
require.Equal(t, true, preferences[0].Visible)
require.Equal(t, CollectiblePreferencesTypeNonCommunityCollectible, preferences[1].Type)
require.Equal(t, "Second", preferences[1].Key)
require.Equal(t, 1, preferences[1].Position)
require.Equal(t, true, preferences[1].Visible)
}
func TestUpdateCollectiblePreferencesRollback(t *testing.T) {
db, stop := setupTestDB(t)
defer stop()
err := db.UpdateCollectiblePreferences([]CollectiblePreferences{
{CollectiblePreferencesTypeNonCommunityCollectible, "First", 0, false},
}, false, false, true, 0)
require.NoError(t, err)
// Duplicate is not allowed
err = db.UpdateCollectiblePreferences([]CollectiblePreferences{
{CollectiblePreferencesTypeNonCommunityCollectible, "Second", -1, false},
{CollectiblePreferencesTypeNonCommunityCollectible, "Third", -1, false},
}, false, false, true, 0)
require.Error(t, err)
// Rolled back to previous state
preferences, err := db.GetCollectiblePreferences(true)
require.NoError(t, err)
require.Equal(t, 1, len(preferences))
require.Equal(t, CollectiblePreferencesTypeNonCommunityCollectible, preferences[0].Type)
require.Equal(t, "First", preferences[0].Key)
require.Equal(t, 0, preferences[0].Position)
require.Equal(t, false, preferences[0].Visible)
}
func TestUpdateCollectiblePreferencesSettings(t *testing.T) {
walletSettings, stop := setupTestDB(t)
defer stop()
preferences := []CollectiblePreferences{
{CollectiblePreferencesTypeNonCommunityCollectible, "First", 0, false},
{CollectiblePreferencesTypeCommunityCollectible, "Second", 1, true},
{CollectiblePreferencesTypeCollection, "Third", 2, false},
{CollectiblePreferencesTypeCommunity, "Fourth", 3, true},
}
err := walletSettings.UpdateCollectiblePreferences(preferences, true, true, true, 123)
require.NoError(t, err)
// Verify that the preferences are updated correctly
prefs, err := walletSettings.GetCollectiblePreferences(true)
require.NoError(t, err)
require.Equal(t, len(preferences), len(prefs))
for i := range preferences {
require.Equal(t, preferences[i], prefs[i])
}
// Verify that the clock is updated
clock, err := walletSettings.GetClockOfLastCollectiblePreferencesChange()
require.NoError(t, err)
require.True(t, clock > 0)
}