"""config.py — env-driven settings (plan §11).""" from pathlib import Path from mcp_server.config import Settings, get_settings def test_defaults(): settings = Settings(_env_file=None) assert settings.elabftw_timeout == 10.0 assert settings.elabftw_retries == 2 assert settings.labvoice_db_path == Path("~/.labvoice/journal.sqlite") assert settings.labvoice_template_desc_limit == 200 assert settings.labvoice_rest_token is None assert settings.labvoice_embed_model is None def test_default_unit_whitelist_matches_plan(): settings = Settings(_env_file=None) assert "μL" in settings.unit_whitelist assert "mL" in settings.unit_whitelist assert "ea" in settings.unit_whitelist def test_unit_whitelist_parsing_ignores_blanks_and_spaces(): settings = Settings(_env_file=None, labvoice_unit_whitelist=" mL , L , , ea ") assert settings.unit_whitelist == ("mL", "L", "ea") def test_api_base_url_strips_trailing_slash(): settings = Settings(_env_file=None, elabftw_url="https://eln.example.org/") assert settings.api_base_url == "https://eln.example.org/api/v2" def test_env_overrides(monkeypatch): monkeypatch.setenv("ELABFTW_URL", "https://eln2.example.org") monkeypatch.setenv("ELABFTW_TIMEOUT", "3.5") monkeypatch.setenv("LABVOICE_DB_PATH", "/tmp/other.sqlite") settings = Settings(_env_file=None) assert settings.elabftw_url == "https://eln2.example.org" assert settings.elabftw_timeout == 3.5 assert settings.labvoice_db_path == Path("/tmp/other.sqlite") def test_get_settings_is_cached(monkeypatch): monkeypatch.setenv("ELABFTW_URL", "https://a.example.org") first = get_settings() monkeypatch.setenv("ELABFTW_URL", "https://b.example.org") assert get_settings() is first get_settings.cache_clear()