import pytest from backend.app.services.feishu_signal_pipeline import FeishuSignalPipelineService @pytest.mark.asyncio async def test_classify_level_fallback_when_llm_empty(monkeypatch): service = FeishuSignalPipelineService(db=None, tenant_id=1) async def _fake_generate(*args, **kwargs): return "" monkeypatch.setattr(service.llm, "generate", _fake_generate) result = await service._classify_level(message="我们需要新增导出按钮", projects=[]) assert result["level"] == "signal" assert 0.0 <= float(result["project_score"]) <= 1.0 assert str(result["level_reasoning"]).strip() @pytest.mark.asyncio async def test_extract_signal_fastpath_for_simple_request(monkeypatch): service = FeishuSignalPipelineService(db=None, tenant_id=1) async def _should_not_be_called(*args, **kwargs): raise AssertionError("LLM should not be called on simple signal request fastpath") monkeypatch.setattr(service.llm, "generate", _should_not_be_called) result = await service._extract_signal( "新增一个导出按钮,支持飞书同步", projects=[{"id": 3, "name": "飞书协同平台"}], ) assert result["type"] == "新需求" assert result["priority"] in {"P1", "P2", "P3"} assert str(result["summary"]).strip() @pytest.mark.asyncio async def test_extract_project_prefill_fallback_when_llm_empty(monkeypatch): service = FeishuSignalPipelineService(db=None, tenant_id=1) async def _fake_generate(*args, **kwargs): return "" monkeypatch.setattr(service.llm, "generate", _fake_generate) result = await service._extract_project_prefill("我们要做一个飞书需求同步项目") assert str(result["suggested_name"]).strip() assert str(result["suggested_description"]).strip() assert str(result["suggested_owner"]).strip()