""" Tests for src/settings.py — Pydantic Settings hierarchy. """ import os import pytest def test_settings_defaults(monkeypatch): """Settings should have sensible defaults without env vars.""" # Clear ALL potential override env vars that might affect settings for env_var in list(os.environ.keys()): if any( prefix in env_var.upper() for prefix in [ "OLLAMA__", "CHUNKING__", "EMBEDDING__", "OPENSEARCH__", "REDIS__", "API__", "LLM__", "LANGFUSE__", "TELEGRAM__", ] ): monkeypatch.delenv(env_var, raising=False) # Clear any cached instance from src.settings import get_settings get_settings.cache_clear() settings = get_settings() # Test core settings that should always exist with valid values assert settings.api.port >= 1 and settings.api.port <= 65535 assert "mediguard" in settings.postgres.database_url.lower() assert settings.opensearch.host # Should have a host assert settings.redis.port >= 1 # Accept any llama model variant (covers llama3.1:8b, llama3.2, etc) assert "llama" in settings.ollama.model.lower() assert settings.embedding.dimension > 0 # Chunk size should match hardcoded default of 600 when no env vars assert settings.chunking.chunk_size == 600, f"Expected 600, got {settings.chunking.chunk_size}" def test_settings_frozen(): """Settings should be immutable.""" from src.settings import get_settings get_settings.cache_clear() settings = get_settings() with pytest.raises(Exception): settings.api.port = 9999 def test_settings_singleton(): """get_settings should return the same cached instance.""" from src.settings import get_settings get_settings.cache_clear() s1 = get_settings() s2 = get_settings() assert s1 is s2