refactor: rename stock-lab → stock (graduation)
- git mv stock-lab/ → stock/ - docker-compose.yml: 서비스 키 + container_name + build.context + frontend.depends_on + agent-office STOCK_LAB_URL → STOCK_URL - agent-office/app: config.py, service_proxy.py, agents/stock.py, tests/ STOCK_LAB_URL → STOCK_URL - nginx/default.conf: proxy_pass http://stock-lab → http://stock (3 lines) - CLAUDE.md / README.md / STATUS.md / scripts/ 문구 갱신 - stock/ 내부 자기 참조 갱신 lab 네이밍 정책 (feedback_lab_naming.md) graduation. API URL / Python import / DB 파일명 변경 없음.
This commit is contained in:
79
stock/tests/test_ai_news_telegram.py
Normal file
79
stock/tests/test_ai_news_telegram.py
Normal file
@@ -0,0 +1,79 @@
|
||||
from app.screener.ai_news import telegram as tg
|
||||
|
||||
|
||||
def _row(ticker, score, reason="r"):
|
||||
return {"ticker": ticker, "score_raw": score, "reason": reason,
|
||||
"news_count": 5, "tokens_input": 100, "tokens_output": 20,
|
||||
"model": "m"}
|
||||
|
||||
|
||||
def test_build_message_includes_top_sections():
|
||||
msg = tg.build_message(
|
||||
asof="2026-05-13",
|
||||
top_pos=[_row("005930", 8.5, "HBM 호재")],
|
||||
top_neg=[_row("373220", -6.3, "수주 지연")],
|
||||
tokens_input=10000, tokens_output=2000,
|
||||
)
|
||||
assert "AI 뉴스 분석" in msg
|
||||
assert "호재 Top" in msg
|
||||
assert "악재 Top" in msg
|
||||
assert "005930" in msg
|
||||
# score는 MarkdownV2 escape 거쳐 "8\.5" 형태 ('.' 가 reserved)
|
||||
assert "8\\.5" in msg
|
||||
assert "HBM" in msg
|
||||
assert "373220" in msg
|
||||
|
||||
|
||||
def test_build_message_escapes_markdownv2_specials():
|
||||
msg = tg.build_message(
|
||||
asof="2026-05-13",
|
||||
top_pos=[_row("005930", 3.0, "테스트(괄호) [대괄호]")],
|
||||
top_neg=[],
|
||||
tokens_input=100, tokens_output=20,
|
||||
)
|
||||
# MarkdownV2 특수문자 ( ) [ ] 이 escape 되어야 함
|
||||
assert r"\(" in msg or r"\)" in msg
|
||||
assert r"\[" in msg or r"\]" in msg
|
||||
|
||||
|
||||
def test_build_message_cost_won_line():
|
||||
msg = tg.build_message(
|
||||
asof="2026-05-13", top_pos=[], top_neg=[],
|
||||
tokens_input=10000, tokens_output=2000,
|
||||
)
|
||||
# tokens_input × 0.0013 + tokens_output × 0.0065 = 13 + 13 = ₩26
|
||||
assert "₩26" in msg or "₩ 26" in msg or "₩" in msg
|
||||
|
||||
|
||||
def test_build_message_empty_lists():
|
||||
msg = tg.build_message(
|
||||
asof="2026-05-13", top_pos=[], top_neg=[],
|
||||
tokens_input=0, tokens_output=0,
|
||||
)
|
||||
# 빈 리스트라도 헤더는 있어야 함
|
||||
assert "호재 Top" in msg
|
||||
assert "악재 Top" in msg
|
||||
|
||||
|
||||
def test_build_message_includes_mapping_line():
|
||||
msg = tg.build_message(
|
||||
asof="2026-05-14",
|
||||
top_pos=[_row("005930", 8.5, "HBM 호재")],
|
||||
top_neg=[],
|
||||
tokens_input=1000, tokens_output=200,
|
||||
mapping={"total_articles": 35, "matched_pairs": 50, "hit_tickers": 42},
|
||||
)
|
||||
assert "매핑" in msg
|
||||
assert "42" in msg
|
||||
assert "50" in msg
|
||||
assert "35" in msg
|
||||
|
||||
|
||||
def test_build_message_without_mapping_omits_line():
|
||||
msg = tg.build_message(
|
||||
asof="2026-05-14",
|
||||
top_pos=[],
|
||||
top_neg=[],
|
||||
tokens_input=1000, tokens_output=200,
|
||||
)
|
||||
assert "매핑" not in msg
|
||||
Reference in New Issue
Block a user