97 lines
3.2 KiB
Python
97 lines
3.2 KiB
Python
"""
|
||
Конфигурация pytest для тестирования API эндпоинтов
|
||
"""
|
||
import pytest
|
||
import requests
|
||
import time
|
||
import os
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
# Добавляем путь к проекту для импорта модулей
|
||
project_root = Path(__file__).parent.parent
|
||
sys.path.insert(0, str(project_root / "python_parser"))
|
||
|
||
from adapters.local_storage import LocalStorageAdapter
|
||
|
||
# Базовый URL API
|
||
API_BASE_URL = "http://localhost:8000"
|
||
|
||
# Путь к тестовым данным
|
||
TEST_DATA_DIR = Path(__file__).parent / "test_data"
|
||
|
||
@pytest.fixture(scope="session")
|
||
def api_base_url():
|
||
"""Базовый URL для API"""
|
||
return API_BASE_URL
|
||
|
||
@pytest.fixture(scope="session")
|
||
def test_data_dir():
|
||
"""Директория с тестовыми данными"""
|
||
return TEST_DATA_DIR
|
||
|
||
@pytest.fixture(scope="session")
|
||
def wait_for_api():
|
||
"""Ожидание готовности API"""
|
||
max_attempts = 30
|
||
for attempt in range(max_attempts):
|
||
try:
|
||
response = requests.get(f"{API_BASE_URL}/docs", timeout=5)
|
||
if response.status_code == 200:
|
||
print(f"✅ API готов после {attempt + 1} попыток")
|
||
return True
|
||
except requests.exceptions.RequestException:
|
||
pass
|
||
|
||
if attempt < max_attempts - 1:
|
||
time.sleep(2)
|
||
|
||
pytest.fail("❌ API не готов после 30 попыток")
|
||
|
||
@pytest.fixture
|
||
def upload_file(test_data_dir):
|
||
"""Фикстура для загрузки файла"""
|
||
def _upload_file(filename):
|
||
file_path = test_data_dir / filename
|
||
if not file_path.exists():
|
||
pytest.skip(f"Файл {filename} не найден в {test_data_dir}")
|
||
return file_path
|
||
return _upload_file
|
||
|
||
@pytest.fixture(scope="session")
|
||
def local_storage():
|
||
"""Фикстура для локального storage"""
|
||
storage = LocalStorageAdapter("tests/local_storage")
|
||
yield storage
|
||
# Очищаем storage после всех тестов
|
||
storage.clear_all()
|
||
|
||
@pytest.fixture
|
||
def clean_storage(local_storage):
|
||
"""Фикстура для очистки storage перед каждым тестом"""
|
||
local_storage.clear_all()
|
||
yield local_storage
|
||
|
||
def make_api_request(url, method="GET", data=None, files=None, json_data=None):
|
||
"""Универсальная функция для API запросов"""
|
||
try:
|
||
if method.upper() == "GET":
|
||
response = requests.get(url, timeout=30)
|
||
elif method.upper() == "POST":
|
||
if files:
|
||
response = requests.post(url, files=files, timeout=30)
|
||
elif json_data:
|
||
response = requests.post(url, json=json_data, timeout=30)
|
||
else:
|
||
response = requests.post(url, data=data, timeout=30)
|
||
else:
|
||
raise ValueError(f"Неподдерживаемый метод: {method}")
|
||
|
||
return response
|
||
except requests.exceptions.RequestException as e:
|
||
pytest.fail(f"Ошибка API запроса: {e}")
|
||
|
||
@pytest.fixture
|
||
def api_request():
|
||
"""Фикстура для API запросов"""
|
||
return make_api_request |