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()