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  }