import pytest from src.services import knowledge_service as knowledge_service_module from src.services.knowledge_service import KnowledgeService class _BrokenDbContext: async def __aenter__(self): raise RuntimeError("db pool exhausted") async def __aexit__(self, exc_type, exc, tb): return False @pytest.mark.asyncio async def test_knowledge_list_entries_fails_soft_when_readback_breaks(monkeypatch) -> None: monkeypatch.setattr( knowledge_service_module, "get_db_context", lambda: _BrokenDbContext(), ) service = KnowledgeService.__new__(KnowledgeService) response = await service.list_entries(limit=50) assert response.items == [] assert response.total == 0 assert [row.category for row in response.categories] == [ "project", "product", "website", "service", "package", "tool", "log", "alert", "playbook", "rag", "mcp", "schedule", "general", ] assert all(row.count == 0 for row in response.categories) assert response.readback_status == "degraded" assert response.operator_stage == "knowledge_readback_degraded_ai_controlled_repair" assert response.next_step == "queue_ai_controlled_km_readback_retry_tagging_and_connector_verifier" assert response.writes_on_read is False assert response.manual_review_required is False @pytest.mark.asyncio async def test_knowledge_categories_fails_soft_when_readback_breaks(monkeypatch) -> None: monkeypatch.setattr( knowledge_service_module, "get_db_context", lambda: _BrokenDbContext(), ) service = KnowledgeService.__new__(KnowledgeService) categories = await service.get_categories() assert [row.category for row in categories] == [ "project", "product", "website", "service", "package", "tool", "log", "alert", "playbook", "rag", "mcp", "schedule", "general", ] assert all(row.count == 0 for row in categories)