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

@@ -14,9 +14,7 @@ from sqlalchemy.orm import Session, sessionmaker
from src.server.database.base import Base, SoftDeleteMixin, TimestampMixin
from src.server.database.models import (
AnimeSeries,
DownloadPriority,
DownloadQueueItem,
DownloadStatus,
Episode,
UserSession,
)
@@ -49,11 +47,6 @@ class TestAnimeSeries:
name="Attack on Titan",
site="https://aniworld.to",
folder="/anime/attack-on-titan",
description="Epic anime about titans",
status="completed",
total_episodes=75,
cover_url="https://example.com/cover.jpg",
episode_dict={1: [1, 2, 3], 2: [1, 2, 3, 4]},
)
db_session.add(series)
@@ -172,9 +165,7 @@ class TestEpisode:
episode_number=5,
title="The Fifth Episode",
file_path="/anime/test/S01E05.mp4",
file_size=524288000, # 500 MB
is_downloaded=True,
download_date=datetime.now(timezone.utc),
)
db_session.add(episode)
@@ -225,17 +216,17 @@ class TestDownloadQueueItem:
db_session.add(series)
db_session.commit()
item = DownloadQueueItem(
episode = Episode(
series_id=series.id,
season=1,
episode_number=3,
status=DownloadStatus.DOWNLOADING,
priority=DownloadPriority.HIGH,
progress_percent=45.5,
downloaded_bytes=250000000,
total_bytes=550000000,
download_speed=2500000.0,
retry_count=0,
)
db_session.add(episode)
db_session.commit()
item = DownloadQueueItem(
series_id=series.id,
episode_id=episode.id,
download_url="https://example.com/download/ep3",
file_destination="/anime/download/S01E03.mp4",
)
@@ -245,37 +236,38 @@ class TestDownloadQueueItem:
# Verify saved
assert item.id is not None
assert item.status == DownloadStatus.DOWNLOADING
assert item.priority == DownloadPriority.HIGH
assert item.progress_percent == 45.5
assert item.retry_count == 0
assert item.episode_id == episode.id
assert item.series_id == series.id
def test_download_item_status_enum(self, db_session: Session):
"""Test download status enum values."""
def test_download_item_episode_relationship(self, db_session: Session):
"""Test download item episode relationship."""
series = AnimeSeries(
key="status-test",
name="Status Test",
key="relationship-test",
name="Relationship Test",
site="https://example.com",
folder="/anime/status",
folder="/anime/relationship",
)
db_session.add(series)
db_session.commit()
item = DownloadQueueItem(
episode = Episode(
series_id=series.id,
season=1,
episode_number=1,
status=DownloadStatus.PENDING,
)
db_session.add(episode)
db_session.commit()
item = DownloadQueueItem(
series_id=series.id,
episode_id=episode.id,
)
db_session.add(item)
db_session.commit()
# Update status
item.status = DownloadStatus.COMPLETED
db_session.commit()
# Verify status change
assert item.status == DownloadStatus.COMPLETED
# Verify relationship
assert item.episode.id == episode.id
assert item.series.id == series.id
def test_download_item_error_handling(self, db_session: Session):
"""Test download item with error information."""
@@ -288,21 +280,24 @@ class TestDownloadQueueItem:
db_session.add(series)
db_session.commit()
item = DownloadQueueItem(
episode = Episode(
series_id=series.id,
season=1,
episode_number=1,
status=DownloadStatus.FAILED,
)
db_session.add(episode)
db_session.commit()
item = DownloadQueueItem(
series_id=series.id,
episode_id=episode.id,
error_message="Network timeout after 30 seconds",
retry_count=2,
)
db_session.add(item)
db_session.commit()
# Verify error info
assert item.status == DownloadStatus.FAILED
assert item.error_message == "Network timeout after 30 seconds"
assert item.retry_count == 2
class TestUserSession:
@@ -502,32 +497,31 @@ class TestDatabaseQueries:
db_session.add(series)
db_session.commit()
# Create items with different statuses
for i, status in enumerate([
DownloadStatus.PENDING,
DownloadStatus.DOWNLOADING,
DownloadStatus.COMPLETED,
]):
item = DownloadQueueItem(
# Create episodes and items
for i in range(3):
episode = Episode(
series_id=series.id,
season=1,
episode_number=i + 1,
status=status,
)
db_session.add(episode)
db_session.commit()
item = DownloadQueueItem(
series_id=series.id,
episode_id=episode.id,
)
db_session.add(item)
db_session.commit()
# Query pending items
# Query all items
result = db_session.execute(
select(DownloadQueueItem).where(
DownloadQueueItem.status == DownloadStatus.PENDING
)
select(DownloadQueueItem)
)
pending = result.scalars().all()
items = result.scalars().all()
# Verify query
assert len(pending) == 1
assert pending[0].episode_number == 1
assert len(items) == 3
def test_query_active_sessions(self, db_session: Session):
"""Test querying active user sessions."""