from datetime import date, datetime from types import SimpleNamespace as NS from app.api.endpoints import recommendations as r def test_premarket_row_price_date_unknown_and_stale(): st = NS(analysis_date=date(2026, 9, 30), updated_at=datetime(2026, 9, 30, 8, 54)) assert r._row_price_date_v2(st) == ("", True) def test_intraday_row_price_date_is_analysis_date(): st = NS(analysis_date=date(2026, 9, 30), updated_at=datetime(2026, 9, 30, 10, 0)) assert r._row_price_date_v2(st) == ("20260930", False) def test_persistable_filters_stale_price_date(): today = date(2026, 10, 8) mk = lambda c, pd: (c, c, NS(price_date=pd)) out = r._persistable_items_v2([mk("a", "20261007"), mk("b", "20261008"), mk("c", "")], today) assert [x[0] for x in out] == ["b", "c"] def test_bg_trade_task_strongly_referenced_until_done(): import asyncio async def run(): ev = asyncio.Event() async def work(): await ev.wait() t = r._spawn_bg_trade_v2(work()) assert t in r._bg_trade_tasks ev.set() await t await asyncio.sleep(0) assert t not in r._bg_trade_tasks asyncio.run(run()) def test_rule_based_has_no_bare_create_task(): import inspect src = inspect.getsource(r.get_rule_based_recommendations) assert "asyncio.create_task(" not in src assert "_spawn_bg_trade_v2(" in src