DRRK/tests/unit/test_config.py

88 lines
2.4 KiB
Python

from __future__ import annotations
import pytest
from app.core.config import Settings
_ENV_NAMES = (
"LOCATION",
"DATABASE_URL",
"DATABASE_SCHEMA",
"GATEWAY_URL",
"MOEX_PATH",
"CBR_PATH",
"MOEX_API_KEY",
"CBR_API_KEY",
"HTTP_TIMEOUT_SECONDS",
"HTTP_RETRIES",
"MOEX_PREFERRED_BOARDS",
)
@pytest.fixture(autouse=True)
def _clean_env(monkeypatch):
"""Тесты не должны зависеть от .env и окружения разработчика."""
for name in _ENV_NAMES:
monkeypatch.delenv(name, raising=False)
monkeypatch.delenv(f"OPENBAO__SETTINGS__{name}", raising=False)
def _settings() -> Settings:
return Settings(_env_file=None)
def test_defaults() -> None:
s = _settings()
assert s.LOCATION == "prod"
assert s.DATABASE_URL == "sqlite+aiosqlite:///./drrk_local.db"
assert s.DATABASE_SCHEMA == ""
assert s.GATEWAY_URL == "https://gateway.rshbdev.ru"
assert s.MOEX_PATH == "/external/moex-iss"
assert s.CBR_PATH == "/external/cbr"
assert s.HTTP_TIMEOUT_SECONDS == 15
assert s.HTTP_RETRIES == 3
assert s.MOEX_PREFERRED_BOARDS == ["TQCB", "TQOB"]
def test_prefixed_name_wins_over_plain(monkeypatch) -> None:
monkeypatch.setenv("DATABASE_SCHEMA", "plain")
monkeypatch.setenv("OPENBAO__SETTINGS__DATABASE_SCHEMA", "drrk")
assert _settings().DATABASE_SCHEMA == "drrk"
def test_plain_name_is_accepted(monkeypatch) -> None:
monkeypatch.setenv("LOCATION", "local")
monkeypatch.setenv("HTTP_RETRIES", "0")
s = _settings()
assert s.LOCATION == "local"
assert s.HTTP_RETRIES == 0
def test_preferred_boards_from_json_env(monkeypatch) -> None:
monkeypatch.setenv("OPENBAO__SETTINGS__MOEX_PREFERRED_BOARDS", '["TQOB","TQCB"]')
assert _settings().MOEX_PREFERRED_BOARDS == ["TQOB", "TQCB"]
def test_api_keys_are_hidden_in_repr(monkeypatch) -> None:
monkeypatch.setenv("OPENBAO__SETTINGS__MOEX_API_KEY", "moex-secret-123")
monkeypatch.setenv("OPENBAO__SETTINGS__CBR_API_KEY", "cbr-secret-456")
s = _settings()
assert s.MOEX_API_KEY.get_secret_value() == "moex-secret-123"
assert s.CBR_API_KEY.get_secret_value() == "cbr-secret-456"
assert "moex-secret-123" not in repr(s)
assert "cbr-secret-456" not in str(s)
def test_unknown_location_is_rejected(monkeypatch) -> None:
monkeypatch.setenv("LOCATION", "staging")
with pytest.raises(ValueError):
_settings()