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", 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",
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",
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",
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",
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", 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}