diff --git a/nanobot/config/loader.py b/nanobot/config/loader.py index 545cd0bdc..0fd1aa4c5 100644 --- a/nanobot/config/loader.py +++ b/nanobot/config/loader.py @@ -7,7 +7,6 @@ from pathlib import Path from typing import Any import pydantic -from loguru import logger from pydantic import BaseModel from nanobot.config.schema import Config, _resolve_tool_config_refs @@ -55,8 +54,7 @@ def load_config(config_path: Path | None = None) -> Config: data = _migrate_config(data) config = Config.model_validate(data) except (json.JSONDecodeError, ValueError, pydantic.ValidationError) as e: - logger.warning("Failed to load config from {}: {}", path, e) - logger.warning("Using default configuration.") + raise ValueError(f"Failed to load config from {path}: {e}") from e _apply_ssrf_whitelist(config) return config diff --git a/tests/config/test_config_load_errors.py b/tests/config/test_config_load_errors.py new file mode 100644 index 000000000..1f52f578e --- /dev/null +++ b/tests/config/test_config_load_errors.py @@ -0,0 +1,30 @@ +import json + +import pytest + +from nanobot.config.loader import load_config + + +def test_load_config_missing_file_uses_defaults(tmp_path) -> None: + config = load_config(tmp_path / "missing.json") + + assert config.agents.defaults.model + + +def test_load_config_invalid_json_fails_fast(tmp_path) -> None: + config_path = tmp_path / "config.json" + config_path.write_text("{broken json", encoding="utf-8") + + with pytest.raises(ValueError, match="Failed to load config"): + load_config(config_path) + + +def test_load_config_invalid_schema_fails_fast(tmp_path) -> None: + config_path = tmp_path / "config.json" + config_path.write_text( + json.dumps({"tools": {"exec": {"timeout": -1}}}), + encoding="utf-8", + ) + + with pytest.raises(ValueError, match="Failed to load config"): + load_config(config_path)