feat(stock-lab): /run 엔드포인트 — preview/manual_save/auto 모드 매트릭스
This commit is contained in:
@@ -62,3 +62,63 @@ def test_settings_put_then_get_round_trip(client):
|
||||
body = r2.json()
|
||||
assert body["weights"]["foreign_buy"] == 2.5
|
||||
assert body["top_n"] == 30
|
||||
|
||||
|
||||
# ---- /run tests ----
|
||||
|
||||
from app.screener._test_fixtures import make_master, make_prices, make_flow
|
||||
|
||||
|
||||
def _seed_min(conn, asof_iso="2026-05-12"):
|
||||
import datetime as dt
|
||||
now = dt.datetime.utcnow().isoformat()
|
||||
rows = [
|
||||
("BIG1", "큰주식1", "KOSPI", 200_000_000_000, 0, 0, 0, None, now),
|
||||
("BIG2", "큰주식2", "KOSPI", 100_000_000_000, 0, 0, 0, None, now),
|
||||
("SMALL", "작은주식", "KOSPI", 1_000_000_000, 0, 0, 0, None, now),
|
||||
]
|
||||
for r in rows:
|
||||
conn.execute("""INSERT INTO krx_master (ticker,name,market,market_cap,
|
||||
is_managed,is_preferred,is_spac,listed_date,updated_at)
|
||||
VALUES (?,?,?,?,?,?,?,?,?)""", r)
|
||||
asof = dt.date(2026, 5, 12)
|
||||
p = make_prices(["BIG1", "BIG2", "SMALL"], days=260, asof=asof)
|
||||
f = make_flow(["BIG1", "BIG2", "SMALL"], days=260, asof=asof,
|
||||
foreign_per_day={"BIG1": 100_000_000, "BIG2": 50_000_000, "SMALL": 0})
|
||||
p.to_sql("krx_daily_prices", conn, if_exists="append", index=False)
|
||||
f.to_sql("krx_flow", conn, if_exists="append", index=False)
|
||||
conn.commit()
|
||||
|
||||
|
||||
def test_run_preview_no_save(client):
|
||||
db_path = os.environ["STOCK_DB_PATH"]
|
||||
c = sqlite3.connect(db_path)
|
||||
_seed_min(c)
|
||||
c.close()
|
||||
|
||||
r = client.post("/api/stock/screener/run", json={"mode": "preview", "asof": "2026-05-12"})
|
||||
assert r.status_code == 200
|
||||
body = r.json()
|
||||
assert body["status"] == "success"
|
||||
assert body["run_id"] is None
|
||||
assert body["telegram_payload"] is not None
|
||||
|
||||
c = sqlite3.connect(db_path)
|
||||
cnt = c.execute("SELECT count(*) FROM screener_runs").fetchone()[0]
|
||||
assert cnt == 0
|
||||
|
||||
|
||||
def test_run_manual_save_writes_row(client):
|
||||
db_path = os.environ["STOCK_DB_PATH"]
|
||||
c = sqlite3.connect(db_path)
|
||||
_seed_min(c)
|
||||
c.close()
|
||||
|
||||
r = client.post("/api/stock/screener/run",
|
||||
json={"mode": "manual_save", "asof": "2026-05-12"})
|
||||
assert r.status_code == 200
|
||||
assert r.json()["run_id"] is not None
|
||||
|
||||
c = sqlite3.connect(db_path)
|
||||
cnt = c.execute("SELECT count(*) FROM screener_runs").fetchone()[0]
|
||||
assert cnt == 1
|
||||
|
||||
Reference in New Issue
Block a user