from datetime import datetime from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.pool import StaticPool from app.db.models import AgentRun, Base from app.db.repository import AgentRepository from app.schemas.agent import SignalItem def test_save_signals_keeps_same_url_across_runs() -> None: # 跨运行保留同一链接,保证每轮日报的实际信号快照不会被历史结果吞掉。 engine = create_engine( "sqlite:///:memory:", connect_args={"check_same_thread": False}, poolclass=StaticPool, future=True, ) Base.metadata.create_all(engine) TestingSessionLocal = sessionmaker(bind=engine, autoflush=False, autocommit=False, future=True) with TestingSessionLocal() as session: repo = AgentRepository(session) first_run = AgentRun(status="running", started_at=datetime(2026, 7, 8), request_payload={}) second_run = AgentRun(status="running", started_at=datetime(2026, 7, 8), request_payload={}) session.add_all([first_run, second_run]) session.flush() item = SignalItem( source_type="news", topic="AI 新闻", title="Same URL", summary="同一个来源链接。", source_url="https://example.com/same", source_name="Example", published_at=datetime(2026, 7, 8), importance=3, entities=["Example"], ) first_saved = repo.save_signals(first_run, [item]) second_saved = repo.save_signals(second_run, [item]) assert len(first_saved) == 1 assert len(second_saved) == 1 assert first_saved[0].run_id != second_saved[0].run_id def test_save_signals_updates_duplicate_url_inside_same_run() -> None: # 同一运行内相同链接只保留一条,避免模型重复输出造成页面重复。 engine = create_engine( "sqlite:///:memory:", connect_args={"check_same_thread": False}, poolclass=StaticPool, future=True, ) Base.metadata.create_all(engine) TestingSessionLocal = sessionmaker(bind=engine, autoflush=False, autocommit=False, future=True) with TestingSessionLocal() as session: repo = AgentRepository(session) run = AgentRun(status="running", started_at=datetime(2026, 7, 8), request_payload={}) session.add(run) session.flush() first = SignalItem( source_type="news", topic="AI 新闻", title="First title", summary="第一条摘要。", source_url="https://example.com/same", source_name="Example", published_at=datetime(2026, 7, 8), importance=3, entities=["Example"], ) second = first.model_copy(update={"title": "Second title", "importance": 5}) saved = repo.save_signals(run, [first, second]) assert len(saved) == 2 assert saved[0].id == saved[1].id assert saved[0].title == "Second title" assert saved[0].importance == 5