89 lines
3.5 KiB
Python
89 lines
3.5 KiB
Python
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
import generate_abs_mock_report as report
|
|
|
|
|
|
class InferBookTests(unittest.TestCase):
|
|
def infer_row(self, relative_book_path: str, filenames: list[str]) -> dict[str, str]:
|
|
with tempfile.TemporaryDirectory() as tmpdir:
|
|
library_root = Path(tmpdir) / "library"
|
|
book_root = library_root / relative_book_path
|
|
book_root.mkdir(parents=True)
|
|
|
|
for filename in filenames:
|
|
(book_root / filename).write_bytes(b"")
|
|
|
|
audio_files = sorted(book_root.glob("*.mp3"))
|
|
return report.infer_book(book_root, library_root, audio_files)
|
|
|
|
def test_splits_author_from_title_context_in_folder_name(self) -> None:
|
|
row = self.infer_row(
|
|
"Biblioteka 2024/Bartos_Jolanta_Krzyk_Ciszy",
|
|
["001_Krzyk_ciszy.mp3", "002_Krzyk_ciszy.mp3"],
|
|
)
|
|
|
|
self.assertEqual(report.signature(row["title"]), "krzyk ciszy")
|
|
self.assertNotIn("krzyk", report.signature(row["author"]))
|
|
self.assertTrue(row["proposed_abs_path"].endswith("/Krzyk Ciszy"))
|
|
|
|
def test_normalizes_author_order_from_current_directory(self) -> None:
|
|
row = self.infer_row(
|
|
"Ahnhem Stefan/Stefan Ahnhem - Kain I Abel",
|
|
["001_Kain_I_Abel.mp3"],
|
|
)
|
|
|
|
self.assertEqual(row["author"], "Stefan Ahnhem")
|
|
self.assertTrue(row["proposed_abs_path"].startswith("Stefan Ahnhem/"))
|
|
|
|
def test_normalizes_author_order_from_audio_filename(self) -> None:
|
|
row = self.infer_row(
|
|
"Archer_Jeffrey/Kain_I_Abel",
|
|
[
|
|
"001_Jeffrey_Archer_-_Kain_I_Abel.mp3",
|
|
"002_Jeffrey_Archer_-_Kain_I_Abel.mp3",
|
|
],
|
|
)
|
|
|
|
self.assertEqual(row["author"], "Jeffrey Archer")
|
|
self.assertTrue(row["proposed_abs_path"].startswith("Jeffrey Archer/"))
|
|
|
|
def test_handles_hyphenated_surname_in_mixed_folder_name(self) -> None:
|
|
row = self.infer_row(
|
|
"Adler-Olsen/Jussi Adler-Olsen - Departament Q tom 1-8/Adler-Olsen Jussi - Departament Q 04. Kartoteka 64",
|
|
["01 - Kartoteka_64.mp3"],
|
|
)
|
|
|
|
self.assertEqual(row["author"], "Jussi Adler-Olsen")
|
|
self.assertEqual(row["series"], "Departament Q")
|
|
self.assertEqual(row["sequence"], "04")
|
|
self.assertEqual(row["title"], "Kartoteka 64")
|
|
self.assertTrue(row["proposed_abs_path"].startswith("Jussi Adler-Olsen/"))
|
|
|
|
def test_extracts_series_from_nested_mixed_folder(self) -> None:
|
|
row = self.infer_row(
|
|
"Adler-Olsen/Jussi Adler-Olsen - Departament Q tom 1-8/Adler-Olsen Jussi - Departament Q Tom 01 Kobieta w klatce/Adler - Olsen Jussi - Kobieta w klatce (czyta Janusz Zadura)",
|
|
["01.mp3"],
|
|
)
|
|
|
|
self.assertEqual(row["author"], "Jussi Adler-Olsen")
|
|
self.assertEqual(row["series"], "Departament Q")
|
|
self.assertEqual(row["sequence"], "01")
|
|
self.assertEqual(row["title"], "Kobieta w klatce")
|
|
|
|
def test_extracts_series_from_inline_series_number_title(self) -> None:
|
|
row = self.infer_row(
|
|
"Adler-Olsen/Jussi Adler-Olsen - Departament Q tom 1-8/Adler-Olsen Jussi - Departament Q 05 Pogrzebany",
|
|
["01.mp3"],
|
|
)
|
|
|
|
self.assertEqual(row["author"], "Jussi Adler-Olsen")
|
|
self.assertEqual(row["series"], "Departament Q")
|
|
self.assertEqual(row["sequence"], "05")
|
|
self.assertEqual(row["title"], "Pogrzebany")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|