diff --git a/tests/test_web_observability.py b/tests/test_web_observability.py index 4ce29d37..76746238 100644 --- a/tests/test_web_observability.py +++ b/tests/test_web_observability.py @@ -2298,6 +2298,32 @@ def test_scan_terminal_timeout_does_not_replace_better_cached_snapshot(monkeypat assert [row["id"] for row in cached["rows"]] == ["old-1", "old-2"] +def test_scan_terminal_prewarm_builds_default_terminal_payload(monkeypatch): + calls = [] + + def _fake_build(filters, *, force_refresh=False): + calls.append((dict(filters), force_refresh)) + return {"rows": []} + + monkeypatch.setattr( + scan_terminal_service, + "_build_scan_terminal_payload_uncached", + _fake_build, + ) + + assert scan_terminal_service._warm_scan_terminal_payloads() == 1 + filters, force_refresh = calls[0] + assert force_refresh is False + assert filters["scan_mode"] == "tradable" + assert filters["min_price"] == 0.05 + assert filters["max_price"] == 0.95 + assert filters["min_edge_pct"] == 2.0 + assert filters["min_liquidity"] == 500.0 + assert filters["market_type"] == "maxtemp" + assert filters["time_range"] == "today" + assert filters["limit"] == 180 + + def test_scan_terminal_service_returns_failed_without_success_snapshot(monkeypatch): filters = {"scan_mode": "tradable", "limit": 5} scan_terminal_cache._SCAN_TERMINAL_CACHE.clear() diff --git a/web/scan_terminal_service.py b/web/scan_terminal_service.py index 730a3bb8..e713e826 100644 --- a/web/scan_terminal_service.py +++ b/web/scan_terminal_service.py @@ -336,6 +336,36 @@ def build_scan_terminal_payload( _SCAN_PREWARM_STARTED = False _SCAN_PREWARM_LOCK = threading.Lock() +_SCAN_TERMINAL_PREWARM_RAW_FILTERS = [ + { + "scan_mode": "tradable", + "min_price": 0.05, + "max_price": 0.95, + "min_edge_pct": 2, + "min_liquidity": 500, + "market_type": "maxtemp", + "time_range": "today", + "limit": 180, + } +] + + +def _scan_terminal_prewarm_filters() -> List[Dict[str, Any]]: + return [ + _normalize_scan_terminal_filters(filters) + for filters in _SCAN_TERMINAL_PREWARM_RAW_FILTERS + ] + + +def _warm_scan_terminal_payloads() -> int: + ok = 0 + for filters in _scan_terminal_prewarm_filters(): + try: + _build_scan_terminal_payload_uncached(filters, force_refresh=False) + ok += 1 + except Exception as exc: + logger.warning("scan terminal payload pre-warm failed: {}", exc) + return ok def start_scan_terminal_prewarm() -> None: @@ -379,11 +409,13 @@ def start_scan_terminal_prewarm() -> None: ok += 1 except Exception: pass + payload_ok = _warm_scan_terminal_payloads() elapsed = int(time.time() - started) logger.info( - "scan terminal pre-warm finished ok={}/{} elapsed={}s", + "scan terminal pre-warm finished ok={}/{} payloads={} elapsed={}s", ok, len(city_names), + payload_ok, elapsed, ) except (ValueError, OSError, IOError):