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}