Sale Djenic 534c756bf5 fix_: re-trying http requests up to the predefined max retries
This commit should fix the issue with Cryptocompare and CoinGecko providers down.
Often happens that the first request fails and because of that:
- the Router cannot complete calculation successfully
- some tests are failing
- some users very often see a red banner line saying the providers are down
2024-05-23 16:28:50 +02:00

179 lines
3.4 KiB
Go

package coingecko
import (
"encoding/json"
"net/http"
"net/http/httptest"
"reflect"
"testing"
"github.com/status-im/status-go/services/wallet/thirdparty"
"github.com/stretchr/testify/require"
)
type TestTokenPlatform struct {
Ethereum string `json:"ethereum"`
Arb string `json:"arb"`
}
type TestGeckoToken struct {
ID string `json:"id"`
Symbol string `json:"symbol"`
Name string `json:"name"`
Platforms TestTokenPlatform `json:"platforms"`
}
func setupTest(t *testing.T, response []byte) (*httptest.Server, func()) {
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(200)
_, err := w.Write(response)
if err != nil {
return
}
}))
return srv, func() {
srv.Close()
}
}
func TestGetTokensSuccess(t *testing.T) {
expected := []GeckoToken{
{
ID: "ethereum",
Symbol: "eth",
Name: "Ethereum",
},
{
ID: "status",
Symbol: "snt",
Name: "Status",
},
}
expectedMap := map[string][]GeckoToken{
"ETH": []GeckoToken{{
ID: "ethereum",
Symbol: "eth",
Name: "Ethereum",
}},
"SNT": []GeckoToken{{
ID: "status",
Symbol: "snt",
Name: "Status",
}},
}
response, _ := json.Marshal(expected)
srv, stop := setupTest(t, response)
defer stop()
geckoClient := &Client{
httpClient: thirdparty.NewHTTPClient(),
tokens: make(map[string][]GeckoToken),
tokensURL: srv.URL,
}
tokenMap, err := geckoClient.getTokens()
require.NoError(t, err)
require.True(t, reflect.DeepEqual(expectedMap, tokenMap))
}
func TestGetTokensEthPlatform(t *testing.T) {
tokenList := []TestGeckoToken{
{
ID: "ethereum",
Symbol: "eth-test",
Name: "Ethereum",
Platforms: TestTokenPlatform{
Ethereum: "0x123",
},
},
{
ID: "usdt-bridge-test",
Symbol: "usdt-test",
Name: "USDT Bridge Test",
Platforms: TestTokenPlatform{
Arb: "0x123",
},
},
{
ID: "tether",
Symbol: "usdt-test",
Name: "Tether",
Platforms: TestTokenPlatform{
Arb: "0x1234",
Ethereum: "0x12345",
},
},
{
ID: "AirDao",
Symbol: "amb-test",
Name: "Amber",
Platforms: TestTokenPlatform{
Arb: "0x123455",
},
},
}
expectedMap := map[string][]GeckoToken{
"ETH-TEST": {{
ID: "ethereum",
Symbol: "eth-test",
Name: "Ethereum",
EthPlatform: true,
}},
"USDT-TEST": {
{
ID: "usdt-bridge-test",
Symbol: "usdt-test",
Name: "USDT Bridge Test",
EthPlatform: false,
},
{
ID: "tether",
Symbol: "usdt-test",
Name: "Tether",
EthPlatform: true,
},
},
"AMB-TEST": {{
ID: "AirDao",
Symbol: "amb-test",
Name: "Amber",
EthPlatform: false,
}},
}
response, _ := json.Marshal(tokenList)
srv, stop := setupTest(t, response)
defer stop()
geckoClient := &Client{
httpClient: thirdparty.NewHTTPClient(),
tokens: make(map[string][]GeckoToken),
tokensURL: srv.URL,
}
tokenMap, err := geckoClient.getTokens()
require.NoError(t, err)
require.True(t, reflect.DeepEqual(expectedMap, tokenMap))
}
func TestGetTokensFailure(t *testing.T) {
resp := []byte{}
srv, stop := setupTest(t, resp)
defer stop()
geckoClient := &Client{
httpClient: thirdparty.NewHTTPClient(),
tokens: make(map[string][]GeckoToken),
tokensURL: srv.URL,
}
_, err := geckoClient.getTokens()
require.Error(t, err)
}