github.com/status-im/status-go@v1.1.0/multiaccounts/settings/database_test.go (about)

     1  package settings
     2  
     3  import (
     4  	"encoding/json"
     5  	"os"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/require"
     9  
    10  	"github.com/status-im/status-go/appdatabase"
    11  	"github.com/status-im/status-go/common/dbsetup"
    12  	"github.com/status-im/status-go/eth-node/types"
    13  	"github.com/status-im/status-go/multiaccounts/errors"
    14  	"github.com/status-im/status-go/params"
    15  	"github.com/status-im/status-go/t/helpers"
    16  )
    17  
    18  var (
    19  	config = params.NodeConfig{
    20  		NetworkID: 10,
    21  		DataDir:   "test",
    22  	}
    23  
    24  	networks = json.RawMessage("{}")
    25  	settings = Settings{
    26  		Address:                             types.HexToAddress("0xdC540f3745Ff2964AFC1171a5A0DD726d1F6B472"),
    27  		AnonMetricsShouldSend:               false,
    28  		CurrentNetwork:                      "mainnet_rpc",
    29  		DappsAddress:                        types.HexToAddress("0xD1300f99fDF7346986CbC766903245087394ecd0"),
    30  		InstallationID:                      "d3efcff6-cffa-560e-a547-21d3858cbc51",
    31  		KeyUID:                              "0x4e8129f3edfc004875be17bf468a784098a9f69b53c095be1f52deff286935ab",
    32  		BackupEnabled:                       true,
    33  		LatestDerivedPath:                   0,
    34  		Name:                                "Jittery Cornflowerblue Kingbird",
    35  		Networks:                            &networks,
    36  		PhotoPath:                           "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAIAAACRXR/mAAAAjklEQVR4nOzXwQmFMBAAUZXUYh32ZB32ZB02sxYQQSZGsod55/91WFgSS0RM+SyjA56ZRZhFmEWYRRT6h+M6G16zrxv6fdJpmUWYRbxsYr13dKfanpN0WmYRZhGzXz6AWYRZRIfbaX26fT9Jk07LLMIsosPt9I/dTDotswizCG+nhFmEWYRZhFnEHQAA///z1CFkYamgfQAAAABJRU5ErkJggg==",
    37  		PreviewPrivacy:                      false,
    38  		PublicKey:                           "0x04211fe0f69772ecf7eb0b5bfc7678672508a9fb01f2d699096f0d59ef7fe1a0cb1e648a80190db1c0f5f088872444d846f2956d0bd84069f3f9f69335af852ac0",
    39  		SigningPhrase:                       "yurt joey vibe",
    40  		SendPushNotifications:               true,
    41  		ProfilePicturesShowTo:               ProfilePicturesShowToContactsOnly,
    42  		ProfilePicturesVisibility:           ProfilePicturesVisibilityContactsOnly,
    43  		DefaultSyncPeriod:                   777600,
    44  		UseMailservers:                      true,
    45  		LinkPreviewRequestEnabled:           true,
    46  		SendStatusUpdates:                   true,
    47  		WalletRootAddress:                   types.HexToAddress("0x3B591fd819F86D0A6a2EF2Bcb94f77807a7De1a6"),
    48  		DisplayAssetsBelowBalanceThreshold:  int64(100000000),
    49  		DisplayAssetsBelowBalance:           false,
    50  		ShowCommunityAssetWhenSendingTokens: true}
    51  )
    52  
    53  func setupTestDB(t *testing.T) (*Database, func()) {
    54  	db, stop, err := helpers.SetupTestSQLDB(appdatabase.DbInitializer{}, "settings-tests-")
    55  	if err != nil {
    56  		require.NoError(t, stop())
    57  	}
    58  	require.NoError(t, err)
    59  
    60  	d, err := MakeNewDB(db)
    61  	if err != nil {
    62  		require.NoError(t, stop())
    63  	}
    64  	require.NoError(t, err)
    65  
    66  	return d, func() {
    67  		require.NoError(t, stop())
    68  	}
    69  }
    70  
    71  func TestClosingsqlDB(t *testing.T) {
    72  	testFileName := "./test.db"
    73  	password := "settings-tests"
    74  
    75  	// Make connection with sql.DB
    76  	db, err := appdatabase.InitializeDB(testFileName, password, dbsetup.ReducedKDFIterationsNumber)
    77  
    78  	// handle removing the test file on any exit
    79  	defer func() {
    80  		require.NoError(t, os.Remove(testFileName))
    81  		require.NoError(t, os.Remove(testFileName+"-shm"))
    82  		require.NoError(t, os.Remove(testFileName+"-wal"))
    83  	}()
    84  
    85  	// Then check the first error
    86  	require.NoError(t, err)
    87  
    88  	// Init settings.Database struct
    89  	d, err := MakeNewDB(db)
    90  	require.NoError(t, err)
    91  
    92  	// Cleanup dbInstances to enable running test with -count more than 1.
    93  	dbFileName, err := dbsetup.GetDBFilename(db)
    94  	require.NoError(t, err)
    95  	defer delete(dbInstances, dbFileName)
    96  
    97  	// Add settings data to the db
    98  	err = d.CreateSettings(settings, config)
    99  	require.NoError(t, err)
   100  
   101  	// close the sql.DB connection
   102  	err = db.Close()
   103  	require.NoError(t, err)
   104  
   105  	// Make another connection with sql.DB
   106  	db2, err := appdatabase.InitializeDB(testFileName, password, dbsetup.ReducedKDFIterationsNumber)
   107  	require.NoError(t, err)
   108  
   109  	// Init settings.Database struct using second connection
   110  	d, err = MakeNewDB(db2)
   111  	require.NoError(t, err)
   112  
   113  	// Ping db expect no error
   114  	err = d.db.Ping()
   115  	require.NoError(t, err)
   116  }
   117  
   118  func TestNewDB(t *testing.T) {
   119  	// TODO test that
   120  	//  - multiple different in memory dbs can be inited
   121  	//  - only one instance per file name can be inited
   122  }
   123  
   124  func TestCreateSettings(t *testing.T) {
   125  	db, stop := setupTestDB(t)
   126  	defer stop()
   127  
   128  	require.NoError(t, db.CreateSettings(settings, config))
   129  
   130  	s, err := db.GetSettings()
   131  	require.NoError(t, err)
   132  	require.Equal(t, settings, s)
   133  }
   134  
   135  func TestSaveSetting(t *testing.T) {
   136  	db, stop := setupTestDB(t)
   137  	defer stop()
   138  
   139  	require.NoError(t, db.CreateSettings(settings, config))
   140  	require.NoError(t, db.SaveSetting(Currency.GetReactName(), "usd"))
   141  
   142  	_, err := db.GetSettings()
   143  	require.NoError(t, err)
   144  
   145  	require.Equal(t, errors.ErrInvalidConfig, db.SaveSetting("a_column_that_does_n0t_exist", "random value"))
   146  }
   147  
   148  func TestDatabase_SetSettingLastSynced(t *testing.T) {
   149  	db, stop := setupTestDB(t)
   150  	defer stop()
   151  
   152  	tm := uint64(0)
   153  
   154  	// Default value should be `0`
   155  	ct, err := db.GetSettingLastSynced(Currency)
   156  	require.NoError(t, err)
   157  	require.Equal(t, tm, ct)
   158  
   159  	// Test setting clock value to something greater than `0`
   160  	tm += 123
   161  	err = db.SetSettingLastSynced(Currency, tm)
   162  	require.NoError(t, err)
   163  
   164  	ct, err = db.GetSettingLastSynced(Currency)
   165  	require.NoError(t, err)
   166  	require.Equal(t, tm, ct)
   167  
   168  	// Test setting clock to greater than `123`
   169  	now := uint64(321)
   170  	err = db.SetSettingLastSynced(Currency, now)
   171  	require.NoError(t, err)
   172  
   173  	ct, err = db.GetSettingLastSynced(Currency)
   174  	require.NoError(t, err)
   175  	require.Equal(t, now, ct)
   176  
   177  	// Test setting clock to something less than `321`
   178  	earlier := uint64(231)
   179  	err = db.SetSettingLastSynced(Currency, earlier)
   180  	require.NoError(t, err)
   181  
   182  	ct, err = db.GetSettingLastSynced(Currency)
   183  	require.NoError(t, err)
   184  	require.Equal(t, now, ct)
   185  }
   186  
   187  func TestSyncColumnsSet(t *testing.T) {
   188  	db, stop := setupTestDB(t)
   189  	defer stop()
   190  
   191  	for _, sf := range SettingFieldRegister {
   192  		if sf.SyncProtobufFactory() != nil {
   193  			_, err := db.GetSettingLastSynced(sf)
   194  			require.NoError(t, err)
   195  		}
   196  	}
   197  }