test_mysql_langgraph_checkpoint.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. from datetime import UTC, datetime
  2. from sqlalchemy import create_engine
  3. from sqlalchemy.orm import sessionmaker
  4. from zbt.domains.surrender.models import SurrenderRequest
  5. from zbt.domains.surrender.workflow import SurrenderWorkflow
  6. from zbt.infrastructure.mysql.core_models import (
  7. LangGraphBlobRecord,
  8. LangGraphCheckpointRecord,
  9. LangGraphWriteRecord,
  10. )
  11. from zbt.infrastructure.mysql.langgraph_checkpoint import (
  12. MySqlLangGraphCheckpointSaver,
  13. )
  14. def test_workflow_resumes_from_database_after_runtime_is_recreated(tmp_path) -> None:
  15. engine = create_engine(f"sqlite:///{tmp_path / 'checkpoint.db'}")
  16. for table in (
  17. LangGraphCheckpointRecord.__table__,
  18. LangGraphBlobRecord.__table__,
  19. LangGraphWriteRecord.__table__,
  20. ):
  21. table.create(engine)
  22. factory = sessionmaker(bind=engine, expire_on_commit=False)
  23. request = SurrenderRequest(
  24. id="01KZ0000000000000000000091",
  25. request_no="ZBT-TB-20260726-0091",
  26. user_id="01KZ0000000000000000000092",
  27. policy_id="01KZ0000000000000000000093",
  28. idempotency_key="checkpoint-test-001",
  29. reason="保障计划调整",
  30. status="WAITING_APPROVAL",
  31. refund_amount_cents=30_600,
  32. currency="CNY",
  33. rule_version="surrender-v1",
  34. calculation={},
  35. workflow_thread_id="surrender:01KZ0000000000000000000091",
  36. created_at=datetime(2026, 7, 26, tzinfo=UTC),
  37. )
  38. first_runtime = SurrenderWorkflow(MySqlLangGraphCheckpointSaver(factory))
  39. paused = first_runtime.start(request)
  40. del first_runtime
  41. restarted_runtime = SurrenderWorkflow(MySqlLangGraphCheckpointSaver(factory))
  42. resumed = restarted_runtime.resume_review(
  43. request,
  44. approved=True,
  45. note="审批通过",
  46. reviewed_by="01KZ0000000000000000000094",
  47. )
  48. assert paused["paused"] is True
  49. assert paused["step"] == "OPERATIONS_APPROVAL"
  50. assert paused["risk_level"] == "HIGH"
  51. assert paused["handoff"]["request_no"] == request.request_no
  52. assert resumed["workflow_status"] == "REFUND_PENDING"