From 15dac50367935f37338bdbfed812257d109f1f9d Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Mon, 18 May 2026 09:38:43 -0400 Subject: [PATCH] feat(post): add nullable description + attachment_count (migration 0007) Co-Authored-By: Claude Opus 4.7 (1M context) --- .../0007_fc2d_post_metadata_fields.py | 31 ++++++++++++ backend/app/models/post.py | 3 ++ tests/test_migration_0007.py | 48 +++++++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 alembic/versions/0007_fc2d_post_metadata_fields.py create mode 100644 tests/test_migration_0007.py diff --git a/alembic/versions/0007_fc2d_post_metadata_fields.py b/alembic/versions/0007_fc2d_post_metadata_fields.py new file mode 100644 index 0000000..24e8ba9 --- /dev/null +++ b/alembic/versions/0007_fc2d_post_metadata_fields.py @@ -0,0 +1,31 @@ +"""fc2d-iv: post.description + post.attachment_count + +Revision ID: 0007 +Revises: 0006 +Create Date: 2026-05-18 + +""" +from typing import Sequence, Union + +import sqlalchemy as sa +from alembic import op + +revision: str = "0007" +down_revision: Union[str, None] = "0006" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + op.add_column( + "post", sa.Column("description", sa.Text(), nullable=True) + ) + op.add_column( + "post", + sa.Column("attachment_count", sa.Integer(), nullable=True), + ) + + +def downgrade() -> None: + op.drop_column("post", "attachment_count") + op.drop_column("post", "description") diff --git a/backend/app/models/post.py b/backend/app/models/post.py index 56cf030..d5263c9 100644 --- a/backend/app/models/post.py +++ b/backend/app/models/post.py @@ -28,6 +28,9 @@ class Post(Base): raw_metadata: Mapped[dict | None] = mapped_column(JSON, nullable=True) + description: Mapped[str | None] = mapped_column(Text, nullable=True) + attachment_count: Mapped[int | None] = mapped_column(Integer, nullable=True) + downloaded_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), nullable=False, server_default=func.now() ) diff --git a/tests/test_migration_0007.py b/tests/test_migration_0007.py new file mode 100644 index 0000000..d452f2e --- /dev/null +++ b/tests/test_migration_0007.py @@ -0,0 +1,48 @@ +"""FC-2d-iv: post.description + post.attachment_count round-trip.""" + +from datetime import UTC, datetime + +import pytest + +from backend.app.models import Artist, Post, Source + +pytestmark = pytest.mark.integration + + +async def _post(db, **post_kwargs): + artist = Artist(name="Nadia", slug="nadia") + db.add(artist) + await db.flush() + src = Source(artist_id=artist.id, platform="web", url="http://x") + db.add(src) + await db.flush() + post = Post( + source_id=src.id, external_post_id="p1", + post_date=datetime(2026, 3, 1, tzinfo=UTC), + **post_kwargs, + ) + db.add(post) + await db.flush() + return post.id + + +def test_post_has_new_columns(): + cols = {c.name for c in Post.__table__.columns} + assert "description" in cols + assert "attachment_count" in cols + + +@pytest.mark.asyncio +async def test_description_and_attachment_count_round_trip(db): + pid = await _post(db, description="

hi

", attachment_count=3) + row = await db.get(Post, pid) + assert row.description == "

hi

" + assert row.attachment_count == 3 + + +@pytest.mark.asyncio +async def test_new_fields_default_null(db): + pid = await _post(db) + row = await db.get(Post, pid) + assert row.description is None + assert row.attachment_count is None