import subprocess import unittest from unittest.mock import Mock, patch from dependabro.utils import execute_shell_command class TestExecuteShellCommand(unittest.TestCase): @patch("subprocess.run") def test_returns_success_and_output_on_successful_command(self, mock_run): mock_run.return_value = Mock(stdout="output", stderr="", returncode=0) success, stdout, stderr = execute_shell_command( 'echo "Hello, World!"', "/path/to/dir" ) self.assertTrue(success) self.assertEqual(stdout, "output") self.assertEqual(stderr, "") @patch( "subprocess.run", side_effect=subprocess.CalledProcessError( 1, "cmd", output="error output", stderr="error" ), ) def test_returns_false_and_error_output_on_command_failure(self, mock_run): success, stdout, stderr = execute_shell_command( "invalid_command", "/path/to/dir" ) self.assertFalse(success) self.assertEqual(stdout, "error output") self.assertEqual(stderr, "error") @patch( "subprocess.run", side_effect=subprocess.TimeoutExpired(cmd="cmd", timeout=15) ) def test_returns_false_and_timeout_message_on_command_timeout(self, mock_run): success, stdout, stderr = execute_shell_command( "long_running_command", "/path/to/dir" ) self.assertFalse(success) self.assertEqual(stdout, "") self.assertIn("Command timed out", stderr) @patch("subprocess.run", side_effect=Exception("Unexpected error")) def test_returns_false_and_error_message_on_unexpected_exception(self, mock_run): success, stdout, stderr = execute_shell_command("command", "/path/to/dir") self.assertFalse(success) self.assertEqual(stdout, "") self.assertIn("Unexpected error", stderr) if __name__ == "__main__": unittest.main()