Remove legacy key file support after DB migration

- SerieScanner: Remove key file fallback, keep data file fallback
- SystemSettings: Add legacy_key_cleanup_completed flag
- initialization_service: Add cleanup task to remove key files from folders with DB entries
- Tests updated to reflect key file removal from legacy path

Key files caused duplicate key errors on folder rename. DB is now sole source of truth.
This commit is contained in:
2026-05-28 22:01:37 +02:00
parent 1ef59c5283
commit 4e6afa31b5
7 changed files with 161 additions and 49 deletions

View File

@@ -519,23 +519,8 @@ class TestFindMp4Files:
class TestReadDataFromFile:
"""Test __read_data_from_file method."""
def test_reads_key_file(self, mock_loader):
"""Should read key from 'key' file."""
import tempfile
with tempfile.TemporaryDirectory() as tmpdir:
anime_folder = os.path.join(tmpdir, "SomeAnime")
os.makedirs(anime_folder)
with open(os.path.join(anime_folder, "key"), "w") as f:
f.write("some-key")
scanner = SerieScanner(tmpdir, mock_loader)
result = scanner._SerieScanner__read_data_from_file("SomeAnime")
assert result is not None
assert result.key == "some-key"
def test_reads_data_file(self, mock_loader):
"""Should read Serie from 'data' file when no 'key' file."""
"""Should read Serie from 'data' file when no DB entry exists."""
import tempfile
with tempfile.TemporaryDirectory() as tmpdir:

View File

@@ -77,23 +77,19 @@ class TestGetSerieFromFolderDbLookup:
assert result.key == "rooster-fighter"
lookup.assert_called_once_with("Rooster Fighter (2026)")
def test_legacy_key_file_as_last_resort(self, temp_directory, mock_loader):
"""No DB, no callback -> legacy 'key' file used with deprecation warning."""
def test_no_db_no_callback_generates_key_from_folder_name(self, temp_directory, mock_loader):
"""No DB entry, no callback -> key generated from folder name."""
folder = os.path.join(temp_directory, "Legacy Series")
os.makedirs(folder, exist_ok=True)
with open(os.path.join(folder, "key"), "w") as f:
f.write("legacy-key")
# No key file, no data file - should fall through to Step 4 (key generation)
scanner = SerieScanner(temp_directory, mock_loader)
with patch.object(logging.getLogger("src.core.SerieScanner"), "warning") as mock_warning:
result = scanner._SerieScanner__read_data_from_file("Legacy Series")
result = scanner._SerieScanner__read_data_from_file("Legacy Series")
assert result is not None
assert result.key == "legacy-key"
mock_warning.assert_called()
warning_calls = [str(c) for c in mock_warning.call_args_list]
assert any("deprecated" in c or "v3.0.0" in c for c in warning_calls)
assert result is not None
assert result.key == "legacy-series"
assert result.folder == "Legacy Series"
def test_db_lookup_exception_caught_and_logged(self, temp_directory, mock_loader):
"""DB exception -> fallback to provider callback."""

View File

@@ -23,6 +23,8 @@ async def test_system_settings_integration():
assert settings.initial_scan_completed is False
assert settings.initial_nfo_scan_completed is False
assert settings.initial_media_scan_completed is False
assert settings.migration_legacy_files_completed is False
assert settings.legacy_key_cleanup_completed is False
# Test checking individual flags
async with get_db_session() as db:
@@ -34,6 +36,12 @@ async def test_system_settings_integration():
is_media_done = await SystemSettingsService.is_initial_media_scan_completed(db)
assert is_media_done is False
is_migration_done = await SystemSettingsService.is_migration_legacy_files_completed(db)
assert is_migration_done is False
is_key_cleanup_done = await SystemSettingsService.is_legacy_key_cleanup_completed(db)
assert is_key_cleanup_done is False
# Test marking scans as completed
async with get_db_session() as db:
@@ -56,6 +64,8 @@ async def test_system_settings_integration():
assert settings.initial_scan_completed is False
assert settings.initial_nfo_scan_completed is False
assert settings.initial_media_scan_completed is False
assert settings.migration_legacy_files_completed is False
assert settings.legacy_key_cleanup_completed is False
if __name__ == "__main__":