Blum / backend /tests /test_learning_performance_architecture.py
Italianhype's picture
Fix live-forward paper runtime deploy
6fbe974 verified
Raw
History Blame Contribute Delete
6.22 kB
from datetime import datetime, timedelta
from pathlib import Path
from sqlalchemy import create_engine
from sqlalchemy.orm import Session
from app.models import (
BlumTradingPowerScore,
DashboardSnapshot,
LearningBenchmarkComparison,
LearningRun,
LearningStrengthWeaknessMap,
TradingCapitalCycle,
TradingGame,
TradingGameTrade,
TradingIntelligenceMetric,
TradeLearningEvidence,
)
from app.services.dashboard_snapshots import DashboardSnapshotService
from app.services.learning_summary import LearningSummaryService, build_truth_panel, safe_progress, summarize_benchmarks
def test_safe_progress_handles_partial_data():
assert safe_progress(None, 10000) is None
assert safe_progress(50, 100) == 0.5
assert safe_progress(200, 100) == 1
def test_summarize_benchmarks_returns_partial_status():
payload = summarize_benchmarks([])
assert payload["status"] == "initializing"
assert payload["major_benchmarks"]["SPY"]["result_label"] == "insufficient_sample"
def test_truth_panel_is_honest_when_power_missing():
rows = build_truth_panel(None, summarize_benchmarks([]), ["No benchmark summary."], [])
assert rows[0].startswith("Not enough precomputed evidence")
assert any("No benchmark summary" in row for row in rows)
def test_learning_summary_returns_partial_payload_without_precomputed_rows():
engine = create_engine("sqlite:///:memory:", future=True)
for model in [
BlumTradingPowerScore,
DashboardSnapshot,
LearningBenchmarkComparison,
LearningRun,
LearningStrengthWeaknessMap,
TradingCapitalCycle,
TradingGame,
TradingGameTrade,
TradingIntelligenceMetric,
TradeLearningEvidence,
]:
model.__table__.create(bind=engine)
with Session(engine) as db:
payload = LearningSummaryService().summary(db)
assert payload["status"] == "initializing"
assert "trading_power_score" in payload["missing_sections"]
assert "trading_intelligence_metrics" in payload["missing_sections"]
assert payload["backend_training_status"]["frontend_policy"] == "read_only_snapshot_observer"
assert "snapshots" in payload
assert payload["truth_panel"][0].startswith("Not enough precomputed evidence")
def test_dashboard_snapshot_round_trip_and_stale_flag():
engine = create_engine("sqlite:///:memory:", future=True)
DashboardSnapshot.__table__.create(bind=engine)
service = DashboardSnapshotService()
with Session(engine) as db:
written = service.write(db, "learning_summary", {"status": "ready"}, ttl_seconds=1)
assert written["status"] == "ready"
latest = service.latest(db, "learning_summary")
assert latest["payload"]["status"] == "ready"
row = db.get(DashboardSnapshot, 1)
row.expires_at = datetime.utcnow() - timedelta(seconds=1)
db.commit()
stale = service.latest(db, "learning_summary")
assert stale["status"] == "stale"
def test_learning_page_keeps_heavy_work_out_of_initial_render():
page = Path(__file__).resolve().parents[2] / "frontend" / "app" / "learning" / "page.tsx"
text = page.read_text()
assert text.strip() == 'export { default } from "../training-ground/page";'
training_page = Path(__file__).resolve().parents[2] / "frontend" / "app" / "training-ground" / "page.tsx"
training_text = training_page.read_text()
initial_effect = training_text.split("useEffect(() => {", 1)[1].split("}, []);", 1)[0]
assert "api.traderTrainingGround()" in initial_effect
assert initial_effect.count("api.") == 1
assert "api.tradingGameLedger" not in training_text
assert "api.alphaRecoveryDashboard()" not in training_text
assert "api.metaCognitionSummary()" not in training_text
assert "recalculateLearningTradingPower" not in text
assert "recalculateDecisionSuperiority" not in text
assert "recalculateBusinessQuality" not in text
assert "recalculatePortfolioIntelligence" not in text
assert "recalculateAlphaRecovery" not in text
assert "metaCognitionRecalculate" not in text
def test_deep_diagnostics_uses_human_readable_renderer_not_raw_json_dump():
page = Path(__file__).resolve().parents[2] / "frontend" / "components" / "DiagnosticPanelRenderer.tsx"
text = page.read_text()
assert "compactPreview" not in text
assert "JSON.stringify(compactPreview" not in text
assert "DiagnosticPanelRenderer" in text
assert "Show raw JSON" in text
def test_diagnostic_panel_renderer_hides_raw_json_by_default():
renderer = Path(__file__).resolve().parents[2] / "frontend" / "components" / "DiagnosticPanelRenderer.tsx"
text = renderer.read_text()
assert "export function DiagnosticPanelRenderer" in text
assert "function ReliabilityByRegimeRenderer" in text
assert "function EnsembleStatusRenderer" in text
assert "export function SampleSizeWarning" in text
assert "export function WeightDistributionTable" in text
assert "Show raw JSON" in text
assert "Hide raw JSON" in text
assert "open && <pre" in text
def test_diagnostic_renderer_exposes_evidence_warnings_and_tables():
renderer = Path(__file__).resolve().parents[2] / "frontend" / "components" / "DiagnosticPanelRenderer.tsx"
text = renderer.read_text()
assert "Small sample size: treat as weak evidence." in text
assert "Reliability is promising but not durable without more samples." in text
assert "Negative average return with positive excess return needs review." in text
assert "DiagnosticTable" in text
assert "Engine" in text
assert "Hit Rate" in text
assert "Excess vs Benchmark" in text
assert "Confidence Penalty" in text
def test_frontend_blocks_heavy_learning_post_during_initial_render():
api_file = Path(__file__).resolve().parents[2] / "frontend" / "lib" / "api.ts"
text = api_file.read_text()
assert "blocked_heavy_frontend_recalculation" in text
assert "LEARNING_INITIAL_RENDER_GUARD_MS" in text
assert '"/api/capital-allocation/recalculate"' in text
assert '"/api/alpha-recovery/recalculate"' in text
assert '"/api/meta-cognition/recalculate"' in text