from fastapi.testclient import TestClient from sqlalchemy import create_engine, select from sqlalchemy.orm import Session, sessionmaker from sqlalchemy.pool import StaticPool from app.db import Base from app.main import app from app.models import Task def test_lifespan_marks_running_tasks_failed_after_restart(monkeypatch): engine = create_engine( "sqlite:///:memory:", connect_args={"check_same_thread": False}, poolclass=StaticPool, ) TestingSessionLocal = sessionmaker(bind=engine, autoflush=False, autocommit=False) Base.metadata.create_all(engine) with TestingSessionLocal() as session: session.add(Task(platform="xiaohongshu", status="running")) session.commit() monkeypatch.setattr("app.main.SessionLocal", TestingSessionLocal, raising=False) monkeypatch.setattr("app.main.init_db", lambda: None) try: with TestClient(app): pass with Session(engine) as session: task = session.scalar(select(Task)) assert task is not None assert task.status == "failed" assert task.error_stage == "system" assert task.error_type == "unexpected_restart" assert task.error_message == "系统重启,任务被中断" finally: engine.dispose()