Edwin Salguero
Enhanced FRED ML with improved Reports & Insights page, fixed alignment analysis, and comprehensive analytics improvements
2469150
| #!/usr/bin/env python3 | |
| """ | |
| System integration tests for FRED ML | |
| Tests complete workflows and system integration | |
| """ | |
| import sys | |
| import os | |
| import pytest | |
| import pandas as pd | |
| import numpy as np | |
| import requests | |
| from unittest.mock import Mock, patch | |
| from datetime import datetime, timedelta | |
| # Add project root to path | |
| sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../..'))) | |
| class TestSystemIntegration: | |
| """Test complete system integration and workflows""" | |
| def setup_method(self): | |
| """Set up test environment""" | |
| self.test_api_key = "test_fred_api_key" | |
| self.test_data = pd.DataFrame({ | |
| 'GDPC1': [22000, 22100, 22200, 22300, 22400], | |
| 'INDPRO': [100, 101, 102, 103, 104], | |
| 'CPIAUCSL': [250, 251, 252, 253, 254], | |
| 'FEDFUNDS': [2.0, 2.1, 2.2, 2.3, 2.4], | |
| 'PAYEMS': [150000, 151000, 152000, 153000, 154000] | |
| }, index=pd.date_range('2023-01-01', periods=5, freq='M')) | |
| def test_complete_analytics_workflow(self): | |
| """Test complete analytics workflow""" | |
| try: | |
| # Test analytics module import | |
| from src.analysis.comprehensive_analytics import ComprehensiveAnalytics | |
| # Create analytics instance | |
| analytics = ComprehensiveAnalytics(self.test_api_key, output_dir="test_output") | |
| # Test basic functionality | |
| assert analytics is not None | |
| assert hasattr(analytics, 'run_complete_analysis') | |
| except ImportError as e: | |
| pytest.skip(f"Analytics module not available: {e}") | |
| except Exception as e: | |
| pytest.fail(f"Analytics workflow test failed: {e}") | |
| def test_fred_client_integration(self): | |
| """Test FRED client integration""" | |
| try: | |
| from src.core.enhanced_fred_client import EnhancedFREDClient | |
| client = EnhancedFREDClient(self.test_api_key) | |
| # Test client structure | |
| assert hasattr(client, 'fetch_economic_data') | |
| assert hasattr(client, 'fetch_quarterly_data') | |
| except ImportError as e: | |
| pytest.skip(f"FRED client module not available: {e}") | |
| except Exception as e: | |
| pytest.fail(f"FRED client integration test failed: {e}") | |
| def test_mathematical_fixes_integration(self): | |
| """Test mathematical fixes integration""" | |
| try: | |
| from src.analysis.mathematical_fixes import MathematicalFixes | |
| fixes = MathematicalFixes() | |
| # Test comprehensive fixes | |
| fixed_data, fix_info = fixes.apply_comprehensive_fixes( | |
| self.test_data, | |
| target_freq='Q', | |
| growth_method='pct_change', | |
| normalize_units=True | |
| ) | |
| assert fixed_data is not None | |
| assert isinstance(fix_info, dict) | |
| except ImportError as e: | |
| pytest.skip(f"Mathematical fixes module not available: {e}") | |
| except Exception as e: | |
| pytest.fail(f"Mathematical fixes integration test failed: {e}") | |
| def test_forecasting_integration(self): | |
| """Test forecasting module integration""" | |
| try: | |
| from src.analysis.economic_forecasting import EconomicForecaster | |
| forecaster = EconomicForecaster(self.test_data) | |
| # Test forecaster structure | |
| assert hasattr(forecaster, 'forecast_series') | |
| assert hasattr(forecaster, 'backtest_forecast') | |
| except ImportError as e: | |
| pytest.skip(f"Forecasting module not available: {e}") | |
| except Exception as e: | |
| pytest.fail(f"Forecasting integration test failed: {e}") | |
| def test_segmentation_integration(self): | |
| """Test segmentation module integration""" | |
| try: | |
| from src.analysis.economic_segmentation import EconomicSegmentation | |
| segmentation = EconomicSegmentation(self.test_data) | |
| # Test segmentation structure | |
| assert hasattr(segmentation, 'cluster_time_periods') | |
| assert hasattr(segmentation, 'cluster_economic_series') | |
| except ImportError as e: | |
| pytest.skip(f"Segmentation module not available: {e}") | |
| except Exception as e: | |
| pytest.fail(f"Segmentation integration test failed: {e}") | |
| class TestAppIntegration: | |
| """Test application integration and functionality""" | |
| def test_app_health_check(self, mock_get): | |
| """Test app health check with mocked requests""" | |
| # Mock successful response | |
| mock_response = Mock() | |
| mock_response.status_code = 200 | |
| mock_get.return_value = mock_response | |
| try: | |
| response = requests.get("http://localhost:8501/_stcore/health", timeout=5) | |
| assert response.status_code == 200 | |
| except Exception as e: | |
| pytest.fail(f"App health check test failed: {e}") | |
| def test_config_integration(self): | |
| """Test configuration integration""" | |
| try: | |
| # Test environment variable loading | |
| import os | |
| fred_key = os.getenv('FRED_API_KEY', 'test_key') | |
| assert fred_key is not None | |
| assert len(fred_key) > 0 | |
| except Exception as e: | |
| pytest.fail(f"Config integration test failed: {e}") | |
| def test_data_processing_integration(self): | |
| """Test data processing integration""" | |
| # Create test data | |
| test_data = pd.DataFrame({ | |
| 'GDPC1': [22000, 22100, 22200], | |
| 'INDPRO': [100, 101, 102], | |
| 'CPIAUCSL': [250, 251, 252] | |
| }) | |
| # Test basic data processing | |
| assert not test_data.empty | |
| assert len(test_data.columns) > 0 | |
| assert len(test_data) > 0 | |
| # Test data validation | |
| for col in test_data.columns: | |
| assert pd.api.types.is_numeric_dtype(test_data[col]) | |
| def test_visualization_integration(self): | |
| """Test visualization integration""" | |
| try: | |
| import matplotlib.pyplot as plt | |
| # Test basic plotting | |
| test_data = pd.DataFrame({ | |
| 'GDPC1': [22000, 22100, 22200], | |
| 'INDPRO': [100, 101, 102] | |
| }) | |
| fig, ax = plt.subplots() | |
| test_data.plot(ax=ax) | |
| plt.close() | |
| assert True # If we get here, plotting worked | |
| except ImportError: | |
| pytest.skip("Matplotlib not available") | |
| except Exception as e: | |
| pytest.fail(f"Visualization integration test failed: {e}") | |
| class TestErrorHandling: | |
| """Test error handling and edge cases""" | |
| def test_invalid_api_key_handling(self): | |
| """Test handling of invalid API key""" | |
| try: | |
| from src.core.enhanced_fred_client import EnhancedFREDClient | |
| # Test with invalid key | |
| client = EnhancedFREDClient("invalid_key") | |
| # Should not raise exception on initialization | |
| assert client is not None | |
| except ImportError as e: | |
| pytest.skip(f"FRED client module not available: {e}") | |
| except Exception as e: | |
| pytest.fail(f"Invalid API key handling test failed: {e}") | |
| def test_empty_data_handling(self): | |
| """Test handling of empty data""" | |
| try: | |
| from src.analysis.mathematical_fixes import MathematicalFixes | |
| fixes = MathematicalFixes() | |
| # Test with empty DataFrame | |
| empty_data = pd.DataFrame() | |
| # Should handle empty data gracefully | |
| if hasattr(fixes, 'normalize_units'): | |
| try: | |
| result = fixes.normalize_units(empty_data) | |
| assert result is not None | |
| except Exception: | |
| # It's OK for empty data to raise an exception | |
| pass | |
| except ImportError as e: | |
| pytest.skip(f"Mathematical fixes module not available: {e}") | |
| except Exception as e: | |
| pytest.fail(f"Empty data handling test failed: {e}") | |
| def test_missing_data_handling(self): | |
| """Test handling of missing data""" | |
| # Create data with missing values | |
| test_data = pd.DataFrame({ | |
| 'GDPC1': [22000, np.nan, 22200], | |
| 'INDPRO': [100, 101, np.nan], | |
| 'CPIAUCSL': [250, 251, 252] | |
| }) | |
| # Test basic missing data handling | |
| assert test_data.isnull().sum().sum() > 0 | |
| # Test that we can handle missing data | |
| cleaned_data = test_data.dropna() | |
| assert len(cleaned_data) < len(test_data) | |
| class TestPerformance: | |
| """Test performance and scalability""" | |
| def test_large_data_handling(self): | |
| """Test handling of large datasets""" | |
| # Create larger test dataset | |
| large_data = pd.DataFrame({ | |
| 'GDPC1': np.random.normal(22000, 1000, 1000), | |
| 'INDPRO': np.random.normal(100, 5, 1000), | |
| 'CPIAUCSL': np.random.normal(250, 10, 1000) | |
| }, index=pd.date_range('2020-01-01', periods=1000, freq='D')) | |
| # Test basic operations on large data | |
| assert len(large_data) == 1000 | |
| assert len(large_data.columns) == 3 | |
| # Test memory usage (basic check) | |
| memory_usage = large_data.memory_usage(deep=True).sum() | |
| assert memory_usage > 0 | |
| def test_computation_efficiency(self): | |
| """Test computation efficiency""" | |
| import time | |
| # Test basic computation time | |
| start_time = time.time() | |
| # Perform some basic computations | |
| test_data = pd.DataFrame({ | |
| 'GDPC1': np.random.normal(22000, 1000, 100), | |
| 'INDPRO': np.random.normal(100, 5, 100) | |
| }) | |
| # Basic operations | |
| test_data.describe() | |
| test_data.corr() | |
| end_time = time.time() | |
| computation_time = end_time - start_time | |
| # Should complete within reasonable time (5 seconds) | |
| assert computation_time < 5.0 | |
| if __name__ == "__main__": | |
| pytest.main([__file__]) |