import math import pytest from app.adapters.fake import FakeEmbeddingProvider, FakeReranker from app.ports.model_providers import ModelProviderError @pytest.mark.asyncio async def test_fake_embedding_is_deterministic_normalized_and_1024_dimensional() -> None: provider = FakeEmbeddingProvider() first = await provider.embed_documents(["斑岩铜矿 钾化 绢英岩化"]) second = await provider.embed_query("斑岩铜矿 钾化 绢英岩化") assert first.vectors[0] == second.vectors[0] assert len(first.vectors[0]) == 1024 assert math.isclose(sum(value * value for value in first.vectors[0]), 1.0) @pytest.mark.asyncio async def test_fake_reranker_preserves_original_candidate_index() -> None: reranker = FakeReranker() documents = ["煤层测井对比", "斑岩铜矿钾化带", "铝土矿含矿层"] result = await reranker.rerank("斑岩铜矿的钾化带", documents, top_n=2) assert result.items[0].index == 1 assert result.items[0].document == documents[1] assert result.items[0].relevance_score >= result.items[1].relevance_score @pytest.mark.asyncio async def test_fake_providers_reject_inputs_the_live_contract_rejects() -> None: embedder = FakeEmbeddingProvider() reranker = FakeReranker() with pytest.raises(ModelProviderError): await embedder.embed_documents([]) with pytest.raises(ModelProviderError): await embedder.embed_documents(["x"] * 11) with pytest.raises(ModelProviderError): await reranker.rerank("", ["document"], top_n=1) with pytest.raises(ModelProviderError): await reranker.rerank("query", [], top_n=1) with pytest.raises(ModelProviderError): await reranker.rerank("query", ["document"], top_n=0)