kwork-api/tests/e2e/test_catalog.py
root 44ac6dfee3 test: revert to login per test (pytest-asyncio compatibility)
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
2026-03-30 00:13:42 +00:00

182 lines
5.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
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()