github.com/status-im/status-go@v1.1.0/multiaccounts/database_test.go (about) 1 package multiaccounts 2 3 import ( 4 "encoding/json" 5 "io/ioutil" 6 "os" 7 "testing" 8 9 "github.com/status-im/status-go/common/dbsetup" 10 "github.com/status-im/status-go/images" 11 12 "github.com/stretchr/testify/require" 13 14 "github.com/status-im/status-go/multiaccounts/common" 15 ) 16 17 func setupTestDB(t *testing.T) (*Database, func()) { 18 tmpfile, err := ioutil.TempFile("", "accounts-tests-") 19 require.NoError(t, err) 20 db, err := InitializeDB(tmpfile.Name()) 21 require.NoError(t, err) 22 return db, func() { 23 require.NoError(t, db.Close()) 24 require.NoError(t, os.Remove(tmpfile.Name())) 25 } 26 } 27 28 func TestAccounts(t *testing.T) { 29 db, stop := setupTestDB(t) 30 defer stop() 31 expected := Account{Name: "string", KeyUID: "string", CustomizationColor: common.CustomizationColorBlue, ColorHash: ColorHash{{4, 3}, {4, 0}, {4, 3}, {4, 0}}, ColorID: 10, KDFIterations: dbsetup.ReducedKDFIterationsNumber, Timestamp: 1712856359} 32 require.NoError(t, db.SaveAccount(expected)) 33 accounts, err := db.GetAccounts() 34 require.NoError(t, err) 35 require.Len(t, accounts, 1) 36 require.Equal(t, expected, accounts[0]) 37 } 38 39 func TestAccountsUpdate(t *testing.T) { 40 db, stop := setupTestDB(t) 41 defer stop() 42 expected := Account{KeyUID: "string", CustomizationColor: common.CustomizationColorBlue, ColorHash: ColorHash{{4, 3}, {4, 0}, {4, 3}, {4, 0}}, ColorID: 10, KDFIterations: dbsetup.ReducedKDFIterationsNumber} 43 require.NoError(t, db.SaveAccount(expected)) 44 expected.Name = "chars" 45 expected.CustomizationColor = common.CustomizationColorMagenta 46 require.NoError(t, db.UpdateAccount(expected)) 47 rst, err := db.GetAccounts() 48 require.NoError(t, err) 49 require.Len(t, rst, 1) 50 require.Equal(t, expected, rst[0]) 51 } 52 53 func TestLoginUpdate(t *testing.T) { 54 db, stop := setupTestDB(t) 55 defer stop() 56 57 accounts := []Account{{Name: "first", KeyUID: "0x1", KDFIterations: dbsetup.ReducedKDFIterationsNumber}, {Name: "second", KeyUID: "0x2", KDFIterations: dbsetup.ReducedKDFIterationsNumber}} 58 for _, acc := range accounts { 59 require.NoError(t, db.SaveAccount(acc)) 60 } 61 require.NoError(t, db.UpdateAccountTimestamp(accounts[0].KeyUID, 100)) 62 require.NoError(t, db.UpdateAccountTimestamp(accounts[1].KeyUID, 10)) 63 accounts[0].Timestamp = 100 64 accounts[1].Timestamp = 10 65 rst, err := db.GetAccounts() 66 require.NoError(t, err) 67 require.Equal(t, accounts, rst) 68 } 69 70 // Profile Image tests 71 72 var ( 73 keyUID = "0xdeadbeef" 74 keyUID2 = "0x1337beef" 75 ) 76 77 func seedTestDBWithIdentityImages(t *testing.T, db *Database, keyUID string) { 78 iis := images.SampleIdentityImages() 79 require.NoError(t, db.StoreIdentityImages(keyUID, iis, false)) 80 } 81 82 func TestDatabase_GetIdentityImages(t *testing.T) { 83 db, stop := setupTestDB(t) 84 defer stop() 85 seedTestDBWithIdentityImages(t, db, keyUID) 86 87 expected := `[{"keyUid":"0xdeadbeef","type":"large","uri":"data:image/png;base64,iVBORw0KGgoAAAANSUg=","width":240,"height":300,"fileSize":1024,"resizeTarget":240,"clock":0},{"keyUid":"0xdeadbeef","type":"thumbnail","uri":"data:image/jpeg;base64,/9j/2wCEAFA3PEY8MlA=","width":80,"height":80,"fileSize":256,"resizeTarget":80,"clock":0}]` 88 89 oiis, err := db.GetIdentityImages(keyUID) 90 require.NoError(t, err) 91 92 joiis, err := json.Marshal(oiis) 93 require.NoError(t, err) 94 require.Exactly(t, expected, string(joiis)) 95 96 oiis, err = db.GetIdentityImages(keyUID2) 97 require.NoError(t, err) 98 99 require.Exactly(t, 0, len(oiis)) 100 } 101 102 func TestDatabase_GetIdentityImage(t *testing.T) { 103 db, stop := setupTestDB(t) 104 defer stop() 105 seedTestDBWithIdentityImages(t, db, keyUID) 106 107 cs := []struct { 108 KeyUID string 109 Name string 110 Expected string 111 }{ 112 { 113 keyUID, 114 images.SmallDimName, 115 `{"keyUid":"0xdeadbeef","type":"thumbnail","uri":"data:image/jpeg;base64,/9j/2wCEAFA3PEY8MlA=","width":80,"height":80,"fileSize":256,"resizeTarget":80,"clock":0}`, 116 }, 117 { 118 keyUID, 119 images.LargeDimName, 120 `{"keyUid":"0xdeadbeef","type":"large","uri":"data:image/png;base64,iVBORw0KGgoAAAANSUg=","width":240,"height":300,"fileSize":1024,"resizeTarget":240,"clock":0}`, 121 }, 122 { 123 keyUID2, 124 images.LargeDimName, 125 "null", 126 }, 127 } 128 129 for _, c := range cs { 130 oii, err := db.GetIdentityImage(c.KeyUID, c.Name) 131 require.NoError(t, err) 132 133 joii, err := json.Marshal(oii) 134 require.NoError(t, err) 135 require.Exactly(t, c.Expected, string(joii)) 136 } 137 } 138 139 func TestDatabase_DeleteIdentityImage(t *testing.T) { 140 db, stop := setupTestDB(t) 141 defer stop() 142 seedTestDBWithIdentityImages(t, db, keyUID) 143 144 require.NoError(t, db.DeleteIdentityImage(keyUID)) 145 146 oii, err := db.GetIdentityImage(keyUID, images.SmallDimName) 147 require.NoError(t, err) 148 require.Empty(t, oii) 149 } 150 151 func TestDatabase_GetAccountsWithIdentityImages(t *testing.T) { 152 db, stop := setupTestDB(t) 153 defer stop() 154 155 testAccs := []Account{ 156 {Name: "string", KeyUID: keyUID, Identicon: "data"}, 157 {Name: "string", KeyUID: keyUID2}, 158 {Name: "string", KeyUID: keyUID2 + "2"}, 159 {Name: "string", KeyUID: keyUID2 + "3"}, 160 } 161 expected := `[{"name":"string","timestamp":100,"identicon":"data","colorHash":null,"colorId":0,"keycard-pairing":"","key-uid":"0xdeadbeef","images":[{"keyUid":"0xdeadbeef","type":"large","uri":"data:image/png;base64,iVBORw0KGgoAAAANSUg=","width":240,"height":300,"fileSize":1024,"resizeTarget":240,"clock":0},{"keyUid":"0xdeadbeef","type":"thumbnail","uri":"data:image/jpeg;base64,/9j/2wCEAFA3PEY8MlA=","width":80,"height":80,"fileSize":256,"resizeTarget":80,"clock":0}],"kdfIterations":3200},{"name":"string","timestamp":10,"identicon":"","colorHash":null,"colorId":0,"keycard-pairing":"","key-uid":"0x1337beef","images":null,"kdfIterations":3200},{"name":"string","timestamp":0,"identicon":"","colorHash":null,"colorId":0,"keycard-pairing":"","key-uid":"0x1337beef2","images":null,"kdfIterations":3200},{"name":"string","timestamp":0,"identicon":"","colorHash":null,"colorId":0,"keycard-pairing":"","key-uid":"0x1337beef3","images":[{"keyUid":"0x1337beef3","type":"large","uri":"data:image/png;base64,iVBORw0KGgoAAAANSUg=","width":240,"height":300,"fileSize":1024,"resizeTarget":240,"clock":0},{"keyUid":"0x1337beef3","type":"thumbnail","uri":"data:image/jpeg;base64,/9j/2wCEAFA3PEY8MlA=","width":80,"height":80,"fileSize":256,"resizeTarget":80,"clock":0}],"kdfIterations":3200}]` 162 163 for _, a := range testAccs { 164 require.NoError(t, db.SaveAccount(a)) 165 } 166 167 seedTestDBWithIdentityImages(t, db, keyUID) 168 seedTestDBWithIdentityImages(t, db, keyUID2+"3") 169 170 err := db.UpdateAccountTimestamp(keyUID, 100) 171 require.NoError(t, err) 172 err = db.UpdateAccountTimestamp(keyUID2, 10) 173 require.NoError(t, err) 174 175 accs, err := db.GetAccounts() 176 require.NoError(t, err) 177 178 accJSON, err := json.Marshal(accs) 179 require.NoError(t, err) 180 181 require.Exactly(t, expected, string(accJSON)) 182 } 183 184 func TestDatabase_GetAccount(t *testing.T) { 185 db, stop := setupTestDB(t) 186 defer stop() 187 188 expected := Account{Name: "string", KeyUID: keyUID, ColorHash: ColorHash{{4, 3}, {4, 0}, {4, 3}, {4, 0}}, ColorID: 10, KDFIterations: dbsetup.ReducedKDFIterationsNumber} 189 require.NoError(t, db.SaveAccount(expected)) 190 191 account, err := db.GetAccount(expected.KeyUID) 192 require.NoError(t, err) 193 require.Equal(t, &expected, account) 194 } 195 196 func TestDatabase_SaveAccountWithIdentityImages(t *testing.T) { 197 db, stop := setupTestDB(t) 198 defer stop() 199 200 expected := Account{ 201 Name: "string", 202 KeyUID: keyUID, 203 ColorHash: ColorHash{{4, 3}, {4, 0}, {4, 3}, {4, 0}}, 204 ColorID: 10, 205 Images: images.SampleIdentityImages(), 206 } 207 require.NoError(t, db.SaveAccount(expected)) 208 209 account, err := db.GetAccount(expected.KeyUID) 210 require.NoError(t, err) 211 require.Exactly(t, expected.ColorHash, account.ColorHash) 212 require.Exactly(t, expected.ColorID, account.ColorID) 213 require.Exactly(t, expected.Identicon, account.Identicon) 214 require.Exactly(t, expected.KeycardPairing, account.KeycardPairing) 215 require.Exactly(t, expected.KeyUID, account.KeyUID) 216 require.Exactly(t, expected.Name, account.Name) 217 require.Exactly(t, expected.Timestamp, account.Timestamp) 218 require.Len(t, expected.Images, 2) 219 220 matches := 0 221 for _, expImg := range expected.Images { 222 for _, accImg := range account.Images { 223 if expImg.Name != accImg.Name { 224 continue 225 } 226 matches++ 227 228 require.Exactly(t, expImg.Clock, accImg.Clock) 229 require.Exactly(t, keyUID, accImg.KeyUID) 230 require.Exactly(t, expImg.Name, accImg.Name) 231 require.Exactly(t, expImg.ResizeTarget, accImg.ResizeTarget) 232 require.Exactly(t, expImg.Payload, accImg.Payload) 233 require.Exactly(t, expImg.Height, accImg.Height) 234 require.Exactly(t, expImg.Width, accImg.Width) 235 require.Exactly(t, expImg.FileSize, accImg.FileSize) 236 } 237 } 238 require.Equal(t, 2, matches) 239 }