File size: 2,317 Bytes
732b14f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
"""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