from __future__ import annotations import os import pytest from core.config.settings import Settings, get_settings class TestGetSettings: def test_returns_settings_instance(self, env_full) -> None: result = get_settings() assert isinstance(result, Settings) def test_caches_result(self, env_full) -> None: a = get_settings() b = get_settings() assert a is b def test_cache_clear_allows_new_instance(self, env_full) -> None: a = get_settings() get_settings.cache_clear() b = get_settings() assert a is not b class TestSettings: def test_defaults(self) -> None: s = Settings( BOT_TOKEN="123456789:AAHdqTcvCH1vGWJxfSeofSAsQK6PALsAWo", OPENAI_API_KEY="sk-test", ADMIN_ID="1", ) assert s.PORT == 7860 assert s.LOG_LEVEL == "INFO" assert s.LOG_FORMAT == "json" assert s.DEFAULT_PROVIDER == "openai" def test_required_fields(self) -> None: s = Settings( BOT_TOKEN="123456789:AAHdqTcvCH1vGWJxfSeofSAsQK6PALsAWo", OPENAI_API_KEY="sk-test", ADMIN_ID="1", ) rf = s.required_fields assert "BOT_TOKEN" in rf assert "OPENAI_API_KEY" in rf assert "ADMIN_ID" in rf def test_port_validation_low(self) -> None: with pytest.raises(Exception): Settings( BOT_TOKEN="t", OPENAI_API_KEY="k", ADMIN_ID="1", PORT=0, ) def test_port_validation_high(self) -> None: with pytest.raises(Exception): Settings( BOT_TOKEN="t", OPENAI_API_KEY="k", ADMIN_ID="1", PORT=70000, ) def test_reads_from_env(self, env_full) -> None: s = get_settings() assert s.BOT_TOKEN == "123456789:AAHdqTcvCH1vGWJxfSeofSAsQK6PALsAWo" assert s.ADMIN_ID == "123456789" def test_default_provider_literal(self) -> None: s = Settings( BOT_TOKEN="t", OPENAI_API_KEY="k", ADMIN_ID="1", DEFAULT_PROVIDER="claude", ) assert s.DEFAULT_PROVIDER == "claude" def test_invalid_default_provider(self) -> None: with pytest.raises(Exception): Settings( BOT_TOKEN="t", OPENAI_API_KEY="k", ADMIN_ID="1", DEFAULT_PROVIDER="invalid_provider", )