mirror of
https://github.com/Xe138/AI-Trader.git
synced 2026-04-01 17:17:24 -04:00
feat: add config file loading with error handling
Implement load_config() function with comprehensive error handling - Loads and parses JSON config files - Raises ConfigValidationError for missing files - Raises ConfigValidationError for malformed JSON - Includes 3 passing tests for all error cases Test coverage: - test_load_config_valid_json: Verifies successful JSON parsing - test_load_config_file_not_found: Validates error on missing file - test_load_config_invalid_json: Validates error on malformed JSON
This commit is contained in:
37
tests/unit/test_config_merger.py
Normal file
37
tests/unit/test_config_merger.py
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
import pytest
|
||||||
|
import json
|
||||||
|
import tempfile
|
||||||
|
from pathlib import Path
|
||||||
|
from tools.config_merger import load_config, ConfigValidationError
|
||||||
|
|
||||||
|
|
||||||
|
def test_load_config_valid_json():
|
||||||
|
"""Test loading a valid JSON config file"""
|
||||||
|
with tempfile.NamedTemporaryFile(mode='w', suffix='.json', delete=False) as f:
|
||||||
|
json.dump({"key": "value"}, f)
|
||||||
|
temp_path = f.name
|
||||||
|
|
||||||
|
try:
|
||||||
|
result = load_config(temp_path)
|
||||||
|
assert result == {"key": "value"}
|
||||||
|
finally:
|
||||||
|
Path(temp_path).unlink()
|
||||||
|
|
||||||
|
|
||||||
|
def test_load_config_file_not_found():
|
||||||
|
"""Test loading non-existent config file"""
|
||||||
|
with pytest.raises(ConfigValidationError, match="not found"):
|
||||||
|
load_config("/nonexistent/path.json")
|
||||||
|
|
||||||
|
|
||||||
|
def test_load_config_invalid_json():
|
||||||
|
"""Test loading malformed JSON"""
|
||||||
|
with tempfile.NamedTemporaryFile(mode='w', suffix='.json', delete=False) as f:
|
||||||
|
f.write("{invalid json")
|
||||||
|
temp_path = f.name
|
||||||
|
|
||||||
|
try:
|
||||||
|
with pytest.raises(ConfigValidationError, match="Invalid JSON"):
|
||||||
|
load_config(temp_path)
|
||||||
|
finally:
|
||||||
|
Path(temp_path).unlink()
|
||||||
36
tools/config_merger.py
Normal file
36
tools/config_merger.py
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
"""Configuration merging and validation for AI-Trader."""
|
||||||
|
|
||||||
|
import json
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Dict, Any, Optional
|
||||||
|
|
||||||
|
|
||||||
|
class ConfigValidationError(Exception):
|
||||||
|
"""Raised when config validation fails."""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def load_config(path: str) -> Dict[str, Any]:
|
||||||
|
"""
|
||||||
|
Load and parse JSON config file.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
path: Path to JSON config file
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Parsed config dictionary
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
ConfigValidationError: If file not found or invalid JSON
|
||||||
|
"""
|
||||||
|
config_path = Path(path)
|
||||||
|
|
||||||
|
if not config_path.exists():
|
||||||
|
raise ConfigValidationError(f"Config file not found: {path}")
|
||||||
|
|
||||||
|
try:
|
||||||
|
with open(config_path, 'r') as f:
|
||||||
|
return json.load(f)
|
||||||
|
except json.JSONDecodeError as e:
|
||||||
|
raise ConfigValidationError(f"Invalid JSON in {path}: {e}")
|
||||||
Reference in New Issue
Block a user