Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -130,3 +130,4 @@ dmypy.json

.idea/
.ruff_cache/
.opencode/
24 changes: 15 additions & 9 deletions finam_trade_api/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ class Client:
"""
Главный клиент для работы с Finam Trade API.

Автоматически настраивает обновление JWT токенов для всех подклиентов.
Настраивает обновление JWT токенов для всех подклиентов при auto_refresh_tokens=True.

Атрибуты:
account (AccountClient): Клиент для работы со счетами.
Expand All @@ -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)
Expand All @@ -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)
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "finam-trade-api"
version = "4.3.1"
version = "4.3.2"
description = "Асинхронный REST-клиент для API Finam"
authors = ["DBoyara <boyarshin.den@yandex.ru>"]
license = "GNU GPL v.3.0"
Expand Down
15 changes: 15 additions & 0 deletions tests/base_client/test_base_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
25 changes: 25 additions & 0 deletions tests/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Loading