From 8c492eae3a35c67e1cebf95a349fb9820a186bbd Mon Sep 17 00:00:00 2001 From: agentson Date: Tue, 24 Feb 2026 06:52:10 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EB=8C=80=EC=8B=9C=EB=B3=B4=EB=93=9C=20m?= =?UTF-8?q?ode=20=EB=B0=B0=EC=A7=80=20os.getenv=20=EB=8C=80=EC=8B=A0=20set?= =?UTF-8?q?tings.MODE=20=EC=82=AC=EC=9A=A9=20(#237)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit os.getenv("MODE")는 .env 파일을 읽지 못해 항상 paper를 반환함. create_dashboard_app에 mode 파라미터 추가 후 main.py에서 settings.MODE를 직접 전달하도록 수정. Co-Authored-By: Claude Sonnet 4.6 --- src/dashboard/app.py | 5 +++-- src/main.py | 2 +- tests/test_dashboard.py | 33 +++++++++++++++++++++------------ 3 files changed, 25 insertions(+), 15 deletions(-) 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"