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