diff --git a/.gitignore b/.gitignore index f41c54a..e8766ad 100644 --- a/.gitignore +++ b/.gitignore @@ -130,3 +130,4 @@ dmypy.json .idea/ .ruff_cache/ +.opencode/ diff --git a/finam_trade_api/client.py b/finam_trade_api/client.py index fc564cc..327c5b5 100644 --- a/finam_trade_api/client.py +++ b/finam_trade_api/client.py @@ -11,7 +11,7 @@ class Client: """ Главный клиент для работы с Finam Trade API. - Автоматически настраивает обновление JWT токенов для всех подклиентов. + Настраивает обновление JWT токенов для всех подклиентов при auto_refresh_tokens=True. Атрибуты: account (AccountClient): Клиент для работы со счетами. @@ -22,15 +22,20 @@ class Client: quotas (QuotasClient): Клиент для работы с квотами. """ - def __init__(self, token_manger: TokenManager): + def __init__(self, token_manger: TokenManager, auto_refresh_tokens: bool = True): """ Инициализирует главный клиент и все его подклиенты. - Автоматически настраивает token_client для всех подклиентов, - чтобы они могли автоматически обновлять JWT токен. + При auto_refresh_tokens=True автоматически настраивает token_client для всех + подклиентов, чтобы они могли автоматически обновлять JWT токен. + + При auto_refresh_tokens=False необходимо самостоятельно вызвать + client.access_tokens.set_jwt_token() после создания клиента. Параметры: token_manger (TokenManager): Менеджер токенов для авторизации. + auto_refresh_tokens (bool): Включить автоматическое обновление JWT токена. + По умолчанию True. """ self.account = AccountClient(token_manger) self.assets = AssetsClient(token_manger) @@ -39,8 +44,9 @@ def __init__(self, token_manger: TokenManager): self.instruments = InstrumentClient(token_manger) self.quotas = QuotasClient(token_manger) - self.account.set_token_client(self.access_tokens) - self.assets.set_token_client(self.access_tokens) - self.orders.set_token_client(self.access_tokens) - self.instruments.set_token_client(self.access_tokens) - self.quotas.set_token_client(self.access_tokens) + if auto_refresh_tokens: + self.account.set_token_client(self.access_tokens) + self.assets.set_token_client(self.access_tokens) + self.orders.set_token_client(self.access_tokens) + self.instruments.set_token_client(self.access_tokens) + self.quotas.set_token_client(self.access_tokens) diff --git a/pyproject.toml b/pyproject.toml index 60b2b3f..bd3d479 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "finam-trade-api" -version = "4.3.1" +version = "4.3.2" description = "Асинхронный REST-клиент для API Finam" authors = ["DBoyara "] license = "GNU GPL v.3.0" diff --git a/tests/base_client/test_base_client.py b/tests/base_client/test_base_client.py index f4acbe6..b1be9fa 100644 --- a/tests/base_client/test_base_client.py +++ b/tests/base_client/test_base_client.py @@ -166,3 +166,18 @@ async def test_should_not_refresh_token_when_recent(base_client): """Тест что токен не должен быть обновлен, если обновлялся недавно""" base_client._last_token_refresh = datetime.now() - timedelta(minutes=5) assert base_client._should_refresh_token() is False + + +@pytest.mark.asyncio +async def test_auth_headers_with_jwt_token(base_client): + """Тест что _auth_headers возвращает JWT токен если он установлен""" + base_client._token_manager.set_jwt_token("jwt_token") + headers = base_client._auth_headers + assert headers == {"Authorization": "jwt_token"} + + +@pytest.mark.asyncio +async def test_auth_headers_without_jwt_token(base_client): + """Тест что _auth_headers возвращает None если jwt_token не установлен""" + headers = base_client._auth_headers + assert headers is None diff --git a/tests/test_client.py b/tests/test_client.py index f2b7faf..3ded1ea 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -21,3 +21,28 @@ def test_client_initialization(client): assert isinstance(client.orders, OrderClient) assert isinstance(client.access_tokens, TokenClient) assert isinstance(client.instruments, InstrumentClient) + + +def test_client_auto_refresh_enabled_by_default(): + """Тест что auto_refresh_tokens=True по умолчанию""" + token = "your_token_here" + client = Client(TokenManager(token)) + + # Проверяем что token_client установлен для всех подклиентов + assert client.account._token_client is not None + assert client.assets._token_client is not None + assert client.orders._token_client is not None + assert client.instruments._token_client is not None + + +def test_client_auto_refresh_disabled(): + """Тест что при auto_refresh_tokens=False token_client не устанавливается""" + token = "your_token_here" + client = Client(TokenManager(token), auto_refresh_tokens=False) + + # Проверяем что token_client НЕ установлен + assert client.account._token_client is None + assert client.assets._token_client is None + assert client.orders._token_client is None + assert client.instruments._token_client is None + assert client.quotas._token_client is None