from analyst import ReadOnlyDB
from analyst.search import ProductSearch
from fake_openai import fake_client


def test_products_are_embedded_in_batches_and_search_ranks_results():
    client = fake_client()
    db = ReadOnlyDB()
    search = ProductSearch(client, db, batch_size=100)
    n_products = len(db.all_products())
    embed_requests = [r for r in client.fake.requests if r["path"].endswith("/embeddings")]
    assert len(embed_requests) == -(-n_products // 100)            # ceil(n / 100) requests, not n

    results = search.search("chair", k=5)
    assert len(results) == 5
    assert [r["score"] for r in results] == sorted((r["score"] for r in results), reverse=True)
    assert "chair" in results[0]["product_name"].lower()           # toy embeddings still match words


def test_k_is_clamped():
    search = ProductSearch(fake_client(), ReadOnlyDB())
    assert len(search.search("lamp", k=500)) == 20
    assert len(search.search("lamp", k=0)) == 1
