feat(stock): 매매알람 DB — watchlist/alert_state/history 테이블+헬퍼
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EqCYBhvTcdeCTUDX3RhWx9
This commit is contained in:
33
stock/tests/test_trade_alerts_db.py
Normal file
33
stock/tests/test_trade_alerts_db.py
Normal file
@@ -0,0 +1,33 @@
|
||||
import os, sqlite3, tempfile, datetime as dt
|
||||
import pytest
|
||||
|
||||
@pytest.fixture
|
||||
def db(monkeypatch, tmp_path):
|
||||
from app import db as _db
|
||||
monkeypatch.setattr(_db, "DB_PATH", str(tmp_path / "stock.db"))
|
||||
_db.init_db()
|
||||
return _db
|
||||
|
||||
def test_watchlist_add_get_remove(db):
|
||||
db.add_watchlist("005930", "삼성전자", note="관심")
|
||||
db.add_watchlist("005930", "삼성전자") # 멱등
|
||||
wl = db.get_watchlist()
|
||||
assert [w["ticker"] for w in wl] == ["005930"]
|
||||
assert wl[0]["name"] == "삼성전자"
|
||||
assert db.remove_watchlist("005930") is True
|
||||
assert db.get_watchlist() == []
|
||||
|
||||
def test_alert_state_edge_firing_and_clear(db):
|
||||
key = ("005930", "buy", "buy_breakout")
|
||||
assert db.get_alert_state_firing() == set()
|
||||
db.set_alert_firing(*key, firing=True, at_iso="2026-07-02T00:01:00Z")
|
||||
assert key in db.get_alert_state_firing()
|
||||
db.set_alert_firing(*key, firing=False)
|
||||
assert key not in db.get_alert_state_firing()
|
||||
|
||||
def test_alert_history_records_and_reads(db):
|
||||
db.add_alert_history("005930", "삼성전자", "buy", "buy_breakout", 71500, {"vol": 2.1})
|
||||
rows = db.get_alert_history(days=7)
|
||||
assert len(rows) == 1
|
||||
assert rows[0]["ticker"] == "005930" and rows[0]["kind"] == "buy"
|
||||
assert rows[0]["detail"]["vol"] == 2.1
|
||||
Reference in New Issue
Block a user