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 TestGetToken(t *testing.T) {
 30	// Get all txs by their ID
 31	endpoint := apiURL + "tokens/"
 32	fetchedTokens := []historydb.TokenWithUSD{}
 33	for _, token := range tc.tokens {
 34		fetchedToken := historydb.TokenWithUSD{}
 35		assert.NoError(t, doGoodReq("GET", endpoint+strconv.Itoa(int(token.TokenID)), nil, &fetchedToken))
 36		fetchedTokens = append(fetchedTokens, fetchedToken)
 37	}
 38	assertTokensAPIs(t, tc.tokens, fetchedTokens)
 39}
 40
 41func TestGetTokens(t *testing.T) {
 42	endpoint := apiURL + "tokens"
 43	fetchedTokens := []historydb.TokenWithUSD{}
 44	appendIter := func(intr interface{}) {
 45		for i := 0; i < len(intr.(*testTokensResponse).Tokens); i++ {
 46			tmp, err := copystructure.Copy(intr.(*testTokensResponse).Tokens[i])
 47			if err != nil {
 48				panic(err)
 49			}
 50			fetchedTokens = append(fetchedTokens, tmp.(historydb.TokenWithUSD))
 51		}
 52	}
 53	// Get all (no filters)
 54	limit := 8
 55	path := fmt.Sprintf("%s?limit=%d&fromItem=", endpoint, limit)
 56	err := doGoodReqPaginated(path, historydb.OrderAsc, &testTokensResponse{}, appendIter)
 57	assert.NoError(t, err)
 58	assertTokensAPIs(t, tc.tokens, fetchedTokens)
 59
 60	// Get by tokenIds
 61	fetchedTokens = []historydb.TokenWithUSD{}
 62	limit = 7
 63	stringIds := strconv.Itoa(int(tc.tokens[2].TokenID)) + "," + strconv.Itoa(int(tc.tokens[5].TokenID)) + "," + strconv.Itoa(int(tc.tokens[6].TokenID))
 64	path = fmt.Sprintf(
 65		"%s?ids=%s&limit=%d&fromItem=",
 66		endpoint, stringIds, limit,
 67	)
 68	err = doGoodReqPaginated(path, historydb.OrderAsc, &testTokensResponse{}, appendIter)
 69	assert.NoError(t, err)
 70	var tokensFiltered []historydb.TokenWithUSD
 71	tokensFiltered = append(tokensFiltered, tc.tokens[2])
 72	tokensFiltered = append(tokensFiltered, tc.tokens[5])
 73	tokensFiltered = append(tokensFiltered, tc.tokens[6])
 74	assertTokensAPIs(t, tokensFiltered, fetchedTokens)
 75
 76	// Get by symbols
 77	fetchedTokens = []historydb.TokenWithUSD{}
 78	limit = 7
 79	stringSymbols := tc.tokens[1].Symbol + "," + tc.tokens[3].Symbol
 80	path = fmt.Sprintf(
 81		"%s?symbols=%s&limit=%d&fromItem=",
 82		endpoint, stringSymbols, limit,
 83	)
 84	err = doGoodReqPaginated(path, historydb.OrderAsc, &testTokensResponse{}, appendIter)
 85	assert.NoError(t, err)
 86	tokensFiltered = nil
 87	tokensFiltered = append(tokensFiltered, tc.tokens[1])
 88	tokensFiltered = append(tokensFiltered, tc.tokens[3])
 89	assertTokensAPIs(t, tokensFiltered, fetchedTokens)
 90
 91	// Get by name
 92	fetchedTokens = []historydb.TokenWithUSD{}
 93	limit = 5
 94	stringName := tc.tokens[8].Name[4:5]
 95	path = fmt.Sprintf(
 96		"%s?name=%s&limit=%d&fromItem=",
 97		endpoint, stringName, limit,
 98	)
 99	err = doGoodReqPaginated(path, historydb.OrderAsc, &testTokensResponse{}, appendIter)
100	assert.NoError(t, err)
101	tokensFiltered = nil
102	tokensFiltered = append(tokensFiltered, tc.tokens[8])
103	assertTokensAPIs(t, tokensFiltered, fetchedTokens)
104
105	// Multiple filters
106	fetchedTokens = []historydb.TokenWithUSD{}
107	limit = 5
108	stringSymbols = tc.tokens[2].Symbol + "," + tc.tokens[6].Symbol
109	stringIds = strconv.Itoa(int(tc.tokens[2].TokenID)) + "," + strconv.Itoa(int(tc.tokens[5].TokenID)) + "," + strconv.Itoa(int(tc.tokens[6].TokenID))
110	path = fmt.Sprintf(
111		"%s?symbols=%s&ids=%s&limit=%d&fromItem=",
112		endpoint, stringSymbols, stringIds, limit,
113	)
114	err = doGoodReqPaginated(path, historydb.OrderAsc, &testTokensResponse{}, appendIter)
115	assert.NoError(t, err)
116
117	tokensFiltered = nil
118	tokensFiltered = append(tokensFiltered, tc.tokens[2])
119	tokensFiltered = append(tokensFiltered, tc.tokens[6])
120	assertTokensAPIs(t, tokensFiltered, fetchedTokens)
121
122	// All, in reverse order
123	fetchedTokens = []historydb.TokenWithUSD{}
124	limit = 5
125	path = fmt.Sprintf("%s?limit=%d&fromItem=", endpoint, limit)
126	err = doGoodReqPaginated(path, historydb.OrderDesc, &testTokensResponse{}, appendIter)
127	assert.NoError(t, err)
128	flipedTokens := []historydb.TokenWithUSD{}
129	for i := 0; i < len(tc.tokens); i++ {
130		flipedTokens = append(flipedTokens, tc.tokens[len(tc.tokens)-1-i])
131	}
132	assertTokensAPIs(t, flipedTokens, fetchedTokens)
133}
134
135func assertTokensAPIs(t *testing.T, expected, actual []historydb.TokenWithUSD) {
136	require.Equal(t, len(expected), len(actual))
137	for i := 0; i < len(actual); i++ { //nolint len(actual) won't change within the loop
138		actual[i].ItemID = 0
139		if expected[i].USDUpdate == nil {
140			assert.Equal(t, expected[i].USDUpdate, actual[i].USDUpdate)
141		} else {
142			assert.Less(t, expected[i].USDUpdate.Unix()-3, actual[i].USDUpdate.Unix())
143			expected[i].USDUpdate = actual[i].USDUpdate
144		}
145		assert.Equal(t, expected[i], actual[i])
146	}
147}