diff --git a/pkg/exchange/bitget/bitgetapi/v2/testdata/get_ticker_request.json b/pkg/exchange/bitget/bitgetapi/v2/testdata/get_ticker_request.json new file mode 100644 index 000000000..99aa58193 --- /dev/null +++ b/pkg/exchange/bitget/bitgetapi/v2/testdata/get_ticker_request.json @@ -0,0 +1,25 @@ +{ + "code":"00000", + "msg":"success", + "requestTime":1709626632870, + "data":[ + { + "open":"64654.54", + "symbol":"BTCUSDT", + "high24h":"68686.93", + "low24h":"64583.42", + "lastPr":"66554.03", + "quoteVolume":"1963568540.741927", + "baseVolume":"29439.351448", + "usdtVolume":"1963568540.74192678", + "ts":"1709626631127", + "bidPr":"66554", + "askPr":"66554.07", + "bidSz":"0.000237", + "askSz":"0.08228", + "openUtc":"68245.32", + "changeUtc24h":"-0.02478", + "change24h":"0.00153" + } + ] +} diff --git a/pkg/exchange/bitget/bitgetapi/v2/testdata/get_tickers_request.json b/pkg/exchange/bitget/bitgetapi/v2/testdata/get_tickers_request.json new file mode 100644 index 000000000..3fd1dc735 --- /dev/null +++ b/pkg/exchange/bitget/bitgetapi/v2/testdata/get_tickers_request.json @@ -0,0 +1,43 @@ +{ + "code":"00000", + "msg":"success", + "requestTime":1709626632870, + "data":[ + { + "open":"64654.54", + "symbol":"BTCUSDT", + "high24h":"68686.93", + "low24h":"64583.42", + "lastPr":"66554.03", + "quoteVolume":"1963568540.741927", + "baseVolume":"29439.351448", + "usdtVolume":"1963568540.74192678", + "ts":"1709626631127", + "bidPr":"66554", + "askPr":"66554.07", + "bidSz":"0.000237", + "askSz":"0.08228", + "openUtc":"68245.32", + "changeUtc24h":"-0.02478", + "change24h":"0.00153" + }, + { + "open":"3506.6", + "symbol":"ETHUSDT", + "high24h":"3740", + "low24h":"3461.17", + "lastPr":"3686.95", + "quoteVolume":"873897317.8273", + "baseVolume":"243220.866", + "usdtVolume":"873897317.827294", + "ts":"1709626631726", + "bidPr":"3686.94", + "askPr":"3686.98", + "bidSz":"1.0046", + "askSz":"1.0015", + "openUtc":"3627.67", + "changeUtc24h":"0.01634", + "change24h":"0.03572" + } + ] +} diff --git a/pkg/exchange/bitget/bitgetapi/v2/testdata/get_symbols_request_error.json b/pkg/exchange/bitget/bitgetapi/v2/testdata/request_error.json similarity index 100% rename from pkg/exchange/bitget/bitgetapi/v2/testdata/get_symbols_request_error.json rename to pkg/exchange/bitget/bitgetapi/v2/testdata/request_error.json diff --git a/pkg/exchange/bitget/exchange_test.go b/pkg/exchange/bitget/exchange_test.go index 78aa79898..b2087972b 100644 --- a/pkg/exchange/bitget/exchange_test.go +++ b/pkg/exchange/bitget/exchange_test.go @@ -74,7 +74,7 @@ func TestExchange_QueryMarkets(t *testing.T) { transport := &httptesting.MockTransport{} ex.client.HttpClient.Transport = transport - f, err := os.ReadFile("bitgetapi/v2/testdata/get_symbols_request_error.json") + f, err := os.ReadFile("bitgetapi/v2/testdata/request_error.json") assert.NoError(t, err) transport.GET("/api/v2/spot/public/symbols", func(req *http.Request) (*http.Response, error) { @@ -85,3 +85,151 @@ func TestExchange_QueryMarkets(t *testing.T) { assert.ErrorContains(t, err, "Invalid IP") }) } + +func TestExchange_QueryTicker(t *testing.T) { + var ( + assert = assert.New(t) + ex = New("key", "secret", "passphrase") + url = "/api/v2/spot/market/tickers" + ) + + t.Run("succeeds", func(t *testing.T) { + transport := &httptesting.MockTransport{} + ex.client.HttpClient.Transport = transport + + f, err := os.ReadFile("bitgetapi/v2/testdata/get_ticker_request.json") + assert.NoError(err) + + transport.GET(url, func(req *http.Request) (*http.Response, error) { + return httptesting.BuildResponseString(http.StatusOK, string(f)), nil + }) + + tickers, err := ex.QueryTicker(context.Background(), "BTCUSDT") + assert.NoError(err) + expTicker := &types.Ticker{ + Time: types.NewMillisecondTimestampFromInt(1709626631127).Time(), + Volume: fixedpoint.MustNewFromString("29439.351448"), + Last: fixedpoint.MustNewFromString("66554.03"), + Open: fixedpoint.MustNewFromString("64654.54"), + High: fixedpoint.MustNewFromString("68686.93"), + Low: fixedpoint.MustNewFromString("64583.42"), + Buy: fixedpoint.MustNewFromString("66554"), + Sell: fixedpoint.MustNewFromString("66554.07"), + } + assert.Equal(expTicker, tickers) + }) + + t.Run("unexpected length", func(t *testing.T) { + transport := &httptesting.MockTransport{} + ex.client.HttpClient.Transport = transport + + f, err := os.ReadFile("bitgetapi/v2/testdata/get_tickers_request.json") + assert.NoError(err) + + transport.GET(url, func(req *http.Request) (*http.Response, error) { + return httptesting.BuildResponseString(http.StatusOK, string(f)), nil + }) + + _, err = ex.QueryTicker(context.Background(), "BTCUSDT") + assert.ErrorContains(err, "unexpected length of query") + }) + + t.Run("error", func(t *testing.T) { + transport := &httptesting.MockTransport{} + ex.client.HttpClient.Transport = transport + + f, err := os.ReadFile("bitgetapi/v2/testdata/request_error.json") + assert.NoError(err) + + transport.GET(url, func(req *http.Request) (*http.Response, error) { + return httptesting.BuildResponseString(http.StatusBadRequest, string(f)), nil + }) + + _, err = ex.QueryTicker(context.Background(), "BTCUSDT") + assert.ErrorContains(err, "Invalid IP") + }) +} + +func TestExchange_QueryTickers(t *testing.T) { + var ( + assert = assert.New(t) + ex = New("key", "secret", "passphrase") + url = "/api/v2/spot/market/tickers" + expBtcSymbol = "BTCUSDT" + expBtcTicker = types.Ticker{ + Time: types.NewMillisecondTimestampFromInt(1709626631127).Time(), + Volume: fixedpoint.MustNewFromString("29439.351448"), + Last: fixedpoint.MustNewFromString("66554.03"), + Open: fixedpoint.MustNewFromString("64654.54"), + High: fixedpoint.MustNewFromString("68686.93"), + Low: fixedpoint.MustNewFromString("64583.42"), + Buy: fixedpoint.MustNewFromString("66554"), + Sell: fixedpoint.MustNewFromString("66554.07"), + } + ) + + t.Run("succeeds", func(t *testing.T) { + transport := &httptesting.MockTransport{} + ex.client.HttpClient.Transport = transport + + f, err := os.ReadFile("bitgetapi/v2/testdata/get_tickers_request.json") + assert.NoError(err) + + transport.GET(url, func(req *http.Request) (*http.Response, error) { + return httptesting.BuildResponseString(http.StatusOK, string(f)), nil + }) + + tickers, err := ex.QueryTickers(context.Background()) + assert.NoError(err) + expTickers := map[string]types.Ticker{ + expBtcSymbol: expBtcTicker, + "ETHUSDT": { + Time: types.NewMillisecondTimestampFromInt(1709626631726).Time(), + Volume: fixedpoint.MustNewFromString("243220.866"), + Last: fixedpoint.MustNewFromString("3686.95"), + Open: fixedpoint.MustNewFromString("3506.6"), + High: fixedpoint.MustNewFromString("3740"), + Low: fixedpoint.MustNewFromString("3461.17"), + Buy: fixedpoint.MustNewFromString("3686.94"), + Sell: fixedpoint.MustNewFromString("3686.98"), + }, + } + assert.Equal(expTickers, tickers) + }) + + t.Run("succeeds for query one markets", func(t *testing.T) { + transport := &httptesting.MockTransport{} + ex.client.HttpClient.Transport = transport + + f, err := os.ReadFile("bitgetapi/v2/testdata/get_ticker_request.json") + assert.NoError(err) + + transport.GET(url, func(req *http.Request) (*http.Response, error) { + assert.Contains(req.URL.Query(), "symbol") + assert.Equal(req.URL.Query()["symbol"], []string{expBtcSymbol}) + return httptesting.BuildResponseString(http.StatusOK, string(f)), nil + }) + + tickers, err := ex.QueryTickers(context.Background(), expBtcSymbol) + assert.NoError(err) + expTickers := map[string]types.Ticker{ + expBtcSymbol: expBtcTicker, + } + assert.Equal(expTickers, tickers) + }) + + t.Run("error", func(t *testing.T) { + transport := &httptesting.MockTransport{} + ex.client.HttpClient.Transport = transport + + f, err := os.ReadFile("bitgetapi/v2/testdata/request_error.json") + assert.NoError(err) + + transport.GET(url, func(req *http.Request) (*http.Response, error) { + return httptesting.BuildResponseString(http.StatusBadRequest, string(f)), nil + }) + + _, err = ex.QueryTicker(context.Background(), expBtcSymbol) + assert.ErrorContains(err, "Invalid IP") + }) +}