File size: 3,168 Bytes
49f0cfb
dc1b199
49f0cfb
 
 
 
dc1b199
 
49f0cfb
dc1b199
 
49f0cfb
 
 
 
 
 
 
dc1b199
 
49f0cfb
 
 
dc1b199
49f0cfb
 
 
 
dc1b199
 
49f0cfb
 
 
dc1b199
faa8fb3
 
49f0cfb
 
 
dc1b199
49f0cfb
 
dc1b199
 
49f0cfb
 
 
dc1b199
faa8fb3
 
49f0cfb
 
 
dc1b199
49f0cfb
 
dc1b199
 
49f0cfb
 
7d37f11
 
 
49f0cfb
 
 
 
 
 
7d37f11
49f0cfb
 
 
7d37f11
49f0cfb
7d37f11
49f0cfb
 
 
 
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
79
80
81
"""Unit tests for the LangChain embedding factory.

LangChain experiment branch: the factory now returns a
``langchain_core.embeddings.Embeddings`` object instead of the custom
``EmbeddingClient`` interface.
"""

import pytest
from langchain_core.embeddings import Embeddings


def test_factory_returns_embeddings_object(monkeypatch: pytest.MonkeyPatch) -> None:
    """get_embedding_client() must return a LangChain Embeddings object."""
    import app.embeddings.factory as _factory

    monkeypatch.setattr(_factory, "_instance", None)
    client = _factory.get_embedding_client()
    assert isinstance(client, Embeddings)


def test_factory_singleton(monkeypatch: pytest.MonkeyPatch) -> None:
    """get_embedding_client() must return the same instance on repeated calls."""
    import app.embeddings.factory as _factory

    monkeypatch.setattr(_factory, "_instance", None)
    c1 = _factory.get_embedding_client()
    c2 = _factory.get_embedding_client()
    assert c1 is c2, "Factory returned a different instance on second call"


def test_factory_openai_when_key_set(monkeypatch: pytest.MonkeyPatch) -> None:
    """Factory should use OpenAIEmbeddings when openai_api_key is non-empty."""
    from langchain_openai import OpenAIEmbeddings

    import app.embeddings.factory as _factory

    monkeypatch.setattr(_factory, "_instance", None)
    fake_settings = type("S", (), {"openai_api_key": "sk-test", "embedding_model": "text-embedding-3-small"})()
    monkeypatch.setattr(_factory, "settings", fake_settings)

    client = _factory.get_embedding_client()
    assert isinstance(client, OpenAIEmbeddings)


def test_factory_huggingface_without_key(monkeypatch: pytest.MonkeyPatch) -> None:
    """Factory should fall back to HuggingFaceEmbeddings when no OpenAI key is set."""
    from langchain_huggingface import HuggingFaceEmbeddings

    import app.embeddings.factory as _factory

    monkeypatch.setattr(_factory, "_instance", None)
    fake_settings = type("S", (), {"openai_api_key": "", "local_embedding_model": "all-MiniLM-L6-v2"})()
    monkeypatch.setattr(_factory, "settings", fake_settings)

    client = _factory.get_embedding_client()
    assert isinstance(client, HuggingFaceEmbeddings)


def test_embeddings_embed_query_returns_vector(monkeypatch: pytest.MonkeyPatch) -> None:
    """embed_query() should return a non-empty list of floats."""
    import app.embeddings.factory as _factory

    monkeypatch.setattr(_factory, "_instance", None)
    client = _factory.get_embedding_client()
    vec = client.embed_query("The property is a Victorian terrace.")
    assert isinstance(vec, list)
    assert len(vec) > 0
    assert all(isinstance(v, float) for v in vec)


def test_embeddings_embed_documents_batch(monkeypatch: pytest.MonkeyPatch) -> None:
    """embed_documents() should return one vector per input text."""
    import app.embeddings.factory as _factory

    monkeypatch.setattr(_factory, "_instance", None)
    client = _factory.get_embedding_client()
    texts = ["first sentence", "second sentence", "third sentence"]
    vecs = client.embed_documents(texts)
    assert len(vecs) == 3
    assert all(len(v) > 0 for v in vecs)