Skip to content

Commit caf35a4

Browse files
authored
optional auto refresh token (#97)
1 parent 017cd2b commit caf35a4

5 files changed

Lines changed: 57 additions & 10 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,3 +130,4 @@ dmypy.json
130130

131131
.idea/
132132
.ruff_cache/
133+
.opencode/

finam_trade_api/client.py

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class Client:
1111
"""
1212
Главный клиент для работы с Finam Trade API.
1313
14-
Автоматически настраивает обновление JWT токенов для всех подклиентов.
14+
Настраивает обновление JWT токенов для всех подклиентов при auto_refresh_tokens=True.
1515
1616
Атрибуты:
1717
account (AccountClient): Клиент для работы со счетами.
@@ -22,15 +22,20 @@ class Client:
2222
quotas (QuotasClient): Клиент для работы с квотами.
2323
"""
2424

25-
def __init__(self, token_manger: TokenManager):
25+
def __init__(self, token_manger: TokenManager, auto_refresh_tokens: bool = True):
2626
"""
2727
Инициализирует главный клиент и все его подклиенты.
2828
29-
Автоматически настраивает token_client для всех подклиентов,
30-
чтобы они могли автоматически обновлять JWT токен.
29+
При auto_refresh_tokens=True автоматически настраивает token_client для всех
30+
подклиентов, чтобы они могли автоматически обновлять JWT токен.
31+
32+
При auto_refresh_tokens=False необходимо самостоятельно вызвать
33+
client.access_tokens.set_jwt_token() после создания клиента.
3134
3235
Параметры:
3336
token_manger (TokenManager): Менеджер токенов для авторизации.
37+
auto_refresh_tokens (bool): Включить автоматическое обновление JWT токена.
38+
По умолчанию True.
3439
"""
3540
self.account = AccountClient(token_manger)
3641
self.assets = AssetsClient(token_manger)
@@ -39,8 +44,9 @@ def __init__(self, token_manger: TokenManager):
3944
self.instruments = InstrumentClient(token_manger)
4045
self.quotas = QuotasClient(token_manger)
4146

42-
self.account.set_token_client(self.access_tokens)
43-
self.assets.set_token_client(self.access_tokens)
44-
self.orders.set_token_client(self.access_tokens)
45-
self.instruments.set_token_client(self.access_tokens)
46-
self.quotas.set_token_client(self.access_tokens)
47+
if auto_refresh_tokens:
48+
self.account.set_token_client(self.access_tokens)
49+
self.assets.set_token_client(self.access_tokens)
50+
self.orders.set_token_client(self.access_tokens)
51+
self.instruments.set_token_client(self.access_tokens)
52+
self.quotas.set_token_client(self.access_tokens)

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "finam-trade-api"
3-
version = "4.3.1"
3+
version = "4.3.2"
44
description = "Асинхронный REST-клиент для API Finam"
55
authors = ["DBoyara <boyarshin.den@yandex.ru>"]
66
license = "GNU GPL v.3.0"

tests/base_client/test_base_client.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,3 +166,18 @@ async def test_should_not_refresh_token_when_recent(base_client):
166166
"""Тест что токен не должен быть обновлен, если обновлялся недавно"""
167167
base_client._last_token_refresh = datetime.now() - timedelta(minutes=5)
168168
assert base_client._should_refresh_token() is False
169+
170+
171+
@pytest.mark.asyncio
172+
async def test_auth_headers_with_jwt_token(base_client):
173+
"""Тест что _auth_headers возвращает JWT токен если он установлен"""
174+
base_client._token_manager.set_jwt_token("jwt_token")
175+
headers = base_client._auth_headers
176+
assert headers == {"Authorization": "jwt_token"}
177+
178+
179+
@pytest.mark.asyncio
180+
async def test_auth_headers_without_jwt_token(base_client):
181+
"""Тест что _auth_headers возвращает None если jwt_token не установлен"""
182+
headers = base_client._auth_headers
183+
assert headers is None

tests/test_client.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,28 @@ def test_client_initialization(client):
2121
assert isinstance(client.orders, OrderClient)
2222
assert isinstance(client.access_tokens, TokenClient)
2323
assert isinstance(client.instruments, InstrumentClient)
24+
25+
26+
def test_client_auto_refresh_enabled_by_default():
27+
"""Тест что auto_refresh_tokens=True по умолчанию"""
28+
token = "your_token_here"
29+
client = Client(TokenManager(token))
30+
31+
# Проверяем что token_client установлен для всех подклиентов
32+
assert client.account._token_client is not None
33+
assert client.assets._token_client is not None
34+
assert client.orders._token_client is not None
35+
assert client.instruments._token_client is not None
36+
37+
38+
def test_client_auto_refresh_disabled():
39+
"""Тест что при auto_refresh_tokens=False token_client не устанавливается"""
40+
token = "your_token_here"
41+
client = Client(TokenManager(token), auto_refresh_tokens=False)
42+
43+
# Проверяем что token_client НЕ установлен
44+
assert client.account._token_client is None
45+
assert client.assets._token_client is None
46+
assert client.orders._token_client is None
47+
assert client.instruments._token_client is None
48+
assert client.quotas._token_client is None

0 commit comments

Comments
 (0)