From 2afe1bd28c0df779e08801c3429717d2c12fb17a Mon Sep 17 00:00:00 2001 From: Yiorgis Gozadinos Date: Sun, 26 Jul 2026 19:36:37 +0300 Subject: [PATCH] Cover store engine and repository paths Add vector-index creation tests including the warned failure, chunk repository get_by_id, list_all pagination, blank-query and precomputed-vector search, the unknown-score-column guard, settings row recreation, and replace_for_document with no items. --- ...ory_get_by_id_and_list_all_pagination.yaml | 45 ++++++++++++ ...h_precomputed_vector_skips_text_query.yaml | 42 +++++++++++ tests/store/test_document_items.py | 17 +++++ tests/test_chunk.py | 73 +++++++++++++++++++ tests/test_lancedb_connection.py | 45 ++++++++++++ tests/test_settings.py | 20 +++++ 6 files changed, 242 insertions(+) create mode 100644 tests/cassettes/test_chunk/test_chunk_repository_get_by_id_and_list_all_pagination.yaml create mode 100644 tests/cassettes/test_chunk/test_chunk_search_with_precomputed_vector_skips_text_query.yaml diff --git a/tests/cassettes/test_chunk/test_chunk_repository_get_by_id_and_list_all_pagination.yaml b/tests/cassettes/test_chunk/test_chunk_repository_get_by_id_and_list_all_pagination.yaml new file mode 100644 index 00000000..c4d2bfa1 --- /dev/null +++ b/tests/cassettes/test_chunk/test_chunk_repository_get_by_id_and_list_all_pagination.yaml @@ -0,0 +1,45 @@ +interactions: +- request: + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate, zstd + connection: + - keep-alive + content-length: + - '123' + content-type: + - application/json + host: + - localhost:11434 + method: POST + parsed_body: + encoding_format: base64 + input: + - |- + First paragraph. + Second paragraph. + Third paragraph. + model: qwen3-embedding:4b + uri: http://localhost:11434/v1/embeddings + response: + headers: + content-type: + - application/json + transfer-encoding: + - chunked + parsed_body: + data: + - embedding: 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 + index: 0 + object: embedding + model: qwen3-embedding:4b + object: list + usage: + prompt_tokens: 10 + total_tokens: 10 + status: + code: 200 + message: OK +version: 1 diff --git a/tests/cassettes/test_chunk/test_chunk_search_with_precomputed_vector_skips_text_query.yaml b/tests/cassettes/test_chunk/test_chunk_search_with_precomputed_vector_skips_text_query.yaml new file mode 100644 index 00000000..984de905 --- /dev/null +++ b/tests/cassettes/test_chunk/test_chunk_search_with_precomputed_vector_skips_text_query.yaml @@ -0,0 +1,42 @@ +interactions: +- request: + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate, zstd + connection: + - keep-alive + content-length: + - '96' + content-type: + - application/json + host: + - localhost:11434 + method: POST + parsed_body: + encoding_format: base64 + input: + - Vector-only search target. + model: qwen3-embedding:4b + uri: http://localhost:11434/v1/embeddings + response: + headers: + content-type: + - application/json + transfer-encoding: + - chunked + parsed_body: + data: + - embedding: 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 + index: 0 + object: embedding + model: qwen3-embedding:4b + object: list + usage: + prompt_tokens: 6 + total_tokens: 6 + status: + code: 200 + message: OK +version: 1 diff --git a/tests/store/test_document_items.py b/tests/store/test_document_items.py index cee84196..ba99178a 100644 --- a/tests/store/test_document_items.py +++ b/tests/store/test_document_items.py @@ -986,3 +986,20 @@ class TestPictureDataPreservedThroughRoundTrip: after = await rag.document_item_repository.get_all_picture_data(created.id) assert after.get("#/pictures/0") == original.get("#/pictures/0") + + +@pytest.mark.asyncio +async def test_replace_for_document_with_no_items_deletes_existing(temp_db_path): + """Replacing with an empty list clears the document's items.""" + from haiku.rag.store.engine import Store + from haiku.rag.store.repositories.document_item import DocumentItemRepository + + async with Store(temp_db_path, create=True) as store: + repo = DocumentItemRepository(store) + docling_doc = _make_docling_doc() + await repo.replace_for_document("doc-1", extract_items("doc-1", docling_doc)) + assert await repo.get_all_items("doc-1") + + await repo.replace_for_document("doc-1", []) + + assert await repo.get_all_items("doc-1") == [] diff --git a/tests/test_chunk.py b/tests/test_chunk.py index f540528b..68c1222d 100644 --- a/tests/test_chunk.py +++ b/tests/test_chunk.py @@ -454,3 +454,76 @@ async def test_ensure_fts_index_warns_on_failure(temp_db_path): assert [r for r in records if r.levelno == logging.WARNING] assert any("index build failed" in r.getMessage() for r in records) + + +@pytest.mark.vcr() +async def test_chunk_repository_get_by_id_and_list_all_pagination(temp_db_path): + """get_by_id resolves a stored chunk; list_all honours limit and offset.""" + async with HaikuRAG(db_path=temp_db_path, config=Config, create=True) as client: + doc = await client.create_document( + content="First paragraph.\n\nSecond paragraph.\n\nThird paragraph." + ) + assert doc.id is not None + + stored = await client.chunk_repository.get_by_document_id(doc.id) + assert stored + + fetched = await client.get_chunk_by_id(stored[0].id) + assert fetched is not None + assert fetched.id == stored[0].id + assert fetched.content == stored[0].content + + assert await client.get_chunk_by_id("no-such-chunk") is None + + everything = await client.chunk_repository.list_all() + assert len(everything) == len(stored) + + first = await client.chunk_repository.list_all(limit=1) + assert len(first) == 1 + assert first[0].id == everything[0].id + + if len(everything) > 1: + second = await client.chunk_repository.list_all(limit=1, offset=1) + assert len(second) == 1 + assert second[0].id == everything[1].id + + +async def test_chunk_search_returns_empty_for_blank_query(temp_db_path): + """A blank query with no precomputed vector has nothing to search for.""" + async with HaikuRAG(db_path=temp_db_path, config=Config, create=True) as client: + assert await client.chunk_repository.search(" ") == [] + + +@pytest.mark.vcr() +async def test_chunk_search_with_precomputed_vector_skips_text_query(temp_db_path): + """The image-as-query path searches vector-only using a stored embedding.""" + async with HaikuRAG(db_path=temp_db_path, config=Config, create=True) as client: + doc = await client.create_document(content="Vector-only search target.") + assert doc.id is not None + + rows = (await client.store.chunks_table.query().limit(1).to_arrow()).to_pylist() + stored_vector = list(rows[0]["vector"]) + + results = await client.chunk_repository.search("", query_vector=stored_vector) + + assert results + assert any(c.document_id == doc.id for c, _ in results) + + +async def test_get_chunk_ids_by_self_ref_grouped_without_documents(temp_db_path): + async with HaikuRAG(db_path=temp_db_path, config=Config, create=True) as client: + assert await client.chunk_repository.get_chunk_ids_by_self_ref_grouped([]) == {} + + +async def test_process_search_results_rejects_unknown_score_column(temp_db_path): + """A result frame with no recognised score column is a programming error.""" + import pandas as pd + + async with HaikuRAG(db_path=temp_db_path, config=Config, create=True) as client: + + class _Frame: + async def to_pandas(self): + return pd.DataFrame([{"id": "c1", "content": "x", "metadata": "{}"}]) + + with pytest.raises(ValueError, match="Unknown search result format"): + await client.chunk_repository._process_search_results(_Frame()) # ty: ignore[invalid-argument-type] diff --git a/tests/test_lancedb_connection.py b/tests/test_lancedb_connection.py index 1d283557..23abae0e 100644 --- a/tests/test_lancedb_connection.py +++ b/tests/test_lancedb_connection.py @@ -310,3 +310,48 @@ class TestInitFailureCleanup: pass assert close_calls, "Store.close() was not called when _initialize raised" + + +class TestVectorIndexCreation: + """_ensure_vector_index needs 256 rows of training data before it builds.""" + + @staticmethod + async def _seed_chunks(store, count: int) -> None: + import random + + records = [ + store.ChunkRecord( + document_id="doc-1", + content=f"row {i}", + content_fts=f"row {i}", + metadata="{}", + order=i, + vector=[random.random() for _ in range(store.embedder.vector_dim)], + ) + for i in range(count) + ] + await store.chunks_table.add(records) + + @pytest.mark.asyncio + async def test_builds_index_once_enough_rows_exist(self, temp_db_path): + async with Store(temp_db_path, create=True) as store: + await self._seed_chunks(store, 256) + + await store._ensure_vector_index() + + indexes = await store.chunks_table.list_indices() + assert any("vector" in idx.columns for idx in indexes) + + @pytest.mark.asyncio + async def test_index_failure_is_warned_not_raised(self, temp_db_path): + async with Store(temp_db_path, create=True) as store: + await self._seed_chunks(store, 256) + + async def boom(*_args, **_kwargs): + raise RuntimeError("index build failed") + + with patch.object(store.chunks_table, "create_index", boom): + await store._ensure_vector_index() + + indexes = await store.chunks_table.list_indices() + assert not any("vector" in idx.columns for idx in indexes) diff --git a/tests/test_settings.py b/tests/test_settings.py index b2f11626..f30e2756 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -263,3 +263,23 @@ class TestValidateConfigCompatibility: await settings_repo.validate_config_compatibility() assert "9999" in str(exc_info.value) + + +@pytest.mark.asyncio +async def test_save_current_settings_recreates_a_deleted_row(temp_db_path): + from haiku.rag.store.engine import Store + from haiku.rag.store.repositories.settings import SettingsRepository + + async with Store(temp_db_path, create=True, skip_validation=True) as store: + settings_repo = SettingsRepository(store) + + await store.settings_table.delete("id = 'settings'") + assert await settings_repo.get_current_settings() == {} + + await settings_repo.save_current_settings() + + recreated = await settings_repo.get_current_settings() + assert ( + recreated["embeddings"] + == store._config.model_dump(mode="json")["embeddings"] + )