feat: Enhanced anime add flow with sanitized folders and targeted scan
- Add sanitize_folder_name utility for filesystem-safe folder names - Add sanitized_folder property to Serie entity - Update SerieList.add() to use sanitized display names for folders - Add scan_single_series() method for targeted episode scanning - Enhance add_series endpoint: DB save -> folder create -> targeted scan - Update response to include missing_episodes and total_missing - Add comprehensive unit tests for new functionality - Update API tests with proper mock support
This commit is contained in:
@@ -320,3 +320,96 @@ class TestSerieDeprecationWarnings:
|
||||
finally:
|
||||
if os.path.exists(temp_filename):
|
||||
os.remove(temp_filename)
|
||||
|
||||
|
||||
class TestSerieSanitizedFolder:
|
||||
"""Test Serie.sanitized_folder property."""
|
||||
|
||||
def test_sanitized_folder_from_name(self):
|
||||
"""Test that sanitized_folder uses the name property."""
|
||||
serie = Serie(
|
||||
key="attack-on-titan",
|
||||
name="Attack on Titan: Final Season",
|
||||
site="aniworld.to",
|
||||
folder="old-folder",
|
||||
episodeDict={}
|
||||
)
|
||||
|
||||
result = serie.sanitized_folder
|
||||
assert ":" not in result
|
||||
assert "Attack on Titan" in result
|
||||
|
||||
def test_sanitized_folder_removes_special_chars(self):
|
||||
"""Test that special characters are removed."""
|
||||
serie = Serie(
|
||||
key="re-zero",
|
||||
name="Re:Zero - Starting Life in Another World?",
|
||||
site="aniworld.to",
|
||||
folder="old-folder",
|
||||
episodeDict={}
|
||||
)
|
||||
|
||||
result = serie.sanitized_folder
|
||||
assert ":" not in result
|
||||
assert "?" not in result
|
||||
|
||||
def test_sanitized_folder_fallback_to_folder(self):
|
||||
"""Test fallback to folder when name is empty."""
|
||||
serie = Serie(
|
||||
key="test-key",
|
||||
name="",
|
||||
site="aniworld.to",
|
||||
folder="Valid Folder Name",
|
||||
episodeDict={}
|
||||
)
|
||||
|
||||
result = serie.sanitized_folder
|
||||
assert result == "Valid Folder Name"
|
||||
|
||||
def test_sanitized_folder_fallback_to_key(self):
|
||||
"""Test fallback to key when name and folder can't be sanitized."""
|
||||
serie = Serie(
|
||||
key="valid-key",
|
||||
name="",
|
||||
site="aniworld.to",
|
||||
folder="",
|
||||
episodeDict={}
|
||||
)
|
||||
|
||||
result = serie.sanitized_folder
|
||||
assert result == "valid-key"
|
||||
|
||||
def test_sanitized_folder_preserves_unicode(self):
|
||||
"""Test that Unicode characters are preserved."""
|
||||
serie = Serie(
|
||||
key="japanese-anime",
|
||||
name="進撃の巨人",
|
||||
site="aniworld.to",
|
||||
folder="old-folder",
|
||||
episodeDict={}
|
||||
)
|
||||
|
||||
result = serie.sanitized_folder
|
||||
assert "進撃の巨人" in result
|
||||
|
||||
def test_sanitized_folder_with_various_anime_titles(self):
|
||||
"""Test sanitized_folder with real anime titles."""
|
||||
test_cases = [
|
||||
("fate-stay-night", "Fate/Stay Night: UBW"),
|
||||
("86-eighty-six", "86: Eighty-Six"),
|
||||
("steins-gate", "Steins;Gate"),
|
||||
]
|
||||
|
||||
for key, name in test_cases:
|
||||
serie = Serie(
|
||||
key=key,
|
||||
name=name,
|
||||
site="aniworld.to",
|
||||
folder="old-folder",
|
||||
episodeDict={}
|
||||
)
|
||||
result = serie.sanitized_folder
|
||||
# Verify invalid filesystem characters are removed
|
||||
# Note: semicolon is valid on Linux but we test common invalid chars
|
||||
assert ":" not in result
|
||||
assert "/" not in result
|
||||
|
||||
Reference in New Issue
Block a user