@@ -163,6 +163,16 @@ def test_connect_close(self):
163163
164164 async def _test ():
165165 with patch ("anyio.open_process" ) as mock_exec :
166+ # Mock version check process
167+ mock_version_process = MagicMock ()
168+ mock_version_process .stdout = MagicMock ()
169+ mock_version_process .stdout .receive = AsyncMock (
170+ return_value = b"2.0.0 (Claude Code)"
171+ )
172+ mock_version_process .terminate = MagicMock ()
173+ mock_version_process .wait = AsyncMock ()
174+
175+ # Mock main process
166176 mock_process = MagicMock ()
167177 mock_process .returncode = None
168178 mock_process .terminate = MagicMock ()
@@ -175,7 +185,8 @@ async def _test():
175185 mock_stdin .aclose = AsyncMock ()
176186 mock_process .stdin = mock_stdin
177187
178- mock_exec .return_value = mock_process
188+ # Return version process first, then main process
189+ mock_exec .side_effect = [mock_version_process , mock_process ]
179190
180191 transport = SubprocessCLITransport (
181192 prompt = "test" ,
@@ -363,13 +374,25 @@ async def _test():
363374 with patch (
364375 "anyio.open_process" , new_callable = AsyncMock
365376 ) as mock_open_process :
377+ # Mock version check process
378+ mock_version_process = MagicMock ()
379+ mock_version_process .stdout = MagicMock ()
380+ mock_version_process .stdout .receive = AsyncMock (
381+ return_value = b"2.0.0 (Claude Code)"
382+ )
383+ mock_version_process .terminate = MagicMock ()
384+ mock_version_process .wait = AsyncMock ()
385+
386+ # Mock main process
366387 mock_process = MagicMock ()
367388 mock_process .stdout = MagicMock ()
368389 mock_stdin = MagicMock ()
369390 mock_stdin .aclose = AsyncMock () # Add async aclose method
370391 mock_process .stdin = mock_stdin
371392 mock_process .returncode = None
372- mock_open_process .return_value = mock_process
393+
394+ # Return version process first, then main process
395+ mock_open_process .side_effect = [mock_version_process , mock_process ]
373396
374397 transport = SubprocessCLITransport (
375398 prompt = "test" ,
@@ -379,11 +402,13 @@ async def _test():
379402
380403 await transport .connect ()
381404
382- # Verify open_process was called with correct env vars
383- mock_open_process .assert_called_once ()
384- call_kwargs = mock_open_process .call_args .kwargs
385- assert "env" in call_kwargs
386- env_passed = call_kwargs ["env" ]
405+ # Verify open_process was called twice (version check + main process)
406+ assert mock_open_process .call_count == 2
407+
408+ # Check the second call (main process) for env vars
409+ second_call_kwargs = mock_open_process .call_args_list [1 ].kwargs
410+ assert "env" in second_call_kwargs
411+ env_passed = second_call_kwargs ["env" ]
387412
388413 # Check that custom env var was passed
389414 assert env_passed ["MY_TEST_VAR" ] == test_value
@@ -410,13 +435,25 @@ async def _test():
410435 with patch (
411436 "anyio.open_process" , new_callable = AsyncMock
412437 ) as mock_open_process :
438+ # Mock version check process
439+ mock_version_process = MagicMock ()
440+ mock_version_process .stdout = MagicMock ()
441+ mock_version_process .stdout .receive = AsyncMock (
442+ return_value = b"2.0.0 (Claude Code)"
443+ )
444+ mock_version_process .terminate = MagicMock ()
445+ mock_version_process .wait = AsyncMock ()
446+
447+ # Mock main process
413448 mock_process = MagicMock ()
414449 mock_process .stdout = MagicMock ()
415450 mock_stdin = MagicMock ()
416451 mock_stdin .aclose = AsyncMock () # Add async aclose method
417452 mock_process .stdin = mock_stdin
418453 mock_process .returncode = None
419- mock_open_process .return_value = mock_process
454+
455+ # Return version process first, then main process
456+ mock_open_process .side_effect = [mock_version_process , mock_process ]
420457
421458 transport = SubprocessCLITransport (
422459 prompt = "test" ,
@@ -426,11 +463,13 @@ async def _test():
426463
427464 await transport .connect ()
428465
429- # Verify open_process was called with correct user
430- mock_open_process .assert_called_once ()
431- call_kwargs = mock_open_process .call_args .kwargs
432- assert "user" in call_kwargs
433- user_passed = call_kwargs ["user" ]
466+ # Verify open_process was called twice (version check + main process)
467+ assert mock_open_process .call_count == 2
468+
469+ # Check the second call (main process) for user
470+ second_call_kwargs = mock_open_process .call_args_list [1 ].kwargs
471+ assert "user" in second_call_kwargs
472+ user_passed = second_call_kwargs ["user" ]
434473
435474 # Check that user was passed
436475 assert user_passed == "claude"
0 commit comments