galaxis-agent/tests/test_docker_sandbox.py

82 lines
3.6 KiB
Python
Raw Permalink Normal View History

import pytest
from unittest.mock import MagicMock, patch
@pytest.fixture
def mock_docker_client():
client = MagicMock()
container = MagicMock()
container.id = "abc123def456"
container.status = "running"
client.containers.run.return_value = container
client.containers.get.return_value = container
return client, container
def test_sandbox_create_new_container(mock_docker_client):
client, container = mock_docker_client
with patch("agent.integrations.docker_sandbox.docker.DockerClient", return_value=client):
from agent.integrations.docker_sandbox import DockerSandbox
sandbox = DockerSandbox()
assert sandbox.id == "abc123def456"
client.containers.run.assert_called_once()
call_kwargs = client.containers.run.call_args.kwargs
assert call_kwargs["detach"] is True
assert call_kwargs["labels"] == {"galaxis-agent-sandbox": "true"}
def test_sandbox_connect_existing_container(mock_docker_client):
client, container = mock_docker_client
with patch("agent.integrations.docker_sandbox.docker.DockerClient", return_value=client):
from agent.integrations.docker_sandbox import DockerSandbox
sandbox = DockerSandbox(container_id="abc123def456")
assert sandbox.id == "abc123def456"
client.containers.get.assert_called_once_with("abc123def456")
client.containers.run.assert_not_called()
def test_sandbox_execute_success(mock_docker_client):
client, container = mock_docker_client
container.exec_run.return_value = MagicMock(exit_code=0, output=(b"hello world\n", None))
with patch("agent.integrations.docker_sandbox.docker.DockerClient", return_value=client):
from agent.integrations.docker_sandbox import DockerSandbox
sandbox = DockerSandbox(container_id="abc123def456")
result = sandbox.execute("echo hello world")
assert "hello world" in result.output
assert result.exit_code == 0
assert result.truncated is False
def test_sandbox_execute_with_stderr(mock_docker_client):
client, container = mock_docker_client
container.exec_run.return_value = MagicMock(exit_code=1, output=(b"", b"error: not found\n"))
with patch("agent.integrations.docker_sandbox.docker.DockerClient", return_value=client):
from agent.integrations.docker_sandbox import DockerSandbox
sandbox = DockerSandbox(container_id="abc123def456")
result = sandbox.execute("cat missing.txt")
assert "error: not found" in result.output
assert result.exit_code == 1
def test_sandbox_execute_with_timeout(mock_docker_client):
client, container = mock_docker_client
container.exec_run.return_value = MagicMock(exit_code=0, output=(b"ok\n", None))
with patch("agent.integrations.docker_sandbox.docker.DockerClient", return_value=client):
from agent.integrations.docker_sandbox import DockerSandbox
sandbox = DockerSandbox(container_id="abc123def456")
sandbox.execute("sleep 1", timeout=30)
call_args = container.exec_run.call_args
cmd = call_args.kwargs.get("cmd", call_args.args[0] if call_args.args else [])
assert cmd[0] == "timeout"
assert cmd[1] == "30"
def test_sandbox_close(mock_docker_client):
client, container = mock_docker_client
with patch("agent.integrations.docker_sandbox.docker.DockerClient", return_value=client):
from agent.integrations.docker_sandbox import DockerSandbox
sandbox = DockerSandbox(container_id="abc123def456")
sandbox.close()
container.stop.assert_called_once()
container.remove.assert_called_once()