Fix screenshot affecting terminal state in open sessions
- Add get_screen_snapshot() method that doesn't mutate terminal state - Use change counter for reliable activity detection instead of dirty flag - Update screenshot handler to use non-mutating snapshot method - Refactor tests to use shared fixtures and reduce duplication - Update copilot-instructions.md with detailed Makefile usage
This commit is contained in:
@@ -86,6 +86,7 @@ def mock_session():
|
||||
session = MagicMock()
|
||||
session.get_screen_has_changes = AsyncMock(return_value=False)
|
||||
session.get_screen_state = AsyncMock(return_value=(80, 24, [], True))
|
||||
session.get_screen_snapshot = AsyncMock(return_value=(80, 24, [], True))
|
||||
return session
|
||||
|
||||
|
||||
@@ -95,6 +96,54 @@ def poller() -> Poller:
|
||||
return Poller()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_poller() -> MagicMock:
|
||||
"""Create a mock Poller for unit tests."""
|
||||
return MagicMock()
|
||||
|
||||
|
||||
class DummyAsyncLock:
|
||||
"""A dummy async context manager for replacing locks in tests."""
|
||||
|
||||
async def __aenter__(self):
|
||||
return None
|
||||
|
||||
async def __aexit__(self, exc_type, exc, tb):
|
||||
return False
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def dummy_lock() -> DummyAsyncLock:
|
||||
"""Create a dummy async lock for tests."""
|
||||
return DummyAsyncLock()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_screen_char():
|
||||
"""Factory for creating mock pyte screen characters."""
|
||||
|
||||
def _make(
|
||||
data: str = " ",
|
||||
fg: int = 0,
|
||||
bg: int = 0,
|
||||
bold: bool = False,
|
||||
italics: bool = False,
|
||||
underscore: bool = False,
|
||||
reverse: bool = False,
|
||||
) -> MagicMock:
|
||||
char = MagicMock()
|
||||
char.data = data
|
||||
char.fg = fg
|
||||
char.bg = bg
|
||||
char.bold = bold
|
||||
char.italics = italics
|
||||
char.underscore = underscore
|
||||
char.reverse = reverse
|
||||
return char
|
||||
|
||||
return _make
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def session_manager(poller: Poller, tmp_path: Path, sample_terminal_app: App) -> SessionManager:
|
||||
"""Create a SessionManager instance."""
|
||||
|
||||
Reference in New Issue
Block a user