better db model
This commit is contained in:
@@ -153,29 +153,40 @@ class TestMigrationIdempotency:
|
||||
}
|
||||
(series_dir / "data").write_text(json.dumps(data))
|
||||
|
||||
# Mock existing series in database
|
||||
# Mock existing series in database with same episodes
|
||||
existing = MagicMock()
|
||||
existing.id = 1
|
||||
existing.episode_dict = {"1": [1, 2]} # Same data
|
||||
|
||||
# Mock episodes matching data file
|
||||
mock_episodes = [
|
||||
MagicMock(season=1, episode_number=1),
|
||||
MagicMock(season=1, episode_number=2),
|
||||
]
|
||||
|
||||
service = DataMigrationService()
|
||||
|
||||
with patch(
|
||||
'src.server.services.data_migration_service.AnimeSeriesService'
|
||||
) as MockService:
|
||||
MockService.get_by_key = AsyncMock(return_value=existing)
|
||||
|
||||
mock_db = AsyncMock()
|
||||
mock_db.commit = AsyncMock()
|
||||
|
||||
result = await service.migrate_all(tmp_dir, mock_db)
|
||||
|
||||
# Should skip since data is same
|
||||
assert result.total_found == 1
|
||||
assert result.skipped == 1
|
||||
assert result.migrated == 0
|
||||
# Should not call create
|
||||
MockService.create.assert_not_called()
|
||||
with patch(
|
||||
'src.server.services.data_migration_service.EpisodeService'
|
||||
) as MockEpisodeService:
|
||||
MockService.get_by_key = AsyncMock(return_value=existing)
|
||||
MockEpisodeService.get_by_series = AsyncMock(
|
||||
return_value=mock_episodes
|
||||
)
|
||||
|
||||
mock_db = AsyncMock()
|
||||
mock_db.commit = AsyncMock()
|
||||
|
||||
result = await service.migrate_all(tmp_dir, mock_db)
|
||||
|
||||
# Should skip since data is same
|
||||
assert result.total_found == 1
|
||||
assert result.skipped == 1
|
||||
assert result.migrated == 0
|
||||
# Should not call create
|
||||
MockService.create.assert_not_called()
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_migration_updates_changed_episodes(self):
|
||||
@@ -196,25 +207,37 @@ class TestMigrationIdempotency:
|
||||
# Mock existing series with fewer episodes
|
||||
existing = MagicMock()
|
||||
existing.id = 1
|
||||
existing.episode_dict = {"1": [1, 2]} # Fewer episodes
|
||||
|
||||
# Mock existing episodes (fewer than data file)
|
||||
mock_episodes = [
|
||||
MagicMock(season=1, episode_number=1),
|
||||
MagicMock(season=1, episode_number=2),
|
||||
]
|
||||
|
||||
service = DataMigrationService()
|
||||
|
||||
with patch(
|
||||
'src.server.services.data_migration_service.AnimeSeriesService'
|
||||
) as MockService:
|
||||
MockService.get_by_key = AsyncMock(return_value=existing)
|
||||
MockService.update = AsyncMock()
|
||||
|
||||
mock_db = AsyncMock()
|
||||
mock_db.commit = AsyncMock()
|
||||
|
||||
result = await service.migrate_all(tmp_dir, mock_db)
|
||||
|
||||
# Should update since data changed
|
||||
assert result.total_found == 1
|
||||
assert result.migrated == 1
|
||||
MockService.update.assert_called_once()
|
||||
with patch(
|
||||
'src.server.services.data_migration_service.EpisodeService'
|
||||
) as MockEpisodeService:
|
||||
MockService.get_by_key = AsyncMock(return_value=existing)
|
||||
MockEpisodeService.get_by_series = AsyncMock(
|
||||
return_value=mock_episodes
|
||||
)
|
||||
MockEpisodeService.create = AsyncMock()
|
||||
|
||||
mock_db = AsyncMock()
|
||||
mock_db.commit = AsyncMock()
|
||||
|
||||
result = await service.migrate_all(tmp_dir, mock_db)
|
||||
|
||||
# Should update since data changed
|
||||
assert result.total_found == 1
|
||||
assert result.migrated == 1
|
||||
# Should create 3 new episodes (3, 4, 5)
|
||||
assert MockEpisodeService.create.call_count == 3
|
||||
|
||||
|
||||
class TestMigrationOnFreshStart:
|
||||
@@ -348,13 +371,18 @@ class TestSerieListReadsFromDatabase:
|
||||
# Create mock series in database with spec to avoid mock attributes
|
||||
from dataclasses import dataclass
|
||||
|
||||
@dataclass
|
||||
class MockEpisode:
|
||||
season: int
|
||||
episode_number: int
|
||||
|
||||
@dataclass
|
||||
class MockAnimeSeries:
|
||||
key: str
|
||||
name: str
|
||||
site: str
|
||||
folder: str
|
||||
episode_dict: dict
|
||||
episodes: list
|
||||
|
||||
mock_series = [
|
||||
MockAnimeSeries(
|
||||
@@ -362,14 +390,18 @@ class TestSerieListReadsFromDatabase:
|
||||
name="Anime 1",
|
||||
site="aniworld.to",
|
||||
folder="Anime 1",
|
||||
episode_dict={"1": [1, 2, 3]}
|
||||
episodes=[
|
||||
MockEpisode(1, 1), MockEpisode(1, 2), MockEpisode(1, 3)
|
||||
]
|
||||
),
|
||||
MockAnimeSeries(
|
||||
key="anime-2",
|
||||
name="Anime 2",
|
||||
site="aniworld.to",
|
||||
folder="Anime 2",
|
||||
episode_dict={"1": [1, 2], "2": [1]}
|
||||
episodes=[
|
||||
MockEpisode(1, 1), MockEpisode(1, 2), MockEpisode(2, 1)
|
||||
]
|
||||
)
|
||||
]
|
||||
|
||||
@@ -389,8 +421,8 @@ class TestSerieListReadsFromDatabase:
|
||||
# Load from database
|
||||
await serie_list.load_series_from_db(mock_db)
|
||||
|
||||
# Verify service was called
|
||||
mock_get_all.assert_called_once_with(mock_db)
|
||||
# Verify service was called with with_episodes=True
|
||||
mock_get_all.assert_called_once_with(mock_db, with_episodes=True)
|
||||
|
||||
# Verify series were loaded
|
||||
all_series = serie_list.get_all()
|
||||
|
||||
Reference in New Issue
Block a user