add(metadata): request a whole ebook series from hardcover
This commit is contained in:
@@ -83,6 +83,80 @@ def test_hardcover_drops_books_without_an_edition_in_that_language(monkeypatch):
|
||||
assert asyncio.run(hardcover.search("hobbit", "german")) == []
|
||||
|
||||
|
||||
SERIES_ROWS = {
|
||||
"name": "Die drei Fragezeichen",
|
||||
"book_series": [
|
||||
{"position": 1, "book": {
|
||||
"id": 1, "title": "Super-Papagei", "release_year": 1968,
|
||||
"contributions": [{"author": {"name": "Robert Arthur"}}],
|
||||
"cached_image": {"url": "https://example.invalid/1.jpg"}}},
|
||||
{"position": 2, "book": {"id": 2, "title": "Misteri Danau"}},
|
||||
{"position": 2, "book": {"id": 3, "title": "Der Phantomsee"}},
|
||||
{"position": 2, "book": {"id": 2, "title": "duplicate row"}},
|
||||
{"position": 0, "book": {"id": 4, "title": "Sonderband"}},
|
||||
],
|
||||
}
|
||||
|
||||
|
||||
def series_client(monkeypatch, editions):
|
||||
seen = []
|
||||
|
||||
def handler(request: httpx.Request) -> httpx.Response:
|
||||
import json
|
||||
body = json.loads(request.content)
|
||||
seen.append(body["variables"])
|
||||
if "editions" in body["query"]:
|
||||
return httpx.Response(200, json={"data": {"editions": editions}})
|
||||
return httpx.Response(200, json={"data": {"series": [SERIES_ROWS]}})
|
||||
|
||||
monkeypatch.setattr(hardcover, "TOKEN", "test-token")
|
||||
mock_client(monkeypatch, hardcover, handler)
|
||||
return seen
|
||||
|
||||
|
||||
def test_hardcover_series_sorts_by_volume_and_keeps_the_first_row(monkeypatch):
|
||||
series_client(monkeypatch, [])
|
||||
books = asyncio.run(hardcover.series_books("10146"))
|
||||
assert [(b.volume, b.title) for b in books] == [
|
||||
(1, "Super-Papagei"), (2, "Misteri Danau"), (None, "Sonderband"),
|
||||
]
|
||||
first = books[0]
|
||||
assert (first.series, first.series_id, first.authors, first.media_type) == (
|
||||
"Die drei Fragezeichen", "10146", "Robert Arthur", "ebook")
|
||||
assert first.cover_url == "https://example.invalid/1.jpg"
|
||||
|
||||
|
||||
def test_hardcover_series_prefers_the_row_with_an_edition_in_the_language(monkeypatch):
|
||||
calls = series_client(monkeypatch, [
|
||||
{"book_id": 3, "title": "Der Phantomsee", "isbn_13": "9783440032251",
|
||||
"release_date": "1969-01-01", "cached_image": None},
|
||||
])
|
||||
books = asyncio.run(hardcover.series_books("10146", "german"))
|
||||
assert calls[1] == {"ids": [1, 2, 3, 4], "lang": "de"}
|
||||
second = next(b for b in books if b.volume == 2)
|
||||
assert (second.title, second.language, second.external_id, second.year) == (
|
||||
"Der Phantomsee", "german", "9783440032251", 1969)
|
||||
# a volume without a German edition keeps its original row instead of vanishing
|
||||
assert [b.title for b in books] == ["Super-Papagei", "Der Phantomsee", "Sonderband"]
|
||||
|
||||
|
||||
def test_hardcover_series_survives_a_broken_edition_lookup(monkeypatch):
|
||||
def handler(request: httpx.Request) -> httpx.Response:
|
||||
import json
|
||||
if "editions" in json.loads(request.content)["query"]:
|
||||
return httpx.Response(500)
|
||||
return httpx.Response(200, json={"data": {"series": [SERIES_ROWS]}})
|
||||
|
||||
monkeypatch.setattr(hardcover, "TOKEN", "test-token")
|
||||
mock_client(monkeypatch, hardcover, handler)
|
||||
assert len(asyncio.run(hardcover.series_books("10146", "german"))) == 3
|
||||
|
||||
|
||||
def test_hardcover_series_needs_a_numeric_id(monkeypatch):
|
||||
monkeypatch.setattr(hardcover, "TOKEN", "test-token")
|
||||
assert asyncio.run(hardcover.series_books("")) == []
|
||||
|
||||
|
||||
def test_google_books_restricts_the_language(monkeypatch):
|
||||
seen = []
|
||||
|
||||
|
||||
Reference in New Issue
Block a user