[NO-TICKET] Repository Design Pattern refactor (#9056) follow-up — missing parameter bugs (#5291)

This commit is contained in:
Aaron Perez 2026-03-30 14:41:28 -05:00 committed by GitHub
parent c4251ff70c
commit dbe252d128
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 226 additions and 11 deletions

View file

@ -0,0 +1,114 @@
"""Tests that update_credential() accepts user_context and save_browser_session_intent
on both CredentialRepository and CredentialsMixin."""
from unittest.mock import MagicMock, patch
import pytest
from skyvern.forge.sdk.db.mixins.credentials import CredentialsMixin
from skyvern.forge.sdk.db.repositories.credentials import CredentialRepository
from tests.unit.conftest import MockAsyncSessionCtx, make_mock_session
def _make_credential_repo(mock_credential: MagicMock) -> CredentialRepository:
mock_session = make_mock_session(mock_credential)
return CredentialRepository(session_factory=lambda: MockAsyncSessionCtx(mock_session))
def _make_credential_mixin(mock_credential: MagicMock) -> CredentialsMixin:
mock_session = make_mock_session(mock_credential)
mixin = CredentialsMixin.__new__(CredentialsMixin)
mixin.Session = lambda: MockAsyncSessionCtx(mock_session) # type: ignore[assignment]
return mixin
# --- CredentialRepository tests ---
@pytest.mark.asyncio
async def test_repo_update_credential_accepts_user_context() -> None:
mock_credential = MagicMock()
mock_credential.name = "test"
mock_credential.user_context = None
repo = _make_credential_repo(mock_credential)
with patch("skyvern.forge.sdk.schemas.credentials.Credential.model_validate", return_value=MagicMock()):
await repo.update_credential(
credential_id="cred_123",
organization_id="org_123",
user_context="Click SSO button first",
)
assert mock_credential.user_context == "Click SSO button first"
@pytest.mark.asyncio
async def test_repo_update_credential_accepts_save_browser_session_intent() -> None:
mock_credential = MagicMock()
mock_credential.name = "test"
mock_credential.save_browser_session_intent = False
repo = _make_credential_repo(mock_credential)
with patch("skyvern.forge.sdk.schemas.credentials.Credential.model_validate", return_value=MagicMock()):
await repo.update_credential(
credential_id="cred_123",
organization_id="org_123",
save_browser_session_intent=True,
)
assert mock_credential.save_browser_session_intent is True
@pytest.mark.asyncio
async def test_repo_update_credential_unset_params_not_applied() -> None:
mock_credential = MagicMock()
mock_credential.name = "test"
mock_credential.user_context = "existing"
mock_credential.save_browser_session_intent = True
repo = _make_credential_repo(mock_credential)
with patch("skyvern.forge.sdk.schemas.credentials.Credential.model_validate", return_value=MagicMock()):
await repo.update_credential(
credential_id="cred_123",
organization_id="org_123",
)
assert mock_credential.user_context == "existing"
assert mock_credential.save_browser_session_intent is True
# --- CredentialsMixin tests ---
@pytest.mark.asyncio
async def test_mixin_update_credential_accepts_user_context() -> None:
mock_credential = MagicMock()
mock_credential.name = "test"
mock_credential.user_context = None
mixin = _make_credential_mixin(mock_credential)
with patch("skyvern.forge.sdk.schemas.credentials.Credential.model_validate", return_value=MagicMock()):
await mixin.update_credential(
credential_id="cred_123",
organization_id="org_123",
user_context="Click SSO button first",
)
assert mock_credential.user_context == "Click SSO button first"
@pytest.mark.asyncio
async def test_mixin_update_credential_accepts_save_browser_session_intent() -> None:
mock_credential = MagicMock()
mock_credential.name = "test"
mock_credential.save_browser_session_intent = False
mixin = _make_credential_mixin(mock_credential)
with patch("skyvern.forge.sdk.schemas.credentials.Credential.model_validate", return_value=MagicMock()):
await mixin.update_credential(
credential_id="cred_123",
organization_id="org_123",
save_browser_session_intent=True,
)
assert mock_credential.save_browser_session_intent is True