feat: add pytest configuration and implement tests for file and metadata extraction
This commit is contained in:
@@ -9,6 +9,7 @@ dependencies = [
|
|||||||
"textual>=6.11.0",
|
"textual>=6.11.0",
|
||||||
"python-magic>=0.4.27",
|
"python-magic>=0.4.27",
|
||||||
"pymediainfo>=6.0.0",
|
"pymediainfo>=6.0.0",
|
||||||
|
"pytest>=7.0.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[project.scripts]
|
[project.scripts]
|
||||||
@@ -16,3 +17,10 @@ renamer = "renamer.main:main"
|
|||||||
|
|
||||||
[tool.uv]
|
[tool.uv]
|
||||||
package = true
|
package = true
|
||||||
|
|
||||||
|
[tool.pytest.ini_options]
|
||||||
|
addopts = "--strict-markers"
|
||||||
|
testpaths = ["renamer/test"]
|
||||||
|
python_files = ["test_*.py"]
|
||||||
|
python_classes = ["Test*"]
|
||||||
|
python_functions = ["test_*"]
|
||||||
|
|||||||
0
renamer/test/__init__.py
Normal file
0
renamer/test/__init__.py
Normal file
15
renamer/test/conftest.py
Normal file
15
renamer/test/conftest.py
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# conftest.py - pytest configuration
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# Force UTF-8 encoding for all I/O operations
|
||||||
|
os.environ['PYTHONIOENCODING'] = 'utf-8'
|
||||||
|
if hasattr(sys.stdout, 'reconfigure'):
|
||||||
|
sys.stdout.reconfigure(encoding='utf-8')
|
||||||
|
if hasattr(sys.stderr, 'reconfigure'):
|
||||||
|
sys.stderr.reconfigure(encoding='utf-8')
|
||||||
|
|
||||||
|
# Configure pytest to handle Unicode properly
|
||||||
|
def pytest_configure(config):
|
||||||
|
# Ensure UTF-8 encoding for test output
|
||||||
|
config.option.capture = 'no' # Don't capture output to avoid encoding issues
|
||||||
205
renamer/test/filenames.txt
Normal file
205
renamer/test/filenames.txt
Normal file
@@ -0,0 +1,205 @@
|
|||||||
|
[01.1] Harry Potter and the Philosopher's Stone (2001) [Theatrical Cut] BDRip 1080p x265 [4xUKR_ENG] [Hurtom].mkv
|
||||||
|
[01.2] Harry Potter and the Sorcerer's Stone (2001) [Ultimate Extended Edition] BDRip 1080p x265 [4xUKR_ENG] [Hurtom].mkv
|
||||||
|
[02.1] Harry Potter and the Chamber of Secrets (2002) [Theatrical Cut] BDRip 1080p x265 [4xUKR_ENG] [Hurtom].mkv
|
||||||
|
[02.2] Harry Potter and the Chamber of Secrets (2002) [Ultimate Extended Edition] BDRip 1080p x265 [4xUKR_ENG] [Hurtom].mkv
|
||||||
|
[03] Harry Potter and the Prisoner of Azkaban (2004) BDRip 1080p x265 [5xUKR_ENG] [Hurtom].mkv
|
||||||
|
[04] Harry Potter and the Goblet of Fire (2005) BDRip 1080p x265 [4xUKR_ENG] [Hurtom].mkv
|
||||||
|
[05] Harry Potter and the Order of the Phoenix (2007) BDRip 1080p x265 [3xUKR_ENG] [Hurtom].mkv
|
||||||
|
[06] Harry Potter and the Half-Blood Prince (2009) BDRip 1080p x265 [2xUKR_ENG] [Hurtom].mkv
|
||||||
|
[07] Harry Potter and the Deathly Hallows. Part 1 (2010) BDRip 1080p x265 [UKR_ENG] [Hurtom].mkv
|
||||||
|
[08] Harry Potter and the Deathly Hallows. Part 2 (2011) BDRip 1080p x265 [UKR_ENG] [Hurtom].mkv
|
||||||
|
12 стульев.(1971).[SD,rus].avi
|
||||||
|
A Mighty Heart.(2007).[SD,2ukr,eng].avi
|
||||||
|
An Ideal Husband (1999) [720p,ukr,eng].mkv
|
||||||
|
China Moon (1994) BDRip [SD,2ukr,eng].mkv
|
||||||
|
Cours Toujours (2010) [720p,und] [tmdbid-993291].mp4
|
||||||
|
Davolja Posla (1965) [SD,und] [tmdbid-665739].avi
|
||||||
|
Destiny (2012) [720p,und] [tmdbid-496051].mp4
|
||||||
|
Emma (1996) BDRip [720p,ukr,eng].mkv
|
||||||
|
I Come with the Rain.(2008).[720p,ukr].mkv
|
||||||
|
I Could Never Be Your Woman (2007) [SD,2ukr,eng].mkv
|
||||||
|
I Spy (2002) [720p,2ukr,eng].mkv
|
||||||
|
If I Stay (2014) [720p,ukr,eng].mkv
|
||||||
|
Il racconto dei racconti (Tale of Tales).(2015).[720p,ukr,eng].mkv
|
||||||
|
Imperium Nerone (2004) [SD,ukr].mkv
|
||||||
|
In Bruges (2008) [SD,ukr].mkv
|
||||||
|
Independence Day Resurgence.(2016).[720,ukr,eng].mkv
|
||||||
|
Inescapable (2012) [SD,ukr].mkv
|
||||||
|
Inside Llewyn Davis.(2013).[720p,ukr,eng].mkv
|
||||||
|
Into the Woods (2014) [720p,ukr,eng].mkv
|
||||||
|
Investigating Sex (2002) [SD,ukr].mkv
|
||||||
|
Jumper.(2008).[SD,ukr].mkv
|
||||||
|
Klątwa doliny węży (1988) [SD,rus].avi
|
||||||
|
Klątwa doliny węży (1988) DVDRip [SD,pol].mkv
|
||||||
|
Ladri di biciclette (1948).[720p,ukr].mp4
|
||||||
|
Larry Crowne.(2011).[720p,2ukr,eng].mkv
|
||||||
|
Le dernier chaperon rouge (1996) [SD,fre] [tmdbid-82143].mkv
|
||||||
|
Lets Be Cops.(2014).[720p,rus,ukr,4eng].mkv
|
||||||
|
Life After Beth.(2014).[720p,ukr,eng].mkv
|
||||||
|
Life Is a Miracle.(2004).[SD,ukr].avi
|
||||||
|
Life Is a Miracle.(2004).[SD,ukr].avi
|
||||||
|
Loosies.(2011).[SD,ukr,eng].avi
|
||||||
|
Love & Friendship.(2016).[720p,ukr,eng].mkv
|
||||||
|
Love Story.(1970).[SD,ukr,eng].mkv
|
||||||
|
Mac and Me.(1988).[720p,ukr,eng].mkv
|
||||||
|
Made of Honor.(2008).[SD,ukr].avi
|
||||||
|
Man on the Moon.(1999).[720p,ukr,eng].mkv
|
||||||
|
Martyrs.(2008).[720p,fre,sukr].mkv
|
||||||
|
Max Keeble's Big Move.(2001).[SD,ukr].avi
|
||||||
|
Me Before You.(2016).[720p,ukr,eng].mkv
|
||||||
|
Me, Myself & Irene.(2000).[720p,ukr,eng].mkv
|
||||||
|
Meet Dave.(2008).[SD,ukr].avi
|
||||||
|
Minority Report.(2002).[720p,ukr,eng].mkv
|
||||||
|
Misconduct (2016) BDRip [720p,ukr,eng].mkv
|
||||||
|
Mission to Mars.(2000).[720p,ukr,eng].mkv
|
||||||
|
Monster's Ball.(2001).[SD,eng].mkv
|
||||||
|
Mr. Nobody (2009) BDRip [SD,2ukr,eng].mkv
|
||||||
|
My Week with Marilyn.(2011).[720p,ukr,eng].mkv
|
||||||
|
Nathalie... (2003) [SD,ukr].mkv
|
||||||
|
New Year's Eve (2011) [720p,ukr,eng].mkv
|
||||||
|
Nightmare City 2035 (2008) [SD,ukr].mkv
|
||||||
|
Noah (2014) [720p,ukr,eng].mkv
|
||||||
|
Northmen - A Viking Saga (2014) [SD,ukr].mkv
|
||||||
|
One More Kiss (1999) DVDRip [SD,ukr].avi
|
||||||
|
Orbita 9 (2017) [SD,ukr,eng].mkv
|
||||||
|
Pay It Forward (2000) [SD,ukr].mkv
|
||||||
|
Pay It Forward (2000) [SD,ukr].mkv
|
||||||
|
Perfect Stranger (2007) [SD,ukr].mkv
|
||||||
|
Peter Pan (2003) [720p,ukr,eng].mkv
|
||||||
|
Prime (2005) [SD,ukr,eng].mkv
|
||||||
|
Prince of Persia. The Sands of Time (2010) [720p,ukr,eng].mkv
|
||||||
|
Prince Valiant (1997) [SD,ukr,eng].mkv
|
||||||
|
Raging Bull (1980) [720p,ukr,eng].mkv
|
||||||
|
Rebecca (2020) [720p,eng].mkv
|
||||||
|
Rekopis znaleziony w Saragossie (1965) WEB-DL [SD,ukr].mkv
|
||||||
|
River's Edge (1986) [SD,ukr,eng].mkv
|
||||||
|
Riverworld (2003) [480p,ukr,eng].mkv
|
||||||
|
Romeo Is Bleeding (1993) [SD,2ukr,eng].mkv
|
||||||
|
Ruthless People (1986) [720p,ukr,eng].mkv
|
||||||
|
Sahara (1983) [SD,ukr,eng].mkv
|
||||||
|
Savages (2012) [SD,ukr].mkv
|
||||||
|
Scoop (2024) WEB-DL [720p,ukr,eng].mkv
|
||||||
|
Se7en (1995) [720p,ukr,eng].mkv
|
||||||
|
See No Evil, Hear No Evil (1989) [720p,ukr,eng].mkv
|
||||||
|
Senseless (1998) [SD,ukr].mkv
|
||||||
|
Sex Tape (2014) [720p,ukr,eng].mkv
|
||||||
|
Shutter Island (2010) [720p,ukr,eng].mkv
|
||||||
|
St. Trinian's (2007) [720p,ukr,eng].mkv
|
||||||
|
The Black Hole (1979) BDRip [480p,ukr,eng].mkv
|
||||||
|
The Invention of Lying (2009) [720p,ukr,eng].mkv
|
||||||
|
The Island of Dr. Moreau.(1977).[720p,ukr].mp4
|
||||||
|
The Killing.(1956).[SD,ukr,eng].mkv
|
||||||
|
The Love Guru.(2008).[SD,ukr].avi
|
||||||
|
The Love Guru.(2008).[SD,ukr].avi
|
||||||
|
The Manchurian Candidate.(2004).[720p,ukr,eng].mkv
|
||||||
|
The Mortal Instruments. City of Bones.(2013).[720p,ukr,eng].mkv
|
||||||
|
The Mutant Chronicles.(2008).[SD,ukr,eng].mkv
|
||||||
|
The Name of the Rose (1986) [SD,3ukr,eng].mkv
|
||||||
|
The Number 23 (2007) [720p,ukr,eng].mkv
|
||||||
|
The People Under the Stairs (1991) [720p,ukr,eng].mkv
|
||||||
|
The Return (2024) WEB-DLRip [720p,ukr,eng].mkv
|
||||||
|
The Road to Wellville (1994) [SD,ukr,eng].mkv
|
||||||
|
The Ruins (2008) [SD,ukr].mkv
|
||||||
|
The Sound of Music (1965).[720p,ukr].mp4
|
||||||
|
The Square Peg (1958).[480p,ukr,eng].mkv
|
||||||
|
Un homme à la hauteur.(2016).[720p,ukr].mkv
|
||||||
|
Upgrade.(2018).[SD,eng].mkv
|
||||||
|
Автомобиль, скрипка и собака Клякса.(1974).[SD,rus].avi
|
||||||
|
Ах, Водевиль, Водевиль...(1979).[SD,rus].avi
|
||||||
|
Белеет парус одинокий.(1937).[SD,rus].avi
|
||||||
|
Белое солнце пустыни.(1969).[SD,rus].avi
|
||||||
|
Берегись автомобиля.(1966).[SD,rus].avi
|
||||||
|
Берегите женщин.(1981).[SD,rus].avi
|
||||||
|
Бриллиантовая рука.(1968).[720p,2rus].mkv
|
||||||
|
В бой идут одни «старики».(1973).[720p,rus].mkv
|
||||||
|
В моей смерти прошу винить Клаву К.(1979).[480p,rus].mkv
|
||||||
|
В тринадцатом часу ночи.(1969).[SD,rus].avi
|
||||||
|
Верные друзья.(1954).[SD,rus].avi
|
||||||
|
Веселые ребята.(1934).[SD,rus].avi
|
||||||
|
Взломщик.(1987).[SD,rus].avi
|
||||||
|
Вий.(1967).[SD,rus].avi
|
||||||
|
Высота.(1957).[SD,rus].avi
|
||||||
|
Гиперболоид инженера Гарина.(1965).[SD,rus].avi
|
||||||
|
Глинка.(1946).[SD,rus].avi
|
||||||
|
Гостья из будущего (1984) [SD,rus] [tmdbid-20894].mkv
|
||||||
|
Гроза.(1934).[SD,rus].avi
|
||||||
|
Гусарская баллада.(1962).[SD,rus].avi
|
||||||
|
Два капитана.(1955).[SD,rus].avi
|
||||||
|
Девушка с гитарой.(1958).[SD,rus].avi
|
||||||
|
Деловые люди (1962) [SD,rus] [tmdbid-92983].avi
|
||||||
|
Джентльмены удачи.(1971).[SD,rus].avi
|
||||||
|
Добро пожаловать, или Посторонним вход воспрещен.(1964).[SD,rus].avi
|
||||||
|
Доживем до понедельника.(1968).[SD,rus].avi
|
||||||
|
За двома зайцями.(1961).[SD,ukr,rus].mkv
|
||||||
|
За спичками.(1980).[SD,rus,fin].mkv
|
||||||
|
Завтра, третьего апреля.(1969).[SD,rus].avi
|
||||||
|
Зеленый фургон.(1959).[SD,rus].avi
|
||||||
|
Золотой ключик.(1939).[SD,rus].avi
|
||||||
|
Золотой телёнок.pt1.(1968).[SD,rus].avi
|
||||||
|
Золотой телёнок.pt2.(1968).[SD,rus].avi
|
||||||
|
Иван Васильевич меняет профессию.(1973).[SD,rus].avi
|
||||||
|
Игла.(1988).[SD,rus].mkv
|
||||||
|
Иди и смотри.(1985).[SD,rus].avi
|
||||||
|
Идиот.(1958).[SD,rus].avi
|
||||||
|
Илья Муромец.(1956).[SD,rus].avi
|
||||||
|
Интердевочка.(1989).[SD,rus].mkv
|
||||||
|
Кавказская пленница, или Новые приключения Шурика.(1966).[SD,rus].avi
|
||||||
|
Карнавальная ночь.(1956).[SD,rus].avi
|
||||||
|
Конек-Горбунок.(1941).[SD,rus].avi
|
||||||
|
Королева бензоколонки.(1962).[SD,rus].avi
|
||||||
|
Королевство кривых зеркал.(1963).[SD,rus].avi
|
||||||
|
Курьер.(1986).[720p,rus].mkv
|
||||||
|
Мария, Мирабела в транзистории.(1989).[SD,rus].mpg
|
||||||
|
Мастер и Маргарита.pt1.(1994).[LQ,rus].wmv
|
||||||
|
Мастер и Маргарита.pt2.(1994).[LQ,rus].wmv
|
||||||
|
Мастер и Маргарита.pt3.(1994).[LQ,rus].wmv
|
||||||
|
Мастер и Маргарита.pt4.(1994).[LQ,rus].wmv
|
||||||
|
Миллион в брачной корзине.(1985).[SD,rus].avi
|
||||||
|
Мольба.(1967).[SD,rus].avi
|
||||||
|
Моцарт и Сальери.(1962).[SD,rus].avi
|
||||||
|
Не могу сказать «прощай».(1982).[SD,rus].avi
|
||||||
|
Не может быть!.(1975).[SD,rus].mkv
|
||||||
|
Невероятные приключения итальянцев в России.(1973).[SD,rus].avi
|
||||||
|
Неподдающиеся.(1959).[SD,rus].avi
|
||||||
|
Новый Гулливер.(1935).[SD,rus].avi
|
||||||
|
Нормандия - Неман.(1960).[SD,rus].avi
|
||||||
|
Обнаженная в шляпе (1991) [480p,rus] [tmdbid-286638].mkv
|
||||||
|
Огонь, вода и ... медные трубы.(1967).[SD,rus].avi
|
||||||
|
Операция «Ы» и другие приключения Шурика.(1965).[SD,rus].avi
|
||||||
|
Остров ржавого генерала.(1988).[SD,rus].avi
|
||||||
|
Остров сокровищ (1971) [SD,rus] [tmdbid-135710].avi
|
||||||
|
По щучьему велению.(1938).[SD,rus].avi
|
||||||
|
Подземелье ведьм.(1990).[SD,rus].avi
|
||||||
|
Подкидыш.(1939).[SD,rus].avi
|
||||||
|
После дождичка в четверг.(1985).[SD,rus].avi
|
||||||
|
Приключения Тома Сойера и Гекльберри Финна.pt1.(1981).[SD,rus].avi
|
||||||
|
Приключения Тома Сойера и Гекльберри Финна.pt2.(1981).[SD,rus].avi
|
||||||
|
Приключения Тома Сойера и Гекльберри Финна.pt3.(1981).[SD,rus].avi
|
||||||
|
Приключения Хоббита.(1984).[SD,rus].avi
|
||||||
|
Приморский бульвар.pt1.(1988).[SD,rus].avi
|
||||||
|
Приморский бульвар.pt2.(1988).[SD,rus].avi
|
||||||
|
Принцесса на горошине.(1976).[SD,rus].avi
|
||||||
|
Республика ШКИД.(1966).[SD,rus].mkv
|
||||||
|
Самые быстрые в мире.(1985).[SD,rus].avi
|
||||||
|
Свадьба в Малиновке.(1967).[1080p,3rus].mkv
|
||||||
|
Свой среди чужих, чужой среди своих.(1974).[SD,rus].avi
|
||||||
|
Сказ про то, как царь Петр арапа женил.(1976).[SD,rus].avi
|
||||||
|
Сказка о потерянном времени.(1964).[SD,rus].avi
|
||||||
|
Собачье сердце (1988) [1080p,2rus] [tmdbid-43680].mkv
|
||||||
|
Совершенно серьезно.(1961).[SD,rus].avi
|
||||||
|
Соломенная шляпка.(1974).[SD,rus].avi
|
||||||
|
Спортлото-82.(1982).[SD,rus].avi
|
||||||
|
Сталкер.(1979).[SD,rus].avi
|
||||||
|
Тайна острова Бэк-Кап (1958) [SD,rus].mkv
|
||||||
|
Там на неведомых дорожках.(1982).[SD,rus].avi
|
||||||
|
Трактористы.(1939).[SD,rus].avi
|
||||||
|
Три плюс два (1963) [SD,rus].mkv
|
||||||
|
Три толстяка.(1966).[SD,rus].avi
|
||||||
|
Трудно быть Богом (1989) [SD,rus] [tmdbid-64508].avi
|
||||||
|
Трудно быть Богом (2014) WEB-DL [720p,rus].m4v
|
||||||
|
Трудно первые 100 лет.(1988).[SD,rus].avi
|
||||||
|
Чародеи.pt1.(1982).[SD,rus].avi
|
||||||
|
Чародеи.pt2.(1982).[SD,rus].avi
|
||||||
|
Человек с бульвара Капуцинов (1987) [1080p,rus] [tmdbid-45227].mkv
|
||||||
|
Человек-амфибия (1961) [SD,rus] [tmdbid-43685].avi
|
||||||
|
Чук и Гек (1953) [SD,rus] [tmdbid-148412].avi
|
||||||
35
renamer/test/test_fileinfo_extractor.py
Normal file
35
renamer/test/test_fileinfo_extractor.py
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
import pytest
|
||||||
|
from pathlib import Path
|
||||||
|
from renamer.extractors.fileinfo_extractor import FileInfoExtractor
|
||||||
|
|
||||||
|
|
||||||
|
class TestFileInfoExtractor:
|
||||||
|
@pytest.fixture
|
||||||
|
def test_file(self):
|
||||||
|
"""Use the filenames.txt file for testing"""
|
||||||
|
return Path(__file__).parent / "filenames.txt"
|
||||||
|
|
||||||
|
def test_extract_size(self, test_file):
|
||||||
|
"""Test extracting file size"""
|
||||||
|
size = FileInfoExtractor.extract_size(test_file)
|
||||||
|
assert isinstance(size, int)
|
||||||
|
assert size > 0
|
||||||
|
|
||||||
|
def test_extract_modification_time(self, test_file):
|
||||||
|
"""Test extracting modification time"""
|
||||||
|
mtime = FileInfoExtractor.extract_modification_time(test_file)
|
||||||
|
assert isinstance(mtime, float)
|
||||||
|
assert mtime > 0
|
||||||
|
|
||||||
|
def test_extract_file_name(self, test_file):
|
||||||
|
"""Test extracting file name"""
|
||||||
|
name = FileInfoExtractor.extract_file_name(test_file)
|
||||||
|
assert isinstance(name, str)
|
||||||
|
assert name == "filenames.txt"
|
||||||
|
|
||||||
|
def test_extract_file_path(self, test_file):
|
||||||
|
"""Test extracting file path"""
|
||||||
|
path = FileInfoExtractor.extract_file_path(test_file)
|
||||||
|
assert isinstance(path, str)
|
||||||
|
assert "filenames.txt" in path
|
||||||
|
assert str(test_file) == path
|
||||||
53
renamer/test/test_filename_extractor.py
Normal file
53
renamer/test/test_filename_extractor.py
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
import pytest
|
||||||
|
from pathlib import Path
|
||||||
|
from ..extractors.filename_extractor import FilenameExtractor
|
||||||
|
|
||||||
|
|
||||||
|
def load_test_filenames():
|
||||||
|
"""Load test filenames from filenames.txt"""
|
||||||
|
test_file = Path(__file__).parent / "filenames.txt"
|
||||||
|
if test_file.exists():
|
||||||
|
with open(test_file, 'r', encoding='utf-8') as f:
|
||||||
|
return [line.strip() for line in f if line.strip()]
|
||||||
|
return []
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("filename", load_test_filenames())
|
||||||
|
def test_extract_title(filename):
|
||||||
|
"""Test title extraction from filename"""
|
||||||
|
file_path = Path(filename)
|
||||||
|
title = FilenameExtractor.extract_title(file_path)
|
||||||
|
# For now, just check it's not None and is string
|
||||||
|
assert isinstance(title, str) or title is None
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("filename", load_test_filenames())
|
||||||
|
def test_extract_year(filename):
|
||||||
|
"""Test year extraction from filename"""
|
||||||
|
file_path = Path(filename)
|
||||||
|
year = FilenameExtractor.extract_year(file_path)
|
||||||
|
# Print filename and extracted year clearly
|
||||||
|
print(f"\nFilename: \033[1;36m{filename}\033[0m")
|
||||||
|
print(f"Extracted year: \033[1;32m{year}\033[0m")
|
||||||
|
# Year should be None or 4-digit string
|
||||||
|
if year:
|
||||||
|
assert len(year) == 4 and year.isdigit()
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("filename", load_test_filenames())
|
||||||
|
def test_extract_source(filename):
|
||||||
|
"""Test source extraction from filename"""
|
||||||
|
file_path = Path(filename)
|
||||||
|
source = FilenameExtractor.extract_source(file_path)
|
||||||
|
# Source should be None or string
|
||||||
|
assert isinstance(source, str) or source is None
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("filename", load_test_filenames())
|
||||||
|
def test_extract_resolution(filename):
|
||||||
|
"""Test resolution extraction from filename"""
|
||||||
|
file_path = Path(filename)
|
||||||
|
resolution = FilenameExtractor.extract_resolution(file_path)
|
||||||
|
# Resolution should be None or string like '2160p'
|
||||||
|
if resolution:
|
||||||
|
assert 'p' in resolution or 'i' in resolution
|
||||||
38
renamer/test/test_mediainfo_extractor.py
Normal file
38
renamer/test/test_mediainfo_extractor.py
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
import pytest
|
||||||
|
from pathlib import Path
|
||||||
|
from renamer.extractors.mediainfo_extractor import MediaInfoExtractor
|
||||||
|
|
||||||
|
|
||||||
|
class TestMediaInfoExtractor:
|
||||||
|
@pytest.fixture
|
||||||
|
def extractor(self):
|
||||||
|
return MediaInfoExtractor()
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def test_file(self):
|
||||||
|
"""Use the filenames.txt file for testing"""
|
||||||
|
return Path(__file__).parent / "filenames.txt"
|
||||||
|
|
||||||
|
def test_extract_resolution(self, extractor, test_file):
|
||||||
|
"""Test extracting resolution from media info"""
|
||||||
|
resolution = extractor.extract_resolution(test_file)
|
||||||
|
# Text files don't have video resolution
|
||||||
|
assert resolution is None
|
||||||
|
|
||||||
|
def test_extract_hdr(self, extractor, test_file):
|
||||||
|
"""Test extracting HDR info"""
|
||||||
|
hdr = extractor.extract_hdr(test_file)
|
||||||
|
# Text files don't have HDR
|
||||||
|
assert hdr is None
|
||||||
|
|
||||||
|
def test_extract_audio_langs(self, extractor, test_file):
|
||||||
|
"""Test extracting audio languages"""
|
||||||
|
langs = extractor.extract_audio_langs(test_file)
|
||||||
|
# Text files don't have audio tracks
|
||||||
|
assert langs == ''
|
||||||
|
|
||||||
|
def test_extract_video_dimensions(self, extractor, test_file):
|
||||||
|
"""Test extracting video dimensions"""
|
||||||
|
dims = extractor.extract_video_dimensions(test_file)
|
||||||
|
# Text files don't have video dimensions
|
||||||
|
assert dims is None
|
||||||
38
renamer/test/test_metadata_extractor.py
Normal file
38
renamer/test/test_metadata_extractor.py
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
import pytest
|
||||||
|
from pathlib import Path
|
||||||
|
from renamer.extractors.metadata_extractor import MetadataExtractor
|
||||||
|
|
||||||
|
|
||||||
|
class TestMetadataExtractor:
|
||||||
|
@pytest.fixture
|
||||||
|
def test_file(self):
|
||||||
|
"""Use the filenames.txt file for testing"""
|
||||||
|
return Path(__file__).parent / "filenames.txt"
|
||||||
|
|
||||||
|
def test_extract_title(self, test_file):
|
||||||
|
"""Test extracting title from metadata"""
|
||||||
|
title = MetadataExtractor.extract_title(test_file)
|
||||||
|
# Text files don't have metadata, so should be None
|
||||||
|
assert title is None
|
||||||
|
|
||||||
|
def test_extract_duration(self, test_file):
|
||||||
|
"""Test extracting duration from metadata"""
|
||||||
|
duration = MetadataExtractor.extract_duration(test_file)
|
||||||
|
# Text files don't have duration
|
||||||
|
assert duration is None
|
||||||
|
|
||||||
|
def test_extract_artist(self, test_file):
|
||||||
|
"""Test extracting artist from metadata"""
|
||||||
|
artist = MetadataExtractor.extract_artist(test_file)
|
||||||
|
# Text files don't have artist
|
||||||
|
assert artist is None
|
||||||
|
|
||||||
|
def test_extract_all_metadata(self, test_file):
|
||||||
|
"""Test extracting all metadata"""
|
||||||
|
metadata = MetadataExtractor.extract_all_metadata(test_file)
|
||||||
|
expected = {
|
||||||
|
'title': None,
|
||||||
|
'duration': None,
|
||||||
|
'artist': None
|
||||||
|
}
|
||||||
|
assert metadata == expected
|
||||||
54
uv.lock
generated
54
uv.lock
generated
@@ -2,6 +2,24 @@ version = 1
|
|||||||
revision = 3
|
revision = 3
|
||||||
requires-python = ">=3.11"
|
requires-python = ">=3.11"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "colorama"
|
||||||
|
version = "0.4.6"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "iniconfig"
|
||||||
|
version = "2.3.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "linkify-it-py"
|
name = "linkify-it-py"
|
||||||
version = "2.0.3"
|
version = "2.0.3"
|
||||||
@@ -61,6 +79,15 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/b0/7a/620f945b96be1f6ee357d211d5bf74ab1b7fe72a9f1525aafbfe3aee6875/mutagen-1.47.0-py3-none-any.whl", hash = "sha256:edd96f50c5907a9539d8e5bba7245f62c9f520aef333d13392a79a4f70aca719", size = 194391, upload-time = "2023-09-03T16:33:29.955Z" },
|
{ url = "https://files.pythonhosted.org/packages/b0/7a/620f945b96be1f6ee357d211d5bf74ab1b7fe72a9f1525aafbfe3aee6875/mutagen-1.47.0-py3-none-any.whl", hash = "sha256:edd96f50c5907a9539d8e5bba7245f62c9f520aef333d13392a79a4f70aca719", size = 194391, upload-time = "2023-09-03T16:33:29.955Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "packaging"
|
||||||
|
version = "25.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "platformdirs"
|
name = "platformdirs"
|
||||||
version = "4.5.1"
|
version = "4.5.1"
|
||||||
@@ -70,6 +97,15 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", size = 18731, upload-time = "2025-12-05T13:52:56.823Z" },
|
{ url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", size = 18731, upload-time = "2025-12-05T13:52:56.823Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pluggy"
|
||||||
|
version = "1.6.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pygments"
|
name = "pygments"
|
||||||
version = "2.19.2"
|
version = "2.19.2"
|
||||||
@@ -92,6 +128,22 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/e7/26/9d50c2a330541bc36c0ea7ce29eeff5b0c35c2624139660df8bcfa9ae3ce/pymediainfo-7.0.1-py3-none-win_amd64.whl", hash = "sha256:13224fa7590e198763b8baf072e704ea81d334e71aa32a469091460e243893c7", size = 3271232, upload-time = "2025-02-12T15:07:13.672Z" },
|
{ url = "https://files.pythonhosted.org/packages/e7/26/9d50c2a330541bc36c0ea7ce29eeff5b0c35c2624139660df8bcfa9ae3ce/pymediainfo-7.0.1-py3-none-win_amd64.whl", hash = "sha256:13224fa7590e198763b8baf072e704ea81d334e71aa32a469091460e243893c7", size = 3271232, upload-time = "2025-02-12T15:07:13.672Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pytest"
|
||||||
|
version = "9.0.2"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
||||||
|
{ name = "iniconfig" },
|
||||||
|
{ name = "packaging" },
|
||||||
|
{ name = "pluggy" },
|
||||||
|
{ name = "pygments" },
|
||||||
|
]
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "python-magic"
|
name = "python-magic"
|
||||||
version = "0.4.27"
|
version = "0.4.27"
|
||||||
@@ -108,6 +160,7 @@ source = { editable = "." }
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "mutagen" },
|
{ name = "mutagen" },
|
||||||
{ name = "pymediainfo" },
|
{ name = "pymediainfo" },
|
||||||
|
{ name = "pytest" },
|
||||||
{ name = "python-magic" },
|
{ name = "python-magic" },
|
||||||
{ name = "textual" },
|
{ name = "textual" },
|
||||||
]
|
]
|
||||||
@@ -116,6 +169,7 @@ dependencies = [
|
|||||||
requires-dist = [
|
requires-dist = [
|
||||||
{ name = "mutagen", specifier = ">=1.47.0" },
|
{ name = "mutagen", specifier = ">=1.47.0" },
|
||||||
{ name = "pymediainfo", specifier = ">=6.0.0" },
|
{ name = "pymediainfo", specifier = ">=6.0.0" },
|
||||||
|
{ name = "pytest", specifier = ">=7.0.0" },
|
||||||
{ name = "python-magic", specifier = ">=0.4.27" },
|
{ name = "python-magic", specifier = ">=0.4.27" },
|
||||||
{ name = "textual", specifier = ">=6.11.0" },
|
{ name = "textual", specifier = ">=6.11.0" },
|
||||||
]
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user