Note: pytest-asyncio creates new event loop per test, so we cannot reuse KworkClient across tests. Each test logs in independently. This is acceptable because: 1. Login is fast (<1s) 2. Tests are independent (no shared state) 3. Auth tests verify login works correctly 4. Catalog tests verify API endpoints work
182 lines
5.4 KiB
Python
182 lines
5.4 KiB
Python
"""
|
||
E2E тесты для каталога и проектов.
|
||
|
||
Каждый тест логинится самостоятельно (pytest-asyncio compatibility).
|
||
Все тесты read-only - ничего не изменяют на сервере.
|
||
Endpoints основаны на HAR анализе (mitmproxy + har-analyzer skill).
|
||
"""
|
||
|
||
import pytest
|
||
|
||
from kwork_api import KworkClient
|
||
|
||
|
||
@pytest.mark.e2e
|
||
async def test_get_catalog_list(require_credentials):
|
||
"""E2E: Получить список кворков из каталога.
|
||
|
||
HAR: POST https://api.kwork.ru/catalogMainv2
|
||
"""
|
||
client = await KworkClient.login(
|
||
username=require_credentials["username"],
|
||
password=require_credentials["password"],
|
||
)
|
||
|
||
try:
|
||
catalog = await client.catalog.get_list(page=1)
|
||
|
||
assert catalog is not None
|
||
if len(catalog.kworks) > 0:
|
||
first_kwork = catalog.kworks[0]
|
||
assert first_kwork.id is not None
|
||
assert first_kwork.title is not None
|
||
assert first_kwork.price is not None
|
||
finally:
|
||
await client.close()
|
||
|
||
|
||
@pytest.mark.e2e
|
||
async def test_get_kwork_details(require_credentials):
|
||
"""E2E: Получить детали кворка.
|
||
|
||
HAR: POST https://api.kwork.ru/getKworkDetails
|
||
"""
|
||
client = await KworkClient.login(
|
||
username=require_credentials["username"],
|
||
password=require_credentials["password"],
|
||
)
|
||
|
||
try:
|
||
# Сначала получаем каталог чтобы найти реальный ID
|
||
catalog = await client.catalog.get_list(page=1)
|
||
|
||
if len(catalog.kworks) == 0:
|
||
pytest.skip("Catalog is empty")
|
||
|
||
kwork_id = catalog.kworks[0].id
|
||
|
||
# Получаем детали
|
||
details = await client.catalog.get_details(kwork_id)
|
||
|
||
assert details is not None
|
||
assert details.id == kwork_id
|
||
assert details.title is not None
|
||
assert details.price is not None
|
||
finally:
|
||
await client.close()
|
||
|
||
|
||
@pytest.mark.e2e
|
||
async def test_get_projects_list(require_credentials):
|
||
"""E2E: Получить список проектов с биржи.
|
||
|
||
HAR: POST https://api.kwork.ru/projects
|
||
"""
|
||
client = await KworkClient.login(
|
||
username=require_credentials["username"],
|
||
password=require_credentials["password"],
|
||
)
|
||
|
||
try:
|
||
projects = await client.projects.get_list(page=1)
|
||
|
||
assert projects is not None
|
||
if len(projects.projects) > 0:
|
||
first_project = projects.projects[0]
|
||
assert first_project.id is not None
|
||
assert first_project.title is not None
|
||
finally:
|
||
await client.close()
|
||
|
||
|
||
@pytest.mark.e2e
|
||
async def test_get_user_info(require_credentials):
|
||
"""E2E: Получить информацию о текущем пользователе.
|
||
|
||
HAR: POST https://api.kwork.ru/user
|
||
"""
|
||
client = await KworkClient.login(
|
||
username=require_credentials["username"],
|
||
password=require_credentials["password"],
|
||
)
|
||
|
||
try:
|
||
user = await client.user.get_info()
|
||
assert user is not None
|
||
assert isinstance(user, dict)
|
||
finally:
|
||
await client.close()
|
||
|
||
|
||
@pytest.mark.e2e
|
||
async def test_get_reference_data(require_credentials):
|
||
"""E2E: Получить справочные данные (города, страны, фичи).
|
||
|
||
HAR endpoints:
|
||
- POST https://api.kwork.ru/cities
|
||
- POST https://api.kwork.ru/countries
|
||
- POST https://api.kwork.ru/getAvailableFeatures
|
||
- POST https://api.kwork.ru/getBadgesInfo
|
||
"""
|
||
client = await KworkClient.login(
|
||
username=require_credentials["username"],
|
||
password=require_credentials["password"],
|
||
)
|
||
|
||
try:
|
||
cities = await client.reference.get_cities()
|
||
assert isinstance(cities, list)
|
||
|
||
countries = await client.reference.get_countries()
|
||
assert isinstance(countries, list)
|
||
|
||
features = await client.reference.get_features()
|
||
assert isinstance(features, list)
|
||
|
||
badges = await client.reference.get_badges_info()
|
||
assert isinstance(badges, list)
|
||
finally:
|
||
await client.close()
|
||
|
||
|
||
@pytest.mark.e2e
|
||
async def test_get_notifications(require_credentials):
|
||
"""E2E: Получить уведомления.
|
||
|
||
HAR: POST https://api.kwork.ru/notifications
|
||
"""
|
||
client = await KworkClient.login(
|
||
username=require_credentials["username"],
|
||
password=require_credentials["password"],
|
||
)
|
||
|
||
try:
|
||
notifications = await client.notifications.get_list()
|
||
assert notifications is not None
|
||
assert hasattr(notifications, 'notifications')
|
||
finally:
|
||
await client.close()
|
||
|
||
|
||
@pytest.mark.e2e
|
||
async def test_get_user_orders(require_credentials):
|
||
"""E2E: Получить заказы пользователя.
|
||
|
||
HAR endpoints:
|
||
- POST https://api.kwork.ru/payerOrders
|
||
- POST https://api.kwork.ru/workerOrders
|
||
"""
|
||
client = await KworkClient.login(
|
||
username=require_credentials["username"],
|
||
password=require_credentials["password"],
|
||
)
|
||
|
||
try:
|
||
payer_orders = await client.projects.get_payer_orders()
|
||
assert isinstance(payer_orders, list)
|
||
|
||
worker_orders = await client.projects.get_worker_orders()
|
||
assert isinstance(worker_orders, list)
|
||
finally:
|
||
await client.close()
|