- weight_evolver.evaluate_weekly: save_base_history 직전에 current_base를 previous_base로 캡처해 return dict에 포함 → formatter가 진짜 diff 표시 가능 - evaluate_weekly: same effective_from row 이미 존재 시 save skip + idempotent return (토 22:00 lotto cron과 agent-office 22:15 재호출 중복 row 방지) - main._run_weight_evolver_daily: 일요일(weekday=6) 도 skip — 토요일 trial을 INSERT OR REPLACE로 덮어쓰는 문제 방지 - telegram_lotto._format_evolution_report: eval_result.previous_base 우선 사용 (없으면 current_base 폴백) → diff 자기 자신 비교 버그 수정 - test_lotto_evolution_format: previous_base 키 추가 + 새 diff 검증 테스트 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
88 lines
3.0 KiB
Python
88 lines
3.0 KiB
Python
import sys, os
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(__file__)))
|
|
|
|
from app.notifiers.telegram_lotto import _format_evolution_report
|
|
|
|
|
|
def test_evolution_report_winner_4plus():
|
|
eval_result = {
|
|
"ok": True,
|
|
"draw_no": 1225,
|
|
"week_start": "2026-05-18",
|
|
"winner": {
|
|
"day_of_week": 3,
|
|
"weight": [0.18, 0.32, 0.20, 0.22, 0.08],
|
|
"avg_score": 0.42,
|
|
"max_correct": 4,
|
|
"n_picks": 5,
|
|
},
|
|
"new_base": [0.18, 0.32, 0.20, 0.22, 0.08],
|
|
"previous_base": [0.20, 0.20, 0.20, 0.20, 0.20],
|
|
"update_reason": "winner_4plus",
|
|
"per_day": [
|
|
{"day_of_week": 0, "avg_score": 0.20, "max_correct": 2},
|
|
{"day_of_week": 3, "avg_score": 0.42, "max_correct": 4},
|
|
],
|
|
}
|
|
current_base = [0.20, 0.20, 0.20, 0.20, 0.20]
|
|
text = _format_evolution_report(eval_result, current_base)
|
|
assert "🧬" in text
|
|
assert "1225" in text
|
|
assert "목요일" in text or "Winner" in text
|
|
assert "4개 일치" in text or "max=4" in text
|
|
assert "winner_4plus" in text
|
|
|
|
|
|
def test_evolution_report_unchanged():
|
|
eval_result = {
|
|
"ok": True,
|
|
"draw_no": 1226,
|
|
"week_start": "2026-05-25",
|
|
"winner": {
|
|
"day_of_week": 1,
|
|
"weight": [0.21, 0.19, 0.20, 0.20, 0.20],
|
|
"avg_score": 0.10,
|
|
"max_correct": 2,
|
|
"n_picks": 5,
|
|
},
|
|
"new_base": [0.20, 0.20, 0.20, 0.20, 0.20],
|
|
"update_reason": "unchanged",
|
|
"per_day": [],
|
|
}
|
|
current_base = [0.20, 0.20, 0.20, 0.20, 0.20]
|
|
text = _format_evolution_report(eval_result, current_base)
|
|
assert "unchanged" in text or "유지" in text
|
|
assert "2개 일치" in text or "max=2" in text
|
|
|
|
|
|
def test_evolution_report_empty_returns_empty():
|
|
"""evaluate가 ok=False면 빈 문자열 (발송 skip)."""
|
|
text = _format_evolution_report({"ok": False, "reason": "no_trials"}, [0.2]*5)
|
|
assert text == ""
|
|
|
|
|
|
def test_evolution_report_uses_previous_base_for_diff():
|
|
"""previous_base와 new_base 차이가 메시지 diff에 정확히 반영됨."""
|
|
eval_result = {
|
|
"ok": True,
|
|
"draw_no": 1227,
|
|
"winner": {
|
|
"day_of_week": 0,
|
|
"weight": [0.30, 0.20, 0.20, 0.20, 0.10],
|
|
"avg_score": 0.50,
|
|
"max_correct": 4,
|
|
"n_picks": 5,
|
|
},
|
|
"new_base": [0.30, 0.20, 0.20, 0.20, 0.10],
|
|
"previous_base": [0.20, 0.20, 0.20, 0.20, 0.20],
|
|
"update_reason": "winner_4plus",
|
|
}
|
|
# current_base는 stale (post-update 값) — previous_base가 우선 적용되어야 함
|
|
text = _format_evolution_report(eval_result, [0.30, 0.20, 0.20, 0.20, 0.10])
|
|
# freq: 0.20 → 0.30 (+0.10 = "++")
|
|
# divers: 0.20 → 0.10 (-0.10 = "--")
|
|
assert "0.20 → 0.30" in text # freq 증가
|
|
assert "0.20 → 0.10" in text # divers 감소
|
|
assert "(++)" in text or "(+)" in text # freq marker
|
|
assert "(--)" in text or "(-)" in text # divers marker
|