arm-core/api/tests/test_config.py
Andrey Epifancev 3d31c1eac5 fix: SMB необязателен, остановка lifespan по независимым шагам (I-3, T4.5, M-3)
- OPENBAO__SMB__* необязательны (по умолчанию пусто); при пустом SMB_HOST
  сессия SMB не регистрируется (DEBUG «SMB не настроен»), в .env.example
  и .env.test SMB выключен — в логе dev-запуска больше нет трейсбэка SMB.
- Задан SMB_HOST: register_session и reset_connection_cache вызываются
  через asyncio.to_thread и не блокируют цикл событий.
- Остановка: задачи обмена -> NATS -> S3 -> SMB -> engine.dispose();
  каждый шаг в своём try/except с логом step=..., ошибка одного шага не
  отменяет следующие. Пул соединений БД закрывается последним (M-3).
- README: «что в логе при запуске», таблица настроек SMB, порядок
  остановки.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 01:53:23 +04:00

70 lines
3.1 KiB
Python

"""Настройки: чтение ENV_FILE и значения по умолчанию (без БД и сети)."""
import os
from pathlib import Path
import pytest
from src.core.config import Settings
API_DIR = Path(__file__).resolve().parent.parent
@pytest.fixture
def clean_env(monkeypatch: pytest.MonkeyPatch) -> pytest.MonkeyPatch:
"""Убирает из окружения процесса переменные, которые перебили бы значения из env-файла."""
for key in list(os.environ):
if key.startswith(("OPENBAO__", "AUTH_", "OUTBOX_", "ACK_")) or key in {"NATS_ENABLED", "DEBUG"}:
monkeypatch.delenv(key)
return monkeypatch
def test_env_test_is_read(clean_env: pytest.MonkeyPatch) -> None:
""".env.test читается: стандартные порты docker-compose из docs/dev."""
s = Settings(_env_file=API_DIR / ".env.test") # type: ignore[call-arg]
assert s.OPENBAO.DATABASE.DATABASE_URL.endswith("localhost:5432/armka")
assert s.OPENBAO.NATS.NATS_URL == "nats://localhost:4222"
assert s.AUTH_DEV_ISSUER is True
assert s.NATS_ENABLED is False
assert s.OPENBAO.MINIO.MINIO_SECURE is False
assert s.OPENBAO.SMB.SMB_HOST == "" # SMB выключен: в логе запуска нет трейсбэка SMB
def test_defaults(clean_env: pytest.MonkeyPatch) -> None:
"""Значения по умолчанию классов настроек: env-файла нет, заданы только обязательные OPENBAO__* (SMB не нужен)."""
required = {
"OPENBAO__DATABASE__DATABASE_URL": "postgresql+asyncpg://u:p@localhost:5432/d",
"OPENBAO__MINIO__MINIO_URL": "localhost:9000",
"OPENBAO__MINIO__MINIO_ADMIN_LOGIN": "login",
"OPENBAO__MINIO__MINIO_ADMIN_PASSWORD": "password",
"OPENBAO__MINIO__MINIO_BUCKET": "bucket",
"OPENBAO__NATS__NATS_URL": "nats://localhost:4222",
}
for key, value in required.items():
clean_env.setenv(key, value)
s = Settings(_env_file=None) # type: ignore[call-arg]
assert s.DEBUG is False
assert s.AUTH_DEV_ISSUER is False
assert s.AUTH_DEV_SECRET == ""
assert s.AUTH_JWKS_URL == ""
assert s.AUTH_PUBLIC_KEY == ""
assert s.AUTH_ISSUER == ""
assert s.AUTH_AUDIENCE == ""
assert s.AUTH_EMAIL_CLAIM == "email"
assert s.NATS_ENABLED is False
assert (s.OUTBOX_POLL_SECONDS, s.ACK_TIMEOUT_SECONDS, s.OUTBOX_MAX_REPUBLISH) == (5, 30, 3)
assert s.OPENBAO.NATS.NATS_SEED == ""
assert s.OPENBAO.NATS.NATS_JWT == ""
assert s.OPENBAO.MINIO.MINIO_SECURE is True
smb = s.OPENBAO.SMB
assert (smb.SMB_HOST, smb.SMB_PATH, smb.SMB_LOGIN, smb.SMB_PASSWORD) == ("", "", "", "")
def test_empty_nats_seed_and_jwt_allowed(clean_env: pytest.MonkeyPatch) -> None:
"""Пустые NATS_SEED/NATS_JWT допустимы (подключение без nkeys)."""
s = Settings(_env_file=API_DIR / ".env.example") # type: ignore[call-arg]
assert s.OPENBAO.NATS.NATS_SEED == ""
assert s.OPENBAO.NATS.NATS_JWT == ""
assert s.NATS_ENABLED is True
assert s.OPENBAO.SMB.SMB_HOST == ""