From ef8bbab7b388e49399c093605d3019fe0a956890 Mon Sep 17 00:00:00 2001 From: Xubin Ren Date: Wed, 22 Apr 2026 04:54:07 +0000 Subject: [PATCH] test(cli): lock _render_interactive_ansi force_terminal to isatty Made-with: Cursor --- tests/cli/test_cli_input.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/cli/test_cli_input.py b/tests/cli/test_cli_input.py index 0e1235b8..e648e818 100644 --- a/tests/cli/test_cli_input.py +++ b/tests/cli/test_cli_input.py @@ -183,3 +183,22 @@ def test_make_console_force_terminal_false_when_stdout_is_not_tty(): with patch.object(sys.stdout, "isatty", return_value=False): console = stream_mod._make_console() assert console._force_terminal is False + + +def test_render_interactive_ansi_force_terminal_follows_isatty(): + """Mirror of _make_console: the capture console used to produce ANSI for + prompt_toolkit must also defer to sys.stdout.isatty(), otherwise cursor + escapes and spinner frames leak into piped output (#3265, #3370).""" + import sys + captured: dict = {} + + def render_fn(c): + captured["console"] = c + + with patch.object(sys.stdout, "isatty", return_value=True): + commands._render_interactive_ansi(render_fn) + assert captured["console"]._force_terminal is True + + with patch.object(sys.stdout, "isatty", return_value=False): + commands._render_interactive_ansi(render_fn) + assert captured["console"]._force_terminal is False