diff --git a/binance/async_client.py b/binance/async_client.py index 335a197e8..1ae5b29d8 100644 --- a/binance/async_client.py +++ b/binance/async_client.py @@ -283,7 +283,7 @@ async def get_products(self) -> Dict: get_products.__doc__ = Client.get_products.__doc__ async def get_exchange_info(self) -> Dict: - return await self._get("exchangeInfo", version=self.PRIVATE_API_VERSION) + return await self._get("exchangeInfo") get_exchange_info.__doc__ = Client.get_exchange_info.__doc__ @@ -301,12 +301,12 @@ async def get_symbol_info(self, symbol) -> Optional[Dict]: # General Endpoints async def ping(self) -> Dict: - return await self._get("ping", version=self.PRIVATE_API_VERSION) + return await self._get("ping") ping.__doc__ = Client.ping.__doc__ async def get_server_time(self) -> Dict: - return await self._get("time", version=self.PRIVATE_API_VERSION) + return await self._get("time") get_server_time.__doc__ = Client.get_server_time.__doc__ @@ -319,7 +319,7 @@ async def get_all_tickers( if symbol: params["symbol"] = symbol response = await self._get( - "ticker/price", version=self.PRIVATE_API_VERSION, data=params + "ticker/price", data=params ) if isinstance(response, list) and all(isinstance(item, dict) for item in response): return response @@ -334,13 +334,13 @@ async def get_orderbook_tickers(self, **params) -> Dict: elif "symbols" in params: data["symbols"] = params["symbols"] return await self._get( - "ticker/bookTicker", data=data, version=self.PRIVATE_API_VERSION + "ticker/bookTicker", data=data ) get_orderbook_tickers.__doc__ = Client.get_orderbook_tickers.__doc__ async def get_order_book(self, **params) -> Dict: - return await self._get("depth", data=params, version=self.PRIVATE_API_VERSION) + return await self._get("depth", data=params) get_order_book.__doc__ = Client.get_order_book.__doc__ @@ -351,14 +351,14 @@ async def get_recent_trades(self, **params) -> Dict: async def get_historical_trades(self, **params) -> Dict: return await self._get( - "historicalTrades", data=params, version=self.PRIVATE_API_VERSION + "historicalTrades", data=params ) get_historical_trades.__doc__ = Client.get_historical_trades.__doc__ async def get_aggregate_trades(self, **params) -> Dict: return await self._get( - "aggTrades", data=params, version=self.PRIVATE_API_VERSION + "aggTrades", data=params ) get_aggregate_trades.__doc__ = Client.get_aggregate_trades.__doc__ @@ -419,12 +419,12 @@ async def aggregate_trade_iter(self, symbol, start_str=None, last_id=None): aggregate_trade_iter.__doc__ = Client.aggregate_trade_iter.__doc__ async def get_ui_klines(self, **params) -> Dict: - return await self._get("uiKlines", data=params, version=self.PRIVATE_API_VERSION) + return await self._get("uiKlines", data=params) get_ui_klines.__doc__ = Client.get_ui_klines.__doc__ async def get_klines(self, **params) -> Dict: - return await self._get("klines", data=params, version=self.PRIVATE_API_VERSION) + return await self._get("klines", data=params) get_klines.__doc__ = Client.get_klines.__doc__ @@ -655,33 +655,33 @@ async def _historical_klines_generator( async def get_avg_price(self, **params): return await self._get( - "avgPrice", data=params, version=self.PRIVATE_API_VERSION + "avgPrice", data=params ) get_avg_price.__doc__ = Client.get_avg_price.__doc__ async def get_ticker(self, **params): return await self._get( - "ticker/24hr", data=params, version=self.PRIVATE_API_VERSION + "ticker/24hr", data=params ) get_ticker.__doc__ = Client.get_ticker.__doc__ async def get_symbol_ticker(self, **params): return await self._get( - "ticker/price", data=params, version=self.PRIVATE_API_VERSION + "ticker/price", data=params ) get_symbol_ticker.__doc__ = Client.get_symbol_ticker.__doc__ async def get_symbol_ticker_window(self, **params): - return await self._get("ticker", data=params, version=self.PRIVATE_API_VERSION) + return await self._get("ticker", data=params) get_symbol_ticker_window.__doc__ = Client.get_symbol_ticker_window.__doc__ async def get_orderbook_ticker(self, **params): return await self._get( - "ticker/bookTicker", data=params, version=self.PRIVATE_API_VERSION + "ticker/bookTicker", data=params ) get_orderbook_ticker.__doc__ = Client.get_orderbook_ticker.__doc__ diff --git a/binance/base_client.py b/binance/base_client.py index 53ee964b8..8e1cd54c8 100644 --- a/binance/base_client.py +++ b/binance/base_client.py @@ -39,7 +39,7 @@ class BaseClient: WS_API_TESTNET_URL = "wss://ws-api.testnet.binance.vision/ws-api/v3" WS_FUTURES_URL = "wss://ws-fapi.binance.{}/ws-fapi/v1" WS_FUTURES_TESTNET_URL = "wss://testnet.binancefuture.com/ws-fapi/v1" - PUBLIC_API_VERSION = "v1" + PUBLIC_API_VERSION = "v3" PRIVATE_API_VERSION = "v3" MARGIN_API_VERSION = "v1" MARGIN_API_VERSION2 = "v2" diff --git a/binance/client.py b/binance/client.py index 206417e77..68e6fc622 100755 --- a/binance/client.py +++ b/binance/client.py @@ -274,7 +274,7 @@ def get_exchange_info(self) -> Dict: """ - return self._get("exchangeInfo", version=self.PRIVATE_API_VERSION) + return self._get("exchangeInfo") def get_symbol_info(self, symbol) -> Optional[Dict]: """Return information about a symbol @@ -341,7 +341,7 @@ def ping(self) -> Dict: :raises: BinanceRequestException, BinanceAPIException """ - return self._get("ping", version=self.PRIVATE_API_VERSION) + return self._get("ping") def get_server_time(self) -> Dict: """Test connectivity to the Rest API and get the current server time. @@ -359,14 +359,14 @@ def get_server_time(self) -> Dict: :raises: BinanceRequestException, BinanceAPIException """ - return self._get("time", version=self.PRIVATE_API_VERSION) + return self._get("time") # Market Data Endpoints def get_all_tickers(self) -> List[Dict[str, str]]: """Latest price for all symbols. - https://binance-docs.github.io/apidocs/spot/en/#symbol-price-ticker + https://developers.binance.com/docs/binance-spot-api-docs/rest-api/market-data-endpoints#symbol-price-ticker :returns: List of market tickers @@ -386,7 +386,7 @@ def get_all_tickers(self) -> List[Dict[str, str]]: :raises: BinanceRequestException, BinanceAPIException """ - response = self._get("ticker/price", version=self.PRIVATE_API_VERSION) + response = self._get("ticker/price") if isinstance(response, list) and all(isinstance(item, dict) for item in response): return response raise TypeError("Expected a list of dictionaries") @@ -394,7 +394,7 @@ def get_all_tickers(self) -> List[Dict[str, str]]: def get_orderbook_tickers(self, **params) -> Dict: """Best price/qty on the order book for all symbols. - https://binance-docs.github.io/apidocs/spot/en/#symbol-order-book-ticker + https://developers.binance.com/docs/binance-spot-api-docs/rest-api/market-data-endpoints#symbol-order-book-ticker :param symbol: optional :type symbol: str @@ -431,13 +431,13 @@ def get_orderbook_tickers(self, **params) -> Dict: elif "symbols" in params: data["symbols"] = params["symbols"] return self._get( - "ticker/bookTicker", data=data, version=self.PRIVATE_API_VERSION + "ticker/bookTicker", data=data ) def get_order_book(self, **params) -> Dict: """Get the Order Book for the market - https://binance-docs.github.io/apidocs/spot/en/#order-book + https://developers.binance.com/docs/binance-spot-api-docs/rest-api/market-data-endpoints#order-book :param symbol: required :type symbol: str @@ -469,12 +469,12 @@ def get_order_book(self, **params) -> Dict: :raises: BinanceRequestException, BinanceAPIException """ - return self._get("depth", data=params, version=self.PRIVATE_API_VERSION) + return self._get("depth", data=params) def get_recent_trades(self, **params) -> Dict: """Get recent trades (up to last 500). - https://binance-docs.github.io/apidocs/spot/en/#recent-trades-list + https://developers.binance.com/docs/binance-spot-api-docs/rest-api/market-data-endpoints#recent-trades-list :param symbol: required :type symbol: str @@ -504,7 +504,7 @@ def get_recent_trades(self, **params) -> Dict: def get_historical_trades(self, **params) -> Dict: """Get older trades. - https://binance-docs.github.io/apidocs/spot/en/#old-trade-lookup + https://developers.binance.com/docs/binance-spot-api-docs/rest-api/market-data-endpoints#old-trade-lookup :param symbol: required :type symbol: str @@ -532,14 +532,14 @@ def get_historical_trades(self, **params) -> Dict: """ return self._get( - "historicalTrades", data=params, version=self.PRIVATE_API_VERSION + "historicalTrades", data=params ) def get_aggregate_trades(self, **params) -> Dict: """Get compressed, aggregate trades. Trades that fill at the time, from the same order, with the same price will have the quantity aggregated. - - https://binance-docs.github.io/apidocs/spot/en/#compressed-aggregate-trades-list + + https://developers.binance.com/docs/binance-spot-api-docs/rest-api/market-data-endpoints :param symbol: required :type symbol: str @@ -572,7 +572,7 @@ def get_aggregate_trades(self, **params) -> Dict: :raises: BinanceRequestException, BinanceAPIException """ - return self._get("aggTrades", data=params, version=self.PRIVATE_API_VERSION) + return self._get("aggTrades", data=params) def aggregate_trade_iter(self, symbol: str, start_str=None, last_id=None): """Iterate over aggregate trade data from (start_time or last_id) to @@ -697,12 +697,12 @@ def get_ui_klines(self, **params) -> Dict: :raises: BinanceRequestException, BinanceAPIException """ - return self._get("uiKlines", data=params, version=self.PRIVATE_API_VERSION) + return self._get("uiKlines", data=params) def get_klines(self, **params) -> Dict: """Kline/candlestick bars for a symbol. Klines are uniquely identified by their open time. - https://binance-docs.github.io/apidocs/spot/en/#kline-candlestick-data + https://developers.binance.com/docs/binance-spot-api-docs/rest-api/market-data-endpoints#klinecandlestick-data :param symbol: required :type symbol: str @@ -739,7 +739,7 @@ def get_klines(self, **params) -> Dict: :raises: BinanceRequestException, BinanceAPIException """ - return self._get("klines", data=params, version=self.PRIVATE_API_VERSION) + return self._get("klines", data=params) def _klines( self, klines_type: HistoricalKlinesType = HistoricalKlinesType.SPOT, **params @@ -1058,8 +1058,8 @@ def _historical_klines_generator( def get_avg_price(self, **params): """Current average price for a symbol. - - https://binance-docs.github.io/apidocs/spot/en/#current-average-price + + https://developers.binance.com/docs/binance-spot-api-docs/rest-api/market-data-endpoints#current-average-price :param symbol: :type symbol: str @@ -1073,12 +1073,12 @@ def get_avg_price(self, **params): "price": "9.35751834" } """ - return self._get("avgPrice", data=params, version=self.PRIVATE_API_VERSION) + return self._get("avgPrice", data=params) def get_ticker(self, **params): """24 hour price change statistics. - https://binance-docs.github.io/apidocs/spot/en/#24hr-ticker-price-change-statistics + https://developers.binance.com/docs/binance-spot-api-docs/rest-api/market-data-endpoints#24hr-ticker-price-change-statistics :param symbol: :type symbol: str @@ -1134,7 +1134,7 @@ def get_ticker(self, **params): :raises: BinanceRequestException, BinanceAPIException """ - return self._get("ticker/24hr", data=params, version=self.PRIVATE_API_VERSION) + return self._get("ticker/24hr", data=params) def get_symbol_ticker(self, **params): """Latest price for a symbol or symbols. @@ -1171,12 +1171,12 @@ def get_symbol_ticker(self, **params): :raises: BinanceRequestException, BinanceAPIException """ - return self._get("ticker/price", data=params, version=self.PRIVATE_API_VERSION) + return self._get("ticker/price", data=params) def get_symbol_ticker_window(self, **params): """Latest price for a symbol or symbols. - https://binance-docs.github.io/apidocs/spot/en/#rolling-window-price-change-statistics + https://developers.binance.com/docs/binance-spot-api-docs/rest-api/market-data-endpoints#rolling-window-price-change-statistics :param symbol: :type symbol: str @@ -1208,7 +1208,7 @@ def get_symbol_ticker_window(self, **params): :raises: BinanceRequestException, BinanceAPIException """ - return self._get("ticker", data=params, version=self.PRIVATE_API_VERSION) + return self._get("ticker", data=params) def get_orderbook_ticker(self, **params): """Latest price for a symbol or symbols. @@ -1255,7 +1255,7 @@ def get_orderbook_ticker(self, **params): """ return self._get( - "ticker/bookTicker", data=params, version=self.PRIVATE_API_VERSION + "ticker/bookTicker", data=params ) # Account Endpoints @@ -3129,7 +3129,7 @@ def stream_get_listen_key(self): """ res = self._post( - "userDataStream", False, data={}, version=self.PRIVATE_API_VERSION + "userDataStream", False, data={} ) return res["listenKey"] @@ -3152,7 +3152,7 @@ def stream_keepalive(self, listenKey): """ params = {"listenKey": listenKey} return self._put( - "userDataStream", False, data=params, version=self.PRIVATE_API_VERSION + "userDataStream", False, data=params ) def stream_close(self, listenKey): diff --git a/tests/conftest.py b/tests/conftest.py index 76e49ceaf..afb29b038 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -160,3 +160,38 @@ def pytest_collection_modifyitems(config, items): item.add_marker(skip_portfolio) if "gift_card" in item.keywords and not config.getoption("--run-gift-card"): item.add_marker(skip_gift_card) + + +def call_method_and_assert_uri_contains(client, method_name, expected_string, *args, **kwargs): + """ + Helper function to test that a client method calls the expected URI. + + Args: + client: The client instance to test + method_name: Name of the method to call (as string) + expected_string: String that should be present in the URI + *args, **kwargs: Arguments to pass to the client method + + Returns: + The result of the method call + """ + from unittest.mock import patch + + with patch.object(client, '_request', wraps=client._request) as mock_request: + # Get the method from the client and call it + method = getattr(client, method_name) + result = method(*args, **kwargs) + + # Assert that _request was called + mock_request.assert_called_once() + + # Get the arguments passed to _request + args_passed, kwargs_passed = mock_request.call_args + + # The second argument is the URI + uri = args_passed[1] + + # Assert that the URL contains the expected string + assert expected_string in uri, f"Expected '{expected_string}' in URL, but got: {uri}" + + return result diff --git a/tests/test_client.py b/tests/test_client.py index 48b977b82..10fea4cf8 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -1,7 +1,7 @@ import pytest from binance.client import Client from binance.exceptions import BinanceAPIException, BinanceRequestException -from .conftest import proxies, api_key, api_secret, testnet +from .conftest import proxies, api_key, api_secret, testnet, call_method_and_assert_uri_contains def test_client_initialization(client): @@ -23,7 +23,8 @@ def test_get_symbol_info(client): def test_ping(client): - client.ping() + call_method_and_assert_uri_contains(client, 'ping', '/v3/') + def test_get_server_time(client): @@ -73,7 +74,7 @@ def test_get_symbol_ticker(client): def test_get_orderbook_ticker(client): - client.get_orderbook_ticker(symbol="BTCUSDT") + call_method_and_assert_uri_contains(client, 'get_orderbook_ticker', '/v3/', symbol="BTCUSDT") def test_get_account(client):