- Add session-scoped 'client' fixture for authenticated client - Add 'catalog_kwork_id' fixture for reusable kwork ID - Update all catalog tests to use fixtures - Reduces login calls from 10 to 1 per test session
88 lines
2.4 KiB
Python
88 lines
2.4 KiB
Python
"""
|
|
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)"
|
|
)
|