Task 3.3: Update ProgressService to use key as identifier

- Added optional 'key' and 'folder' fields to ProgressUpdate dataclass
- key: Primary series identifier (provider key, e.g., 'attack-on-titan')
- folder: Optional series folder name for display (e.g., 'Attack on Titan (2013)')
- Updated start_progress() and update_progress() methods to accept key/folder parameters
- Enhanced to_dict() serialization to include key/folder when present
- Updated all docstrings to clarify identifier usage
- Added 5 new comprehensive unit tests for key/folder functionality
- All 25 ProgressService tests passing
- Updated infrastructure.md with series identifier documentation
- Maintains backward compatibility - fields are optional
- Completed Phase 3, Task 3.3 of identifier standardization initiative
This commit is contained in:
2025-11-27 18:36:35 +01:00
parent dda999fb98
commit fb2cdd4bb6
4 changed files with 179 additions and 9 deletions

View File

@@ -508,3 +508,94 @@ class TestProgressService:
assert progress.metadata["initial"] == "value"
assert progress.metadata["additional"] == "data"
assert progress.metadata["speed"] == 1.5
@pytest.mark.asyncio
async def test_progress_with_key_and_folder(self, service):
"""Test progress tracking with series key and folder."""
# Start progress with key and folder
update = await service.start_progress(
progress_id="download-series-1",
progress_type=ProgressType.DOWNLOAD,
title="Downloading Attack on Titan",
key="attack-on-titan",
folder="Attack on Titan (2013)",
total=100,
)
assert update.key == "attack-on-titan"
assert update.folder == "Attack on Titan (2013)"
# Verify to_dict includes key and folder
dict_repr = update.to_dict()
assert dict_repr["key"] == "attack-on-titan"
assert dict_repr["folder"] == "Attack on Titan (2013)"
# Update progress and verify key/folder are preserved
updated = await service.update_progress(
progress_id="download-series-1",
current=50,
)
assert updated.key == "attack-on-titan"
assert updated.folder == "Attack on Titan (2013)"
@pytest.mark.asyncio
async def test_progress_update_key_and_folder(self, service):
"""Test updating key and folder in existing progress."""
# Start without key/folder
await service.start_progress(
progress_id="test-1",
progress_type=ProgressType.SCAN,
title="Test Scan",
)
# Update with key and folder
updated = await service.update_progress(
progress_id="test-1",
key="one-piece",
folder="One Piece (1999)",
current=10,
)
assert updated.key == "one-piece"
assert updated.folder == "One Piece (1999)"
# Verify to_dict includes the fields
dict_repr = updated.to_dict()
assert dict_repr["key"] == "one-piece"
assert dict_repr["folder"] == "One Piece (1999)"
def test_progress_update_to_dict_without_key_folder(self):
"""Test to_dict doesn't include key/folder if not set."""
update = ProgressUpdate(
id="test-1",
type=ProgressType.SYSTEM,
status=ProgressStatus.STARTED,
title="System Task",
)
result = update.to_dict()
# key and folder should not be in dict if not set
assert "key" not in result
assert "folder" not in result
def test_progress_update_creation_with_key_folder(self):
"""Test creating progress update with key and folder."""
update = ProgressUpdate(
id="test-1",
type=ProgressType.DOWNLOAD,
status=ProgressStatus.STARTED,
title="Test Download",
key="naruto",
folder="Naruto (2002)",
total=100,
)
assert update.key == "naruto"
assert update.folder == "Naruto (2002)"
# Verify to_dict includes them
result = update.to_dict()
assert result["key"] == "naruto"
assert result["folder"] == "Naruto (2002)"