kirche-einfach/backend/tests/test_models.py

88 lines
2.8 KiB
Python

"""Model-level tests: defaults, constraints, JSON roundtrip, linkage."""
import pytest
from sqlalchemy.exc import IntegrityError
from sqlmodel import select
from app.models import ApprovalTask, FlowDefinition, FlowRun, FlowVersion
def test_flow_definition_defaults(session):
from datetime import UTC, datetime
before = datetime.now(UTC).replace(tzinfo=None)
d = FlowDefinition(name="bauvorhaben")
session.add(d)
session.commit()
session.refresh(d)
assert d.id is not None
assert d.status == "active"
assert d.continuation_flow_id is None
assert d.created_at is not None
# Timestamps are written as UTC. SQLite does not round-trip tzinfo, so
# after a refresh the value is calendar-time UTC without tzinfo.
assert d.created_at.tzinfo is None
assert abs((d.created_at - before).total_seconds()) < 60
def test_flow_definition_name_unique(session):
session.add(FlowDefinition(name="doppelt"))
session.commit()
session.add(FlowDefinition(name="doppelt"))
with pytest.raises(IntegrityError):
session.commit()
session.rollback()
def test_flow_version_unique_per_flow(session):
d = FlowDefinition(name="v-flow")
session.add(d)
session.commit()
session.add(FlowVersion(flow_id=d.id, version_no=1, author="a"))
session.commit()
session.add(FlowVersion(flow_id=d.id, version_no=1, author="b"))
with pytest.raises(IntegrityError):
session.commit()
session.rollback()
session.add(FlowVersion(flow_id=d.id, version_no=2, author="b"))
session.commit()
def test_flow_version_json_roundtrip(session):
payload = {"data": {"nodes": [{"id": "n1"}], "edges": []}, "name": "x"}
d = FlowDefinition(name="json-flow")
session.add(d)
session.commit()
v = FlowVersion(flow_id=d.id, version_no=1, langflow_json=payload)
session.add(v)
session.commit()
session.refresh(v)
assert v.langflow_json == payload
assert v.deployed_at is None
assert v.lfx_flow_id is None
def test_run_and_task_linkage_with_tenant_default(session):
d = FlowDefinition(name="linked")
session.add(d)
session.commit()
v = FlowVersion(flow_id=d.id, version_no=1)
session.add(v)
session.commit()
run = FlowRun(version_id=v.id, input={"a": 1})
session.add(run)
session.commit()
task = ApprovalTask(run_id=run.id, version_id=v.id, title="bitte pruefen")
session.add(task)
session.commit()
assert run.tenant_id == "default"
assert run.status == "running"
assert task.tenant_id == "default"
assert task.status == "open"
runs = session.exec(select(FlowRun).where(FlowRun.version_id == v.id)).all()
assert len(runs) == 1
tasks = session.exec(select(ApprovalTask).where(ApprovalTask.run_id == run.id)).all()
assert len(tasks) == 1
assert tasks[0].payload == {}