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