"""Общие фикстуры тестов.""" import os from collections.abc import Callable from pathlib import Path import pytest from src.core.config import Settings # Переменные, которые читает Settings: убираются из окружения процесса, чтобы тест видел только свой файл _SETTINGS_ENV_PREFIXES = ( "OPENBAO__", "SERVER__", "DEBUG", "ROOT_PATH", "VERSION", "SERVICE_NAME", "NATS_ENABLED", "WORKER_CONCURRENCY", "PUBLISH_RETRIES", "DONE_CACHE_SIZE", ) # Минимальное окружение spec «Старт с минимальным окружением»: MinIO, адрес NATS и DEBUG; без seed/jwt, БД и SMB MINIMAL_ENV = """\ DEBUG=true 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 """ @pytest.fixture def minimal_settings(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> Callable[[str], Settings]: """Фабрика Settings только из временного `.env` с `MINIMAL_ENV` и строками `extra` (окружение процесса скрыто).""" for name in list(os.environ): if name.upper().startswith(_SETTINGS_ENV_PREFIXES): monkeypatch.delenv(name) def build(extra: str = "") -> Settings: env_file = tmp_path / ".env" env_file.write_text(MINIMAL_ENV + extra, encoding="utf-8") return Settings(_env_file=env_file) # type: ignore[call-arg] return build