Complete Task 8: Database Support for NFO Status
- Added 5 NFO tracking fields to AnimeSeries model - Fields: has_nfo, nfo_created_at, nfo_updated_at, tmdb_id, tvdb_id - Added 3 service methods to AnimeService for NFO operations - Methods: update_nfo_status, get_series_without_nfo, get_nfo_statistics - SQLAlchemy auto-migration (no manual migration needed) - Backward compatible with existing data - 15 new tests added (19/19 passing) - Tests: database models, service methods, integration queries
This commit is contained in:
@@ -144,6 +144,169 @@ class TestAnimeSeries:
|
||||
)
|
||||
assert result.scalar_one_or_none() is None
|
||||
|
||||
def test_anime_series_nfo_fields_default_values(self, db_session: Session):
|
||||
"""Test NFO fields have correct default values."""
|
||||
series = AnimeSeries(
|
||||
key="nfo-test",
|
||||
name="NFO Test Series",
|
||||
site="https://example.com",
|
||||
folder="/anime/nfo-test",
|
||||
)
|
||||
db_session.add(series)
|
||||
db_session.commit()
|
||||
|
||||
# Verify NFO fields default values
|
||||
assert series.has_nfo is False
|
||||
assert series.nfo_created_at is None
|
||||
assert series.nfo_updated_at is None
|
||||
assert series.tmdb_id is None
|
||||
assert series.tvdb_id is None
|
||||
|
||||
def test_anime_series_nfo_fields_set_values(self, db_session: Session):
|
||||
"""Test setting NFO field values."""
|
||||
now = datetime.now(timezone.utc)
|
||||
|
||||
series = AnimeSeries(
|
||||
key="nfo-values-test",
|
||||
name="NFO Values Test",
|
||||
site="https://example.com",
|
||||
folder="/anime/nfo-values",
|
||||
has_nfo=True,
|
||||
nfo_created_at=now,
|
||||
nfo_updated_at=now,
|
||||
tmdb_id=12345,
|
||||
tvdb_id=67890,
|
||||
)
|
||||
db_session.add(series)
|
||||
db_session.commit()
|
||||
|
||||
# Verify NFO fields are saved
|
||||
assert series.has_nfo is True
|
||||
assert series.nfo_created_at is not None
|
||||
assert series.nfo_updated_at is not None
|
||||
# Check time is close (within 1 second)
|
||||
# Timezone may be lost in SQLite
|
||||
created_delta = abs(
|
||||
(series.nfo_created_at.replace(tzinfo=timezone.utc) - now)
|
||||
.total_seconds()
|
||||
)
|
||||
updated_delta = abs(
|
||||
(series.nfo_updated_at.replace(tzinfo=timezone.utc) - now)
|
||||
.total_seconds()
|
||||
)
|
||||
assert created_delta < 1
|
||||
assert updated_delta < 1
|
||||
assert series.tmdb_id == 12345
|
||||
assert series.tvdb_id == 67890
|
||||
|
||||
def test_anime_series_update_nfo_status(self, db_session: Session):
|
||||
"""Test updating NFO status fields."""
|
||||
series = AnimeSeries(
|
||||
key="nfo-update-test",
|
||||
name="NFO Update Test",
|
||||
site="https://example.com",
|
||||
folder="/anime/nfo-update",
|
||||
)
|
||||
db_session.add(series)
|
||||
db_session.commit()
|
||||
|
||||
# Initially no NFO
|
||||
assert series.has_nfo is False
|
||||
|
||||
# Update NFO status
|
||||
now = datetime.now(timezone.utc)
|
||||
series.has_nfo = True
|
||||
series.nfo_created_at = now
|
||||
series.nfo_updated_at = now
|
||||
series.tmdb_id = 99999
|
||||
db_session.commit()
|
||||
|
||||
# Verify update
|
||||
db_session.refresh(series)
|
||||
assert series.has_nfo is True
|
||||
assert series.nfo_created_at is not None
|
||||
assert series.nfo_updated_at is not None
|
||||
assert series.tmdb_id == 99999
|
||||
|
||||
def test_anime_series_query_by_nfo_status(self, db_session: Session):
|
||||
"""Test querying series by NFO status."""
|
||||
# Create series with and without NFO
|
||||
series_with_nfo = AnimeSeries(
|
||||
key="with-nfo",
|
||||
name="Series With NFO",
|
||||
site="https://example.com",
|
||||
folder="/anime/with-nfo",
|
||||
has_nfo=True,
|
||||
tmdb_id=111,
|
||||
)
|
||||
series_without_nfo = AnimeSeries(
|
||||
key="without-nfo",
|
||||
name="Series Without NFO",
|
||||
site="https://example.com",
|
||||
folder="/anime/without-nfo",
|
||||
has_nfo=False,
|
||||
)
|
||||
|
||||
db_session.add_all([series_with_nfo, series_without_nfo])
|
||||
db_session.commit()
|
||||
|
||||
# Query series with NFO
|
||||
with_nfo = db_session.execute(
|
||||
select(AnimeSeries).where(
|
||||
AnimeSeries.has_nfo == True # noqa: E712
|
||||
)
|
||||
).scalars().all()
|
||||
assert len(with_nfo) == 1
|
||||
assert with_nfo[0].key == "with-nfo"
|
||||
|
||||
# Query series without NFO
|
||||
without_nfo = db_session.execute(
|
||||
select(AnimeSeries).where(
|
||||
AnimeSeries.has_nfo == False # noqa: E712
|
||||
)
|
||||
).scalars().all()
|
||||
assert len(without_nfo) == 1
|
||||
assert without_nfo[0].key == "without-nfo"
|
||||
|
||||
def test_anime_series_query_by_tmdb_id(self, db_session: Session):
|
||||
"""Test querying series by TMDB ID."""
|
||||
series1 = AnimeSeries(
|
||||
key="tmdb-test-1",
|
||||
name="TMDB Test 1",
|
||||
site="https://example.com",
|
||||
folder="/anime/tmdb-1",
|
||||
tmdb_id=12345,
|
||||
)
|
||||
series2 = AnimeSeries(
|
||||
key="tmdb-test-2",
|
||||
name="TMDB Test 2",
|
||||
site="https://example.com",
|
||||
folder="/anime/tmdb-2",
|
||||
tmdb_id=67890,
|
||||
)
|
||||
series3 = AnimeSeries(
|
||||
key="tmdb-test-3",
|
||||
name="TMDB Test 3",
|
||||
site="https://example.com",
|
||||
folder="/anime/tmdb-3",
|
||||
)
|
||||
|
||||
db_session.add_all([series1, series2, series3])
|
||||
db_session.commit()
|
||||
|
||||
# Query by specific TMDB ID
|
||||
result = db_session.execute(
|
||||
select(AnimeSeries).where(AnimeSeries.tmdb_id == 12345)
|
||||
).scalar_one_or_none()
|
||||
assert result is not None
|
||||
assert result.key == "tmdb-test-1"
|
||||
|
||||
# Query series with any TMDB ID
|
||||
with_tmdb = db_session.execute(
|
||||
select(AnimeSeries).where(AnimeSeries.tmdb_id.isnot(None))
|
||||
).scalars().all()
|
||||
assert len(with_tmdb) == 2
|
||||
|
||||
|
||||
class TestEpisode:
|
||||
"""Test cases for Episode model."""
|
||||
|
||||
Reference in New Issue
Block a user