FREDML / scripts /test_complete_system.py
Edwin Salguero
feat: Integrate advanced analytics and enterprise UI
26a8ea5
#!/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()