From 98a7ee35ee693eb2f7270f9c96696edf628f8381 Mon Sep 17 00:00:00 2001 From: lordwelch Date: Sat, 21 May 2022 00:16:45 -0700 Subject: [PATCH] Add tests --- comicapi/issuestring.py | 6 -- comicapi/utils.py | 3 + tests/autoimprint_test.py | 91 +++++++++++++++++++ ...t_comicarchive.py => comicarchive_test.py} | 0 ...lenameParser.py => filenameparser_test.py} | 17 ++-- tests/filenames.py | 73 +++++++++++++++ tests/issuestring_test.py | 30 +++--- tests/{test_rename.py => rename_test.py} | 0 8 files changed, 197 insertions(+), 23 deletions(-) create mode 100644 tests/autoimprint_test.py rename tests/{test_comicarchive.py => comicarchive_test.py} (100%) rename tests/{test_FilenameParser.py => filenameparser_test.py} (63%) rename tests/{test_rename.py => rename_test.py} (100%) diff --git a/comicapi/issuestring.py b/comicapi/issuestring.py index 3567761..2e425a6 100644 --- a/comicapi/issuestring.py +++ b/comicapi/issuestring.py @@ -120,9 +120,3 @@ class IssueString: return 0.5 return self.num - - def as_int(self) -> Optional[int]: - # return the int version of the float - if self.num is None: - return None - return int(self.num) diff --git a/comicapi/utils.py b/comicapi/utils.py index b4e19af..f97a2cf 100644 --- a/comicapi/utils.py +++ b/comicapi/utils.py @@ -270,6 +270,9 @@ class ImprintDict(dict): else: return (item, self.publisher, True) + def copy(self) -> "ImprintDict": + return ImprintDict(self.publisher, super().copy()) + publishers: dict[str, ImprintDict] = {} diff --git a/tests/autoimprint_test.py b/tests/autoimprint_test.py new file mode 100644 index 0000000..cfc9d89 --- /dev/null +++ b/tests/autoimprint_test.py @@ -0,0 +1,91 @@ +import pytest + +from comicapi import utils + +imprints = [ + ("marvel", ("", "Marvel")), + ("marvel comics", ("", "Marvel")), + ("aircel", ("Aircel Comics", "Marvel")), +] + +additional_imprints = [ + ("test", ("Test", "Marvel")), + ("temp", ("Temp", "DC Comics")), +] + +all_imprints = imprints + additional_imprints + +seed = { + "Marvel": utils.ImprintDict( + "Marvel", + { + "marvel comics": "", + "aircel": "Aircel Comics", + }, + ) +} + +additional_seed = { + "Marvel": utils.ImprintDict("Marvel", {"test": "Test"}), + "DC Comics": utils.ImprintDict("DC Comics", {"temp": "Temp"}), +} + +all_seed = { + "Marvel": seed["Marvel"].copy(), + "DC Comics": additional_seed["DC Comics"].copy(), +} +all_seed["Marvel"].update(additional_seed["Marvel"]) + +conflicting_seed = {"Marvel": {"test": "Never"}} + + +# manually seeds publishers +@pytest.fixture +def seed_publishers(monkeypatch): + publisher_seed = {} + for publisher, imprint in seed.items(): + publisher_seed[publisher] = imprint + monkeypatch.setattr(utils, "publishers", publisher_seed) + + +@pytest.fixture +def seed_all_publishers(monkeypatch): + publisher_seed = {} + for publisher, imprint in all_seed.items(): + publisher_seed[publisher] = imprint + monkeypatch.setattr(utils, "publishers", publisher_seed) + + +# test that that an empty list returns the input unchanged +@pytest.mark.parametrize("publisher, expected", imprints) +def test_get_publisher_empty(publisher: str, expected: tuple[str, str]): + assert ("", publisher) == utils.get_publisher(publisher) + + +# initial test +@pytest.mark.parametrize("publisher, expected", imprints) +def test_get_publisher(publisher: str, expected: tuple[str, str], seed_publishers): + assert expected == utils.get_publisher(publisher) + + +# tests that update_publishers will initially set values +@pytest.mark.parametrize("publisher, expected", imprints) +def test_set_publisher(publisher: str, expected: tuple[str, str]): + utils.update_publishers(seed) + assert expected == utils.get_publisher(publisher) + + +# tests that update_publishers will add to existing values +@pytest.mark.parametrize("publisher, expected", all_imprints) +def test_update_publisher(publisher: str, expected: tuple[str, str], seed_publishers): + utils.update_publishers(additional_seed) + assert expected == utils.get_publisher(publisher) + + +# tests that update_publishers will overwrite conflicting existing values +def test_conflict_publisher(seed_all_publishers): + assert ("Test", "Marvel") == utils.get_publisher("test") + + utils.update_publishers(conflicting_seed) + + assert ("Never", "Marvel") == utils.get_publisher("test") diff --git a/tests/test_comicarchive.py b/tests/comicarchive_test.py similarity index 100% rename from tests/test_comicarchive.py rename to tests/comicarchive_test.py diff --git a/tests/test_FilenameParser.py b/tests/filenameparser_test.py similarity index 63% rename from tests/test_FilenameParser.py rename to tests/filenameparser_test.py index 2371ee2..74f3e36 100644 --- a/tests/test_FilenameParser.py +++ b/tests/filenameparser_test.py @@ -4,8 +4,8 @@ from filenames import fnames import comicapi.filenameparser -@pytest.mark.parametrize("filename,reason,expected", fnames) -def test_file_name_parser_new(filename, reason, expected): +@pytest.mark.parametrize("filename, reason, expected, xfail", fnames) +def test_file_name_parser_new(filename, reason, expected, xfail): p = comicapi.filenameparser.Parse( comicapi.filenamelexer.Lex(filename).items, first_is_alt=True, @@ -28,15 +28,20 @@ def test_file_name_parser_new(filename, reason, expected): assert fp == expected -@pytest.mark.parametrize("filename,reason,expected", fnames) -def test_file_name_parser(filename, reason, expected): +@pytest.mark.parametrize("filename, reason, expected, xfail", fnames) +def test_file_name_parser(filename, reason, expected, xfail): p = comicapi.filenameparser.FileNameParser() p.parse_filename(filename) fp = p.__dict__ - for s in ["title", "alternate", "publisher", "fcbd", "c2c", "annual", "volume_count"]: + # These are currently not tracked in this parser + for s in ["title", "alternate", "publisher", "fcbd", "c2c", "annual", "volume_count", "remainder"]: if s in expected: del expected[s] - if fp != expected: + # The remainder is not considered compatible between parsers + if "remainder" in fp: + del fp["remainder"] + + if xfail and fp != expected: pytest.xfail("old parser") assert fp == expected diff --git a/tests/filenames.py b/tests/filenames.py index 732eebe..61cb0fc 100644 --- a/tests/filenames.py +++ b/tests/filenames.py @@ -1,3 +1,14 @@ +""" +format is +( + "filename", + "reason or unique case", + { + "expected": "Dictionary of properties extracted from filename", + }, + bool(xfail: expected failure on the old parser) +) +""" fnames = [ ( "batman 3 title (DC).cbz", @@ -13,6 +24,7 @@ fnames = [ "issue_count": "", "alternate": "", }, + True, ), ( "batman 3 title DC.cbz", @@ -28,6 +40,7 @@ fnames = [ "issue_count": "", "alternate": "", }, + True, ), ( "ms. Marvel 3.cbz", @@ -43,6 +56,7 @@ fnames = [ "issue_count": "", "alternate": "", }, + False, ), ( "january jones 2.cbz", @@ -57,6 +71,7 @@ fnames = [ "issue_count": "", "alternate": "", }, + False, ), ( "52.cbz", @@ -71,6 +86,7 @@ fnames = [ "issue_count": "", "alternate": "", }, + True, ), ( "52 Monster_Island_v1_2__repaired__c2c.cbz", @@ -86,6 +102,7 @@ fnames = [ "alternate": "52", "c2c": True, }, + True, ), ( "Monster_Island_v1_2__repaired__c2c.cbz", @@ -100,6 +117,7 @@ fnames = [ "issue_count": "", "c2c": True, }, + False, ), ( "Monster Island v1 3 (1957) -- The Revenge Of King Klong (noads).cbz", @@ -113,6 +131,7 @@ fnames = [ "remainder": "The Revenge Of King Klong (noads)", "issue_count": "", }, + False, ), ( "Foobar-Man Annual 121 - The Wrath of Foobar-Man, Part 1 of 2.cbz", @@ -127,6 +146,7 @@ fnames = [ "issue_count": "", "annual": True, }, + True, ), ( "Plastic Man v1 002 (1942).cbz", @@ -140,6 +160,7 @@ fnames = [ "remainder": "", "issue_count": "", }, + False, ), ( "Blue Beetle 02.cbr", @@ -153,6 +174,7 @@ fnames = [ "remainder": "", "issue_count": "", }, + False, ), ( "Monster Island vol. 2 #2.cbz", @@ -166,6 +188,7 @@ fnames = [ "remainder": "", "issue_count": "", }, + False, ), ( "Crazy Weird Comics 2 (of 2) (1969).rar", @@ -179,6 +202,7 @@ fnames = [ "remainder": "", "issue_count": "2", }, + False, ), ( "Super Strange Yarns (1957) #92 (1969).cbz", @@ -192,6 +216,7 @@ fnames = [ "remainder": "", "issue_count": "", }, + False, ), ( "Action Spy Tales v1965 #3.cbr", @@ -205,6 +230,7 @@ fnames = [ "remainder": "", "issue_count": "", }, + False, ), ( " X-Men-V1-067.cbr", @@ -218,6 +244,7 @@ fnames = [ "remainder": "", "issue_count": "", }, + True, ), ( "Amazing Spider-Man 078.BEY (2022) (Digital) (Zone-Empire).cbr", @@ -231,6 +258,7 @@ fnames = [ "remainder": "(Digital) (Zone-Empire)", "issue_count": "", }, + False, ), ( "Angel Wings 02 - Black Widow (2015) (Scanlation) (phillywilly).cbr", @@ -244,6 +272,7 @@ fnames = [ "remainder": "(Scanlation) (phillywilly)", "issue_count": "", }, + True, ), ( "Angel Wings #02 - Black Widow (2015) (Scanlation) (phillywilly).cbr", @@ -257,6 +286,7 @@ fnames = [ "remainder": "(Scanlation) (phillywilly)", "issue_count": "", }, + False, ), ( "Aquaman - Green Arrow - Deep Target 01 (of 07) (2021) (digital) (Son of Ultron-Empire).cbr", @@ -270,6 +300,7 @@ fnames = [ "issue_count": "7", "remainder": "(digital) (Son of Ultron-Empire)", }, + False, ), ( "Aquaman 80th Anniversary 100-Page Super Spectacular (2021) 001 (2021) (Digital) (BlackManta-Empire).cbz", @@ -283,6 +314,7 @@ fnames = [ "remainder": "(Digital) (BlackManta-Empire)", "issue_count": "", }, + False, ), ( "Avatar - The Last Airbender - The Legend of Korra (FCBD 2021) (Digital) (mv-DCP).cbr", @@ -297,6 +329,21 @@ fnames = [ "issue_count": "", "fcbd": True, }, + True, + ), + ( + "Avengers By Brian Michael Bendis volume 03 (2013) (Digital) (F2) (Kileko-Empire).cbz", + "volume without issue", + { + "issue": "3", + "series": "Avengers By Brian Michael Bendis", + "title": "", + "volume": "3", + "year": "2013", + "remainder": "(Digital) (F2) (Kileko-Empire)", + "issue_count": "", + }, + False, ), ( "Avengers By Brian Michael Bendis v03 (2013) (Digital) (F2) (Kileko-Empire).cbz", @@ -310,6 +357,7 @@ fnames = [ "remainder": "(Digital) (F2) (Kileko-Empire)", "issue_count": "", }, + False, ), ( "Batman '89 (2021) (Webrip) (The Last Kryptonian-DCP).cbr", @@ -323,6 +371,7 @@ fnames = [ "remainder": "(Webrip) (The Last Kryptonian-DCP)", "issue_count": "", }, + False, ), ( "Batman_-_Superman_020_(2021)_(digital)_(NeverAngel-Empire).cbr", @@ -336,6 +385,7 @@ fnames = [ "remainder": "(digital) (NeverAngel-Empire)", "issue_count": "", }, + False, ), ( "Black Widow 009 (2021) (Digital) (Zone-Empire).cbr", @@ -349,6 +399,7 @@ fnames = [ "remainder": "(Digital) (Zone-Empire)", "issue_count": "", }, + False, ), ( "Blade Runner 2029 006 (2021) (3 covers) (digital) (Son of Ultron-Empire).cbr", @@ -362,6 +413,7 @@ fnames = [ "remainder": "(3 covers) (digital) (Son of Ultron-Empire)", "issue_count": "", }, + False, ), ( "Blade Runner Free Comic Book Day 2021 (2021) (digital-Empire).cbr", @@ -376,6 +428,7 @@ fnames = [ "issue_count": "", "fcbd": True, }, + True, ), ( "Bloodshot Book 03 (2020) (digital) (Son of Ultron-Empire).cbr", @@ -389,6 +442,7 @@ fnames = [ "remainder": "(digital) (Son of Ultron-Empire)", "issue_count": "", }, + True, ), ( "book of eli (2020) (digital) (Son of Ultron-Empire).cbr", @@ -402,6 +456,7 @@ fnames = [ "remainder": "(digital) (Son of Ultron-Empire)", "issue_count": "", }, + False, ), ( "Cyberpunk 2077 - You Have My Word 02 (2021) (digital) (Son of Ultron-Empire).cbr", @@ -415,6 +470,7 @@ fnames = [ "issue_count": "", "remainder": "(digital) (Son of Ultron-Empire)", }, + True, ), ( "Elephantmen 2259 008 - Simple Truth 03 (of 06) (2021) (digital) (Son of Ultron-Empire).cbr", @@ -429,6 +485,7 @@ fnames = [ "remainder": "(digital) (Son of Ultron-Empire)", "issue_count": "", }, + True, ), ( "Elephantmen 2259 #008 - Simple Truth 03 (of 06) (2021) (digital) (Son of Ultron-Empire).cbr", @@ -443,6 +500,7 @@ fnames = [ "remainder": "(digital) (Son of Ultron-Empire)", "issue_count": "", }, + True, ), ( "Free Comic Book Day - Avengers.Hulk (2021) (2048px) (db).cbz", @@ -457,6 +515,7 @@ fnames = [ "issue_count": "", "fcbd": True, }, + True, ), ( "Goblin (2021) (digital) (Son of Ultron-Empire).cbr", @@ -470,6 +529,7 @@ fnames = [ "remainder": "(digital) (Son of Ultron-Empire)", "issue_count": "", }, + False, ), ( "Marvel Previews 002 (January 2022) (Digital-Empire).cbr", @@ -484,6 +544,7 @@ fnames = [ "remainder": "(Digital-Empire)", "issue_count": "", }, + True, ), ( "Marvel Two In One V1 090 c2c (Comixbear-DCP).cbr", @@ -499,6 +560,7 @@ fnames = [ "issue_count": "", "c2c": True, }, + True, ), ( "Marvel Two In One V1 #090 c2c (Comixbear-DCP).cbr", @@ -514,6 +576,7 @@ fnames = [ "issue_count": "", "c2c": True, }, + False, ), ( "Star Wars - War of the Bounty Hunters - IG-88 (2021) (Digital) (Kileko-Empire).cbz", @@ -527,6 +590,7 @@ fnames = [ "remainder": "(Digital) (Kileko-Empire)", "issue_count": "", }, + True, ), ( "Star Wars - War of the Bounty Hunters - IG-88 #1 (2021) (Digital) (Kileko-Empire).cbz", @@ -540,6 +604,7 @@ fnames = [ "remainder": "(Digital) (Kileko-Empire)", "issue_count": "", }, + False, ), ( "The Defenders v1 058 (1978) (digital).cbz", @@ -553,6 +618,7 @@ fnames = [ "remainder": "(digital)", "issue_count": "", }, + False, ), ( "The Defenders v1 Annual 01 (1976) (Digital) (Minutemen-Slayer).cbr", @@ -567,6 +633,7 @@ fnames = [ "issue_count": "", "annual": True, }, + True, ), ( "The Magic Order 2 06 (2022) (Digital) (Zone-Empire)[__913302__].cbz", @@ -580,6 +647,7 @@ fnames = [ "remainder": "(Digital) (Zone-Empire)[913302]", # Don't really care about double underscores "issue_count": "", }, + False, ), ( "Wonder Woman 001 Wonder Woman Day Special Edition (2021) (digital-Empire).cbr", @@ -593,6 +661,7 @@ fnames = [ "remainder": "(digital-Empire)", "issue_count": "", }, + True, ), ( "Wonder Woman #001 Wonder Woman Day Special Edition (2021) (digital-Empire).cbr", @@ -606,6 +675,7 @@ fnames = [ "remainder": "(digital-Empire)", "issue_count": "", }, + False, ), ( "Wonder Woman 49 DC Sep-Oct 1951 digital [downsized, lightened, 4 missing story pages restored] (Shadowcat-Empire).cbz", @@ -620,6 +690,7 @@ fnames = [ "remainder": "[downsized, lightened, 4 missing story pages restored] (Shadowcat-Empire)", "issue_count": "", }, + True, ), ( "Wonder Woman #49 DC Sep-Oct 1951 digital [downsized, lightened, 4 missing story pages restored] (Shadowcat-Empire).cbz", @@ -634,6 +705,7 @@ fnames = [ "remainder": "[downsized, lightened, 4 missing story pages restored] (Shadowcat-Empire)", "issue_count": "", }, + True, ), ( "X-Men, 2021-08-04 (#02) (digital) (Glorith-HD).cbz", @@ -647,6 +719,7 @@ fnames = [ "remainder": "(digital) (Glorith-HD)", "issue_count": "", }, + True, ), ] diff --git a/tests/issuestring_test.py b/tests/issuestring_test.py index 5d9d2af..d1c66ff 100644 --- a/tests/issuestring_test.py +++ b/tests/issuestring_test.py @@ -3,18 +3,26 @@ import pytest import comicapi.issuestring issues = [ - ("¼", 0.25), - ("1½", 1.5), - ("0.5", 0.5), - ("0", 0.0), - ("1", 1.0), - ("22.BEY", 22.0), - ("22A", 22.0), - ("22-A", 22.0), + ("¼", 0.25, "¼"), + ("1½", 1.5, "001½"), + ("0.5", 0.5, "000.5"), + ("0", 0.0, "000"), + ("1", 1.0, "001"), + ("22.BEY", 22.0, "022.BEY"), + ("22A", 22.0, "022A"), + ("22-A", 22.0, "022-A"), ] -@pytest.mark.parametrize("issue, expected", issues) -def test_issue_string_as_float(issue, expected): +@pytest.mark.parametrize("issue, expected_float, expected_pad_str", issues) +def test_issue_string_as_float(issue, expected_float, expected_pad_str): issue_float = comicapi.issuestring.IssueString(issue).as_float() - assert issue_float == expected + assert issue_float == expected_float + + +@pytest.mark.parametrize("issue, expected_float, expected_pad_str", issues) +def test_issue_string_as_string(issue, expected_float, expected_pad_str): + issue_str = comicapi.issuestring.IssueString(issue).as_string() + issue_str_pad = comicapi.issuestring.IssueString(issue).as_string(3) + assert issue_str == issue + assert issue_str_pad == expected_pad_str diff --git a/tests/test_rename.py b/tests/rename_test.py similarity index 100% rename from tests/test_rename.py rename to tests/rename_test.py