test: isolate CLI output capture with monkeypatch/redirect to fix stdout corruption in full suite runs (Issue #178)
- Replace raw patch("sys.stdout") and contextlib.redirect_stderr with pytest MonkeyPatch or contextlib redirect scoped to main calls in CLI tests (create_*, prs, python_cli, manage_labels, merge_pr, review_pr).
- Add regression tests in test_review_proofs.py for stdout/stderr remaining usable.
- Ensures normal pytest summary output without junitxml workaround; improves review validation reporting per #173.
- No behavior change to production code or gates.
Refs #178
This commit is contained in:
@@ -2,9 +2,11 @@
|
||||
|
||||
All API calls are mocked — no real network or keychain access.
|
||||
"""
|
||||
import io
|
||||
import json
|
||||
import sys
|
||||
import unittest
|
||||
import contextlib
|
||||
from unittest.mock import MagicMock, call, patch
|
||||
|
||||
sys.path.insert(0, str(__import__("pathlib").Path(__file__).resolve().parent.parent))
|
||||
@@ -33,7 +35,8 @@ class TestLabelCreation(unittest.TestCase):
|
||||
|
||||
# Patch sys.argv to avoid --dry
|
||||
with patch.object(sys, "argv", ["manage_labels.py"]):
|
||||
manage_labels.main()
|
||||
with contextlib.redirect_stdout(io.StringIO()), contextlib.redirect_stderr(io.StringIO()):
|
||||
manage_labels.main()
|
||||
|
||||
# The GET call happens, but no POST calls for label creation
|
||||
get_calls = [c for c in mock_api.call_args_list if c[0][0] == "GET"]
|
||||
@@ -59,7 +62,8 @@ class TestLabelCreation(unittest.TestCase):
|
||||
|
||||
mock_api.side_effect = side_effect
|
||||
with patch.object(sys, "argv", ["manage_labels.py"]):
|
||||
manage_labels.main()
|
||||
with contextlib.redirect_stdout(io.StringIO()), contextlib.redirect_stderr(io.StringIO()):
|
||||
manage_labels.main()
|
||||
|
||||
post_calls = [
|
||||
c for c in mock_api.call_args_list
|
||||
@@ -79,7 +83,8 @@ class TestDryRun(unittest.TestCase):
|
||||
mock_api.return_value = [] # no existing labels
|
||||
|
||||
with patch.object(sys, "argv", ["manage_labels.py", "--dry"]):
|
||||
manage_labels.main()
|
||||
with contextlib.redirect_stdout(io.StringIO()), contextlib.redirect_stderr(io.StringIO()):
|
||||
manage_labels.main()
|
||||
|
||||
# Only the GET call should be made, no POST or PUT
|
||||
for c in mock_api.call_args_list:
|
||||
@@ -107,7 +112,8 @@ class TestLabelMapping(unittest.TestCase):
|
||||
|
||||
mock_api.side_effect = side_effect
|
||||
with patch.object(sys, "argv", ["manage_labels.py"]):
|
||||
manage_labels.main()
|
||||
with contextlib.redirect_stdout(io.StringIO()), contextlib.redirect_stderr(io.StringIO()):
|
||||
manage_labels.main()
|
||||
|
||||
put_calls = [c for c in mock_api.call_args_list if c[0][0] == "PUT"]
|
||||
self.assertEqual(len(put_calls), len(manage_labels.MAPPING))
|
||||
|
||||
Reference in New Issue
Block a user