feat(stock): holdings_signals 테이블 + CRUD
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
24
stock/app/test_holdings_db.py
Normal file
24
stock/app/test_holdings_db.py
Normal file
@@ -0,0 +1,24 @@
|
||||
import os, tempfile, importlib
|
||||
|
||||
def _fresh_db(monkeypatch):
|
||||
tmp = tempfile.mkdtemp()
|
||||
from app import db
|
||||
monkeypatch.setattr(db, "DB_PATH", os.path.join(tmp, "stock.db"))
|
||||
db.init_db()
|
||||
return db
|
||||
|
||||
def test_holdings_signals_table_and_upsert(monkeypatch):
|
||||
db = _fresh_db(monkeypatch)
|
||||
db.upsert_holdings_signal(date="2026-05-29", ticker="005930", name="삼성전자",
|
||||
action="hold", tech_score=72.0, exit_flags={"stop_loss": False},
|
||||
issues=[{"type": "news", "severity": "low", "summary": "x"}],
|
||||
close=80000, pnl_rate=5.2, reasons="강건")
|
||||
db.upsert_holdings_signal(date="2026-05-29", ticker="005930", name="삼성전자",
|
||||
action="trim", tech_score=60.0, exit_flags={"ma50_break": True},
|
||||
issues=[], close=79000, pnl_rate=3.0, reasons="MA50 이탈")
|
||||
rows = db.get_holdings_signals(date="2026-05-29")
|
||||
assert len(rows) == 1 # upsert 멱등
|
||||
assert rows[0]["action"] == "trim"
|
||||
assert rows[0]["exit_flags"]["ma50_break"] is True # JSON 역직렬화
|
||||
hist = db.get_holdings_signal_history("005930", days=30)
|
||||
assert len(hist) == 1
|
||||
Reference in New Issue
Block a user