from datetime import date import pytest import hircine.enums as enums import hircine.plugins.scrapers.ehentai_api as ehentai_api from hircine.scraper import ScrapeError from hircine.scraper.types import ( URL, Artist, Censorship, Circle, Date, Language, OriginalTitle, Rating, Tag, Title, World, ) def test_does_scrape(requests_mock, gen_comic): comic = next(gen_comic) comic.url = "https://exhentai.org/g/1025913/fdaabef1a2" scraper = ehentai_api.EHentaiAPIScraper(comic) requests_mock.post( ehentai_api.API_URL, text=""" { "gmetadata": [ { "gid": 1025913, "token": "fdaabef1a2", "title": "(C91) [Animachine (Shimahara)] Iya na Kao Sarenagara Opantsu Misete Moraitai Manga | A manga about girl showing you her panties while making a disgusted face [English] [葛の寺]", "title_jpn": "(C91) [アニマルマシーン (40原)] 嫌な顔されながらおパンツ見せてもらいたい漫画 [英訳]", "category": "Non-H", "thumb": "https://ehgt.org/51/17/5117cde63cc14436c5ad7f2dd06abb52c86aff65-23642001-2866-4047-png_250.jpg", "uploader": "葛の寺", "posted": "1486182349", "filecount": "23", "filesize": 528093263, "expunged": false, "rating": "4.72", "torrentcount": "1", "torrents": [ { "hash": "30c7124efca83bf0db1b9fd5ab4511da5f28a60b", "added": "1486121301", "name": "(C91) [Animachine (Shimahara)] Iya na Kao Sarenagara Opantsu Misete Moraitai Manga A manga about girl showing you her panties while making a disgusted face [English] [葛の寺].zip", "tsize": "20800", "fsize": "528093242" } ], "tags": [ "language:english", "language:translated", "parody:iya na kao sare nagara opantsu misete moraitai", "group:animachine", "artist:shimahara", "female:femdom", "female:schoolgirl uniform", "other:full color" ], "parent_gid": "1025875", "parent_key": "cfe6adccb8", "first_gid": "1025646", "first_key": "098b4a982a" } ] } """, # noqa: E501 ) assert scraper.is_available assert scraper.id == 1025913 assert scraper.token == "fdaabef1a2" assert set(scraper.collect()) == set( [ Artist(name="shimahara"), Censorship(value=enums.Censorship.NONE), Circle(name="animachine"), Date(value=date(2017, 2, 4)), Language(value=enums.Language.EN), OriginalTitle(value="嫌な顔されながらおパンツ見せてもらいたい漫画"), Rating(value=enums.Rating.QUESTIONABLE), Tag(namespace="female", tag="femdom"), Tag(namespace="female", tag="schoolgirl uniform"), Tag(namespace="other", tag="full color"), Title( value="A manga about girl showing you her panties while making a disgusted face" # noqa: E501 ), URL("https://exhentai.org/g/1025913/fdaabef1a2"), World(name="iya na kao sare nagara opantsu misete moraitai"), ] ) def test_is_not_available_with_wrong_url(gen_comic): comic = next(gen_comic) comic.url = "https://example.com" scraper = ehentai_api.EHentaiAPIScraper(comic) assert not scraper.is_available def test_raises_scrape_error_with_invalid_json(requests_mock, gen_comic): comic = next(gen_comic) comic.url = "https://exhentai.org/g/1025913/fdaabef1a2" scraper = ehentai_api.EHentaiAPIScraper(comic) requests_mock.post(ehentai_api.API_URL, text="{") assert scraper.is_available assert scraper.id == 1025913 assert scraper.token == "fdaabef1a2" with pytest.raises(ScrapeError, match="Could not parse JSON response"): assert set(scraper.collect()) == set() def test_raises_scrape_error_with_missing_field(requests_mock, gen_comic): comic = next(gen_comic) comic.url = "https://exhentai.org/g/1025913/fdaabef1a2" scraper = ehentai_api.EHentaiAPIScraper(comic) requests_mock.post(ehentai_api.API_URL, text="{}") assert scraper.is_available assert scraper.id == 1025913 assert scraper.token == "fdaabef1a2" with pytest.raises(ScrapeError, match="Response is missing 'gmetadata' field"): assert set(scraper.collect()) == set() def test_raises_scrape_error_with_error_code(requests_mock, gen_comic): comic = next(gen_comic) comic.url = "https://exhentai.org/g/1025913/fdaabef1a2" scraper = ehentai_api.EHentaiAPIScraper(comic) requests_mock.post(ehentai_api.API_URL, status_code=500) assert scraper.is_available assert scraper.id == 1025913 assert scraper.token == "fdaabef1a2" with pytest.raises(ScrapeError, match="Request failed with status code 500"): assert set(scraper.collect()) == set()