test(downloads): cover preferred naming hint propagation in get_or_download

This commit is contained in:
2026-02-18 03:39:09 +01:00
parent 0cf2644f55
commit 6335f8bbac

View File

@@ -1,6 +1,7 @@
from __future__ import annotations from __future__ import annotations
from pathlib import Path from pathlib import Path
from typing import Any, cast
import pytest import pytest
@@ -14,9 +15,14 @@ def _bare_manager(tmp_path: Path) -> DownloadManager:
manager = DownloadManager.__new__(DownloadManager) manager = DownloadManager.__new__(DownloadManager)
manager.cache_dir = tmp_path manager.cache_dir = tmp_path
manager.chunk_size = 1024 manager.chunk_size = 1024
manager.auth = type( manager.auth = cast(
"Auth", (), {"adp_token": "x", "locale": type("Loc", (), {"domain": "fr"})()} Any,
)() type(
"Auth",
(),
{"adp_token": "x", "locale": type("Loc", (), {"domain": "fr"})()},
)(),
)
return manager return manager
@@ -48,8 +54,12 @@ def test_get_or_download_uses_cached_file_when_available(
) -> None: ) -> None:
"""Ensure cached files bypass link generation and download work.""" """Ensure cached files bypass link generation and download work."""
manager = _bare_manager(tmp_path) manager = _bare_manager(tmp_path)
monkeypatch.setattr(manager, "_get_name_from_asin", lambda asin: "Book") monkeypatch.setattr(
cached_path = tmp_path / "Book.aax" manager,
"_get_filename_stems_from_asin",
lambda asin, preferred_title=None, preferred_author=None: ["Author_Book"],
)
cached_path = tmp_path / "Author_Book.aax"
cached_path.write_bytes(b"1" * MIN_FILE_SIZE) cached_path.write_bytes(b"1" * MIN_FILE_SIZE)
messages: list[str] = [] messages: list[str] = []
assert manager.get_or_download("ASIN", notify=messages.append) == cached_path assert manager.get_or_download("ASIN", notify=messages.append) == cached_path
@@ -61,7 +71,11 @@ def test_get_or_download_reports_invalid_url(
) -> None: ) -> None:
"""Ensure workflow reports invalid download URLs and aborts.""" """Ensure workflow reports invalid download URLs and aborts."""
manager = _bare_manager(tmp_path) manager = _bare_manager(tmp_path)
monkeypatch.setattr(manager, "_get_name_from_asin", lambda asin: "Book") monkeypatch.setattr(
manager,
"_get_filename_stems_from_asin",
lambda asin, preferred_title=None, preferred_author=None: ["Author_Book"],
)
monkeypatch.setattr( monkeypatch.setattr(
manager, "_get_download_link", lambda asin, notify=None: "ftp://bad" manager, "_get_download_link", lambda asin, notify=None: "ftp://bad"
) )
@@ -75,7 +89,11 @@ def test_get_or_download_handles_download_failure(
) -> None: ) -> None:
"""Ensure workflow reports failures when stream download does not complete.""" """Ensure workflow reports failures when stream download does not complete."""
manager = _bare_manager(tmp_path) manager = _bare_manager(tmp_path)
monkeypatch.setattr(manager, "_get_name_from_asin", lambda asin: "Book") monkeypatch.setattr(
manager,
"_get_filename_stems_from_asin",
lambda asin, preferred_title=None, preferred_author=None: ["Author_Book"],
)
monkeypatch.setattr( monkeypatch.setattr(
manager, "_get_download_link", lambda asin, notify=None: "https://ok" manager, "_get_download_link", lambda asin, notify=None: "https://ok"
) )
@@ -83,3 +101,30 @@ def test_get_or_download_handles_download_failure(
messages: list[str] = [] messages: list[str] = []
assert manager.get_or_download("ASIN", notify=messages.append) is None assert manager.get_or_download("ASIN", notify=messages.append) is None
assert "Download failed" in messages assert "Download failed" in messages
def test_get_or_download_uses_preferred_naming_hints(
tmp_path: Path, monkeypatch: pytest.MonkeyPatch
) -> None:
"""Ensure preferred title/author are forwarded to filename stem selection."""
manager = _bare_manager(tmp_path)
captured: list[tuple[str | None, str | None]] = []
def stems(
asin: str,
preferred_title: str | None = None,
preferred_author: str | None = None,
) -> list[str]:
"""Capture naming hints and return one deterministic filename stem."""
del asin
captured.append((preferred_title, preferred_author))
return ["Author_Book"]
monkeypatch.setattr(manager, "_get_filename_stems_from_asin", stems)
monkeypatch.setattr(manager, "_get_download_link", lambda asin, notify=None: None)
manager.get_or_download(
"ASIN",
preferred_title="11/22/63",
preferred_author="Stephen King",
)
assert captured == [("11/22/63", "Stephen King")]