"""Native Settings lives under periscope/src and keeps DeepSeek routing.""" from __future__ import annotations from pathlib import Path import backend.config as config from backend.config import Settings, settings def test_config_module_is_src(): path = Path(config.__file__).resolve() assert path.name == "config.py" assert "src" in path.parts assert "Native Periscope overlay" not in path.read_text(encoding="utf-8")[:400] def test_deepseek_defaults_and_anthropic_coercion(): assert Settings.model_fields["provider_default"].default == "deepseek" assert Settings.model_fields["deepseek_model"].default == "deepseek-flash" assert Settings.model_fields["model_pintable_deepseek"].default == "deepseek-flash" assert settings.provider_for_stage("pintable") == "deepseek" snap = settings.provider_validation try: settings.provider_validation = "anthropic" assert settings.provider_for_stage("validation") == "deepseek" assert "deepseek" in settings.model_for_stage("validation") finally: settings.provider_validation = snap def test_anthropic_fallback_is_none(): snap_p = settings.fallback_provider_validation snap_m = settings.fallback_model_validation try: settings.fallback_provider_validation = "anthropic" settings.fallback_model_validation = "claude-sonnet-4-6" assert settings.fallback_for_stage("validation") is None finally: settings.fallback_provider_validation = snap_p settings.fallback_model_validation = snap_m def test_skills_manifest_is_readable(): version = settings.get_default_model_version() assert version skill_id, latest = settings.get_skill("extract-pintable") assert skill_id.startswith("skill_") assert latest