"""业务列表按照核算准备结果筛选时保持准确分页。""" from types import SimpleNamespace from app.schemas.business import BusinessOut, BusinessQuery from app.services import business_service, business_source def test_准备原因筛选跨批次分页并按实际状态计数(monkeypatch): rows = [(SimpleNamespace(id=i, integration_json={"source_database": "test"}),) for i in range(105, 0, -1)] def scan(_session, _query, before_id, limit=100): return [row for row in rows if before_id is None or row[0].id < before_id][:limit] def summaries(_session, businesses, *, snapshot_cache=None): return {row.id: {"status": "PENDING" if row.id % 2 else "READY", "reasons": ([{"code": "GUIDANCE_PENDING", "message": "指导成本待补"}] if row.id % 2 else [])} for row in businesses} monkeypatch.setattr(business_service.business_repository, "scan_businesses", scan) monkeypatch.setattr(business_source, "readiness_summaries", summaries) monkeypatch.setattr(business_service, "_to_out", lambda row: BusinessOut( id=row[0].id, business_no=str(row[0].id), customer_id=1)) result = business_service.list_businesses(None, BusinessQuery( pageNum=3, pageSize=10, readiness_reason="GUIDANCE_PENDING", pending_only=True)) assert result.total == 53 assert [row.id for row in result.records] == list(range(65, 45, -2)) assert all(row.readiness_status == "PENDING" for row in result.records)