From e478807aa46a6db03a5c2fd6a91f1adc908d9930 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 29 Mar 2026 21:49:02 +0000 Subject: [PATCH] fix: update tests for new login endpoint --- .ipynb_checkpoints/Untitled-checkpoint.ipynb | 6 ++ Untitled.ipynb | 97 ++++++++++++++++++ .../__pycache__/__init__.cpython-312.pyc | Bin 982 -> 970 bytes .../__pycache__/client.cpython-312.pyc | Bin 61776 -> 59798 bytes .../__pycache__/errors.cpython-312.pyc | Bin 9059 -> 9010 bytes .../__pycache__/models.cpython-312.pyc | Bin 20068 -> 19821 bytes src/kwork_api/client.py | 49 +++++---- tests/unit/test_client.py | 57 ++++------ 8 files changed, 148 insertions(+), 61 deletions(-) create mode 100644 .ipynb_checkpoints/Untitled-checkpoint.ipynb create mode 100644 Untitled.ipynb diff --git a/.ipynb_checkpoints/Untitled-checkpoint.ipynb b/.ipynb_checkpoints/Untitled-checkpoint.ipynb new file mode 100644 index 0000000..363fcab --- /dev/null +++ b/.ipynb_checkpoints/Untitled-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Untitled.ipynb b/Untitled.ipynb new file mode 100644 index 0000000..c841c93 --- /dev/null +++ b/Untitled.ipynb @@ -0,0 +1,97 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "f28552f1-618c-4853-92e2-566554a2de2c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import asyncio\n", + "from kwork_api import KworkClient\n", + "from dotenv import load_dotenv\n", + "import os\n", + "\n", + "load_dotenv('tests/e2e/.env')" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "953d142e-a575-41b7-927d-8cd1546d2747", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "KworkAuthError: Login failed: 404\n" + ] + } + ], + "source": [ + "try:\n", + " client = await KworkClient.login(\n", + " username=os.getenv('KWORK_USERNAME'),\n", + " password=os.getenv('KWORK_PASSWORD')\n", + " )\n", + " print(f\"✅ Logged in as: {client.token[:20]}...\")\n", + "except Exception as e:\n", + " print(e)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "655aa71e-5645-4c7a-aadd-5b044a0713c9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'8AQhyzQRcTJ6v81maCNa'" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "os.getenv('KWORK_PASSWORD')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/kwork_api/__pycache__/__init__.cpython-312.pyc b/src/kwork_api/__pycache__/__init__.cpython-312.pyc index 0e5b60d94dd7523221c9ed07fd318275fd3c9f33..e761467a002afa66b0c5bedaf2f3edc0d3a5e9f9 100644 GIT binary patch delta 228 zcmcb{eu|yGA0Lmzy?8PJ%AQYCElbMoOl9`_e(_h7Epl7IOpvhgt40K}=8;D>95iB5r a7ew%Y2o4az2_itADPji^+>;+NeFXr_6i6}v delta 180 zcmX@bevO^?G%qg~0}yy5oX9Mn$Xmf!G_kFOMF9vV{)z_ElS3JUA&eD_aco@P<@rU~ zllhs%WO%_$$AV1PqN4mFP4-(tVTn1JDTyVS`FWGGnWQXO!3u8ifGL;MlEloM;#=$i zMfq8&$tAb=ofAtEbMn)JQi}`n^NLe%2|#6vCr@A!=VJjns)!XtumOq50?f*jZ!moV E0M8OR6aWAK diff --git a/src/kwork_api/__pycache__/client.cpython-312.pyc b/src/kwork_api/__pycache__/client.cpython-312.pyc index 455e83c92132930e1aaa9c0858cd188300d5885e..43a1a1d330e0bd65a27ef17f4c5f7a74b2712155 100644 GIT binary patch delta 10280 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 Qqi$sgOZi?P%H!+*0r~4+uK)l5 delta 12042 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 hLX)<~^%)X-42k%P;qSXkz_0zodq{{h5q6{!FK diff --git a/src/kwork_api/__pycache__/errors.cpython-312.pyc b/src/kwork_api/__pycache__/errors.cpython-312.pyc index adda591cadb9322dc08f307f176e73984c63e8f5..d940f65b07566851a7760f59f622af873db14f2a 100644 GIT binary patch delta 2779 zcmbVOZ%kWN6o0RM|JqWZl(s-iX@QLu5Z7%EXD|cjwqz`w`6Sz}K&H>_GZFVh|BGqnAgp^RZEtLgbrwb%4m_L@=LfqoHgyH`=|nxG1r zsM^M4j_Vg*;QD!0oOCB8Rnmlhn<`HVN%;kClus&$xtN0p5Ww7Z`jq_${lT80yM)(h zwyK-fix2Y&Ix0RND+2@K24RYNZbT!dl1gQUGe#;kBbb7&4fYeugl>|0>O5dLW*wZJ zw`0k;gFYiY>qW~Mo_L|rc@Poeqd_^sZ>3#w$mItOsX!A4P0L%yF~0;?Bta0SJC#Zg z_UU?B8ytk)c~T8pwoEtip%wbVL_JQlfw(!zE!fIMWg%i0Tc+)K4w?`2*&{P!i`dOO zdGW3(@829Wgzb(?q~XPf)+tSQ5K$36&HYLzlzsGjWgep0LceuPD~Y8rJ??yP19Q?w zD#6rpunKxQZXSt5CM<6})O3a#_k!+EoV_{0T~*vK%JWLiRA7436{XEOae!u{J@mM% z%3ljsqz=SVXmK2*PrHKrKKiyR#QW(5SGYNZ>ZT>LLg?_&1VtxKw9$WDHTB-h#$4SZ z#HKwj@nYPHQ{38Bq+80iJm6RfHz1`{0G`BvCjszeASD7%0pKYNcn$!blSr^p?i`&h z>!SHGjUIO&g;1%~U*7ApLS?#iqtD3csdQG=h@0lh4?Ti$i`hvlG|Rz@i40IyeAyJj z)j|il1R*WP6ozB|71S#t^aO3L*dQ?!1n7Z^3)|UJ4BNK_6_@d?UPd=aDm6fNR_+?d zRbsY80{lcQk}!$}6cH3r5T-pdY><@@Cyh9}IyV?87On(z^xYsBtlgrLZ|0g>er#x3 zaL8i&HBWV3gf=g6E&kf6ZD*5t8HWnz^-l?BTNlwNUu73JV?e(F@hwAbTnmsTdS zv~IAJ$&fOcKthbkdcQ3!dqy=7?Rw%Xq z!*2!s{*vCP?qYsFC8WKA}24n!MXg;^cT)=D-vO^;qt zFdrjHI%yqzLxoc41{PdNYS{9OTYC5T{_9TR*o4#NBRb_#} zQh!DpRCPdwQFrRTVzpaA*n42L5`3&h*m}700(5gw;@_j4!PWvtKN$$_;CUZ?H?)(V zrN4zvwj)<#HU>MhjBTCL@bcAl8_Y!DvcbLZE*T5Kk|F*h`cnNtD2rF?gGXKKg3c7w zOxiGo!3;3`zYrD!L{LzAFzi3jv86!Kc!8pEps2@p=I~VWl>SES%!&ER=4oTTvJLqf zU%}USzDf`~k+0BL;B^3aJMQ3G!oMu2w-btw?rexc)>`Px4bQQR)r&zo5*b(qGF(w% zEVX2PG?-u$w8s_Kdt!QYwRU60L3G3%2!cvqVYhFuuXoBKX zy1%i0+nq*6wJPh?TJdYf8rHk<9P_%a$ppQhoTxU^;e>rnM0xlO48x z6%cEzu(FcD=*7~;b|gD+mN|y7xutXs(LWk1Lqjmg+j*W}u(^3*G0gFS8-n7pO~`*i LNoYDI;3xkA<=|gy delta 2882 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 E1F@7NL;wH) delta 7032 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 ValidationResponse: + async def validate_text(self, text: str, context: str | None = None) -> ValidationResponse: """ Проверить текст на соответствие требованиям Kwork. diff --git a/tests/unit/test_client.py b/tests/unit/test_client.py index ab0a7bc..980f2fb 100644 --- a/tests/unit/test_client.py +++ b/tests/unit/test_client.py @@ -8,7 +8,7 @@ import pytest import respx from httpx import Response -from kwork_api import KworkApiError, KworkAuthError, KworkClient +from kwork_api import KworkApiError, KworkAuthError, KworkClient, KworkNetworkError from kwork_api.models import CatalogResponse, ValidationResponse @@ -18,22 +18,11 @@ class TestAuthentication: @respx.mock async def test_login_success(self): """Test successful login.""" - import httpx - # Mock login endpoint - login_route = respx.post("https://kwork.ru/signIn") - login_route.mock( - return_value=httpx.Response( - 200, - headers={"Set-Cookie": "userId=12345; slrememberme=token123"}, - ) - ) - - # Mock token endpoint - token_route = respx.post("https://kwork.ru/getWebAuthToken").mock( + login_route = respx.post("https://kwork.ru/api/user/login").mock( return_value=Response( 200, - json={"web_auth_token": "test_token_abc123"}, + json={"user_id": 12345, "web_auth_token": "test_token_abc123"}, ) ) @@ -42,13 +31,12 @@ class TestAuthentication: # Verify assert login_route.called - assert token_route.called assert client._token == "test_token_abc123" @respx.mock async def test_login_invalid_credentials(self): """Test login with invalid credentials.""" - respx.post("https://kwork.ru/signIn").mock( + respx.post("https://kwork.ru/api/user/login").mock( return_value=Response(401, json={"error": "Invalid credentials"}) ) @@ -57,11 +45,9 @@ class TestAuthentication: @respx.mock async def test_login_no_userid(self): - """Test login without userId in cookies.""" - import httpx - - respx.post("https://kwork.ru/signIn").mock( - return_value=httpx.Response(200, headers={"Set-Cookie": "other=value"}) + """Test login without userId in response.""" + respx.post("https://kwork.ru/api/user/login").mock( + return_value=Response(200, json={"error": "No user_id"}) ) with pytest.raises(KworkAuthError, match="no userId"): @@ -70,14 +56,8 @@ class TestAuthentication: @respx.mock async def test_login_no_token(self): """Test login without web_auth_token in response.""" - import httpx - - respx.post("https://kwork.ru/signIn").mock( - return_value=httpx.Response(200, headers={"Set-Cookie": "userId=123"}) - ) - - respx.post("https://kwork.ru/getWebAuthToken").mock( - return_value=Response(200, json={"other": "data"}) + respx.post("https://kwork.ru/api/user/login").mock( + return_value=Response(200, json={"user_id": 123}) ) with pytest.raises(KworkAuthError, match="No web_auth_token"): @@ -177,7 +157,9 @@ class TestProjectsAPI: "pagination": {"current_page": 1}, } - respx.post(f"{client.base_url}/projects").mock(return_value=Response(200, json=mock_data)) + respx.post(f"{client.base_url}/projects").mock( + return_value=Response(200, json=mock_data) + ) result = await client.projects.get_list() @@ -193,7 +175,9 @@ class TestErrorHandling: """Test 404 error handling.""" client = KworkClient(token="test") - respx.post(f"{client.base_url}/getKworkDetails").mock(return_value=Response(404)) + respx.post(f"{client.base_url}/getKworkDetails").mock( + return_value=Response(404) + ) with pytest.raises(KworkApiError) as exc_info: await client.catalog.get_details(999) @@ -205,7 +189,9 @@ class TestErrorHandling: """Test 401 error handling.""" client = KworkClient(token="invalid") - respx.post(f"{client.base_url}/catalogMainv2").mock(return_value=Response(401)) + respx.post(f"{client.base_url}/catalogMainv2").mock( + return_value=Response(401) + ) with pytest.raises(KworkAuthError): await client.catalog.get_list() @@ -213,10 +199,12 @@ class TestErrorHandling: @respx.mock async def test_network_error(self): """Test network error handling.""" + import httpx + client = KworkClient(token="test") respx.post(f"{client.base_url}/catalogMainv2").mock( - side_effect=Exception("Connection refused") + side_effect=httpx.RequestError("Connection refused", request=None) ) with pytest.raises(KworkNetworkError): @@ -231,9 +219,6 @@ class TestContextManager: async with KworkClient(token="test") as client: assert client._client is None # Not created yet - # Client should be created on first request - # (but we don't make actual requests in this test) - # Client should be closed after context assert client._client is None or client._client.is_closed