better db model
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
# ============================================================================
|
||||
|
||||
Reference in New Issue
Block a user