from datetime import date import pytest import hircine.enums as enums from hircine.api.types import ScrapedComic from hircine.scraper import ScrapeWarning from hircine.scraper.types import ( Artist, Category, Character, Circle, Date, Language, OriginalTitle, Rating, Tag, Title, World, ) @pytest.mark.parametrize( "input,options,want", [ ("foo", {}, Tag(namespace="none", tag="foo")), ("foo:bar", {}, Tag(namespace="foo", tag="bar")), ("foo:bar:baz", {}, Tag(namespace="foo", tag="bar:baz")), ("foo/bar", {"delimiter": "/"}, Tag(namespace="foo", tag="bar")), ], ids=[ "tag only", "tag and namespace", "tag with delimiter", "custom delimiter", ], ) def test_tag_from_string(input, options, want): assert Tag.from_string(input, **options) == want @pytest.mark.parametrize( "input,want", [ ("1998-02-07", Date(value=date(1998, 2, 7))), ("2018-07-18T19:15", Date(value=date(2018, 7, 18))), ( "2003-12-30T10:37Z", Date(value=date(2003, 12, 30)), ), ], ) def test_date_from_iso(input, want): assert Date.from_iso(input) == want @pytest.mark.parametrize( "input", [ ("text"), ("1997 02 07"), ("1997/02/07"), ], ) def test_date_from_iso_fails(input): with pytest.raises(ScrapeWarning, match="Could not parse date:"): Date.from_iso(input) @pytest.mark.parametrize( "input,want", [ ("886806000", Date(value=date(1998, 2, 7))), (886806000, Date(value=date(1998, 2, 7))), ], ) def test_date_from_timestamp(input, want): assert Date.from_timestamp(input) == want @pytest.mark.parametrize( "input", [ ("text"), ], ) def test_date_from_timestamp_fails(input): with pytest.raises(ScrapeWarning, match="Could not parse date:"): Date.from_timestamp(input) @pytest.mark.parametrize( "item,attr,empty", [ (Title(""), "title", None), (OriginalTitle(""), "original_title", None), (Language(None), "language", None), (Date(None), "date", None), (Rating(None), "rating", None), (Category(None), "category", None), (Tag("", ""), "tags", []), (Tag(namespace="", tag=""), "tags", []), (Tag(namespace=None, tag=""), "tags", []), (Tag(namespace="foo", tag=""), "tags", []), (Artist(""), "artists", []), (Character(""), "characters", []), (Circle(""), "circles", []), (World(""), "worlds", []), ], ids=[ "title", "original title", "language", "date", "rating", "category", "tag (both empty, positional)", "tag (both empty)", "tag (namespace None, tag empty)", "tag (tag empty)", "artist", "character", "circle", "world", ], ) def test_scraped_comic_silently_ignores_empty(item, attr, empty): def gen(): yield item comic = ScrapedComic.from_generator(gen()) assert getattr(comic, attr) == empty @pytest.mark.parametrize( "input,want", [ ("EN", Language(value=enums.Language.EN)), ("de", Language(value=enums.Language.DE)), ], ) def test_language_from_iso_639_3(input, want): assert Language.from_iso_639_3(input) == want def test_language_from_iso_639_3_fails(): with pytest.raises(ScrapeWarning, match="Could not parse language code:"): Language.from_iso_639_3("ENG") @pytest.mark.parametrize( "input,want", [ ("English", Language(value=enums.Language.EN)), ("german", Language(value=enums.Language.DE)), ], ) def test_language_from_name(input, want): assert Language.from_name(input) == want def test_language_from_name_fails(): with pytest.raises(ScrapeWarning, match="Could not parse language name:"): Language.from_name("nonexistent")