"""Regression tests for Phase 1/2 audit fixes.""" from __future__ import annotations import pytest from app.agentic.speculative_executor import _mapping_for_learned_tool from app.db.database import multi_section_parallel_enabled def test_generate_api_imports_multi_section_parallel() -> None: """POST /generate must resolve multi_section_parallel_enabled (no NameError).""" from app.api import generate as generate_api assert callable(generate_api.multi_section_parallel_enabled) def test_multi_section_parallel_import_from_database() -> None: assert callable(multi_section_parallel_enabled) def test_learned_speculative_mapping_retrieve_rag() -> None: fn = _mapping_for_learned_tool("retrieve_survey_rag") args = fn({"last_query": "roof tiles"}) assert args.get("query") == "roof tiles" def test_learned_speculative_mapping_section_plan() -> None: fn = _mapping_for_learned_tool("submit_section_plan") args = fn({"section_code": "E1", "outline": "x"}) assert args.get("section_code") == "E1" @pytest.mark.asyncio async def test_qdrant_hybrid_merge_off_event_loop(monkeypatch) -> None: """_hybrid_merge_vector_rows is callable from run_sync_in_executor.""" from langchain_community.embeddings import FakeEmbeddings from langchain_core.documents import Document from app.models.schemas import SearchResult from app.vectorstore.qdrant_wrapper import QdrantVectorStore vs = QdrantVectorStore.__new__(QdrantVectorStore) vs._bm25_texts = {"t1": ["roof defect"]} vs._bm25_rows = { "t1": [ SearchResult( chunk_id="c1", doc_id="d1", tenant_id="t1", text="roof defect", score=0.5, section_type="paragraph", hierarchy_level="paragraph", ) ] } rows = [ SearchResult( chunk_id="c2", doc_id="d1", tenant_id="t1", text="vector hit", score=0.9, section_type="paragraph", hierarchy_level="paragraph", ) ] merged = vs._hybrid_merge_vector_rows( "roof", "t1", 3, rows, hierarchy_level=None, doc_id_in=None, ) assert merged