Skyvern/tests/unit_tests/test_update_status_guard.py

53 lines
1.6 KiB
Python

"""Tests for the update_status finalization guard in default_persistent_sessions_manager."""
from __future__ import annotations
import sys
from datetime import datetime, timezone
from unittest.mock import AsyncMock, MagicMock
import pytest
# Stub the AWS module to avoid import-time boto session creation.
sys.modules.setdefault("skyvern.forge.sdk.api.aws", MagicMock())
from skyvern.forge.sdk.schemas.persistent_browser_sessions import ( # noqa: E402
PersistentBrowserSession,
PersistentBrowserSessionStatus,
)
from skyvern.webeye.default_persistent_sessions_manager import update_status # noqa: E402
SESSION_ID = "sess_1"
ORG_ID = "org_1"
NOW = datetime.now(timezone.utc)
def _make_session(status: str) -> PersistentBrowserSession:
return PersistentBrowserSession(
persistent_browser_session_id=SESSION_ID,
organization_id=ORG_ID,
status=status,
created_at=NOW,
modified_at=NOW,
)
@pytest.mark.parametrize(
"desired_status",
[
pytest.param(PersistentBrowserSessionStatus.running, id="non-final-to-final"),
pytest.param(PersistentBrowserSessionStatus.failed, id="final-to-final"),
],
)
@pytest.mark.asyncio
async def test_rejects_update_when_already_final(desired_status: str):
"""A finalized session must not accept any status update."""
db = AsyncMock()
db.browser_sessions.get_persistent_browser_session.return_value = _make_session(
PersistentBrowserSessionStatus.completed,
)
result = await update_status(db, SESSION_ID, ORG_ID, desired_status)
assert result is None
db.update_persistent_browser_session.assert_not_called()