"""R4: 분석(ML 추론 포함)이 이벤트 루프 스레드에서 실행되지 않아야 한다.""" import asyncio import threading import time import pytest from app.services import market_analyzer as ma @pytest.mark.asyncio async def test_analyze_runs_off_loop_thread(monkeypatch): main_tid = threading.get_ident() seen = {} def fake(chart_data, code, name, criteria, ml_chart_data=None): seen["tid"] = threading.get_ident() return "OK" monkeypatch.setattr(ma, "_analyze_chart_items_v2", fake) res = await ma.analyze_stock_for_batch_db([{"a": 1}], "005930", "삼성") assert res == "OK" assert seen["tid"] != main_tid @pytest.mark.asyncio async def test_loop_not_blocked_during_analysis(monkeypatch): def slow(*a, **k): time.sleep(0.3) return None monkeypatch.setattr(ma, "_analyze_chart_items_v2", slow) ticks = 0 async def ticker(): nonlocal ticks while True: await asyncio.sleep(0.02) ticks += 1 t = asyncio.create_task(ticker()) await ma.analyze_stock_for_batch_db([{"a": 1}], "005930", "삼성") t.cancel() assert ticks >= 5