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}