import sys from datetime import datetime, timezone from pathlib import Path from types import SimpleNamespace sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "apps" / "api")) sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "apps" / "worker")) from app.api.routes.generation_tasks import _select_title_id from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from worker_app.core.title_usage import mark_title_used_for_generation from packages.adapters.sqlalchemy_impl.models import Base, ProjectTitleModel from packages.adapters.sqlalchemy_impl.project_title_repository import SQLAlchemyProjectTitleRepository def _session_and_repository(): engine = create_engine("sqlite:///:memory:") Base.metadata.create_all(engine) session = sessionmaker(bind=engine)() return session, SQLAlchemyProjectTitleRepository(session) def test_select_title_prefers_favorite_then_lowest_usage(): _, repository = _session_and_repository() normal = repository.create( workspace_id="workspace-1", project_id="project-1", text="普通标题", category="default", created_by_user_id="user-1", ) favorite = repository.create( workspace_id="workspace-1", project_id="project-1", text="常用标题", category="default", favorite=True, created_by_user_id="user-1", ) normal.usage_count = 0 favorite.usage_count = 10 repository.update(normal) repository.update(favorite) assert _select_title_id(repository, "project-1") == favorite.id def test_mark_title_used_after_generation_completion(): session, _ = _session_and_repository() now = datetime.now(timezone.utc) title = ProjectTitleModel( id="title-1", workspace_id="workspace-1", project_id="project-1", text="生成标题", category="default", favorite=False, usage_count=2, is_active=True, created_by_user_id="user-1", created_at=now, updated_at=now, ) session.add(title) session.commit() mark_title_used_for_generation( session, SimpleNamespace(strategy_id="title-1", workspace_id="workspace-1", project_id="project-1"), ) updated = session.query(ProjectTitleModel).filter(ProjectTitleModel.id == "title-1").first() assert updated.usage_count == 3