from __future__ import annotations import pytest from backend.app.services import campaign_vectorizer from backend.app.services.campaign_vectorizer import FEATURE_KEYS, extract_campaign_features def test_extract_campaign_features_explicitly_falls_back_when_llm_errors( monkeypatch: pytest.MonkeyPatch, ) -> None: monkeypatch.setattr(campaign_vectorizer.settings, "ollama_api_key", "present-for-test") monkeypatch.setattr(campaign_vectorizer, "embed_text", lambda _text: [0.0] * 384) def _raise_llm_error(*_args, **_kwargs): raise ConnectionError("simulated provider outage") monkeypatch.setattr(campaign_vectorizer, "llm_create", _raise_llm_error) result = extract_campaign_features( "Oncology campaign for senior KOLs focused on phase 3 evidence, safety, and guideline alignment." ) assert result["model"] == "fallback-llm-error" assert list(result["features"]) == FEATURE_KEYS assert list(result["normalized_features"]) == FEATURE_KEYS assert all(0.0 <= float(value) <= 1.0 for value in result["features"].values())