feat(05-01): add Phase 5 cloud fixtures to conftest.py
Appends 4 new fixtures to backend/tests/conftest.py: - mock_google_drive_creds: Google OAuth credential dict (access/refresh token, expiry) - mock_onedrive_creds: OneDrive MSAL credential dict - mock_webdav_client: MagicMock with upload_to/download_from/list/check methods - cloud_connection_factory: async factory that creates CloudConnection ORM rows All existing fixtures and tests unaffected; pytest collection errors = 0.
This commit is contained in:
@@ -302,3 +302,107 @@ def mock_minio_stat(monkeypatch):
|
|||||||
except ImportError:
|
except ImportError:
|
||||||
pass # storage module not yet available — patch is best-effort
|
pass # storage module not yet available — patch is best-effort
|
||||||
yield mock
|
yield mock
|
||||||
|
|
||||||
|
|
||||||
|
# ── Phase 5 cloud storage fixtures ───────────────────────────────────────────
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def mock_google_drive_creds():
|
||||||
|
"""Return a fake Google Drive OAuth credential dict for unit tests.
|
||||||
|
|
||||||
|
Shape mirrors what google-auth-oauthlib stores in credentials.to_json().
|
||||||
|
Expiry is far in the future so tests never hit a token-refresh branch.
|
||||||
|
"""
|
||||||
|
return {
|
||||||
|
"access_token": "ya29.test_access",
|
||||||
|
"refresh_token": "1//test_refresh",
|
||||||
|
"expiry": "2099-12-31T23:59:59",
|
||||||
|
"token_uri": "https://oauth2.googleapis.com/token",
|
||||||
|
"client_id": "test_client_id",
|
||||||
|
"client_secret": "test_client_secret",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def mock_onedrive_creds():
|
||||||
|
"""Return a fake OneDrive MSAL credential dict for unit tests.
|
||||||
|
|
||||||
|
Shape mirrors what msal.PublicClientApplication.acquire_token_by_auth_code_flow
|
||||||
|
returns (simplified subset required by cloud_utils).
|
||||||
|
"""
|
||||||
|
return {
|
||||||
|
"access_token": "test_ms_access",
|
||||||
|
"refresh_token": "test_ms_refresh",
|
||||||
|
"expires_at": "2099-12-31T23:59:59",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def mock_webdav_client():
|
||||||
|
"""Return a MagicMock simulating a webdavclient3 Client instance.
|
||||||
|
|
||||||
|
All four methods the DocuVault cloud layer calls are pre-wired to return None
|
||||||
|
so tests can assert call counts without making real network connections.
|
||||||
|
"""
|
||||||
|
from unittest.mock import MagicMock
|
||||||
|
|
||||||
|
client = MagicMock()
|
||||||
|
client.upload_to = MagicMock(return_value=None)
|
||||||
|
client.download_from = MagicMock(return_value=None)
|
||||||
|
client.list = MagicMock(return_value=None)
|
||||||
|
client.check = MagicMock(return_value=None)
|
||||||
|
return client
|
||||||
|
|
||||||
|
|
||||||
|
@pytest_asyncio.fixture
|
||||||
|
async def cloud_connection_factory(db_session: AsyncSession):
|
||||||
|
"""Factory fixture that creates CloudConnection ORM rows in the test db_session.
|
||||||
|
|
||||||
|
Usage::
|
||||||
|
|
||||||
|
async def test_something(cloud_connection_factory, auth_user):
|
||||||
|
conn = await cloud_connection_factory(
|
||||||
|
db_session, auth_user["user"].id, provider="google_drive"
|
||||||
|
)
|
||||||
|
assert conn.status == "ACTIVE"
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
session : AsyncSession
|
||||||
|
The async SQLAlchemy session to use (typically db_session).
|
||||||
|
user_id : uuid.UUID | str
|
||||||
|
Owner of the cloud connection.
|
||||||
|
provider : str
|
||||||
|
Provider slug, e.g. "google_drive", "onedrive", "webdav".
|
||||||
|
status : str
|
||||||
|
Connection status string, default "ACTIVE".
|
||||||
|
display_name : str | None
|
||||||
|
Human-readable label; defaults to "<provider> account".
|
||||||
|
credentials_enc : str
|
||||||
|
Encrypted credential blob (use a placeholder in unit tests).
|
||||||
|
"""
|
||||||
|
import uuid as _uuid
|
||||||
|
from db.models import CloudConnection
|
||||||
|
|
||||||
|
async def _factory(
|
||||||
|
session: AsyncSession,
|
||||||
|
user_id,
|
||||||
|
provider: str = "google_drive",
|
||||||
|
status: str = "ACTIVE",
|
||||||
|
display_name: str | None = None,
|
||||||
|
credentials_enc: str = "fake_encrypted_creds",
|
||||||
|
) -> CloudConnection:
|
||||||
|
conn = CloudConnection(
|
||||||
|
id=_uuid.uuid4(),
|
||||||
|
user_id=user_id if isinstance(user_id, _uuid.UUID) else _uuid.UUID(str(user_id)),
|
||||||
|
provider=provider,
|
||||||
|
display_name=display_name or f"{provider} account",
|
||||||
|
credentials_enc=credentials_enc,
|
||||||
|
status=status,
|
||||||
|
)
|
||||||
|
session.add(conn)
|
||||||
|
await session.flush()
|
||||||
|
return conn
|
||||||
|
|
||||||
|
return _factory
|
||||||
|
|||||||
Reference in New Issue
Block a user