haiku.rag/tests/ingester/test_resolve_fetcher.py
2026-05-26 11:41:53 +03:00

59 lines
1.8 KiB
Python

from pathlib import Path
import pytest
from haiku.rag.ingester.sources import resolve_fetcher
from haiku.rag.ingester.sources.fs import FSSource
from haiku.rag.ingester.sources.http import HTTPSource
from haiku.rag.ingester.sources.s3 import S3Source
def test_resolves_fs_for_file_uri():
src = resolve_fetcher("file:///tmp/sample.md")
assert isinstance(src, FSSource)
def test_resolves_fs_for_bare_path():
src = resolve_fetcher("/tmp/sample.md")
assert isinstance(src, FSSource)
def test_resolves_http():
src = resolve_fetcher("https://example.com/x.pdf")
assert isinstance(src, HTTPSource)
def test_resolves_s3_scopes_to_bucket():
src = resolve_fetcher("s3://my-bucket/key.pdf")
assert isinstance(src, S3Source)
assert src.bucket == "my-bucket"
assert src.prefix == ""
def test_resolves_s3_forwards_storage_options():
src = resolve_fetcher(
"s3://my-bucket/key.pdf",
storage_options={"endpoint": "http://seaweed:8333", "allow_http": "true"},
)
assert isinstance(src, S3Source)
assert src.storage_options["endpoint"] == "http://seaweed:8333"
def test_unknown_scheme_raises():
with pytest.raises(ValueError, match="No source adapter"):
resolve_fetcher("ftp://example.com/x")
def test_configured_source_matches_first(tmp_path: Path):
(tmp_path / "a.md").write_text("hi")
fs = FSSource(root=tmp_path)
chosen = resolve_fetcher((tmp_path / "a.md").as_uri(), sources=[fs])
assert chosen is fs
def test_configured_source_falls_through_when_no_match():
fs = FSSource(root=Path("/tmp"))
# https doesn't match an FS source — fall back to ad-hoc HTTPSource
chosen = resolve_fetcher("https://example.com/x", sources=[fs])
assert isinstance(chosen, HTTPSource)
assert chosen is not fs