Skip to content

Commit

Permalink
Create Case Tracker model (#48)
Browse files Browse the repository at this point in the history
  • Loading branch information
said-moj authored Oct 17, 2024
1 parent 93ea908 commit 0565476
Show file tree
Hide file tree
Showing 6 changed files with 119 additions and 2 deletions.
4 changes: 2 additions & 2 deletions alembic.ini
Original file line number Diff line number Diff line change
Expand Up @@ -72,11 +72,11 @@ sqlalchemy.url = None
hooks = lint, format

lint.type = exec
lint.executable = %(here)s/.venv/bin/ruff
lint.executable = ruff
lint.options = check --fix REVISION_SCRIPT_FILENAME

format.type = exec
format.executable = %(here)s/.venv/bin/ruff
format.executable = ruff
format.options = format REVISION_SCRIPT_FILENAME

# Logging configuration
Expand Down
49 changes: 49 additions & 0 deletions app/db/migrations/versions/117a6ec2770b_case_tracker.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
"""case_tracker
Revision ID: 117a6ec2770b
Revises: da58faadfe41
Create Date: 2024-10-16 08:59:53.139922
"""

from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa
import sqlmodel


# revision identifiers, used by Alembic.
revision: str = "117a6ec2770b"
down_revision: Union[str, None] = "da58faadfe41"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.create_table(
"case_tracker",
sa.Column("created_at", sa.DateTime(), nullable=False),
sa.Column("updated_at", sa.DateTime(), nullable=False),
sa.Column("id", sa.Uuid(), nullable=False),
sa.Column("case_id", sa.Uuid(), nullable=False),
sa.Column("gtm_anon_id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
sa.Column("journey", sa.JSON(), nullable=False),
sa.ForeignKeyConstraint(
["case_id"],
["cases.id"],
),
sa.PrimaryKeyConstraint("id"),
)
op.create_index(
op.f("ix_case_tracker_case_id"), "case_tracker", ["case_id"], unique=False
)
# ### end Alembic commands ###


def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index(op.f("ix_case_tracker_case_id"), table_name="case_tracker")
op.drop_table("case_tracker")
# ### end Alembic commands ###
17 changes: 17 additions & 0 deletions app/models/case_tracker.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from uuid import UUID
from sqlmodel import SQLModel, Field, JSON, Relationship
from app.models.base import TableModelMixin


class CaseTrackerBase(SQLModel):
case_id: UUID = Field(foreign_key="cases.id", index=True)
gtm_anon_id: str = Field()
journey: dict = Field(sa_type=JSON)


class CaseTracker(CaseTrackerBase, TableModelMixin, table=True):
__tablename__ = "case_tracker"
# This allows for linking the case tracker back to the case, this allows us to address case tracker
# directly by using the `Case.case_tracker` syntax, rather than searching for each eligibility outcome
# using its ID.
case: "Case" = Relationship(back_populates="case_tracker") # noqa: F821
2 changes: 2 additions & 0 deletions app/models/cases.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from app.models.types.case_types import CaseTypes
from app.models.case_notes import CaseNote
from app.models.person import Person
from app.models.case_tracker import CaseTracker


class BaseCase(SQLModel):
Expand All @@ -16,6 +17,7 @@ class Case(BaseCase, TableModelMixin, table=True):
# Cascade delete ensures all related fields are deleted when the attached case is deleted.
notes: List[CaseNote] = Relationship(back_populates="case", cascade_delete=True)
people: List[Person] = Relationship(back_populates="case", cascade_delete=True)
case_tracker: CaseTracker = Relationship(back_populates="case", cascade_delete=True)


class CaseRequest(BaseCase):
Expand Down
Empty file added tests/case_tracker/__init__.py
Empty file.
49 changes: 49 additions & 0 deletions tests/case_tracker/test_case_tracker.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
from app.models.case_tracker import CaseTracker
from app.models.cases import Case, CaseTypes
import uuid
from sqlmodel import Session, select


def create_case_tracker(case_id=None):
return CaseTracker(
case_id=case_id or uuid.uuid4(),
gtm_anon_id=str(uuid.uuid4()),
journey={
"source": "access",
"scope": "access",
"means": "chs",
"last_app": "ccq",
},
)


def test_create_case_tracker(session: Session):
case_tracker = create_case_tracker()
session.add(case_tracker)
session.commit()
assert session.exec(select(CaseTracker)).all() == [case_tracker]


def test_case_tracker_journey_dict(session: Session):
case_tracker = create_case_tracker()
session.add(case_tracker)
session.commit()
expected_journey = case_tracker.journey

case_tracker = session.exec(select(CaseTracker)).first()
assert type(case_tracker.journey) is dict
assert case_tracker.journey == expected_journey


def test_cascade_delete(session: Session):
"""If a case is deleted the case_tracker attached to said case should also be deleted."""
case = Case(case_type=CaseTypes.CLA)
case_tracker = create_case_tracker(case_id=case.id)
session.add(case)
session.add(case_tracker)
session.commit()
assert session.exec(select(CaseTracker)).all() == [case_tracker]

session.delete(case)
session.commit()
assert session.exec(select(CaseTracker)).all() == []

0 comments on commit 0565476

Please sign in to comment.