Files
signalscout-backend/tests/test_repository.py
T
2026-07-09 00:14:20 +08:00

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