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 }