folder stricture reorganize
This commit is contained in:
221
tests/test_callback_registration.py
Normal file
221
tests/test_callback_registration.py
Normal file
@ -0,0 +1,221 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Test callback registration to identify the issue
|
||||
"""
|
||||
|
||||
import logging
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
# Add project root to path
|
||||
project_root = Path(__file__).parent
|
||||
sys.path.insert(0, str(project_root))
|
||||
|
||||
import dash
|
||||
from dash import dcc, html, Input, Output
|
||||
|
||||
# Setup logging
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
def test_simple_callback():
|
||||
"""Test a simple callback registration"""
|
||||
logger.info("Testing simple callback registration...")
|
||||
|
||||
app = dash.Dash(__name__)
|
||||
|
||||
app.layout = html.Div([
|
||||
html.H1("Callback Registration Test"),
|
||||
html.Div(id="output", children="Initial"),
|
||||
dcc.Interval(id="interval", interval=1000, n_intervals=0)
|
||||
])
|
||||
|
||||
@app.callback(
|
||||
Output('output', 'children'),
|
||||
Input('interval', 'n_intervals')
|
||||
)
|
||||
def update_output(n_intervals):
|
||||
logger.info(f"Callback triggered: {n_intervals}")
|
||||
return f"Update #{n_intervals}"
|
||||
|
||||
logger.info("Simple callback registered successfully")
|
||||
|
||||
# Check if callback is in the callback map
|
||||
logger.info(f"Callback map keys: {list(app.callback_map.keys())}")
|
||||
|
||||
return app
|
||||
|
||||
def test_complex_callback():
|
||||
"""Test a complex callback like the dashboard"""
|
||||
logger.info("Testing complex callback registration...")
|
||||
|
||||
app = dash.Dash(__name__)
|
||||
|
||||
app.layout = html.Div([
|
||||
html.H1("Complex Callback Test"),
|
||||
html.Div(id="current-balance", children="$100.00"),
|
||||
html.Div(id="session-duration", children="00:00:00"),
|
||||
html.Div(id="status", children="Starting"),
|
||||
dcc.Graph(id="chart"),
|
||||
dcc.Interval(id="ultra-fast-interval", interval=1000, n_intervals=0)
|
||||
])
|
||||
|
||||
@app.callback(
|
||||
[
|
||||
Output('current-balance', 'children'),
|
||||
Output('session-duration', 'children'),
|
||||
Output('status', 'children'),
|
||||
Output('chart', 'figure')
|
||||
],
|
||||
[Input('ultra-fast-interval', 'n_intervals')]
|
||||
)
|
||||
def update_dashboard(n_intervals):
|
||||
logger.info(f"Complex callback triggered: {n_intervals}")
|
||||
|
||||
import plotly.graph_objects as go
|
||||
fig = go.Figure()
|
||||
fig.add_trace(go.Scatter(x=[1, 2, 3], y=[1, 2, 3], mode='lines'))
|
||||
fig.update_layout(template="plotly_dark")
|
||||
|
||||
return f"${100 + n_intervals:.2f}", f"00:00:{n_intervals:02d}", "Running", fig
|
||||
|
||||
logger.info("Complex callback registered successfully")
|
||||
|
||||
# Check if callback is in the callback map
|
||||
logger.info(f"Callback map keys: {list(app.callback_map.keys())}")
|
||||
|
||||
return app
|
||||
|
||||
def test_dashboard_callback():
|
||||
"""Test the exact dashboard callback structure"""
|
||||
logger.info("Testing dashboard callback structure...")
|
||||
|
||||
try:
|
||||
from core.data_provider import DataProvider
|
||||
from core.enhanced_orchestrator import EnhancedTradingOrchestrator
|
||||
|
||||
app = dash.Dash(__name__)
|
||||
|
||||
# Minimal layout with dashboard elements
|
||||
app.layout = html.Div([
|
||||
html.H1("Dashboard Callback Test"),
|
||||
html.Div(id="current-balance", children="$100.00"),
|
||||
html.Div(id="session-duration", children="00:00:00"),
|
||||
html.Div(id="open-positions", children="0"),
|
||||
html.Div(id="live-pnl", children="$0.00"),
|
||||
html.Div(id="win-rate", children="0%"),
|
||||
html.Div(id="total-trades", children="0"),
|
||||
html.Div(id="last-action", children="WAITING"),
|
||||
html.Div(id="eth-price", children="Loading..."),
|
||||
html.Div(id="btc-price", children="Loading..."),
|
||||
dcc.Graph(id="main-eth-1s-chart"),
|
||||
dcc.Graph(id="eth-1m-chart"),
|
||||
dcc.Graph(id="eth-1h-chart"),
|
||||
dcc.Graph(id="eth-1d-chart"),
|
||||
dcc.Graph(id="btc-1s-chart"),
|
||||
html.Div(id="actions-log", children="No actions yet"),
|
||||
html.Div(id="debug-status", children="Debug info"),
|
||||
dcc.Interval(id="ultra-fast-interval", interval=1000, n_intervals=0)
|
||||
])
|
||||
|
||||
@app.callback(
|
||||
[
|
||||
Output('current-balance', 'children'),
|
||||
Output('session-duration', 'children'),
|
||||
Output('open-positions', 'children'),
|
||||
Output('live-pnl', 'children'),
|
||||
Output('win-rate', 'children'),
|
||||
Output('total-trades', 'children'),
|
||||
Output('last-action', 'children'),
|
||||
Output('eth-price', 'children'),
|
||||
Output('btc-price', 'children'),
|
||||
Output('main-eth-1s-chart', 'figure'),
|
||||
Output('eth-1m-chart', 'figure'),
|
||||
Output('eth-1h-chart', 'figure'),
|
||||
Output('eth-1d-chart', 'figure'),
|
||||
Output('btc-1s-chart', 'figure'),
|
||||
Output('actions-log', 'children'),
|
||||
Output('debug-status', 'children')
|
||||
],
|
||||
[Input('ultra-fast-interval', 'n_intervals')]
|
||||
)
|
||||
def update_dashboard_test(n_intervals):
|
||||
logger.info(f"Dashboard callback triggered: {n_intervals}")
|
||||
|
||||
import plotly.graph_objects as go
|
||||
from datetime import datetime
|
||||
|
||||
# Create empty figure
|
||||
empty_fig = go.Figure()
|
||||
empty_fig.update_layout(template="plotly_dark")
|
||||
|
||||
debug_status = html.Div([
|
||||
html.P(f"Test Callback #{n_intervals} at {datetime.now().strftime('%H:%M:%S')}")
|
||||
])
|
||||
|
||||
return (
|
||||
f"${100 + n_intervals:.2f}", # current-balance
|
||||
f"00:00:{n_intervals:02d}", # session-duration
|
||||
"0", # open-positions
|
||||
f"${n_intervals:+.2f}", # live-pnl
|
||||
"75%", # win-rate
|
||||
str(n_intervals), # total-trades
|
||||
"TEST", # last-action
|
||||
"$3500.00", # eth-price
|
||||
"$65000.00", # btc-price
|
||||
empty_fig, # main-eth-1s-chart
|
||||
empty_fig, # eth-1m-chart
|
||||
empty_fig, # eth-1h-chart
|
||||
empty_fig, # eth-1d-chart
|
||||
empty_fig, # btc-1s-chart
|
||||
f"Test action #{n_intervals}", # actions-log
|
||||
debug_status # debug-status
|
||||
)
|
||||
|
||||
logger.info("Dashboard callback registered successfully")
|
||||
logger.info(f"Callback map keys: {list(app.callback_map.keys())}")
|
||||
|
||||
return app
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error testing dashboard callback: {e}")
|
||||
import traceback
|
||||
logger.error(f"Traceback: {traceback.format_exc()}")
|
||||
return None
|
||||
|
||||
def main():
|
||||
"""Main test function"""
|
||||
logger.info("Starting callback registration tests...")
|
||||
|
||||
# Test 1: Simple callback
|
||||
try:
|
||||
simple_app = test_simple_callback()
|
||||
logger.info("✅ Simple callback test passed")
|
||||
except Exception as e:
|
||||
logger.error(f"❌ Simple callback test failed: {e}")
|
||||
|
||||
# Test 2: Complex callback
|
||||
try:
|
||||
complex_app = test_complex_callback()
|
||||
logger.info("✅ Complex callback test passed")
|
||||
except Exception as e:
|
||||
logger.error(f"❌ Complex callback test failed: {e}")
|
||||
|
||||
# Test 3: Dashboard callback
|
||||
try:
|
||||
dashboard_app = test_dashboard_callback()
|
||||
if dashboard_app:
|
||||
logger.info("✅ Dashboard callback test passed")
|
||||
|
||||
# Run the dashboard test
|
||||
logger.info("Starting dashboard test server on port 8054...")
|
||||
dashboard_app.run(host='127.0.0.1', port=8054, debug=True)
|
||||
else:
|
||||
logger.error("❌ Dashboard callback test failed")
|
||||
except Exception as e:
|
||||
logger.error(f"❌ Dashboard callback test failed: {e}")
|
||||
import traceback
|
||||
logger.error(f"Traceback: {traceback.format_exc()}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Reference in New Issue
Block a user