From 2f2ac96ac7fbe1903a1122b11c30ddb5890b6c22 Mon Sep 17 00:00:00 2001 From: yorkhellen Date: Wed, 22 Apr 2026 08:48:53 +0800 Subject: [PATCH] fix: update tests for path_append env dict change --- nanobot/agent/tools/shell.py | 1 + tests/tools/test_exec_platform.py | 38 +++++++++++++++++++------------ 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/nanobot/agent/tools/shell.py b/nanobot/agent/tools/shell.py index 78a2cc24..08c58499 100644 --- a/nanobot/agent/tools/shell.py +++ b/nanobot/agent/tools/shell.py @@ -255,6 +255,7 @@ class ExecTool(Tool): home = os.environ.get("HOME", "/tmp") env = { "HOME": home, + "PATH": os.environ.get ("PATH", "/usr/bin:/bin"), "LANG": os.environ.get("LANG", "C.UTF-8"), "TERM": os.environ.get("TERM", "dumb"), } diff --git a/tests/tools/test_exec_platform.py b/tests/tools/test_exec_platform.py index b24d01ac..e9922d2b 100644 --- a/tests/tools/test_exec_platform.py +++ b/tests/tools/test_exec_platform.py @@ -27,7 +27,7 @@ class TestBuildEnvUnix: def test_expected_keys(self): with patch("nanobot.agent.tools.shell._IS_WINDOWS", False): env = ExecTool()._build_env() - expected = {"HOME", "LANG", "TERM"} + expected = {"HOME", "LANG", "PATH","TERM"} assert expected <= set(env) if sys.platform != "win32": assert set(env) == expected @@ -148,23 +148,32 @@ class TestSpawnWindows: class TestPathAppendPlatform: @pytest.mark.asyncio - async def test_unix_injects_export(self): - """On Unix, path_append is an export statement prepended to command.""" - mock_proc = AsyncMock() + async def test_unix_injects_export (self): + """On Unix, path_append is passed via the env dict, not shell string.""" + mock_proc = AsyncMock () mock_proc.communicate.return_value = (b"ok", b"") mock_proc.returncode = 0 - with ( - patch("nanobot.agent.tools.shell._IS_WINDOWS", False), - patch.object(ExecTool, "_spawn", return_value=mock_proc) as mock_spawn, - patch.object(ExecTool, "_guard_command", return_value=None), - ): - tool = ExecTool(path_append="/opt/bin") - await tool.execute(command="ls") + captured_cmd = None + captured_env = {} - spawned_cmd = mock_spawn.call_args[0][0] - assert 'export PATH="$PATH:/opt/bin"' in spawned_cmd - assert spawned_cmd.endswith("ls") + async def capture_spawn (cmd, cwd, env): + nonlocal captured_cmd + captured_cmd = cmd + captured_env.update (env) + return mock_proc + + with ( + patch ("nanobot.agent.tools.shell._IS_WINDOWS", False), + patch.object (ExecTool, "_spawn", side_effect=capture_spawn), + patch.object (ExecTool, "_guard_command", return_value=None), + ): + tool = ExecTool (path_append="/opt/bin") + await tool.execute (command="ls") + + # path_append must be in the env dict, NOT injected into the command + assert captured_cmd == "ls" + assert captured_env["PATH"].endswith (":/opt/bin") @pytest.mark.asyncio async def test_windows_modifies_env(self): @@ -181,6 +190,7 @@ class TestPathAppendPlatform: with ( patch("nanobot.agent.tools.shell._IS_WINDOWS", True), + patch ("nanobot.agent.tools.shell.os.pathsep", ";"), patch.object(ExecTool, "_spawn", side_effect=capture_spawn), patch.object(ExecTool, "_guard_command", return_value=None), ):