Files
cthulhu/tests/test_event_manager_xterm_handoff_regressions.py
2026-07-28 20:45:10 -04:00

130 lines
5.0 KiB
Python

import sys
import types
import unittest
from pathlib import Path
from unittest import mock
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src"))
stubCthulhu = types.ModuleType("cthulhu.cthulhu")
stubCthulhu.cthulhuApp = mock.Mock()
sys.modules.setdefault("cthulhu.cthulhu", stubCthulhu)
from cthulhu import event_manager
class FakeEvent:
def __init__(self, event_type, source="window", detail1=0):
self.type = event_type
self.source = source
self.detail1 = detail1
self.detail2 = 0
self.any_data = None
class EventManagerXtermHandoffRegressionTests(unittest.TestCase):
def setUp(self) -> None:
listener = mock.Mock()
fakeAtspi = types.SimpleNamespace(
Accessible=event_manager.Atspi.Accessible,
EventListener=types.SimpleNamespace(new=mock.Mock(return_value=listener)),
Role=event_manager.Atspi.Role,
)
self.listenerPatch = mock.patch.object(event_manager, "Atspi", fakeAtspi)
self.listenerPatch.start()
self.addCleanup(self.listenerPatch.stop)
self.manager = event_manager.EventManager(mock.Mock(), asyncMode=False)
self.manager._active = True
self.manager._inputEventManager = mock.Mock()
self.manager._inputEventManager.should_suppress_atspi_events_for_xterm.return_value = True
self.manager._get_scriptForEvent = mock.Mock()
def test_window_activate_is_dropped_while_xterm_is_foreground(self) -> None:
event = FakeEvent("window:activate")
with (
mock.patch.object(event_manager.debug, "printObjectEvent"),
mock.patch.object(event_manager.debug, "printMessage"),
):
self.manager._processObjectEvent(event)
self.manager._get_scriptForEvent.assert_not_called()
self.manager._inputEventManager.should_suppress_atspi_events_for_xterm.assert_called_once_with(
refresh=True,
)
def test_active_frame_event_is_dropped_while_xterm_is_foreground(self) -> None:
event = FakeEvent("object:state-changed:active", detail1=1)
with (
mock.patch.object(event_manager.debug, "printObjectEvent"),
mock.patch.object(event_manager.debug, "printMessage"),
mock.patch.object(event_manager.AXUtilities, "is_frame", return_value=True),
):
self.manager._processObjectEvent(event)
self.manager._get_scriptForEvent.assert_not_called()
self.manager._inputEventManager.should_suppress_atspi_events_for_xterm.assert_called_once_with(
refresh=True,
)
def test_focused_event_is_dropped_while_xterm_is_foreground(self) -> None:
event = FakeEvent("object:state-changed:focused", detail1=1)
with (
mock.patch.object(event_manager.debug, "printObjectEvent"),
mock.patch.object(event_manager.debug, "printMessage"),
):
self.manager._processObjectEvent(event)
self.manager._get_scriptForEvent.assert_not_called()
self.manager._inputEventManager.should_suppress_atspi_events_for_xterm.assert_called_once_with(
refresh=True,
)
def test_background_event_is_dropped_during_xterm_handoff_without_refresh(self) -> None:
event = FakeEvent("object:text-changed:insert")
with (
mock.patch.object(event_manager.debug, "printObjectEvent"),
mock.patch.object(event_manager.debug, "printMessage"),
):
self.manager._processObjectEvent(event)
self.manager._get_scriptForEvent.assert_not_called()
self.manager._inputEventManager.should_suppress_atspi_events_for_xterm.assert_called_once_with(
refresh=False,
)
def test_notification_daemon_window_create_is_processed_during_xterm_handoff(self) -> None:
event = FakeEvent("window:create", source=object())
notificationApp = object()
self.manager._isActivatableEvent = mock.Mock(return_value=(False, "test"))
with (
mock.patch.object(event_manager.debug, "printObjectEvent"),
mock.patch.object(event_manager.debug, "printMessage"),
mock.patch.object(
event_manager.AXObject,
"get_application",
return_value=notificationApp,
),
mock.patch.object(
event_manager.AXObject,
"get_name",
return_value="xfce4-notifyd",
),
mock.patch.object(event_manager.AXObject, "is_dead", return_value=False),
mock.patch.object(event_manager.AXUtilities, "is_defunct", return_value=False),
mock.patch.object(event_manager.AXUtilities, "is_iconified", return_value=False),
):
self.manager._processObjectEvent(event)
self.manager._get_scriptForEvent.assert_called_once_with(event)
self.manager._inputEventManager.should_suppress_atspi_events_for_xterm.assert_not_called()
if __name__ == "__main__":
unittest.main()