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