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  }