kwork-api/tests/e2e/test_catalog.py
root 94978ccdf1 test: use session-scoped e2e_client fixture (login once per session)
- Add event_loop fixture with session scope
- Add e2e_client fixture that logs in ONCE for all catalog tests
- Add catalog_kwork_id fixture that fetches kwork ID ONCE
- All catalog tests now reuse the same authenticated client
- Reduces login calls from 10 to 1 per test session
2026-03-29 23:55:38 +00:00

134 lines
4.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 тесты для каталога и проектов.
Используют session-scoped e2e_client fixture - логин ОДИН РАЗ для всех тестов.
Все тесты read-only - ничего не изменяют на сервере.
Endpoints основаны на HAR анализе (mitmproxy + har-analyzer skill).
"""
import pytest
from kwork_api import KworkClient
@pytest.mark.e2e
async def test_get_catalog_list(e2e_client):
"""E2E: Получить список кворков из каталога.
HAR: POST https://api.kwork.ru/catalogMainv2
"""
# Первая страница каталога
catalog = await e2e_client.catalog.get_list(page=1)
assert catalog is not None
# API может вернуть пустой список (это нормально)
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
@pytest.mark.e2e
async def test_get_kwork_details(e2e_client, catalog_kwork_id):
"""E2E: Получить детали кворка.
HAR: POST https://api.kwork.ru/getKworkDetails
"""
# Пропускаем если каталог пустой
if catalog_kwork_id is None:
pytest.skip("Catalog is empty")
# Получаем детали
details = await e2e_client.catalog.get_details(catalog_kwork_id)
assert details is not None
assert details.id == catalog_kwork_id
assert details.title is not None
assert details.price is not None
@pytest.mark.e2e
async def test_get_projects_list(e2e_client):
"""E2E: Получить список проектов с биржи.
HAR: POST https://api.kwork.ru/projects
"""
projects = await e2e_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
@pytest.mark.e2e
async def test_get_user_info(e2e_client):
"""E2E: Получить информацию о текущем пользователе.
HAR: POST https://api.kwork.ru/user
"""
user = await e2e_client.user.get_info()
assert user is not None
# API возвращает dict с данными пользователя
assert isinstance(user, dict)
@pytest.mark.e2e
async def test_get_reference_data(e2e_client):
"""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
"""
# Города (может вернуть пустой список)
cities = await e2e_client.reference.get_cities()
assert isinstance(cities, list)
# Страны (может вернуть пустой список)
countries = await e2e_client.reference.get_countries()
assert isinstance(countries, list)
# Фичи
features = await e2e_client.reference.get_features()
assert isinstance(features, list)
# Бейджи
badges = await e2e_client.reference.get_badges_info()
assert isinstance(badges, list)
@pytest.mark.e2e
async def test_get_notifications(e2e_client):
"""E2E: Получить уведомления.
HAR: POST https://api.kwork.ru/notifications
"""
notifications = await e2e_client.notifications.get_list()
assert notifications is not None
# Уведомления могут быть пустыми
assert hasattr(notifications, 'notifications')
@pytest.mark.e2e
async def test_get_user_orders(e2e_client):
"""E2E: Получить заказы пользователя.
HAR endpoints:
- POST https://api.kwork.ru/payerOrders
- POST https://api.kwork.ru/workerOrders
"""
# Заказы как заказчик
payer_orders = await e2e_client.projects.get_payer_orders()
assert isinstance(payer_orders, list)
# Заказы как исполнитель
worker_orders = await e2e_client.projects.get_worker_orders()
assert isinstance(worker_orders, list)