fix: return empty skills list instead of 404 for stopped sandboxes (#13429)

Co-authored-by: openhands <openhands@all-hands.dev>
This commit is contained in:
HeyItsChloe
2026-03-18 13:46:00 -07:00
committed by GitHub
parent 2879e58781
commit abd1f9948f
3 changed files with 69 additions and 21 deletions

View File

@@ -263,7 +263,7 @@ class TestGetConversationHooks:
assert response.status_code == status.HTTP_404_NOT_FOUND
async def test_get_hooks_returns_404_when_sandbox_not_running(self):
async def test_get_hooks_returns_404_when_sandbox_not_found(self):
conversation_id = uuid4()
sandbox_id = str(uuid4())
@@ -291,3 +291,44 @@ class TestGetConversationHooks:
)
assert response.status_code == status.HTTP_404_NOT_FOUND
async def test_get_hooks_returns_empty_list_when_sandbox_paused(self):
conversation_id = uuid4()
sandbox_id = str(uuid4())
mock_conversation = AppConversation(
id=conversation_id,
created_by_user_id='test-user',
sandbox_id=sandbox_id,
sandbox_status=SandboxStatus.PAUSED,
)
mock_sandbox = SandboxInfo(
id=sandbox_id,
created_by_user_id='test-user',
status=SandboxStatus.PAUSED,
sandbox_spec_id=str(uuid4()),
session_api_key='test-api-key',
)
mock_app_conversation_service = MagicMock()
mock_app_conversation_service.get_app_conversation = AsyncMock(
return_value=mock_conversation
)
mock_sandbox_service = MagicMock()
mock_sandbox_service.get_sandbox = AsyncMock(return_value=mock_sandbox)
response = await get_conversation_hooks(
conversation_id=conversation_id,
app_conversation_service=mock_app_conversation_service,
sandbox_service=mock_sandbox_service,
sandbox_spec_service=MagicMock(),
httpx_client=AsyncMock(spec=httpx.AsyncClient),
)
assert response.status_code == status.HTTP_200_OK
import json
data = json.loads(response.body.decode('utf-8'))
assert data == {'hooks': []}

View File

@@ -203,7 +203,7 @@ class TestGetConversationSkills:
Arrange: Setup conversation but no sandbox
Act: Call get_conversation_skills endpoint
Assert: Response is 404 with sandbox error message
Assert: Response is 404
"""
# Arrange
conversation_id = uuid4()
@@ -237,19 +237,13 @@ class TestGetConversationSkills:
# Assert
assert response.status_code == status.HTTP_404_NOT_FOUND
content = response.body.decode('utf-8')
import json
data = json.loads(content)
assert 'error' in data
assert 'Sandbox not found' in data['error']
async def test_get_skills_returns_empty_list_when_sandbox_paused(self):
"""Test endpoint returns empty skills when sandbox is PAUSED (closed conversation).
async def test_get_skills_returns_404_when_sandbox_not_running(self):
"""Test endpoint returns 404 when sandbox is not in RUNNING state.
Arrange: Setup conversation with stopped sandbox
Arrange: Setup conversation with paused sandbox
Act: Call get_conversation_skills endpoint
Assert: Response is 404 with sandbox not running message
Assert: Response is 200 with empty skills list
"""
# Arrange
conversation_id = uuid4()
@@ -290,13 +284,12 @@ class TestGetConversationSkills:
)
# Assert
assert response.status_code == status.HTTP_404_NOT_FOUND
assert response.status_code == status.HTTP_200_OK
content = response.body.decode('utf-8')
import json
data = json.loads(content)
assert 'error' in data
assert 'not running' in data['error']
assert data == {'skills': []}
async def test_get_skills_handles_task_trigger_skills(self):
"""Test endpoint correctly handles skills with TaskTrigger.