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	tokenNameLen := len(tc.tokens[8].Name)
 97	stringName := tc.tokens[8].Name[tokenNameLen-1:]
 98	path = fmt.Sprintf(
 99		"%s?name=%s&limit=%d&fromItem=",
100		endpoint, stringName, limit,
101	)
102	err = doGoodReqPaginated(path, historydb.OrderAsc, &testTokensResponse{}, appendIter)
103	assert.NoError(t, err)
104	tokensFiltered = nil
105	tokensFiltered = append(tokensFiltered, tc.tokens[8])
106	assertTokensAPIs(t, tokensFiltered, fetchedTokens)
107
108	// Multiple filters
109	fetchedTokens = []historydb.TokenWithUSD{}
110	limit = 5
111	stringSymbols = tc.tokens[2].Symbol + "," + tc.tokens[6].Symbol
112	stringIds = strconv.Itoa(int(tc.tokens[2].TokenID)) + "," + strconv.Itoa(int(tc.tokens[5].TokenID)) + "," + strconv.Itoa(int(tc.tokens[6].TokenID))
113	path = fmt.Sprintf(
114		"%s?symbols=%s&ids=%s&limit=%d&fromItem=",
115		endpoint, stringSymbols, stringIds, limit,
116	)
117	err = doGoodReqPaginated(path, historydb.OrderAsc, &testTokensResponse{}, appendIter)
118	assert.NoError(t, err)
119
120	tokensFiltered = nil
121	tokensFiltered = append(tokensFiltered, tc.tokens[2])
122	tokensFiltered = append(tokensFiltered, tc.tokens[6])
123	assertTokensAPIs(t, tokensFiltered, fetchedTokens)
124
125	// All, in reverse order
126	fetchedTokens = []historydb.TokenWithUSD{}
127	limit = 5
128	path = fmt.Sprintf("%s?limit=%d&fromItem=", endpoint, limit)
129	err = doGoodReqPaginated(path, historydb.OrderDesc, &testTokensResponse{}, appendIter)
130	assert.NoError(t, err)
131	flipedTokens := []historydb.TokenWithUSD{}
132	for i := 0; i < len(tc.tokens); i++ {
133		flipedTokens = append(flipedTokens, tc.tokens[len(tc.tokens)-1-i])
134	}
135	assertTokensAPIs(t, flipedTokens, fetchedTokens)
136}
137
138func assertTokensAPIs(t *testing.T, expected, actual []historydb.TokenWithUSD) {
139	require.Equal(t, len(expected), len(actual))
140	for i := 0; i < len(actual); i++ { //nolint len(actual) won't change within the loop
141		actual[i].ItemID = 0
142		if expected[i].USDUpdate == nil {
143			assert.Equal(t, expected[i].USDUpdate, actual[i].USDUpdate)
144		} else {
145			assert.Less(t, expected[i].USDUpdate.Unix()-3, actual[i].USDUpdate.Unix())
146			expected[i].USDUpdate = actual[i].USDUpdate
147		}
148		assert.Equal(t, expected[i], actual[i])
149	}
150}