Files
SneakyCode/tests/unit/test_display.py
Phillip Tarrant 5b5c3098bb fix: remove cat from allowed shell commands and fix stale display tests
Remove cat from allowed_commands to close shell redirect bypass vector
(read_file provides safer alternative). Update display tests to match
render_user_message returning Text instead of Panel, and shell test to
use head instead of cat.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 21:14:21 -05:00

88 lines
2.8 KiB
Python

"""Tests for display render functions and DisplayAdapter."""
from unittest.mock import MagicMock
from rich.panel import Panel
from rich.table import Table
from rich.text import Text
from app.models.message import Message
from app.utils.display import (
DisplayAdapter,
render_assistant_message,
render_error,
render_iteration_header,
render_tool_call,
render_tool_result,
render_token_usage,
render_user_message,
render_warning,
)
class TestRenderFunctions:
def test_render_user_message_returns_text(self) -> None:
result = render_user_message("hello")
assert isinstance(result, Text)
assert "hello" in result.plain
def test_render_assistant_message_returns_panel(self) -> None:
result = render_assistant_message("response")
assert isinstance(result, Panel)
assert result.title == "Assistant"
def test_render_tool_call_returns_text(self) -> None:
result = render_tool_call("read_file", '{"path": "foo.py"}')
assert isinstance(result, Text)
assert "read_file" in result.plain
def test_render_tool_result_success(self) -> None:
result = render_tool_result("read_file", "file contents here", is_error=False)
assert isinstance(result, Text)
assert "read_file" in result.plain
def test_render_tool_result_error(self) -> None:
result = render_tool_result("read_file", "not found", is_error=True)
assert isinstance(result, Text)
assert "read_file" in result.plain
def test_render_iteration_header(self) -> None:
result = render_iteration_header(3, 25)
assert isinstance(result, Text)
assert "3/25" in result.plain
def test_render_token_usage(self) -> None:
result = render_token_usage(1500, 32000)
assert isinstance(result, Text)
assert "1,500" in result.plain
def test_render_warning(self) -> None:
result = render_warning("something happened")
assert isinstance(result, Text)
def test_render_error(self) -> None:
result = render_error("bad thing")
assert isinstance(result, Text)
class TestDisplayAdapter:
def test_write_user_message(self) -> None:
mock_log = MagicMock()
adapter = DisplayAdapter(mock_log)
adapter.write_user_message("hello")
mock_log.write.assert_called_once()
arg = mock_log.write.call_args[0][0]
assert isinstance(arg, Text)
def test_write_tool_call(self) -> None:
mock_log = MagicMock()
adapter = DisplayAdapter(mock_log)
adapter.write_tool_call("read_file", '{"path": "x"}')
mock_log.write.assert_called_once()
def test_write_warning(self) -> None:
mock_log = MagicMock()
adapter = DisplayAdapter(mock_log)
adapter.write_warning("oops")
mock_log.write.assert_called_once()