mirror of
https://github.com/Skyvern-AI/skyvern.git
synced 2026-04-28 03:30:10 +00:00
238 lines
8.8 KiB
Python
238 lines
8.8 KiB
Python
"""Tests for all 14 OSS repository instantiations + dependency injection."""
|
|
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
|
|
def test_credential_repository_instantiation():
|
|
from skyvern.forge.sdk.db.repositories.credentials import CredentialRepository
|
|
|
|
mock_session = MagicMock()
|
|
repo = CredentialRepository(session_factory=mock_session, debug_enabled=False)
|
|
assert repo.Session is mock_session
|
|
assert hasattr(repo, "create_credential")
|
|
assert hasattr(repo, "get_credential")
|
|
assert hasattr(repo, "get_credentials")
|
|
assert hasattr(repo, "update_credential")
|
|
assert hasattr(repo, "delete_credential")
|
|
assert hasattr(repo, "create_organization_bitwarden_collection")
|
|
assert hasattr(repo, "get_organization_bitwarden_collection")
|
|
|
|
|
|
def test_otp_repository_instantiation():
|
|
from skyvern.forge.sdk.db.repositories.otp import OTPRepository
|
|
|
|
mock_session = MagicMock()
|
|
repo = OTPRepository(session_factory=mock_session, debug_enabled=False)
|
|
assert repo.Session is mock_session
|
|
assert hasattr(repo, "get_otp_codes")
|
|
assert hasattr(repo, "create_otp_code")
|
|
|
|
|
|
def test_debug_repository_instantiation():
|
|
from skyvern.forge.sdk.db.repositories.debug import DebugRepository
|
|
|
|
mock_session = MagicMock()
|
|
repo = DebugRepository(session_factory=mock_session, debug_enabled=False)
|
|
assert repo.Session is mock_session
|
|
assert hasattr(repo, "get_debug_session")
|
|
assert hasattr(repo, "create_debug_session")
|
|
assert hasattr(repo, "create_block_run")
|
|
|
|
|
|
def test_organizations_repository_instantiation():
|
|
from skyvern.forge.sdk.db.repositories.organizations import OrganizationsRepository
|
|
|
|
mock_session = MagicMock()
|
|
repo = OrganizationsRepository(session_factory=mock_session, debug_enabled=False)
|
|
assert repo.Session is mock_session
|
|
assert hasattr(repo, "get_organization")
|
|
assert hasattr(repo, "create_organization")
|
|
assert hasattr(repo, "create_org_auth_token")
|
|
assert hasattr(repo, "validate_org_auth_token")
|
|
|
|
|
|
def test_schedules_repository_instantiation():
|
|
from skyvern.forge.sdk.db.repositories.schedules import SchedulesRepository
|
|
|
|
mock_session = MagicMock()
|
|
repo = SchedulesRepository(session_factory=mock_session, debug_enabled=False)
|
|
assert repo.Session is mock_session
|
|
assert hasattr(repo, "create_workflow_schedule")
|
|
assert hasattr(repo, "get_workflow_schedules")
|
|
|
|
|
|
def test_scripts_repository_instantiation():
|
|
from skyvern.forge.sdk.db.repositories.scripts import ScriptsRepository
|
|
|
|
mock_session = MagicMock()
|
|
repo = ScriptsRepository(session_factory=mock_session, debug_enabled=False)
|
|
assert repo.Session is mock_session
|
|
assert hasattr(repo, "create_script")
|
|
assert hasattr(repo, "get_scripts")
|
|
|
|
|
|
def test_workflow_parameters_repository_instantiation():
|
|
from skyvern.forge.sdk.db.repositories.workflow_parameters import WorkflowParametersRepository
|
|
|
|
mock_session = MagicMock()
|
|
repo = WorkflowParametersRepository(session_factory=mock_session, debug_enabled=False)
|
|
assert repo.Session is mock_session
|
|
assert hasattr(repo, "get_workflow_parameter")
|
|
assert hasattr(repo, "create_workflow_parameter")
|
|
|
|
|
|
def test_tasks_repository_instantiation():
|
|
from skyvern.forge.sdk.db.repositories.tasks import TasksRepository
|
|
|
|
mock_session = MagicMock()
|
|
repo = TasksRepository(session_factory=mock_session, debug_enabled=False)
|
|
assert repo.Session is mock_session
|
|
assert hasattr(repo, "create_task")
|
|
assert hasattr(repo, "get_task")
|
|
assert hasattr(repo, "create_step")
|
|
|
|
|
|
def test_workflows_repository_instantiation():
|
|
from skyvern.forge.sdk.db.repositories.workflows import WorkflowsRepository
|
|
|
|
mock_session = MagicMock()
|
|
repo = WorkflowsRepository(session_factory=mock_session, debug_enabled=False)
|
|
assert repo.Session is mock_session
|
|
assert hasattr(repo, "get_workflow")
|
|
assert hasattr(repo, "create_workflow")
|
|
assert hasattr(repo, "get_workflow_by_permanent_id")
|
|
|
|
|
|
def test_browser_sessions_repository_instantiation():
|
|
from skyvern.forge.sdk.db.repositories.browser_sessions import BrowserSessionsRepository
|
|
|
|
mock_session = MagicMock()
|
|
repo = BrowserSessionsRepository(session_factory=mock_session, debug_enabled=False)
|
|
assert repo.Session is mock_session
|
|
assert hasattr(repo, "create_browser_profile")
|
|
assert hasattr(repo, "get_browser_profile")
|
|
|
|
|
|
# ── Cross-dependency repositories ──
|
|
|
|
|
|
def test_workflow_runs_repository_with_dependency():
|
|
from skyvern.forge.sdk.db.repositories.workflow_runs import WorkflowRunsRepository
|
|
|
|
mock_session = MagicMock()
|
|
mock_param_reader = MagicMock()
|
|
repo = WorkflowRunsRepository(
|
|
session_factory=mock_session,
|
|
debug_enabled=False,
|
|
workflow_parameter_reader=mock_param_reader,
|
|
)
|
|
assert repo.Session is mock_session
|
|
assert repo._workflow_parameter_reader is mock_param_reader
|
|
assert hasattr(repo, "get_workflow_run_parameters")
|
|
assert hasattr(repo, "create_workflow_run")
|
|
assert hasattr(repo, "get_workflow_run")
|
|
|
|
|
|
def test_artifacts_repository_with_dependency():
|
|
from skyvern.forge.sdk.db.repositories.artifacts import ArtifactsRepository
|
|
|
|
mock_session = MagicMock()
|
|
mock_run_reader = MagicMock()
|
|
repo = ArtifactsRepository(
|
|
session_factory=mock_session,
|
|
debug_enabled=False,
|
|
run_reader=mock_run_reader,
|
|
)
|
|
assert repo.Session is mock_session
|
|
assert repo._run_reader is mock_run_reader
|
|
assert hasattr(repo, "create_artifact")
|
|
assert hasattr(repo, "get_artifact")
|
|
|
|
|
|
def test_folders_repository_with_dependency():
|
|
from skyvern.forge.sdk.db.repositories.folders import FoldersRepository
|
|
|
|
mock_session = MagicMock()
|
|
mock_workflow_reader = MagicMock()
|
|
repo = FoldersRepository(
|
|
session_factory=mock_session,
|
|
debug_enabled=False,
|
|
workflow_reader=mock_workflow_reader,
|
|
)
|
|
assert repo.Session is mock_session
|
|
assert repo._workflow_reader is mock_workflow_reader
|
|
assert hasattr(repo, "create_folder")
|
|
assert hasattr(repo, "update_workflow_folder")
|
|
|
|
|
|
def test_observer_repository_with_dependency():
|
|
from skyvern.forge.sdk.db.repositories.observer import ObserverRepository
|
|
|
|
mock_session = MagicMock()
|
|
mock_task_reader = MagicMock()
|
|
repo = ObserverRepository(
|
|
session_factory=mock_session,
|
|
debug_enabled=False,
|
|
task_reader=mock_task_reader,
|
|
)
|
|
assert repo.Session is mock_session
|
|
assert repo._task_reader is mock_task_reader
|
|
assert hasattr(repo, "create_workflow_run_block")
|
|
assert hasattr(repo, "get_workflow_run_blocks")
|
|
|
|
|
|
# ── AgentDB composition test ──
|
|
|
|
|
|
def test_agent_db_has_typed_repo_attributes():
|
|
"""After refactoring, AgentDB should expose typed repository attributes."""
|
|
from skyvern.forge.sdk.db.repositories.credentials import CredentialRepository
|
|
from skyvern.forge.sdk.db.repositories.tasks import TasksRepository
|
|
|
|
with patch("skyvern.forge.sdk.db.agent_db.create_async_engine"):
|
|
from skyvern.forge.sdk.db.agent_db import AgentDB
|
|
|
|
db = AgentDB("postgresql+asyncpg://test", debug_enabled=True)
|
|
assert isinstance(db.tasks, TasksRepository)
|
|
assert isinstance(db.credentials, CredentialRepository)
|
|
assert hasattr(db, "get_task") # backward compat delegate
|
|
# Migrated domains no longer have delegates on AgentDB:
|
|
assert not hasattr(db, "create_workflow")
|
|
assert not hasattr(db, "get_organization")
|
|
assert not hasattr(db, "get_credential")
|
|
|
|
|
|
def test_agent_db_delegates_route_to_repositories():
|
|
"""Verify delegate methods actually forward to the correct repository."""
|
|
from unittest.mock import AsyncMock
|
|
from unittest.mock import patch as mock_patch
|
|
|
|
with mock_patch("skyvern.forge.sdk.db.agent_db.create_async_engine"):
|
|
from skyvern.forge.sdk.db.agent_db import AgentDB
|
|
|
|
db = AgentDB("postgresql+asyncpg://test", debug_enabled=False)
|
|
|
|
# Patch a method on each major repository and verify the delegate calls it
|
|
delegates_to_check = [
|
|
("get_task", "tasks"),
|
|
("create_artifact", "artifacts"),
|
|
("create_workflow_run", "workflow_runs"),
|
|
]
|
|
|
|
import asyncio
|
|
|
|
loop = asyncio.new_event_loop()
|
|
try:
|
|
for delegate_name, repo_attr in delegates_to_check:
|
|
repo = getattr(db, repo_attr)
|
|
mock_method = AsyncMock(return_value="sentinel")
|
|
original = getattr(repo, delegate_name)
|
|
setattr(repo, delegate_name, mock_method)
|
|
try:
|
|
result = loop.run_until_complete(getattr(db, delegate_name)("arg1", key="val"))
|
|
mock_method.assert_called_once_with("arg1", key="val")
|
|
assert result == "sentinel", f"Delegate {delegate_name} did not return repository result"
|
|
finally:
|
|
setattr(repo, delegate_name, original)
|
|
finally:
|
|
loop.close()
|