88 lines
2.4 KiB
Python
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()
|