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}