better db model

This commit is contained in:
2025-12-04 19:22:42 +01:00
parent 942f14f746
commit 798461a1ea
18 changed files with 551 additions and 2161 deletions

View File

@@ -10,7 +10,6 @@ from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemy.orm import sessionmaker
from src.server.database.base import Base
from src.server.database.models import DownloadPriority, DownloadStatus
from src.server.database.service import (
AnimeSeriesService,
DownloadQueueService,
@@ -65,17 +64,11 @@ async def test_create_anime_series(db_session):
name="Test Anime",
site="https://example.com",
folder="/path/to/anime",
description="A test anime",
status="ongoing",
total_episodes=12,
cover_url="https://example.com/cover.jpg",
)
assert series.id is not None
assert series.key == "test-anime-1"
assert series.name == "Test Anime"
assert series.description == "A test anime"
assert series.total_episodes == 12
@pytest.mark.asyncio
@@ -160,13 +153,11 @@ async def test_update_anime_series(db_session):
db_session,
series.id,
name="Updated Name",
total_episodes=24,
)
await db_session.commit()
assert updated is not None
assert updated.name == "Updated Name"
assert updated.total_episodes == 24
@pytest.mark.asyncio
@@ -308,14 +299,12 @@ async def test_mark_episode_downloaded(db_session):
db_session,
episode.id,
file_path="/path/to/file.mp4",
file_size=1024000,
)
await db_session.commit()
assert updated is not None
assert updated.is_downloaded is True
assert updated.file_path == "/path/to/file.mp4"
assert updated.download_date is not None
# ============================================================================
@@ -336,23 +325,30 @@ async def test_create_download_queue_item(db_session):
)
await db_session.commit()
# Add to queue
item = await DownloadQueueService.create(
# Create episode
episode = await EpisodeService.create(
db_session,
series_id=series.id,
season=1,
episode_number=1,
priority=DownloadPriority.HIGH,
)
await db_session.commit()
# Add to queue
item = await DownloadQueueService.create(
db_session,
series_id=series.id,
episode_id=episode.id,
)
assert item.id is not None
assert item.status == DownloadStatus.PENDING
assert item.priority == DownloadPriority.HIGH
assert item.episode_id == episode.id
assert item.series_id == series.id
@pytest.mark.asyncio
async def test_get_pending_downloads(db_session):
"""Test retrieving pending downloads."""
async def test_get_download_queue_item_by_episode(db_session):
"""Test retrieving download queue item by episode."""
# Create series
series = await AnimeSeriesService.create(
db_session,
@@ -362,29 +358,32 @@ async def test_get_pending_downloads(db_session):
folder="/path/test5",
)
# Add pending items
await DownloadQueueService.create(
# Create episode
episode = await EpisodeService.create(
db_session,
series_id=series.id,
season=1,
episode_number=1,
)
await db_session.commit()
# Add to queue
await DownloadQueueService.create(
db_session,
series_id=series.id,
season=1,
episode_number=2,
episode_id=episode.id,
)
await db_session.commit()
# Retrieve pending
pending = await DownloadQueueService.get_pending(db_session)
assert len(pending) == 2
# Retrieve by episode
item = await DownloadQueueService.get_by_episode(db_session, episode.id)
assert item is not None
assert item.episode_id == episode.id
@pytest.mark.asyncio
async def test_update_download_status(db_session):
"""Test updating download status."""
async def test_set_download_error(db_session):
"""Test setting error on download queue item."""
# Create series and queue item
series = await AnimeSeriesService.create(
db_session,
@@ -393,30 +392,34 @@ async def test_update_download_status(db_session):
site="https://example.com",
folder="/path/test6",
)
item = await DownloadQueueService.create(
episode = await EpisodeService.create(
db_session,
series_id=series.id,
season=1,
episode_number=1,
)
item = await DownloadQueueService.create(
db_session,
series_id=series.id,
episode_id=episode.id,
)
await db_session.commit()
# Update status
updated = await DownloadQueueService.update_status(
# Set error
updated = await DownloadQueueService.set_error(
db_session,
item.id,
DownloadStatus.DOWNLOADING,
"Network error",
)
await db_session.commit()
assert updated is not None
assert updated.status == DownloadStatus.DOWNLOADING
assert updated.started_at is not None
assert updated.error_message == "Network error"
@pytest.mark.asyncio
async def test_update_download_progress(db_session):
"""Test updating download progress."""
async def test_delete_download_queue_item_by_episode(db_session):
"""Test deleting download queue item by episode."""
# Create series and queue item
series = await AnimeSeriesService.create(
db_session,
@@ -425,109 +428,31 @@ async def test_update_download_progress(db_session):
site="https://example.com",
folder="/path/test7",
)
item = await DownloadQueueService.create(
episode = await EpisodeService.create(
db_session,
series_id=series.id,
season=1,
episode_number=1,
)
await db_session.commit()
# Update progress
updated = await DownloadQueueService.update_progress(
db_session,
item.id,
progress_percent=50.0,
downloaded_bytes=500000,
total_bytes=1000000,
download_speed=50000.0,
)
await db_session.commit()
assert updated is not None
assert updated.progress_percent == 50.0
assert updated.downloaded_bytes == 500000
assert updated.total_bytes == 1000000
@pytest.mark.asyncio
async def test_clear_completed_downloads(db_session):
"""Test clearing completed downloads."""
# Create series and completed items
series = await AnimeSeriesService.create(
db_session,
key="test-series-8",
name="Test Series 8",
site="https://example.com",
folder="/path/test8",
)
item1 = await DownloadQueueService.create(
await DownloadQueueService.create(
db_session,
series_id=series.id,
season=1,
episode_number=1,
)
item2 = await DownloadQueueService.create(
db_session,
series_id=series.id,
season=1,
episode_number=2,
)
# Mark items as completed
await DownloadQueueService.update_status(
db_session,
item1.id,
DownloadStatus.COMPLETED,
)
await DownloadQueueService.update_status(
db_session,
item2.id,
DownloadStatus.COMPLETED,
episode_id=episode.id,
)
await db_session.commit()
# Clear completed
count = await DownloadQueueService.clear_completed(db_session)
await db_session.commit()
assert count == 2
@pytest.mark.asyncio
async def test_retry_failed_downloads(db_session):
"""Test retrying failed downloads."""
# Create series and failed item
series = await AnimeSeriesService.create(
# Delete by episode
deleted = await DownloadQueueService.delete_by_episode(
db_session,
key="test-series-9",
name="Test Series 9",
site="https://example.com",
folder="/path/test9",
)
item = await DownloadQueueService.create(
db_session,
series_id=series.id,
season=1,
episode_number=1,
)
# Mark as failed
await DownloadQueueService.update_status(
db_session,
item.id,
DownloadStatus.FAILED,
error_message="Network error",
episode.id,
)
await db_session.commit()
# Retry
retried = await DownloadQueueService.retry_failed(db_session)
await db_session.commit()
assert deleted is True
assert len(retried) == 1
assert retried[0].status == DownloadStatus.PENDING
assert retried[0].error_message is None
# Verify deleted
item = await DownloadQueueService.get_by_episode(db_session, episode.id)
assert item is None
# ============================================================================