from __future__ import annotations from unittest.mock import AsyncMock, MagicMock from uuid import uuid4 import pytest from app.core.pagination import PaginationGuardError from app.domains.bailian.models import BailianWorkspace from app.domains.bailian.service import BailianService @pytest.mark.asyncio async def test_api_key_partial_fanout_is_not_staged_or_swept(monkeypatch) -> None: """A later workspace failure must invalidate the whole remote snapshot.""" workspaces = [ BailianWorkspace( id=uuid4(), integration_id="int-1", workspace_id="ws-1", name="one", ), BailianWorkspace( id=uuid4(), integration_id="int-1", workspace_id="ws-2", name="two", ), ] result = MagicMock() result.scalars.return_value.all.return_value = workspaces db = MagicMock() db.execute = AsyncMock(return_value=result) db.flush = AsyncMock() client = MagicMock() client.list_api_keys = AsyncMock(side_effect=[ [{ "api_key_id": "partial-key", "workspace_id": "ws-1", "display_name": "partial", "raw": {}, }], PaginationGuardError("pagination failed loud"), ]) service = BailianService(db) monkeypatch.setattr(service, "_get_client", AsyncMock(return_value=client)) with pytest.raises(PaginationGuardError): await service.sync_api_keys(integration_id="int-1") assert client.list_api_keys.await_count == 2 assert db.execute.await_count == 1 # no existing-key load / drift sweep db.add.assert_not_called() db.flush.assert_not_awaited()