import requests from shelfmark.core.cache import get_metadata_cache from shelfmark.metadata_providers import MetadataSearchOptions, SearchType from shelfmark.metadata_providers.moly import MolyProvider, _valid_isbn SEARCH_HTML = """

Mocsidzuki Mai: A Telihold kávézó (A Telihold kávézó 1.)

Mocsidzuki Mai: A Telihold kávézó

Mocsidzuki Mai: Az igazi kívánság

Lisa Jewell: A föld nyelte el

Not a book row

""" BOOK_HTML = """

A ​Telihold kávézó (A Telihold kávézó 1.)

Mocsidzuki Mai

Vigyázat! Cselekményleírást tartalmaz.

A japánok úgy tartják, hogy ha gondoskodsz egy macskáról, az egy napon meghálálja.

Athenaeum, Budapest, 2024
180 oldal · ISBN: 9789635434435 · Fordította: Nagy Anita
asztrológia japán
""" class _MolyResponse: def __init__(self, text): self.text = text def raise_for_status(self): return None class _MolySession: """Serves canned HTML per URL substring.""" def __init__(self, pages): self.pages = pages self.calls = 0 self.headers = {} def get(self, url, **kwargs): self.calls += 1 for fragment, html in self.pages.items(): if fragment in url: return _MolyResponse(html) raise requests.HTTPError(f"unexpected URL: {url}") class _FlakyMolySession(_MolySession): def get(self, url, **kwargs): if self.calls == 0: self.calls += 1 raise requests.Timeout return super().get(url, **kwargs) def _provider(session): provider = MolyProvider() provider.session = session return provider class TestMolySearch: def test_search_parses_results(self): get_metadata_cache().clear() provider = _provider(_MolySession({"/kereses": SEARCH_HTML})) books = provider.search(MetadataSearchOptions(query="telihold kávézó")) assert len(books) == 3 # duplicate slug deduped, colon-less row skipped # Mid-word wrapping must not split words highlighted = books[2] assert highlighted.title == "A föld nyelte el" assert highlighted.authors == ["Lisa Jewell"] book = books[0] assert book.provider == "moly" assert book.provider_id == "mocsidzuki-mai-a-telihold-kavezo" assert book.title == "A Telihold kávézó" assert book.authors == ["Mocsidzuki Mai"] assert book.cover_url == "https://assets.moly.hu/system/covers/normal/covers_864003.jpg" assert book.source_url == "https://moly.hu/konyvek/mocsidzuki-mai-a-telihold-kavezo" labels = {f.label: f.value for f in book.display_fields} assert labels["Rating"] == "82%" assert labels["Series"] == "A Telihold kávézó 1." def test_search_second_page_is_empty(self): provider = _provider(_MolySession({"/kereses": SEARCH_HTML})) assert provider.search(MetadataSearchOptions(query="telihold", page=2)) == [] def test_search_does_not_cache_request_failures(self): get_metadata_cache().clear() session = _FlakyMolySession({"/kereses": SEARCH_HTML}) provider = _provider(session) options = MetadataSearchOptions(query="telihold kávézó") assert provider.search(options) == [] books = provider.search(options) assert session.calls == 2 assert [book.provider_id for book in books] == [ "mocsidzuki-mai-a-telihold-kavezo", "mocsidzuki-mai-az-igazi-kivansag", "lisa-jewell-a-fold-nyelte-el", ] class TestMolyGetBook: def test_get_book_parses_details(self): get_metadata_cache().clear() provider = _provider(_MolySession({"/konyvek/": BOOK_HTML})) book = provider.get_book("mocsidzuki-mai-a-telihold-kavezo") assert book is not None # Zero-width space stripped, nested series link excluded from title assert book.title == "A Telihold kávézó" assert book.authors == ["Mocsidzuki Mai"] assert book.isbn_13 == "9789635434435" assert book.publisher == "Athenaeum" assert book.publish_year == 2024 assert book.language == "hu" assert book.cover_url == "https://moly.hu/system/covers/big/covers_864003.jpg?1712583436" assert "asztrológia" in book.genres # Spoiler warning stripped from the description assert book.description is not None assert not book.description.startswith("Vigyázat!") assert "japánok" in book.description def test_isbn_search_resolves_first_result(self): get_metadata_cache().clear() provider = _provider(_MolySession({"/kereses": SEARCH_HTML, "/konyvek/": BOOK_HTML})) book = provider.search( MetadataSearchOptions(query="9789635434435", search_type=SearchType.ISBN) )[0] assert book.provider_id == "mocsidzuki-mai-a-telihold-kavezo" assert book.isbn_13 == "9789635434435" class TestValidIsbn: def test_isbn_13(self): assert _valid_isbn("978-963-543-443-5") == "9789635434435" def test_isbn_10_with_check_x(self): assert _valid_isbn("963-543-443-X") == "963543443X" def test_rejects_page_counts_and_years(self): assert _valid_isbn("2024") is None assert _valid_isbn("1234567") is None