47 lines
2.0 KiB
Python
47 lines
2.0 KiB
Python
import pytest
|
|
|
|
from app.providers.base import ProviderError
|
|
from app.providers.internet_archive import InternetArchiveProvider
|
|
|
|
|
|
def test_internet_archive_detection():
|
|
provider = InternetArchiveProvider()
|
|
assert provider.can_handle("https://archive.org/details/BigBuckBunny_328")
|
|
assert provider.can_handle("https://archive.org/download/BigBuckBunny_328/video.mp4")
|
|
assert not provider.can_handle("https://example.com/details/BigBuckBunny_328")
|
|
|
|
|
|
def test_internet_archive_identifier_parsing():
|
|
provider = InternetArchiveProvider()
|
|
assert provider._identifier_from_url("https://archive.org/details/BigBuckBunny_328") == "BigBuckBunny_328"
|
|
assert provider._identifier_from_url("https://archive.org/download/BigBuckBunny_328/video.mp4") == "BigBuckBunny_328"
|
|
assert provider._identifier_from_url("https://archive.org/metadata/BigBuckBunny_328") == "BigBuckBunny_328"
|
|
|
|
|
|
def test_select_media_file_prefers_original_mp4():
|
|
provider = InternetArchiveProvider()
|
|
selected = provider._select_media_file([
|
|
{"name": "thumb.jpg", "format": "JPEG", "source": "metadata", "size": "10"},
|
|
{"name": "movie.ogv", "format": "Ogg Video", "source": "derivative", "size": "200000000"},
|
|
{"name": "movie.mp4", "format": "MPEG4", "source": "original", "size": "100000000"},
|
|
])
|
|
assert selected is not None
|
|
assert selected["name"] == "movie.mp4"
|
|
|
|
|
|
def test_select_media_file_rejects_path_traversal():
|
|
provider = InternetArchiveProvider()
|
|
assert provider._select_media_file([{"name": "../evil.mp4", "format": "MPEG4", "source": "original"}]) is None
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_probe_requires_media_file(monkeypatch):
|
|
provider = InternetArchiveProvider()
|
|
|
|
async def fake_metadata(identifier: str) -> dict:
|
|
return {"metadata": {"title": "No media"}, "files": [{"name": "notes.txt", "format": "Text"}]}
|
|
|
|
monkeypatch.setattr(provider, "_metadata", fake_metadata)
|
|
with pytest.raises(ProviderError):
|
|
await provider.probe("https://archive.org/details/no-media")
|