diff --git a/tests/cassettes/test_s3_source/test_create_document_from_s3_uri_override.yaml b/tests/cassettes/test_s3_source/test_create_document_from_s3_uri_override.yaml new file mode 100644 index 00000000..b564c8c9 --- /dev/null +++ b/tests/cassettes/test_s3_source/test_create_document_from_s3_uri_override.yaml @@ -0,0 +1,42 @@ +interactions: +- request: + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate, zstd + connection: + - keep-alive + content-length: + - '93' + content-type: + - application/json + host: + - localhost:11434 + method: POST + parsed_body: + encoding_format: base64 + input: + - override target content + 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: 4 + total_tokens: 4 + status: + code: 200 + message: OK +version: 1 diff --git a/tests/test_s3_monitor.py b/tests/test_s3_monitor.py index b125c592..36aad9a4 100644 --- a/tests/test_s3_monitor.py +++ b/tests/test_s3_monitor.py @@ -317,6 +317,37 @@ async def test_s3_watcher_invalid_uri_rejected(): ) +@pytest.mark.asyncio +async def test_s3_watcher_upsert_failure_does_not_abort_sweep(s3_listing): + """A failing upsert doesn't propagate; the refresh keeps processing siblings.""" + set_batches, _ = s3_listing + set_batches([[_meta("incoming/bad.txt", "abc"), _meta("incoming/good.txt", "def")]]) + + from haiku.rag.monitor import S3Watcher + + rag = AsyncMock(spec=HaikuRAG) + rag.list_documents.return_value = [] + + good_doc = Document( + id="good-id", content="...", uri="s3://my-bucket/incoming/good.txt" + ) + + async def maybe_fail(uri, **_): + if uri.endswith("bad.txt"): + raise RuntimeError("boom") + return good_doc + + rag.create_document_from_source.side_effect = maybe_fail + + watcher = S3Watcher(client=rag, entry=_entry(), supported_extensions=[".txt"]) + + # The failing upsert must not propagate out of refresh(). + await watcher.refresh() + + # Both objects were attempted — the first failure didn't abort the sibling. + assert rag.create_document_from_source.await_count == 2 + + @pytest.mark.asyncio async def test_serve_starts_one_s3_task_per_entry(monkeypatch, s3_listing): """`serve` wires one S3Watcher task per MonitorConfig.s3 entry.""" diff --git a/tests/test_s3_source.py b/tests/test_s3_source.py index 41688dd2..1b157566 100644 --- a/tests/test_s3_source.py +++ b/tests/test_s3_source.py @@ -169,3 +169,37 @@ async def test_create_document_from_s3_rejects_invalid_uri( async with HaikuRAG(temp_db_path, create=True) as client: with pytest.raises(ValueError, match="Invalid S3 URI"): await client.create_document_from_source("s3://only-bucket-no-key") + + +@pytest.mark.asyncio +async def test_create_document_from_s3_rejects_unsupported_extension( + fake_obstore_io, temp_db_path +): + head_async, _ = fake_obstore_io + head_async.return_value = _meta('"abc"') + + async with HaikuRAG(temp_db_path, create=True) as client: + with pytest.raises(ValueError, match="Unsupported content type"): + await client.create_document_from_source("s3://my-bucket/file.unsupported") + + +@pytest.mark.asyncio +@pytest.mark.vcr() +async def test_create_document_from_s3_uri_override(fake_obstore_io, temp_db_path): + """`uri=` kwarg overrides the s3:// URL as the stored document identifier.""" + head_async, get_async = fake_obstore_io + head_async.return_value = _meta('"abc"') + get_async.return_value = _get_result(b"override target content") + + async with HaikuRAG(temp_db_path, create=True) as client: + doc = await client.create_document_from_source( + "s3://my-bucket/file.txt", uri="arxiv:2401.00001" + ) + + assert doc.uri == "arxiv:2401.00001" + # The override is the canonical identifier — lookup by it must hit the doc. + looked_up = await client.get_document_by_uri("arxiv:2401.00001") + assert looked_up is not None + assert looked_up.id == doc.id + # The s3:// URL is NOT a stored identifier. + assert await client.get_document_by_uri("s3://my-bucket/file.txt") is None