status-im/status-go

View on GitHub
multiaccounts/settings/database_test.go

Summary

Maintainability
A
0 mins
Test Coverage
package settings

import (
    "encoding/json"
    "os"
    "testing"

    "github.com/stretchr/testify/require"

    "github.com/status-im/status-go/appdatabase"
    "github.com/status-im/status-go/common/dbsetup"
    "github.com/status-im/status-go/eth-node/types"
    "github.com/status-im/status-go/multiaccounts/errors"
    "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("{}")
    settings = Settings{
        Address:                             types.HexToAddress("0xdC540f3745Ff2964AFC1171a5A0DD726d1F6B472"),
        AnonMetricsShouldSend:               false,
        CurrentNetwork:                      "mainnet_rpc",
        DappsAddress:                        types.HexToAddress("0xD1300f99fDF7346986CbC766903245087394ecd0"),
        InstallationID:                      "d3efcff6-cffa-560e-a547-21d3858cbc51",
        KeyUID:                              "0x4e8129f3edfc004875be17bf468a784098a9f69b53c095be1f52deff286935ab",
        BackupEnabled:                       true,
        LatestDerivedPath:                   0,
        Name:                                "Jittery Cornflowerblue Kingbird",
        Networks:                            &networks,
        PhotoPath:                           "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAIAAACRXR/mAAAAjklEQVR4nOzXwQmFMBAAUZXUYh32ZB32ZB02sxYQQSZGsod55/91WFgSS0RM+SyjA56ZRZhFmEWYRRT6h+M6G16zrxv6fdJpmUWYRbxsYr13dKfanpN0WmYRZhGzXz6AWYRZRIfbaX26fT9Jk07LLMIsosPt9I/dTDotswizCG+nhFmEWYRZhFnEHQAA///z1CFkYamgfQAAAABJRU5ErkJggg==",
        PreviewPrivacy:                      false,
        PublicKey:                           "0x04211fe0f69772ecf7eb0b5bfc7678672508a9fb01f2d699096f0d59ef7fe1a0cb1e648a80190db1c0f5f088872444d846f2956d0bd84069f3f9f69335af852ac0",
        SigningPhrase:                       "yurt joey vibe",
        SendPushNotifications:               true,
        ProfilePicturesShowTo:               ProfilePicturesShowToContactsOnly,
        ProfilePicturesVisibility:           ProfilePicturesVisibilityContactsOnly,
        DefaultSyncPeriod:                   777600,
        UseMailservers:                      true,
        LinkPreviewRequestEnabled:           true,
        SendStatusUpdates:                   true,
        WalletRootAddress:                   types.HexToAddress("0x3B591fd819F86D0A6a2EF2Bcb94f77807a7De1a6"),
        DisplayAssetsBelowBalanceThreshold:  int64(100000000),
        DisplayAssetsBelowBalance:           false,
        ShowCommunityAssetWhenSendingTokens: true}
)

func setupTestDB(t *testing.T) (*Database, func()) {
    db, stop, err := helpers.SetupTestSQLDB(appdatabase.DbInitializer{}, "settings-tests-")
    if err != nil {
        require.NoError(t, stop())
    }
    require.NoError(t, err)

    d, err := MakeNewDB(db)
    if err != nil {
        require.NoError(t, stop())
    }
    require.NoError(t, err)

    return d, func() {
        require.NoError(t, stop())
    }
}

func TestClosingsqlDB(t *testing.T) {
    testFileName := "./test.db"
    password := "settings-tests"

    // Make connection with sql.DB
    db, err := appdatabase.InitializeDB(testFileName, password, dbsetup.ReducedKDFIterationsNumber)

    // handle removing the test file on any exit
    defer func() {
        require.NoError(t, os.Remove(testFileName))
        require.NoError(t, os.Remove(testFileName+"-shm"))
        require.NoError(t, os.Remove(testFileName+"-wal"))
    }()

    // Then check the first error
    require.NoError(t, err)

    // Init settings.Database struct
    d, err := MakeNewDB(db)
    require.NoError(t, err)

    // Cleanup dbInstances to enable running test with -count more than 1.
    dbFileName, err := dbsetup.GetDBFilename(db)
    require.NoError(t, err)
    defer delete(dbInstances, dbFileName)

    // Add settings data to the db
    err = d.CreateSettings(settings, config)
    require.NoError(t, err)

    // close the sql.DB connection
    err = db.Close()
    require.NoError(t, err)

    // Make another connection with sql.DB
    db2, err := appdatabase.InitializeDB(testFileName, password, dbsetup.ReducedKDFIterationsNumber)
    require.NoError(t, err)

    // Init settings.Database struct using second connection
    d, err = MakeNewDB(db2)
    require.NoError(t, err)

    // Ping db expect no error
    err = d.db.Ping()
    require.NoError(t, err)
}

func TestNewDB(t *testing.T) {
    // TODO test that
    //  - multiple different in memory dbs can be inited
    //  - only one instance per file name can be inited
}

func TestCreateSettings(t *testing.T) {
    db, stop := setupTestDB(t)
    defer stop()

    require.NoError(t, db.CreateSettings(settings, config))

    s, err := db.GetSettings()
    require.NoError(t, err)
    require.Equal(t, settings, s)
}

func TestSaveSetting(t *testing.T) {
    db, stop := setupTestDB(t)
    defer stop()

    require.NoError(t, db.CreateSettings(settings, config))
    require.NoError(t, db.SaveSetting(Currency.GetReactName(), "usd"))

    _, err := db.GetSettings()
    require.NoError(t, err)

    require.Equal(t, errors.ErrInvalidConfig, db.SaveSetting("a_column_that_does_n0t_exist", "random value"))
}

func TestDatabase_SetSettingLastSynced(t *testing.T) {
    db, stop := setupTestDB(t)
    defer stop()

    tm := uint64(0)

    // Default value should be `0`
    ct, err := db.GetSettingLastSynced(Currency)
    require.NoError(t, err)
    require.Equal(t, tm, ct)

    // Test setting clock value to something greater than `0`
    tm += 123
    err = db.SetSettingLastSynced(Currency, tm)
    require.NoError(t, err)

    ct, err = db.GetSettingLastSynced(Currency)
    require.NoError(t, err)
    require.Equal(t, tm, ct)

    // Test setting clock to greater than `123`
    now := uint64(321)
    err = db.SetSettingLastSynced(Currency, now)
    require.NoError(t, err)

    ct, err = db.GetSettingLastSynced(Currency)
    require.NoError(t, err)
    require.Equal(t, now, ct)

    // Test setting clock to something less than `321`
    earlier := uint64(231)
    err = db.SetSettingLastSynced(Currency, earlier)
    require.NoError(t, err)

    ct, err = db.GetSettingLastSynced(Currency)
    require.NoError(t, err)
    require.Equal(t, now, ct)
}

func TestSyncColumnsSet(t *testing.T) {
    db, stop := setupTestDB(t)
    defer stop()

    for _, sf := range SettingFieldRegister {
        if sf.SyncProtobufFactory() != nil {
            _, err := db.GetSettingLastSynced(sf)
            require.NoError(t, err)
        }
    }
}