fix: Add proper I18N mocking to Docker validation tests

- Mock I18N initialization to prevent 'Prompt file None not found' errors
- Follow existing test patterns for Agent dependency mocking
- Ensure tests are isolated and don't require external files

Co-Authored-By: João <joao@crewai.com>
This commit is contained in:
Devin AI
2025-06-18 11:17:09 +00:00
parent 6938ca5a33
commit 968d0a0e2c

View File

@@ -2,7 +2,7 @@
import os
import subprocess
from unittest.mock import Mock, patch, mock_open
from unittest.mock import Mock, patch, mock_open, MagicMock
import pytest
from crewai import Agent
@@ -32,24 +32,14 @@ class TestDockerValidation:
)
assert agent.code_execution_mode == "unsafe"
@patch("crewai.utilities.i18n.I18N")
@patch("crewai.agent.os.path.exists")
def test_docker_validation_skipped_in_container_dockerenv(self, mock_exists):
def test_docker_validation_skipped_in_container_dockerenv(self, mock_exists, mock_i18n):
"""Test that Docker validation is skipped when /.dockerenv exists."""
mock_exists.return_value = True
agent = Agent(
role="Test Agent",
goal="Test goal",
backstory="Test backstory",
allow_code_execution=True,
)
assert agent.allow_code_execution is True
@patch("crewai.agent.os.path.exists")
@patch("builtins.open", new_callable=mock_open, read_data="12:memory:/docker/container123")
def test_docker_validation_skipped_in_container_cgroup(self, mock_file, mock_exists):
"""Test that Docker validation is skipped when cgroup indicates container."""
mock_exists.return_value = False
mock_i18n_instance = MagicMock()
mock_i18n.return_value = mock_i18n_instance
agent = Agent(
role="Test Agent",
@@ -59,14 +49,36 @@ class TestDockerValidation:
)
assert agent.allow_code_execution is True
@patch("crewai.utilities.i18n.I18N")
@patch("crewai.agent.os.path.exists")
@patch("builtins.open", new_callable=mock_open, read_data="12:memory:/docker/container123")
def test_docker_validation_skipped_in_container_cgroup(self, mock_file, mock_exists, mock_i18n):
"""Test that Docker validation is skipped when cgroup indicates container."""
mock_exists.return_value = False
mock_i18n_instance = MagicMock()
mock_i18n.return_value = mock_i18n_instance
agent = Agent(
role="Test Agent",
goal="Test goal",
backstory="Test backstory",
allow_code_execution=True,
)
assert agent.allow_code_execution is True
@patch("crewai.utilities.i18n.I18N")
@patch("crewai.agent.os.path.exists")
@patch("crewai.agent.os.getpid")
@patch("builtins.open", side_effect=FileNotFoundError)
def test_docker_validation_skipped_in_container_pid1(self, mock_file, mock_getpid, mock_exists):
def test_docker_validation_skipped_in_container_pid1(self, mock_file, mock_getpid, mock_exists, mock_i18n):
"""Test that Docker validation is skipped when running as PID 1."""
mock_exists.return_value = False
mock_getpid.return_value = 1
mock_i18n_instance = MagicMock()
mock_i18n.return_value = mock_i18n_instance
agent = Agent(
role="Test Agent",
goal="Test goal",
@@ -75,16 +87,20 @@ class TestDockerValidation:
)
assert agent.allow_code_execution is True
@patch("crewai.utilities.i18n.I18N")
@patch("crewai.agent.shutil.which")
@patch("crewai.agent.os.path.exists")
@patch("crewai.agent.os.getpid")
@patch("builtins.open", side_effect=FileNotFoundError)
def test_docker_validation_fails_no_docker(self, mock_file, mock_getpid, mock_exists, mock_which):
def test_docker_validation_fails_no_docker(self, mock_file, mock_getpid, mock_exists, mock_which, mock_i18n):
"""Test that Docker validation fails when Docker is not installed."""
mock_exists.return_value = False
mock_getpid.return_value = 1000
mock_which.return_value = None
mock_i18n_instance = MagicMock()
mock_i18n.return_value = mock_i18n_instance
with pytest.raises(RuntimeError, match="Docker is not installed"):
Agent(
role="Test Agent",
@@ -93,18 +109,22 @@ class TestDockerValidation:
allow_code_execution=True,
)
@patch("crewai.utilities.i18n.I18N")
@patch("crewai.agent.shutil.which")
@patch("crewai.agent.subprocess.run")
@patch("crewai.agent.os.path.exists")
@patch("crewai.agent.os.getpid")
@patch("builtins.open", side_effect=FileNotFoundError)
def test_docker_validation_fails_docker_not_running(self, mock_file, mock_getpid, mock_exists, mock_run, mock_which):
def test_docker_validation_fails_docker_not_running(self, mock_file, mock_getpid, mock_exists, mock_run, mock_which, mock_i18n):
"""Test that Docker validation fails when Docker daemon is not running."""
mock_exists.return_value = False
mock_getpid.return_value = 1000
mock_which.return_value = "/usr/bin/docker"
mock_run.side_effect = subprocess.CalledProcessError(1, "docker info")
mock_i18n_instance = MagicMock()
mock_i18n.return_value = mock_i18n_instance
with pytest.raises(RuntimeError, match="Docker is not running"):
Agent(
role="Test Agent",
@@ -113,18 +133,22 @@ class TestDockerValidation:
allow_code_execution=True,
)
@patch("crewai.utilities.i18n.I18N")
@patch("crewai.agent.shutil.which")
@patch("crewai.agent.subprocess.run")
@patch("crewai.agent.os.path.exists")
@patch("crewai.agent.os.getpid")
@patch("builtins.open", side_effect=FileNotFoundError)
def test_docker_validation_passes_docker_available(self, mock_file, mock_getpid, mock_exists, mock_run, mock_which):
def test_docker_validation_passes_docker_available(self, mock_file, mock_getpid, mock_exists, mock_run, mock_which, mock_i18n):
"""Test that Docker validation passes when Docker is available."""
mock_exists.return_value = False
mock_getpid.return_value = 1000
mock_which.return_value = "/usr/bin/docker"
mock_run.return_value = Mock(returncode=0)
mock_i18n_instance = MagicMock()
mock_i18n.return_value = mock_i18n_instance
agent = Agent(
role="Test Agent",
goal="Test goal",
@@ -153,8 +177,12 @@ class TestDockerValidation:
patch("crewai.agent.os.getpid", return_value=1):
assert agent._is_running_in_container() is True
def test_reproduce_original_issue(self):
@patch("crewai.utilities.i18n.I18N")
def test_reproduce_original_issue(self, mock_i18n):
"""Test that reproduces the original issue from GitHub issue #3028."""
mock_i18n_instance = MagicMock()
mock_i18n.return_value = mock_i18n_instance
with patch("crewai.agent.os.path.exists", return_value=True):
agent = Agent(
role="Knowledge Pattern Synthesizer",