from app.config import Settings, get_settings def test_configuration_sections_are_loaded_from_env(monkeypatch) -> None: monkeypatch.setenv("G2S_CONTROLLER__API_PREFIX", "/internal/v1") monkeypatch.setenv("G2S_SERVICE__MAX_PARALLEL_PROVIDERS", "12") monkeypatch.setenv("G2S_BUSINESS_LOGIC__WEIGHT_ROUND_SCALE", "3") monkeypatch.setenv("G2S_REPOSITORY__PRICE_CACHE_TTL_SECONDS", "1200") monkeypatch.setenv("G2S_ADAPTER__CDEK_BASE_URL", "https://sandbox.cdek.test") monkeypatch.setenv("G2S_ADAPTER__CDEK_CLIENT_ID", "env-client-id") monkeypatch.setenv("G2S_ADAPTER__CDEK_CLIENT_SECRET", "env-client-secret") monkeypatch.setenv("G2S_ADAPTER__CDEK_RETRY_ATTEMPTS", "4") monkeypatch.setenv("G2S_ADAPTER__CDEK_RETRY_BACKOFF_SECONDS", "0.7") monkeypatch.setenv("G2S_ADAPTER__CDEK_TIMEOUT_SECONDS", "8.5") monkeypatch.setenv("G2S_ADAPTER__CDEK_CACHE_TTL_SECONDS", "780") monkeypatch.setenv("G2S_OBSERVABILITY__SERVICE_NAME", "g2s-test") monkeypatch.setenv("G2S_ALERTS__TELEGRAM_ENABLED", "true") settings = Settings() assert settings.controller.api_prefix == "/internal/v1" assert settings.service.max_parallel_providers == 12 assert settings.business_logic.weight_round_scale == 3 assert settings.repository.price_cache_ttl_seconds == 1200 assert settings.adapter.cdek_base_url == "https://sandbox.cdek.test" assert settings.adapter.cdek_client_id == "env-client-id" assert settings.adapter.cdek_client_secret == "env-client-secret" assert settings.adapter.cdek_retry_attempts == 4 assert settings.adapter.cdek_retry_backoff_seconds == 0.7 assert settings.adapter.cdek_timeout_seconds == 8.5 assert settings.adapter.cdek_cache_ttl_seconds == 780 assert settings.observability.service_name == "g2s-test" assert settings.alerts.telegram_enabled is True def test_configuration_sections_are_loaded_from_yaml_file(tmp_path, monkeypatch) -> None: config_file = tmp_path / "config.yaml" config_file.write_text( """ controller: api_prefix: "/yaml/v1" service: max_parallel_providers: 11 business_logic: weight_round_scale: 4 repository: price_cache_ttl_seconds: 600 adapter: cdek_base_url: "https://yaml.cdek.test" cdek_client_id: "yaml-client-id" cdek_client_secret: "yaml-client-secret" cdek_retry_attempts: 5 cdek_retry_backoff_seconds: 0.4 cdek_timeout_seconds: 9.5 cdek_cache_ttl_seconds: 810 observability: service_name: "g2s-yaml" alerts: telegram_enabled: true """.strip(), encoding="utf-8", ) monkeypatch.setenv("G2S_CONFIG_FILE", str(config_file)) settings = Settings() assert settings.controller.api_prefix == "/yaml/v1" assert settings.service.max_parallel_providers == 11 assert settings.business_logic.weight_round_scale == 4 assert settings.repository.price_cache_ttl_seconds == 600 assert settings.adapter.cdek_base_url == "https://yaml.cdek.test" assert settings.adapter.cdek_client_id == "yaml-client-id" assert settings.adapter.cdek_client_secret == "yaml-client-secret" assert settings.adapter.cdek_retry_attempts == 5 assert settings.adapter.cdek_retry_backoff_seconds == 0.4 assert settings.adapter.cdek_timeout_seconds == 9.5 assert settings.adapter.cdek_cache_ttl_seconds == 810 assert settings.observability.service_name == "g2s-yaml" assert settings.alerts.telegram_enabled is True def test_get_settings_returns_cached_instance(monkeypatch) -> None: get_settings.cache_clear() monkeypatch.setenv("G2S_SERVICE__PROVIDER_TIMEOUT_SECONDS", "22") first = get_settings() second = get_settings() assert first is second assert first.service.provider_timeout_seconds == 22 get_settings.cache_clear()