"""首页采集状态来自真实批次,关闭读取不抹掉历史成功记录。""" from datetime import datetime import pytest from sqlalchemy import Column, DateTime, Integer, MetaData, String, Table, create_engine from sqlalchemy.orm import Session from app.core.config import Settings from app.services import dashboard_service @pytest.fixture def sync_database(monkeypatch): engine = create_engine("sqlite://") metadata = MetaData() # 只建 V14 已有列,证明读取状态不要求业务库先升级 V20。 table = Table( "tplus_sync_batches", metadata, Column("id", Integer, primary_key=True), Column("sync_mode", String(16)), Column("status", String(16)), Column("finished_at", DateTime), ) metadata.create_all(engine) settings = Settings(_env_file=None, app_secret_key="x" * 32) monkeypatch.setattr(dashboard_service, "get_settings", lambda: settings, raising=False) with Session(engine) as session: yield session, table, settings engine.dispose() def test_关闭采集仍显示历史成功且不将旧失败冒充当前失败(sync_database): session, table, _ = sync_database finished = datetime(2026, 10, 30, 16, 52, 3) session.execute(table.insert(), [ {"id": 1, "sync_mode": "FULL", "status": "FAILED", "finished_at": finished}, {"id": 2, "sync_mode": "FULL", "status": "SUCCEEDED", "finished_at": finished}, {"id": 3, "sync_mode": "AUDIT", "status": "FAILED", "finished_at": finished}, ]) result = dashboard_service._sync_status(session) assert result["available"] is True assert result["enabled"] is False and result["automation_enabled"] is False assert result["latest_status"] == "SUCCEEDED" assert result["last_success_at"] == finished assert result["historical_failure_total"] == 1 @pytest.mark.parametrize("status", ["FAILED", "PARTIAL", "QUEUED", "RUNNING"]) def test_首页如实返回最近采集状态(sync_database, status): session, table, settings = sync_database settings.t_plus_enabled = True session.execute(table.insert(), {"id": 1, "sync_mode": "FULL", "status": status}) result = dashboard_service._sync_status(session) assert result["latest_status"] == status and result["enabled"] is True assert result["last_success_at"] is None def test_无记录不显示已采集(sync_database): session, _, _ = sync_database result = dashboard_service._sync_status(session) assert result["available"] is True assert result["latest_status"] is None and result["last_success_at"] is None def test_未建同步表时明确返回不可查询(): engine = create_engine("sqlite://") try: with Session(engine) as session: result = dashboard_service._sync_status(session) assert result["available"] is False assert result["last_success_at"] is None finally: engine.dispose()