status-go/services/wallet/collectibles/collection_data_db_test.go

154 lines
4.2 KiB
Go

package collectibles
import (
"math/big"
"testing"
"github.com/ethereum/go-ethereum/common"
w_common "github.com/status-im/status-go/services/wallet/common"
"github.com/status-im/status-go/services/wallet/thirdparty"
"github.com/status-im/status-go/t/helpers"
"github.com/status-im/status-go/walletdatabase"
"github.com/stretchr/testify/require"
)
func setupCollectionDataDBTest(t *testing.T) (*CollectionDataDB, func()) {
db, err := helpers.SetupTestMemorySQLDB(walletdatabase.DbInitializer{})
require.NoError(t, err)
return NewCollectionDataDB(db), func() {
require.NoError(t, db.Close())
}
}
func TestUpdateCollectionsData(t *testing.T) {
db, cleanDB := setupCollectionDataDBTest(t)
defer cleanDB()
data := thirdparty.GenerateTestCollectionsData(50)
var err error
err = db.SetData(data, true)
require.NoError(t, err)
ids := make([]thirdparty.ContractID, 0, len(data))
for _, collection := range data {
ids = append(ids, collection.ID)
}
// Check for missing IDs
idsNotInDB, err := db.GetIDsNotInDB(ids)
require.NoError(t, err)
require.Empty(t, idsNotInDB)
extraID0 := thirdparty.ContractID{
ChainID: w_common.ChainID(100),
Address: common.BigToAddress(big.NewInt(100)),
}
extraID1 := thirdparty.ContractID{
ChainID: w_common.ChainID(101),
Address: common.BigToAddress(big.NewInt(101)),
}
extraIds := []thirdparty.ContractID{extraID0, extraID1}
idsNotInDB, err = db.GetIDsNotInDB(extraIds)
require.NoError(t, err)
require.ElementsMatch(t, extraIds, idsNotInDB)
combinedIds := append(ids, extraIds...)
idsNotInDB, err = db.GetIDsNotInDB(combinedIds)
require.NoError(t, err)
require.ElementsMatch(t, extraIds, idsNotInDB)
// Check for loaded data
loadedMap, err := db.GetData(ids)
require.NoError(t, err)
require.Equal(t, len(ids), len(loadedMap))
for _, origC := range data {
require.Equal(t, origC, loadedMap[origC.ID.HashKey()])
}
// update some collections, changing the provider
c0Orig := data[0]
c0 := c0Orig
c0.Name = "new collection name 0"
c0.Provider = "new collection provider 0"
c1Orig := data[1]
c1 := c1Orig
c1.Name = "new collection name 1"
c1.Provider = "new collection provider 1"
// Test allowUpdate = false
err = db.SetData([]thirdparty.CollectionData{c0, c1}, false)
require.NoError(t, err)
loadedMap, err = db.GetData([]thirdparty.ContractID{c0.ID, c1.ID})
require.NoError(t, err)
require.Equal(t, 2, len(loadedMap))
require.Equal(t, c0Orig, loadedMap[c0.ID.HashKey()])
require.Equal(t, c1Orig, loadedMap[c1.ID.HashKey()])
// Test allowUpdate = true
err = db.SetData([]thirdparty.CollectionData{c0, c1}, true)
require.NoError(t, err)
loadedMap, err = db.GetData([]thirdparty.ContractID{c0.ID, c1.ID})
require.NoError(t, err)
require.Equal(t, 2, len(loadedMap))
require.Equal(t, c0, loadedMap[c0.ID.HashKey()])
require.Equal(t, c1, loadedMap[c1.ID.HashKey()])
}
func TestCollectionSocialsData(t *testing.T) {
db, cleanDB := setupCollectionDataDBTest(t)
defer cleanDB()
data := thirdparty.GenerateTestCollectionsData(10)
ids := make([]thirdparty.ContractID, 0, len(data))
for _, collection := range data {
ids = append(ids, collection.ID)
}
err := db.SetData(data, true)
require.NoError(t, err)
// Check for loaded data
loadedMap, err := db.GetData(ids)
require.NoError(t, err)
require.Equal(t, len(data), len(loadedMap))
// Valid check for ID should return false as it was not set initially
socials, err := db.GetSocialsForID(data[0].ID)
require.NoError(t, err)
require.Nil(t, socials)
// Now we'll try to set socials data for the first item
socialsToSet := &thirdparty.CollectionSocials{
Website: "new-website",
TwitterHandle: "newTwitterHandle",
Provider: "alchemy",
}
err = db.SetCollectionSocialsData(data[0].ID, socialsToSet)
require.NoError(t, err)
// Valid check for ID should return true as it was now set
socials, err = db.GetSocialsForID(data[0].ID)
require.NoError(t, err)
require.Equal(t, socials, socialsToSet)
// Check the loaded data again for socials
loadedMap, err = db.GetData(ids)
require.NoError(t, err)
require.Equal(t, len(data), len(loadedMap))
require.Equal(t, socials.Website, loadedMap[data[0].ID.HashKey()].Socials.Website)
require.Equal(t, socials.TwitterHandle, loadedMap[data[0].ID.HashKey()].Socials.TwitterHandle)
}