#!/usr/bin/env python3 """ FRED ML - Complete System Test Comprehensive testing of all system components """ import os import sys import subprocess import logging from pathlib import Path from datetime import datetime import json # Setup logging logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s' ) logger = logging.getLogger(__name__) class FREDMLSystemTest: """Complete system testing for FRED ML""" def __init__(self): self.root_dir = Path(__file__).parent.parent self.test_results = {} def run_complete_system_test(self): """Run complete system test""" logger.info("๐Ÿงช Starting FRED ML Complete System Test") logger.info("=" * 60) # 1. Environment Setup Test self.test_environment_setup() # 2. Dependencies Test self.test_dependencies() # 3. Configuration Test self.test_configurations() # 4. Core Modules Test self.test_core_modules() # 5. Advanced Analytics Test self.test_advanced_analytics() # 6. Streamlit UI Test self.test_streamlit_ui() # 7. Integration Test self.test_integration() # 8. Performance Test self.test_performance() # 9. Generate Test Report self.generate_test_report() def test_environment_setup(self): """Test environment setup""" logger.info("๐Ÿ”ง Testing environment setup...") # Check Python version python_version = sys.version_info if python_version.major >= 3 and python_version.minor >= 8: logger.info(f"โœ… Python version: {python_version.major}.{python_version.minor}.{python_version.micro}") self.test_results['python_version'] = True else: logger.error(f"โŒ Python version too old: {python_version}") self.test_results['python_version'] = False # Check working directory logger.info(f"โœ… Working directory: {self.root_dir}") self.test_results['working_directory'] = True # Check environment variables required_env_vars = ['FRED_API_KEY'] env_status = True for var in required_env_vars: if os.getenv(var): logger.info(f"โœ… Environment variable set: {var}") else: logger.warning(f"โš ๏ธ Environment variable not set: {var}") env_status = False self.test_results['environment_variables'] = env_status def test_dependencies(self): """Test dependencies""" logger.info("๐Ÿ“ฆ Testing dependencies...") required_packages = [ 'pandas', 'numpy', 'scikit-learn', 'scipy', 'statsmodels', 'streamlit', 'plotly', 'boto3', 'fredapi' ] missing_packages = [] for package in required_packages: try: __import__(package) logger.info(f"โœ… Package available: {package}") except ImportError: logger.error(f"โŒ Package missing: {package}") missing_packages.append(package) if missing_packages: self.test_results['dependencies'] = False logger.error(f"โŒ Missing packages: {missing_packages}") else: self.test_results['dependencies'] = True logger.info("โœ… All dependencies available") def test_configurations(self): """Test configuration files""" logger.info("โš™๏ธ Testing configurations...") config_files = [ 'config/pipeline.yaml', 'config/settings.py', 'requirements.txt', 'pyproject.toml' ] config_status = True for config_file in config_files: full_path = self.root_dir / config_file if full_path.exists(): logger.info(f"โœ… Configuration file exists: {config_file}") else: logger.error(f"โŒ Configuration file missing: {config_file}") config_status = False self.test_results['configurations'] = config_status def test_core_modules(self): """Test core modules""" logger.info("๐Ÿ”ง Testing core modules...") # Add src to path sys.path.append(str(self.root_dir / 'src')) core_modules = [ 'src.core.enhanced_fred_client', 'src.analysis.economic_forecasting', 'src.analysis.economic_segmentation', 'src.analysis.statistical_modeling', 'src.analysis.comprehensive_analytics' ] module_status = True for module in core_modules: try: __import__(module) logger.info(f"โœ… Module available: {module}") except ImportError as e: logger.error(f"โŒ Module missing: {module} - {e}") module_status = False self.test_results['core_modules'] = module_status def test_advanced_analytics(self): """Test advanced analytics functionality""" logger.info("๐Ÿ”ฎ Testing advanced analytics...") try: # Test Enhanced FRED Client from src.core.enhanced_fred_client import EnhancedFREDClient logger.info("โœ… Enhanced FRED Client imported successfully") # Test Economic Forecasting from src.analysis.economic_forecasting import EconomicForecaster logger.info("โœ… Economic Forecasting imported successfully") # Test Economic Segmentation from src.analysis.economic_segmentation import EconomicSegmentation logger.info("โœ… Economic Segmentation imported successfully") # Test Statistical Modeling from src.analysis.statistical_modeling import StatisticalModeling logger.info("โœ… Statistical Modeling imported successfully") # Test Comprehensive Analytics from src.analysis.comprehensive_analytics import ComprehensiveAnalytics logger.info("โœ… Comprehensive Analytics imported successfully") self.test_results['advanced_analytics'] = True except Exception as e: logger.error(f"โŒ Advanced analytics test failed: {e}") self.test_results['advanced_analytics'] = False def test_streamlit_ui(self): """Test Streamlit UI""" logger.info("๐ŸŽจ Testing Streamlit UI...") try: # Check if Streamlit app exists streamlit_app = self.root_dir / 'frontend/app.py' if not streamlit_app.exists(): logger.error("โŒ Streamlit app not found") self.test_results['streamlit_ui'] = False return # Check app content with open(streamlit_app, 'r') as f: content = f.read() # Check for required components required_components = [ 'st.set_page_config', 'ComprehensiveAnalytics', 'EnhancedFREDClient', 'show_executive_dashboard', 'show_advanced_analytics_page' ] missing_components = [] for component in required_components: if component not in content: missing_components.append(component) if missing_components: logger.error(f"โŒ Missing components in Streamlit app: {missing_components}") self.test_results['streamlit_ui'] = False else: logger.info("โœ… Streamlit UI components found") self.test_results['streamlit_ui'] = True except Exception as e: logger.error(f"โŒ Streamlit UI test failed: {e}") self.test_results['streamlit_ui'] = False def test_integration(self): """Test system integration""" logger.info("๐Ÿ”— Testing system integration...") try: # Test FRED API connection (if API key available) from config.settings import FRED_API_KEY if FRED_API_KEY: try: from src.core.enhanced_fred_client import EnhancedFREDClient client = EnhancedFREDClient(FRED_API_KEY) logger.info("โœ… FRED API client created successfully") # Test series info retrieval series_info = client.get_series_info('GDPC1') if 'error' not in series_info: logger.info("โœ… FRED API connection successful") self.test_results['fred_api_integration'] = True else: logger.warning("โš ๏ธ FRED API connection failed") self.test_results['fred_api_integration'] = False except Exception as e: logger.error(f"โŒ FRED API integration failed: {e}") self.test_results['fred_api_integration'] = False else: logger.warning("โš ๏ธ FRED API key not available, skipping API test") self.test_results['fred_api_integration'] = False # Test analytics integration try: from src.analysis.comprehensive_analytics import ComprehensiveAnalytics logger.info("โœ… Analytics integration successful") self.test_results['analytics_integration'] = True except Exception as e: logger.error(f"โŒ Analytics integration failed: {e}") self.test_results['analytics_integration'] = False except Exception as e: logger.error(f"โŒ Integration test failed: {e}") self.test_results['integration'] = False def test_performance(self): """Test system performance""" logger.info("โšก Testing system performance...") try: # Test data processing performance import pandas as pd import numpy as np # Create test data test_data = pd.DataFrame({ 'GDPC1': np.random.randn(1000), 'INDPRO': np.random.randn(1000), 'RSAFS': np.random.randn(1000) }) # Test analytics modules with test data from src.analysis.economic_forecasting import EconomicForecaster from src.analysis.economic_segmentation import EconomicSegmentation from src.analysis.statistical_modeling import StatisticalModeling # Test forecasting performance forecaster = EconomicForecaster(test_data) logger.info("โœ… Forecasting module performance test passed") # Test segmentation performance segmentation = EconomicSegmentation(test_data) logger.info("โœ… Segmentation module performance test passed") # Test statistical modeling performance modeling = StatisticalModeling(test_data) logger.info("โœ… Statistical modeling performance test passed") self.test_results['performance'] = True except Exception as e: logger.error(f"โŒ Performance test failed: {e}") self.test_results['performance'] = False def generate_test_report(self): """Generate comprehensive test report""" logger.info("๐Ÿ“Š Generating test report...") # Calculate overall status total_tests = len(self.test_results) passed_tests = sum(1 for status in self.test_results.values() if status) overall_status = "โœ… PASSED" if passed_tests == total_tests else "โŒ FAILED" # Generate report report = { "timestamp": datetime.now().isoformat(), "overall_status": overall_status, "summary": { "total_tests": total_tests, "passed_tests": passed_tests, "failed_tests": total_tests - passed_tests, "success_rate": f"{(passed_tests/total_tests)*100:.1f}%" }, "detailed_results": self.test_results } # Save report report_file = self.root_dir / 'system_test_report.json' with open(report_file, 'w') as f: json.dump(report, f, indent=2) # Print summary logger.info("=" * 60) logger.info("๐Ÿ“Š SYSTEM TEST REPORT") logger.info("=" * 60) logger.info(f"Overall Status: {overall_status}") logger.info(f"Total Tests: {total_tests}") logger.info(f"Passed: {passed_tests}") logger.info(f"Failed: {total_tests - passed_tests}") logger.info(f"Success Rate: {(passed_tests/total_tests)*100:.1f}%") logger.info("=" * 60) # Print detailed results logger.info("Detailed Results:") for test, status in self.test_results.items(): status_icon = "โœ…" if status else "โŒ" logger.info(f" {status_icon} {test}") logger.info("=" * 60) logger.info(f"Report saved to: {report_file}") return report def run_demo_tests(self): """Run demo tests""" logger.info("๐ŸŽฏ Running demo tests...") try: # Test comprehensive demo demo_script = self.root_dir / 'scripts/comprehensive_demo.py' if demo_script.exists(): logger.info("โœ… Comprehensive demo script exists") # Test demo script syntax with open(demo_script, 'r') as f: compile(f.read(), str(demo_script), 'exec') logger.info("โœ… Comprehensive demo script syntax valid") self.test_results['comprehensive_demo'] = True else: logger.error("โŒ Comprehensive demo script not found") self.test_results['comprehensive_demo'] = False # Test advanced analytics script analytics_script = self.root_dir / 'scripts/run_advanced_analytics.py' if analytics_script.exists(): logger.info("โœ… Advanced analytics script exists") # Test script syntax with open(analytics_script, 'r') as f: compile(f.read(), str(analytics_script), 'exec') logger.info("โœ… Advanced analytics script syntax valid") self.test_results['advanced_analytics_script'] = True else: logger.error("โŒ Advanced analytics script not found") self.test_results['advanced_analytics_script'] = False except Exception as e: logger.error(f"โŒ Demo tests failed: {e}") self.test_results['demo_tests'] = False def main(): """Main test function""" tester = FREDMLSystemTest() try: # Run complete system test tester.run_complete_system_test() # Run demo tests tester.run_demo_tests() logger.info("๐ŸŽ‰ Complete system test finished!") except Exception as e: logger.error(f"โŒ System test failed: {e}") sys.exit(1) if __name__ == "__main__": main()