import pytest from unittest.mock import MagicMock, patch import subprocess from shell_runner import run_powershell def test_run_powershell_qa_callback_on_failure(): """ Test that qa_callback is called when a powershell command fails (non-zero exit code). The result of the callback should be appended to the output. """ script = "Write-Error 'something went wrong'; exit 1" base_dir = "." # Mocking subprocess.run to simulate failure mock_result = MagicMock() mock_result.stdout = "" mock_result.stderr = "something went wrong" mock_result.returncode = 1 qa_callback = MagicMock(return_value="QA ANALYSIS: This looks like a syntax error.") with patch("subprocess.run", return_value=mock_result), \ patch("shutil.which", return_value="powershell.exe"): # We expect run_powershell to accept qa_callback output = run_powershell(script, base_dir, qa_callback=qa_callback) # Verify callback was called with stderr qa_callback.assert_called_once_with("something went wrong") # Verify output contains the callback result assert "QA ANALYSIS: This looks like a syntax error." in output assert "STDERR:\nsomething went wrong" in output assert "EXIT CODE: 1" in output def test_run_powershell_qa_callback_on_stderr_only(): """ Test that qa_callback is called when a command has stderr even if exit code is 0. """ script = "Write-Error 'non-fatal error'" base_dir = "." mock_result = MagicMock() mock_result.stdout = "Success" mock_result.stderr = "non-fatal error" mock_result.returncode = 0 qa_callback = MagicMock(return_value="QA ANALYSIS: Ignorable warning.") with patch("subprocess.run", return_value=mock_result), \ patch("shutil.which", return_value="powershell.exe"): output = run_powershell(script, base_dir, qa_callback=qa_callback) qa_callback.assert_called_once_with("non-fatal error") assert "QA ANALYSIS: Ignorable warning." in output assert "STDOUT:\nSuccess" in output def test_run_powershell_no_qa_callback_on_success(): """ Test that qa_callback is NOT called when the command succeeds without stderr. """ script = "Write-Output 'All good'" base_dir = "." mock_result = MagicMock() mock_result.stdout = "All good" mock_result.stderr = "" mock_result.returncode = 0 qa_callback = MagicMock() with patch("subprocess.run", return_value=mock_result), \ patch("shutil.which", return_value="powershell.exe"): output = run_powershell(script, base_dir, qa_callback=qa_callback) qa_callback.assert_not_called() assert "STDOUT:\nAll good" in output assert "EXIT CODE: 0" in output assert "QA ANALYSIS" not in output def test_run_powershell_optional_qa_callback(): """ Test that run_powershell still works without providing a qa_callback. """ script = "Write-Error 'error'" base_dir = "." mock_result = MagicMock() mock_result.stdout = "" mock_result.stderr = "error" mock_result.returncode = 1 with patch("subprocess.run", return_value=mock_result), \ patch("shutil.which", return_value="powershell.exe"): # Should not raise TypeError even if qa_callback is not provided output = run_powershell(script, base_dir) assert "STDERR:\nerror" in output assert "EXIT CODE: 1" in output def test_end_to_end_tier4_integration(): """ Verifies that shell_runner.run_powershell correctly uses ai_client.run_tier4_analysis. """ import ai_client script = "Invoke-Item non_existent_file" base_dir = "." stderr_content = "Invoke-Item : Cannot find path 'C:\\non_existent_file' because it does not exist." mock_result = MagicMock() mock_result.stdout = "" mock_result.stderr = stderr_content mock_result.returncode = 1 expected_analysis = "Path does not exist. Verify the file path and ensure the file is present before invoking." with patch("subprocess.run", return_value=mock_result), \ patch("shutil.which", return_value="powershell.exe"), \ patch("ai_client.run_tier4_analysis", return_value=expected_analysis) as mock_analysis: output = run_powershell(script, base_dir, qa_callback=ai_client.run_tier4_analysis) mock_analysis.assert_called_once_with(stderr_content) assert f"QA ANALYSIS:\n{expected_analysis}" in output