arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
hermez-node/api/token_test.go
api/token_test.goRaw
  1package api
  2
  3import (
  4	"fmt"
  5	"strconv"
  6	"testing"
  7
  8	"github.com/hermeznetwork/hermez-node/db/historydb"
  9	"github.com/mitchellh/copystructure"
 10	"github.com/stretchr/testify/assert"
 11	"github.com/stretchr/testify/require"
 12)
 13
 14type testTokensResponse struct {
 15	Tokens       []historydb.TokenWithUSD `json:"tokens"`
 16	PendingItems uint64                   `json:"pendingItems"`
 17}
 18
 19func (t testTokensResponse) GetPending() (pendingItems, lastItemID uint64) {
 20	pendingItems = t.PendingItems
 21	lastItemID = t.Tokens[len(t.Tokens)-1].ItemID
 22	return pendingItems, lastItemID
 23}
 24
 25func (t *testTokensResponse) Len() int {
 26	return len(t.Tokens)
 27}
 28
 29func (t testTokensResponse) New() Pendinger { return &testTokensResponse{} }
 30
 31func TestGetToken(t *testing.T) {
 32	// Get all txs by their ID
 33	endpoint := apiURL + "tokens/"
 34	fetchedTokens := []historydb.TokenWithUSD{}
 35	for _, token := range tc.tokens {
 36		fetchedToken := historydb.TokenWithUSD{}
 37		assert.NoError(t, doGoodReq("GET", endpoint+strconv.Itoa(int(token.TokenID)), nil, &fetchedToken))
 38		fetchedTokens = append(fetchedTokens, fetchedToken)
 39	}
 40	assertTokensAPIs(t, tc.tokens, fetchedTokens)
 41}
 42
 43func TestGetTokens(t *testing.T) {
 44	endpoint := apiURL + "tokens"
 45	fetchedTokens := []historydb.TokenWithUSD{}
 46	appendIter := func(intr interface{}) {
 47		for i := 0; i < len(intr.(*testTokensResponse).Tokens); i++ {
 48			tmp, err := copystructure.Copy(intr.(*testTokensResponse).Tokens[i])
 49			if err != nil {
 50				panic(err)
 51			}
 52			fetchedTokens = append(fetchedTokens, tmp.(historydb.TokenWithUSD))
 53		}
 54	}
 55	// Get all (no filters)
 56	limit := 8
 57	path := fmt.Sprintf("%s?limit=%d&fromItem=", endpoint, limit)
 58	err := doGoodReqPaginated(path, historydb.OrderAsc, &testTokensResponse{}, appendIter)
 59	assert.NoError(t, err)
 60	assertTokensAPIs(t, tc.tokens, fetchedTokens)
 61
 62	// Get by tokenIds
 63	fetchedTokens = []historydb.TokenWithUSD{}
 64	limit = 7
 65	stringIds := strconv.Itoa(int(tc.tokens[2].TokenID)) + "," + strconv.Itoa(int(tc.tokens[5].TokenID)) + "," + strconv.Itoa(int(tc.tokens[6].TokenID))
 66	path = fmt.Sprintf(
 67		"%s?ids=%s&limit=%d&fromItem=",
 68		endpoint, stringIds, limit,
 69	)
 70	err = doGoodReqPaginated(path, historydb.OrderAsc, &testTokensResponse{}, appendIter)
 71	assert.NoError(t, err)
 72	var tokensFiltered []historydb.TokenWithUSD
 73	tokensFiltered = append(tokensFiltered, tc.tokens[2])
 74	tokensFiltered = append(tokensFiltered, tc.tokens[5])
 75	tokensFiltered = append(tokensFiltered, tc.tokens[6])
 76	assertTokensAPIs(t, tokensFiltered, fetchedTokens)
 77
 78	// Get by symbols
 79	fetchedTokens = []historydb.TokenWithUSD{}
 80	limit = 7
 81	stringSymbols := tc.tokens[1].Symbol + "," + tc.tokens[3].Symbol
 82	path = fmt.Sprintf(
 83		"%s?symbols=%s&limit=%d&fromItem=",
 84		endpoint, stringSymbols, limit,
 85	)
 86	err = doGoodReqPaginated(path, historydb.OrderAsc, &testTokensResponse{}, appendIter)
 87	assert.NoError(t, err)
 88	tokensFiltered = nil
 89	tokensFiltered = append(tokensFiltered, tc.tokens[1])
 90	tokensFiltered = append(tokensFiltered, tc.tokens[3])
 91	assertTokensAPIs(t, tokensFiltered, fetchedTokens)
 92
 93	// Get by name
 94	fetchedTokens = []historydb.TokenWithUSD{}
 95	limit = 5
 96	stringName := tc.tokens[8].Name[4:5]
 97	path = fmt.Sprintf(
 98		"%s?name=%s&limit=%d&fromItem=",
 99		endpoint, stringName, limit,
100	)
101	err = doGoodReqPaginated(path, historydb.OrderAsc, &testTokensResponse{}, appendIter)
102	assert.NoError(t, err)
103	tokensFiltered = nil
104	tokensFiltered = append(tokensFiltered, tc.tokens[8])
105	assertTokensAPIs(t, tokensFiltered, fetchedTokens)
106
107	// Multiple filters
108	fetchedTokens = []historydb.TokenWithUSD{}
109	limit = 5
110	stringSymbols = tc.tokens[2].Symbol + "," + tc.tokens[6].Symbol
111	stringIds = strconv.Itoa(int(tc.tokens[2].TokenID)) + "," + strconv.Itoa(int(tc.tokens[5].TokenID)) + "," + strconv.Itoa(int(tc.tokens[6].TokenID))
112	path = fmt.Sprintf(
113		"%s?symbols=%s&ids=%s&limit=%d&fromItem=",
114		endpoint, stringSymbols, stringIds, limit,
115	)
116	err = doGoodReqPaginated(path, historydb.OrderAsc, &testTokensResponse{}, appendIter)
117	assert.NoError(t, err)
118
119	tokensFiltered = nil
120	tokensFiltered = append(tokensFiltered, tc.tokens[2])
121	tokensFiltered = append(tokensFiltered, tc.tokens[6])
122	assertTokensAPIs(t, tokensFiltered, fetchedTokens)
123
124	// All, in reverse order
125	fetchedTokens = []historydb.TokenWithUSD{}
126	limit = 5
127	path = fmt.Sprintf("%s?limit=%d&fromItem=", endpoint, limit)
128	err = doGoodReqPaginated(path, historydb.OrderDesc, &testTokensResponse{}, appendIter)
129	assert.NoError(t, err)
130	flipedTokens := []historydb.TokenWithUSD{}
131	for i := 0; i < len(tc.tokens); i++ {
132		flipedTokens = append(flipedTokens, tc.tokens[len(tc.tokens)-1-i])
133	}
134	assertTokensAPIs(t, flipedTokens, fetchedTokens)
135}
136
137func assertTokensAPIs(t *testing.T, expected, actual []historydb.TokenWithUSD) {
138	require.Equal(t, len(expected), len(actual))
139	for i := 0; i < len(actual); i++ { //nolint len(actual) won't change within the loop
140		actual[i].ItemID = 0
141		if expected[i].USDUpdate == nil {
142			assert.Equal(t, expected[i].USDUpdate, actual[i].USDUpdate)
143		} else {
144			assert.Less(t, expected[i].USDUpdate.Unix()-3, actual[i].USDUpdate.Unix())
145			expected[i].USDUpdate = actual[i].USDUpdate
146		}
147		assert.Equal(t, expected[i], actual[i])
148	}
149}