`api/src/__init__.py` оставлен только с docstring: `python -m src.scan_emulator` больше не импортирует `src.app` и не требует `OPENBAO__*`. `run_server.py` импортирует `app` из `src.app`, `get_settings` — из `src.core.config`. Регрессионный тест: subprocess эмулятора с окружением только PATH/ENV_FILE/SCAN_HOTFOLDER_PATH -> код 2, сообщение про корень горячей папки, без ValidationError. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
55 lines
2.3 KiB
Python
55 lines
2.3 KiB
Python
"""Общие фикстуры. Окружение тестов — `api/.env.test`: его подключает pytest.ini (`ENV_FILE=.env.test`, путь от
|
||
каталога api/), поэтому `import src.app` (он создаёт приложение) работает без своей настройки окружения
|
||
и без инфраструктуры."""
|
||
|
||
import sys
|
||
from collections.abc import Iterator
|
||
|
||
import pytest
|
||
from loguru import logger
|
||
|
||
|
||
@pytest.fixture(autouse=True)
|
||
def _fresh_settings():
|
||
"""get_settings кэшируется (lru_cache): сбрасываем кэш до и после каждого теста."""
|
||
# Импорт отложен намеренно: модули тестов импортируют `src.app`, а он создаёт приложение и читает окружение
|
||
from src.core.config import get_settings # noqa: PLC0415
|
||
|
||
get_settings.cache_clear()
|
||
yield
|
||
get_settings.cache_clear()
|
||
|
||
|
||
@pytest.fixture
|
||
def minimal_env_file(tmp_path, monkeypatch):
|
||
"""Env-файл только с обязательными настройками (без `.env.test`): для проверки значений по умолчанию."""
|
||
env_file = tmp_path / "minimal.env"
|
||
env_file.write_text(
|
||
"\n".join(
|
||
[
|
||
"OPENBAO__MINIO__MINIO_URL=localhost:9000",
|
||
"OPENBAO__MINIO__MINIO_ADMIN_LOGIN=minioadmin",
|
||
"OPENBAO__MINIO__MINIO_ADMIN_PASSWORD=minioadmin",
|
||
"OPENBAO__MINIO__MINIO_BUCKET=arm-ka",
|
||
"OPENBAO__NATS__NATS_URL=nats://localhost:4222",
|
||
"SCAN_HOTFOLDER_PATH=/tmp/scan-gateway-test-hotfolder",
|
||
]
|
||
)
|
||
)
|
||
monkeypatch.setenv("ENV_FILE", str(env_file))
|
||
return env_file
|
||
|
||
|
||
@pytest.fixture
|
||
def log_lines() -> Iterator[list[str]]:
|
||
"""Перехват loguru: строки `LEVEL|сообщение` вместо stderr (pytest запускается с --capture=no, вывод чистый).
|
||
|
||
Обработчик stderr по умолчанию восстанавливается после теста.
|
||
"""
|
||
lines: list[str] = []
|
||
logger.remove()
|
||
logger.add(lambda message: lines.append(str(message)), level="DEBUG", format="{level}|{message}")
|
||
yield lines
|
||
logger.remove()
|
||
logger.add(sys.stderr)
|