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()