fix(buildings): Refactor _run to handle arguments with spaces correctly

Refactored the subprocess wrapper to only split the command part (first element) if it contains spaces, while preserving spaces in subsequent arguments (like file paths). Added unit tests for various scenarios including command overrides and error handling.
This commit is contained in:
2026-02-03 23:09:21 +01:00
parent 1a0ab1e4b6
commit 358e093e79
4 changed files with 213 additions and 5 deletions

View File

@@ -0,0 +1,54 @@
import unittest
import os
import subprocess
from unittest.mock import patch, MagicMock
from geodata_pipeline.buildings import _run
class TestBuildingsSubprocess(unittest.TestCase):
@patch("subprocess.run")
def test_run_with_spaces_in_args(self, mock_run):
mock_run.return_value = MagicMock(returncode=0)
# This simulates a path with spaces
cmd = ["ls", "folder with space/file.txt"]
_run(cmd, "test command")
# Should stay as one argument for the path
expected_argv = ["ls", "folder with space/file.txt"]
actual_argv = mock_run.call_args[0][0]
self.assertEqual(actual_argv, expected_argv)
@patch("subprocess.run")
@patch("os.path.exists")
def test_run_with_spaces_in_command_override(self, mock_exists, mock_run):
mock_run.return_value = MagicMock(returncode=0)
mock_exists.return_value = False # Simulate "uv run cjio" is not a file
cmd = ["uv run cjio", "arg1", "path with space"]
_run(cmd, "test command")
# The command part should be split, but not the arguments
expected_argv = ["uv", "run", "cjio", "arg1", "path with space"]
actual_argv = mock_run.call_args[0][0]
self.assertEqual(actual_argv, expected_argv)
@patch("subprocess.run")
def test_run_file_not_found(self, mock_run):
mock_run.side_effect = FileNotFoundError()
cmd = ["nonexistent_tool", "arg1"]
result = _run(cmd, "test command")
self.assertFalse(result)
@patch("subprocess.run")
def test_run_failed_exit_code(self, mock_run):
mock_run.return_value = MagicMock(returncode=1)
cmd = ["ls", "nonexistent_file"]
result = _run(cmd, "test command")
self.assertFalse(result)
if __name__ == "__main__":
unittest.main()