from pathlib import Path
import httpx
from imagefind.sources import LocalConnector, WebDavConnector
def test_local_connector_ignores_symlinks_and_non_video(tmp_path: Path):
(tmp_path / "a.mp4").write_bytes(b"video")
(tmp_path / "note.txt").write_text("no")
outside = tmp_path.parent / "outside.mkv"
outside.write_bytes(b"outside")
(tmp_path / "link.mkv").symlink_to(outside)
items = list(LocalConnector(str(tmp_path)).items())
assert [item.key for item in items] == ["a.mp4"]
def test_webdav_depth_one_and_external_href_rejection():
xml = b"""
/videos/
HTTP/1.1 200 OK
/videos/movie.mp4
123abc
HTTP/1.1 200 OK
https://evil.example/leak.mp4
HTTP/1.1 200 OK
"""
def handler(request: httpx.Request):
assert request.method == "PROPFIND"
assert request.headers["Depth"] == "1"
return httpx.Response(207, content=xml)
connector = WebDavConnector("https://dav.example/videos/", "user", "pass")
connector.client.close()
connector.client = httpx.Client(transport=httpx.MockTransport(handler))
items = list(connector.items())
connector.close()
assert len(items) == 1
assert items[0].key == "movie.mp4"
assert items[0].etag == "abc"
def test_webdav_tolerates_alist_xml_with_extra_payload():
xml = b"""alist notice
/dav/movie.mp4
42
HTTP/1.1 200 OK
"""
def handler(_request: httpx.Request):
return httpx.Response(207, content=xml)
connector = WebDavConnector("https://dav.example/dav/", "user", "pass")
connector.client.close()
connector.client = httpx.Client(transport=httpx.MockTransport(handler))
items = list(connector.items())
connector.close()
assert len(items) == 1
assert items[0].key == "movie.mp4"
assert items[0].size_bytes == 42