|
|
|
""" |
|
FRED ML Development Testing |
|
Simple testing script for development environment |
|
""" |
|
|
|
import os |
|
import sys |
|
import json |
|
import time |
|
from pathlib import Path |
|
|
|
def test_streamlit_app(): |
|
"""Test Streamlit app functionality""" |
|
print("π¨ Testing Streamlit app...") |
|
|
|
try: |
|
|
|
sys.path.append('frontend') |
|
from app import load_config, init_aws_clients |
|
|
|
|
|
config = load_config() |
|
if config: |
|
print("β
Streamlit app configuration loaded") |
|
else: |
|
print("β Failed to load Streamlit app configuration") |
|
return False |
|
|
|
|
|
try: |
|
s3_client, lambda_client = init_aws_clients() |
|
print("β
AWS clients initialized") |
|
except Exception as e: |
|
print(f"β AWS client initialization failed: {str(e)}") |
|
return False |
|
|
|
print("β
Streamlit app test passed") |
|
return True |
|
|
|
except Exception as e: |
|
print(f"β Streamlit app test failed: {str(e)}") |
|
return False |
|
|
|
def test_lambda_function(): |
|
"""Test Lambda function""" |
|
print("β‘ Testing Lambda function...") |
|
|
|
try: |
|
import boto3 |
|
lambda_client = boto3.client('lambda') |
|
|
|
|
|
function_info = lambda_client.get_function(FunctionName='fred-ml-processor') |
|
print(f"β
Lambda function found: {function_info['Configuration']['FunctionArn']}") |
|
|
|
|
|
test_payload = { |
|
'indicators': ['GDP', 'UNRATE'], |
|
'start_date': '2023-01-01', |
|
'end_date': '2023-12-31', |
|
'test_mode': True |
|
} |
|
|
|
response = lambda_client.invoke( |
|
FunctionName='fred-ml-processor', |
|
InvocationType='RequestResponse', |
|
Payload=json.dumps(test_payload) |
|
) |
|
|
|
if response['StatusCode'] == 200: |
|
print("β
Lambda function invocation successful") |
|
return True |
|
else: |
|
print(f"β Lambda invocation failed with status {response['StatusCode']}") |
|
return False |
|
|
|
except Exception as e: |
|
print(f"β Lambda function test failed: {str(e)}") |
|
return False |
|
|
|
def test_s3_access(): |
|
"""Test S3 bucket access""" |
|
print("π¦ Testing S3 bucket access...") |
|
|
|
try: |
|
import boto3 |
|
s3 = boto3.client('s3') |
|
|
|
|
|
s3.head_bucket(Bucket='fredmlv1') |
|
print("β
S3 bucket access successful") |
|
|
|
|
|
test_data = "test content" |
|
test_key = f"dev-test/test-{int(time.time())}.txt" |
|
|
|
|
|
s3.put_object( |
|
Bucket='fredmlv1', |
|
Key=test_key, |
|
Body=test_data.encode('utf-8') |
|
) |
|
print("β
S3 upload successful") |
|
|
|
|
|
response = s3.get_object(Bucket='fredmlv1', Key=test_key) |
|
downloaded_data = response['Body'].read().decode('utf-8') |
|
|
|
if downloaded_data == test_data: |
|
print("β
S3 download successful") |
|
else: |
|
print("β S3 download data mismatch") |
|
return False |
|
|
|
|
|
s3.delete_object(Bucket='fredmlv1', Key=test_key) |
|
print("β
S3 cleanup successful") |
|
|
|
return True |
|
|
|
except Exception as e: |
|
print(f"β S3 access test failed: {str(e)}") |
|
return False |
|
|
|
def test_fred_api(): |
|
"""Test FRED API access""" |
|
print("π Testing FRED API...") |
|
|
|
try: |
|
from fredapi import Fred |
|
fred = Fred(api_key=os.getenv('FRED_API_KEY')) |
|
|
|
|
|
test_series = fred.get_series('GDP', limit=5) |
|
if len(test_series) > 0: |
|
print(f"β
FRED API access successful - retrieved {len(test_series)} data points") |
|
return True |
|
else: |
|
print("β FRED API returned no data") |
|
return False |
|
|
|
except Exception as e: |
|
print(f"β FRED API test failed: {str(e)}") |
|
return False |
|
|
|
def test_data_processing(): |
|
"""Test data processing capabilities""" |
|
print("π Testing data processing...") |
|
|
|
try: |
|
import pandas as pd |
|
import numpy as np |
|
from fredapi import Fred |
|
|
|
fred = Fred(api_key=os.getenv('FRED_API_KEY')) |
|
|
|
|
|
test_data = {} |
|
indicators = ['GDP', 'UNRATE', 'CPIAUCSL'] |
|
|
|
for indicator in indicators: |
|
try: |
|
data = fred.get_series(indicator, limit=100) |
|
test_data[indicator] = data |
|
print(f"β
Retrieved {indicator}: {len(data)} observations") |
|
except Exception as e: |
|
print(f"β Failed to retrieve {indicator}: {str(e)}") |
|
|
|
if not test_data: |
|
print("β No test data retrieved") |
|
return False |
|
|
|
|
|
df = pd.DataFrame(test_data) |
|
df = df.dropna() |
|
|
|
if len(df) > 0: |
|
|
|
summary = df.describe() |
|
correlation = df.corr() |
|
|
|
print(f"β
Data processing successful - {len(df)} data points processed") |
|
print(f" Summary statistics calculated") |
|
print(f" Correlation matrix shape: {correlation.shape}") |
|
return True |
|
else: |
|
print("β No valid data after processing") |
|
return False |
|
|
|
except Exception as e: |
|
print(f"β Data processing test failed: {str(e)}") |
|
return False |
|
|
|
def test_visualization(): |
|
"""Test visualization generation""" |
|
print("π¨ Testing visualization generation...") |
|
|
|
try: |
|
import matplotlib.pyplot as plt |
|
import plotly.express as px |
|
import seaborn as sns |
|
import pandas as pd |
|
import numpy as np |
|
|
|
|
|
np.random.seed(42) |
|
dates = pd.date_range('2023-01-01', '2024-01-01', freq='M') |
|
test_data = pd.DataFrame({ |
|
'GDP': np.random.normal(100, 5, len(dates)), |
|
'UNRATE': np.random.normal(5, 1, len(dates)), |
|
'CPIAUCSL': np.random.normal(200, 10, len(dates)) |
|
}, index=dates) |
|
|
|
|
|
fig, ax = plt.subplots(figsize=(10, 6)) |
|
test_data.plot(ax=ax) |
|
plt.title('Test Visualization') |
|
plt.close() |
|
print("β
Matplotlib visualization created") |
|
|
|
|
|
fig = px.line(test_data, title='Test Plotly Visualization') |
|
fig.update_layout(showlegend=True) |
|
print("β
Plotly visualization created") |
|
|
|
|
|
plt.figure(figsize=(8, 6)) |
|
sns.heatmap(test_data.corr(), annot=True, cmap='coolwarm') |
|
plt.title('Test Correlation Heatmap') |
|
plt.close() |
|
print("β
Seaborn visualization created") |
|
|
|
print("β
All visualization tests passed") |
|
return True |
|
|
|
except Exception as e: |
|
print(f"β Visualization test failed: {str(e)}") |
|
return False |
|
|
|
def main(): |
|
"""Main testing function""" |
|
print("π§ͺ FRED ML Development Testing") |
|
print("=" * 50) |
|
|
|
tests = [ |
|
("Streamlit App", test_streamlit_app), |
|
("Lambda Function", test_lambda_function), |
|
("S3 Bucket Access", test_s3_access), |
|
("FRED API", test_fred_api), |
|
("Data Processing", test_data_processing), |
|
("Visualization", test_visualization) |
|
] |
|
|
|
passed = 0 |
|
total = len(tests) |
|
|
|
for test_name, test_func in tests: |
|
print(f"\nπ Running {test_name} test...") |
|
if test_func(): |
|
passed += 1 |
|
else: |
|
print(f"β {test_name} test failed") |
|
|
|
print(f"\nπ Test Summary: {passed}/{total} tests passed") |
|
|
|
if passed == total: |
|
print("β
All development tests passed!") |
|
print("\nπ― Your development environment is ready!") |
|
print("You can now:") |
|
print("1. Run the Streamlit app: streamlit run frontend/app.py") |
|
print("2. Test the complete system: python scripts/test_complete_system.py") |
|
return True |
|
else: |
|
print("β Some tests failed. Please check the issues above.") |
|
return False |
|
|
|
if __name__ == '__main__': |
|
success = main() |
|
sys.exit(0 if success else 1) |