""" E2E тесты для Kwork API. Требуют реальных credentials и запускаются только локально. """ import os from pathlib import Path import pytest from dotenv import load_dotenv from kwork_api import KworkClient # Загружаем .env load_dotenv(Path(__file__).parent / ".env") @pytest.fixture(scope="session") def kwork_credentials(): """Credentials для тестового аккаунта.""" return { "username": os.getenv("KWORK_USERNAME"), "password": os.getenv("KWORK_PASSWORD"), } @pytest.fixture(scope="session") def require_credentials(kwork_credentials): """Пропускает тест если нет credentials.""" if not kwork_credentials["username"] or not kwork_credentials["password"]: pytest.skip( "E2E credentials not set. " "Copy tests/e2e/.env.example to tests/e2e/.env and fill in credentials." ) return kwork_credentials @pytest.fixture(scope="session") async def client(require_credentials): """ E2E клиент для всех тестов. Авторизуется один раз и переиспользуется во всех тестах сессии. """ client = await KworkClient.login( username=require_credentials["username"], password=require_credentials["password"], ) yield client await client.close() @pytest.fixture(scope="session") async def catalog_kwork_id(client): """ Получить ID первого кворка из каталога для тестов. Переиспользуется во всех тестах сессии. """ catalog = await client.catalog.get_list(page=1) if len(catalog.kworks) > 0: return catalog.kworks[0].id else: return None @pytest.fixture(scope="function") def slowmo(request): """Задержка между тестами для rate limiting.""" slowmo = request.config.getoption("--slowmo", default=0) if slowmo > 0: import time time.sleep(slowmo) def pytest_configure(config): """Регистрация маркера e2e.""" config.addinivalue_line("markers", "e2e: mark test as end-to-end (requires credentials)") def pytest_addoption(parser): """Добавляет опцию --slowmo.""" parser.addoption( "--slowmo", type=float, default=0, help="Delay between tests in seconds (for rate limiting)" )