Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions alembic/env.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@
from alembic import context
from sqlalchemy import engine_from_config, pool

from sqlmodel import SQLModel

from app.core.config import DATABASE_URL
from app.models.models import SQLModel
from app.models import Template, FormSubmission
from app.models import FormSubmission, Job, Template

config = context.config

Expand Down
38 changes: 25 additions & 13 deletions alembic/versions/001_initial_schema.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"""Initial schema — Template and FormSubmission tables.
"""Initial schema — Template, FormSubmission, and Job tables.

Revision ID: 001
Revises:
Expand All @@ -24,12 +24,7 @@ def upgrade() -> None:
sa.Column("name", sqlmodel.sql.sqltypes.AutoString, nullable=False),
sa.Column("fields", sa.JSON, nullable=False),
sa.Column("pdf_path", sqlmodel.sql.sqltypes.AutoString, nullable=False),
sa.Column(
"created_at",
sa.DateTime,
nullable=False,
server_default=sa.text("now()"),
),
sa.Column("created_at", sa.DateTime, nullable=False),
)

op.create_table(
Expand All @@ -38,15 +33,32 @@ def upgrade() -> None:
sa.Column("template_id", sa.Integer, sa.ForeignKey("template.id"), nullable=False),
sa.Column("input_text", sqlmodel.sql.sqltypes.AutoString, nullable=False),
sa.Column("output_pdf_path", sqlmodel.sql.sqltypes.AutoString, nullable=False),
sa.Column(
"created_at",
sa.DateTime,
nullable=False,
server_default=sa.text("now()"),
),
sa.Column("created_at", sa.DateTime, nullable=False),
)

op.create_table(
"job",
sa.Column("id", sa.Integer, primary_key=True, autoincrement=True),
sa.Column("job_id", sqlmodel.sql.sqltypes.AutoString, nullable=False),
sa.Column("celery_task_id", sqlmodel.sql.sqltypes.AutoString, nullable=False),
sa.Column("job_type", sqlmodel.sql.sqltypes.AutoString, nullable=False),
sa.Column("template_id", sa.Integer, sa.ForeignKey("template.id"), nullable=True),
sa.Column("input_text", sqlmodel.sql.sqltypes.AutoString, nullable=True),
sa.Column("status", sqlmodel.sql.sqltypes.AutoString, nullable=False),
sa.Column("progress_percent", sa.Integer, nullable=False),
sa.Column("result_url", sqlmodel.sql.sqltypes.AutoString, nullable=True),
sa.Column("error", sa.JSON, nullable=True),
sa.Column("model", sqlmodel.sql.sqltypes.AutoString, nullable=True),
sa.Column("created_at", sa.DateTime, nullable=False),
sa.Column("updated_at", sa.DateTime, nullable=False),
)
op.create_index("ix_job_job_id", "job", ["job_id"], unique=True)
op.create_index("ix_job_celery_task_id", "job", ["celery_task_id"], unique=False)


def downgrade() -> None:
op.drop_index("ix_job_celery_task_id", table_name="job")
op.drop_index("ix_job_job_id", table_name="job")
op.drop_table("job")
op.drop_table("formsubmission")
op.drop_table("template")
2 changes: 1 addition & 1 deletion app/models/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
class Template(SQLModel, table=True):
id: int | None = Field(default=None, primary_key=True)
name: str
fields: dict = Field(sa_column=Column(JSON))
fields: dict = Field(sa_column=Column(JSON, nullable=False))
pdf_path: str
created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))

Expand Down
43 changes: 43 additions & 0 deletions tests/test_migrations.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ def test_upgrade_head(alembic_cfg, alembic_engine):
tables = inspector.get_table_names()
assert "template" in tables
assert "formsubmission" in tables
assert "job" in tables
assert "alembic_version" in tables


Expand All @@ -46,6 +47,7 @@ def test_downgrade_base(alembic_cfg, alembic_engine):
tables = inspector.get_table_names()
assert "template" not in tables
assert "formsubmission" not in tables
assert "job" not in tables


def test_round_trip(alembic_cfg, alembic_engine):
Expand Down Expand Up @@ -83,3 +85,44 @@ def test_formsubmission_fk(alembic_cfg, alembic_engine):
assert len(fks) == 1
assert fks[0]["referred_table"] == "template"
assert fks[0]["referred_columns"] == ["id"]


def test_job_columns(alembic_cfg, alembic_engine):
command.upgrade(alembic_cfg, "head")

inspector = inspect(alembic_engine)
columns = {c["name"] for c in inspector.get_columns("job")}
assert columns == {
"id",
"job_id",
"celery_task_id",
"job_type",
"template_id",
"input_text",
"status",
"progress_percent",
"result_url",
"error",
"model",
"created_at",
"updated_at",
}


def test_job_indexes(alembic_cfg, alembic_engine):
command.upgrade(alembic_cfg, "head")

inspector = inspect(alembic_engine)
indexes = {ix["name"]: ix for ix in inspector.get_indexes("job")}
assert indexes["ix_job_job_id"]["unique"]
assert not indexes["ix_job_celery_task_id"]["unique"]


def test_job_fk(alembic_cfg, alembic_engine):
command.upgrade(alembic_cfg, "head")

inspector = inspect(alembic_engine)
fks = inspector.get_foreign_keys("job")
assert len(fks) == 1
assert fks[0]["referred_table"] == "template"
assert fks[0]["referred_columns"] == ["id"]