diff --git a/src/dashboard/app.py b/src/dashboard/app.py index 6124ad9..e9d8e26 100644 --- a/src/dashboard/app.py +++ b/src/dashboard/app.py @@ -13,10 +13,11 @@ from fastapi import FastAPI, HTTPException, Query from fastapi.responses import FileResponse -def create_dashboard_app(db_path: str) -> FastAPI: +def create_dashboard_app(db_path: str, mode: str = "paper") -> FastAPI: """Create dashboard FastAPI app bound to a SQLite database path.""" app = FastAPI(title="The Ouroboros Dashboard", version="1.0.0") app.state.db_path = db_path + app.state.mode = mode @app.get("/") def index() -> FileResponse: @@ -111,7 +112,7 @@ def create_dashboard_app(db_path: str) -> FastAPI: return { "date": today, - "mode": os.getenv("MODE", "paper"), + "mode": mode, "markets": market_status, "totals": { "trade_count": total_trades, diff --git a/src/main.py b/src/main.py index a424be2..ee5e051 100644 --- a/src/main.py +++ b/src/main.py @@ -2045,7 +2045,7 @@ def _start_dashboard_server(settings: Settings) -> threading.Thread | None: import uvicorn from src.dashboard import create_dashboard_app - app = create_dashboard_app(settings.DB_PATH) + app = create_dashboard_app(settings.DB_PATH, mode=settings.MODE) uvicorn.run( app, host=settings.DASHBOARD_HOST, diff --git a/tests/test_dashboard.py b/tests/test_dashboard.py index 38d872e..8620c44 100644 --- a/tests/test_dashboard.py +++ b/tests/test_dashboard.py @@ -415,28 +415,37 @@ def test_status_circuit_breaker_unknown_when_no_data(tmp_path: Path) -> None: assert cb["current_pnl_pct"] is None -def test_status_mode_paper(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: - """MODE=paper일 때 status 응답에 mode=paper가 포함돼야 한다.""" - monkeypatch.setenv("MODE", "paper") - app = _app(tmp_path) +def test_status_mode_paper(tmp_path: Path) -> None: + """mode=paper로 생성하면 status 응답에 mode=paper가 포함돼야 한다.""" + db_path = tmp_path / "dashboard_test.db" + conn = init_db(str(db_path)) + _seed_db(conn) + conn.close() + app = create_dashboard_app(str(db_path), mode="paper") get_status = _endpoint(app, "/api/status") body = get_status() assert body["mode"] == "paper" -def test_status_mode_live(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: - """MODE=live일 때 status 응답에 mode=live가 포함돼야 한다.""" - monkeypatch.setenv("MODE", "live") - app = _app(tmp_path) +def test_status_mode_live(tmp_path: Path) -> None: + """mode=live로 생성하면 status 응답에 mode=live가 포함돼야 한다.""" + db_path = tmp_path / "dashboard_test.db" + conn = init_db(str(db_path)) + _seed_db(conn) + conn.close() + app = create_dashboard_app(str(db_path), mode="live") get_status = _endpoint(app, "/api/status") body = get_status() assert body["mode"] == "live" -def test_status_mode_default_paper(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: - """MODE 환경변수가 없으면 mode 기본값은 paper여야 한다.""" - monkeypatch.delenv("MODE", raising=False) - app = _app(tmp_path) +def test_status_mode_default_paper(tmp_path: Path) -> None: + """mode 파라미터 미전달 시 기본값은 paper여야 한다.""" + db_path = tmp_path / "dashboard_test.db" + conn = init_db(str(db_path)) + _seed_db(conn) + conn.close() + app = create_dashboard_app(str(db_path)) get_status = _endpoint(app, "/api/status") body = get_status() assert body["mode"] == "paper"