github.com/status-im/status-go@v1.1.0/services/wallet/collectibles/collection_data_db_test.go (about) 1 package collectibles 2 3 import ( 4 "math/big" 5 "testing" 6 7 "github.com/ethereum/go-ethereum/common" 8 9 w_common "github.com/status-im/status-go/services/wallet/common" 10 "github.com/status-im/status-go/services/wallet/thirdparty" 11 "github.com/status-im/status-go/t/helpers" 12 "github.com/status-im/status-go/walletdatabase" 13 14 "github.com/stretchr/testify/require" 15 ) 16 17 func setupCollectionDataDBTest(t *testing.T) (*CollectionDataDB, func()) { 18 db, err := helpers.SetupTestMemorySQLDB(walletdatabase.DbInitializer{}) 19 require.NoError(t, err) 20 return NewCollectionDataDB(db), func() { 21 require.NoError(t, db.Close()) 22 } 23 } 24 25 func TestUpdateCollectionsData(t *testing.T) { 26 db, cleanDB := setupCollectionDataDBTest(t) 27 defer cleanDB() 28 29 data := thirdparty.GenerateTestCollectionsData(50) 30 31 var err error 32 33 err = db.SetData(data, true) 34 require.NoError(t, err) 35 36 ids := make([]thirdparty.ContractID, 0, len(data)) 37 for _, collection := range data { 38 ids = append(ids, collection.ID) 39 } 40 41 // Check for missing IDs 42 idsNotInDB, err := db.GetIDsNotInDB(ids) 43 require.NoError(t, err) 44 require.Empty(t, idsNotInDB) 45 46 extraID0 := thirdparty.ContractID{ 47 ChainID: w_common.ChainID(100), 48 Address: common.BigToAddress(big.NewInt(100)), 49 } 50 extraID1 := thirdparty.ContractID{ 51 ChainID: w_common.ChainID(101), 52 Address: common.BigToAddress(big.NewInt(101)), 53 } 54 extraIds := []thirdparty.ContractID{extraID0, extraID1} 55 56 idsNotInDB, err = db.GetIDsNotInDB(extraIds) 57 require.NoError(t, err) 58 require.ElementsMatch(t, extraIds, idsNotInDB) 59 60 combinedIds := append(ids, extraIds...) 61 idsNotInDB, err = db.GetIDsNotInDB(combinedIds) 62 require.NoError(t, err) 63 require.ElementsMatch(t, extraIds, idsNotInDB) 64 65 // Check for loaded data 66 loadedMap, err := db.GetData(ids) 67 require.NoError(t, err) 68 require.Equal(t, len(ids), len(loadedMap)) 69 70 for _, origC := range data { 71 require.Equal(t, origC, loadedMap[origC.ID.HashKey()]) 72 } 73 74 // update some collections, changing the provider 75 c0Orig := data[0] 76 c0 := c0Orig 77 c0.Name = "new collection name 0" 78 c0.Provider = "new collection provider 0" 79 80 c1Orig := data[1] 81 c1 := c1Orig 82 c1.Name = "new collection name 1" 83 c1.Provider = "new collection provider 1" 84 85 // Test allowUpdate = false 86 err = db.SetData([]thirdparty.CollectionData{c0, c1}, false) 87 require.NoError(t, err) 88 89 loadedMap, err = db.GetData([]thirdparty.ContractID{c0.ID, c1.ID}) 90 require.NoError(t, err) 91 require.Equal(t, 2, len(loadedMap)) 92 93 require.Equal(t, c0Orig, loadedMap[c0.ID.HashKey()]) 94 require.Equal(t, c1Orig, loadedMap[c1.ID.HashKey()]) 95 96 // Test allowUpdate = true 97 err = db.SetData([]thirdparty.CollectionData{c0, c1}, true) 98 require.NoError(t, err) 99 100 loadedMap, err = db.GetData([]thirdparty.ContractID{c0.ID, c1.ID}) 101 require.NoError(t, err) 102 require.Equal(t, 2, len(loadedMap)) 103 104 require.Equal(t, c0, loadedMap[c0.ID.HashKey()]) 105 require.Equal(t, c1, loadedMap[c1.ID.HashKey()]) 106 } 107 108 func TestCollectionSocialsData(t *testing.T) { 109 db, cleanDB := setupCollectionDataDBTest(t) 110 defer cleanDB() 111 112 data := thirdparty.GenerateTestCollectionsData(10) 113 114 ids := make([]thirdparty.ContractID, 0, len(data)) 115 for _, collection := range data { 116 ids = append(ids, collection.ID) 117 } 118 119 err := db.SetData(data, true) 120 require.NoError(t, err) 121 122 // Check for loaded data 123 loadedMap, err := db.GetData(ids) 124 require.NoError(t, err) 125 require.Equal(t, len(data), len(loadedMap)) 126 127 // Valid check for ID should return false as it was not set initially 128 socials, err := db.GetSocialsForID(data[0].ID) 129 require.NoError(t, err) 130 require.Nil(t, socials) 131 132 // Now we'll try to set socials data for the first item 133 socialsToSet := &thirdparty.CollectionSocials{ 134 Website: "new-website", 135 TwitterHandle: "newTwitterHandle", 136 Provider: "alchemy", 137 } 138 err = db.SetCollectionSocialsData(data[0].ID, socialsToSet) 139 require.NoError(t, err) 140 141 // Valid check for ID should return true as it was now set 142 socials, err = db.GetSocialsForID(data[0].ID) 143 require.NoError(t, err) 144 require.Equal(t, socials, socialsToSet) 145 146 // Check the loaded data again for socials 147 loadedMap, err = db.GetData(ids) 148 require.NoError(t, err) 149 require.Equal(t, len(data), len(loadedMap)) 150 151 require.Equal(t, socials.Website, loadedMap[data[0].ID.HashKey()].Socials.Website) 152 require.Equal(t, socials.TwitterHandle, loadedMap[data[0].ID.HashKey()].Socials.TwitterHandle) 153 }