82 lines
3.0 KiB
Python
82 lines
3.0 KiB
Python
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
|