From ffb3248e8e578b60ac1c49812435c58bd3604147 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 29 Mar 2026 21:59:10 +0000 Subject: [PATCH] fix: credentials property returns all cookies for session restoration --- .../__pycache__/client.cpython-312.pyc | Bin 59977 -> 60155 bytes src/kwork_api/client.py | 11 ++++------- tests/e2e/test_auth.py | 8 ++++---- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/kwork_api/__pycache__/client.cpython-312.pyc b/src/kwork_api/__pycache__/client.cpython-312.pyc index fa4ac2c6f713b920748409e0a43654c37e0f9625..23a4b4cb2b7afc83522cb8f6f29f87f7b8034b2d 100644 GIT binary patch delta 4559 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 Coyj-= diff --git a/src/kwork_api/client.py b/src/kwork_api/client.py index bcdd10c..499eab6 100644 --- a/src/kwork_api/client.py +++ b/src/kwork_api/client.py @@ -162,12 +162,12 @@ class KworkClient: return self._cookies.copy() @property - def credentials(self) -> dict[str, str | None]: + def credentials(self) -> dict[str, str]: """ Учётные данные для восстановления сессии. Returns: - Словарь с token и cookies для передачи в KworkClient(). + Словарь со всеми cookies (включая slrememberme и userId) для передачи в KworkClient(cookies=...). Example: # Сохранение @@ -179,12 +179,9 @@ class KworkClient: # Восстановление with open("session.json") as f: creds = json.load(f) - client = KworkClient(**creds) + client = KworkClient(cookies=creds) """ - return { - "token": self._token, - "cookies": self._cookies.copy() if self._cookies else None, - } + return self._cookies.copy() if self._cookies else {} @classmethod async def login( diff --git a/tests/e2e/test_auth.py b/tests/e2e/test_auth.py index 9ee610b..6662914 100644 --- a/tests/e2e/test_auth.py +++ b/tests/e2e/test_auth.py @@ -31,16 +31,16 @@ async def test_login_invalid_credentials(): @pytest.mark.e2e async def test_restore_session(require_credentials): - """E2E: Восстановление сессии из токена.""" + """E2E: Восстановление сессии из cookies.""" # First login client1 = await KworkClient.login( username=require_credentials["username"], password=require_credentials["password"] ) - token = client1.token + credentials = client1.credentials # Get all cookies await client1.close() - # Restore from token - client2 = KworkClient(token=token) + # Restore from credentials (all cookies) + client2 = KworkClient(cookies=credentials) try: user = await client2.user.get_info() assert user["username"] == require_credentials["username"]