status-im/status-go

View on GitHub
services/wallet/collectibles/collection_data_db_test.go

Summary

Maintainability
A
0 mins
Test Coverage
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)
}