Spaces:
Running
Running
| """ | |
| Test script to verify chart and visualization blocks work end-to-end | |
| """ | |
| import json | |
| from ml_module.core.response_formatter import ( | |
| FormattedResponse, | |
| visualization_block, | |
| simple_table_with_types, | |
| chart_block, | |
| metric_block, | |
| text_block, | |
| Severity | |
| ) | |
| def test_visualization_block(): | |
| """Test creating visualization blocks""" | |
| print("\n=== Testing Visualization Block ===") | |
| # Feature importance data | |
| data = [ | |
| {"feature": "age", "importance": 0.35}, | |
| {"feature": "income", "importance": 0.28}, | |
| {"feature": "credit_score", "importance": 0.22}, | |
| {"feature": "loan_amount", "importance": 0.15}, | |
| ] | |
| viz = visualization_block( | |
| data, | |
| chart_type="bar", | |
| title="Feature Importance", | |
| subtitle="Top features affecting model predictions" | |
| ) | |
| print("✓ Created visualization block") | |
| print(json.dumps(viz.model_dump(), indent=2)) | |
| return viz | |
| def test_table_with_types(): | |
| """Test creating tables with type inference""" | |
| print("\n=== Testing Table with Type Inference ===") | |
| # Time series data | |
| data = [ | |
| {"date": "2024-01-01", "price": 150.5, "volume": 1000000}, | |
| {"date": "2024-01-02", "price": 152.3, "volume": 1200000}, | |
| {"date": "2024-01-03", "price": 151.8, "volume": 950000}, | |
| ] | |
| table = simple_table_with_types( | |
| data, | |
| caption="Stock Prices", | |
| block_id="stock_data" | |
| ) | |
| print("✓ Created table with inferred types") | |
| print(json.dumps(table.model_dump(), indent=2)) | |
| return table | |
| def test_formatted_response_with_charts(): | |
| """Test a complete formatted response with charts""" | |
| print("\n=== Testing Complete FormattedResponse with Charts ===") | |
| # Simulate evaluation results | |
| metrics_data = [ | |
| {"metric": "Accuracy", "score": 0.89}, | |
| {"metric": "Precision", "score": 0.87}, | |
| {"metric": "Recall", "score": 0.91}, | |
| {"metric": "F1 Score", "score": 0.89}, | |
| ] | |
| feature_data = [ | |
| {"feature": "transaction_amount", "importance": 0.42}, | |
| {"feature": "account_age_days", "importance": 0.28}, | |
| {"feature": "num_transactions", "importance": 0.18}, | |
| {"feature": "avg_transaction_size", "importance": 0.12}, | |
| ] | |
| response = FormattedResponse( | |
| blocks=[ | |
| text_block( | |
| "Model evaluation completed successfully", | |
| severity=Severity.SUCCESS | |
| ), | |
| metric_block("Accuracy", 0.89), | |
| metric_block("Precision", 0.87), | |
| metric_block("Recall", 0.91), | |
| metric_block("F1 Score", 0.89), | |
| visualization_block( | |
| metrics_data, | |
| chart_type="bar", | |
| title="Model Performance Metrics", | |
| subtitle="Evaluation on test set", | |
| block_id="eval_metrics_chart" | |
| ), | |
| visualization_block( | |
| feature_data, | |
| chart_type="bar", | |
| title="Feature Importance", | |
| subtitle="Top features affecting predictions", | |
| block_id="feature_importance_chart" | |
| ), | |
| simple_table_with_types( | |
| feature_data, | |
| caption="Detailed feature importance scores", | |
| block_id="feature_table" | |
| ), | |
| ], | |
| summary="Evaluation complete with visualizations", | |
| correlation_id="eval_v1_20241031", | |
| done=True | |
| ) | |
| print("✓ Created complete formatted response") | |
| output = response.model_dump(mode="json") | |
| print(json.dumps(output, indent=2)) | |
| # Verify structure | |
| assert len(output["blocks"]) == 8, "Should have 8 blocks" | |
| assert output["blocks"][5]["type"] == "visualization", "Block 5 should be visualization" | |
| assert output["blocks"][6]["type"] == "visualization", "Block 6 should be visualization" | |
| assert output["blocks"][7]["type"] == "table", "Block 7 should be table" | |
| print("✓ All assertions passed") | |
| return response | |
| def test_echarts_chart_block(): | |
| """Test creating an ECharts specification block""" | |
| print("\n=== Testing ECharts ChartBlock ===") | |
| echarts_spec = { | |
| "title": {"text": "Sales Over Time"}, | |
| "xAxis": { | |
| "type": "category", | |
| "data": ["Jan", "Feb", "Mar", "Apr", "May"] | |
| }, | |
| "yAxis": {"type": "value"}, | |
| "series": [{ | |
| "data": [150, 230, 224, 218, 135], | |
| "type": "line", | |
| "smooth": True | |
| }] | |
| } | |
| chart = chart_block( | |
| chart_type="line", | |
| specification=echarts_spec, | |
| title="Monthly Sales", | |
| subtitle="2024 Q1-Q2" | |
| ) | |
| print("✓ Created ECharts chart block") | |
| print(json.dumps(chart.model_dump(), indent=2)) | |
| return chart | |
| if __name__ == "__main__": | |
| print("=" * 60) | |
| print("Testing ML Module Chart and Visualization Blocks") | |
| print("=" * 60) | |
| try: | |
| test_visualization_block() | |
| test_table_with_types() | |
| test_formatted_response_with_charts() | |
| test_echarts_chart_block() | |
| print("\n" + "=" * 60) | |
| print("✅ ALL TESTS PASSED!") | |
| print("=" * 60) | |
| print("\nBackend is now ready to send chart data to the frontend!") | |
| print("The frontend will automatically detect and render:") | |
| print(" • VisualizationBlock → Interactive charts with toggle buttons") | |
| print(" • TableBlock (with dtype) → Auto-converted to charts") | |
| print(" • ChartBlock → Direct ECharts rendering") | |
| except Exception as e: | |
| print(f"\n❌ Test failed: {e}") | |
| import traceback | |
| traceback.print_exc() | |
| exit(1) | |