From 968d0a0e2c21d0dc28966d7f849042a62fc07283 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 18 Jun 2025 11:17:09 +0000 Subject: [PATCH] fix: Add proper I18N mocking to Docker validation tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- tests/test_docker_validation.py | 68 +++++++++++++++++++++++---------- 1 file changed, 48 insertions(+), 20 deletions(-) diff --git a/tests/test_docker_validation.py b/tests/test_docker_validation.py index 261a68dfb..e82b0b9ee 100644 --- a/tests/test_docker_validation.py +++ b/tests/test_docker_validation.py @@ -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",