Files
cthulhu/tests/test_web_input_regressions.py

103 lines
3.9 KiB
Python

import os
import sys
import unittest
from pathlib import Path
from unittest import mock
import gi
os.environ.setdefault("GSETTINGS_BACKEND", "memory")
gi.require_version("Gdk", "3.0")
gi.require_version("Gtk", "3.0")
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src"))
soundGeneratorModule = sys.modules.get("cthulhu.sound_generator")
if soundGeneratorModule is not None and not hasattr(soundGeneratorModule, "SoundGenerator"):
class _StubSoundGenerator:
pass
soundGeneratorModule.SoundGenerator = _StubSoundGenerator
from cthulhu.scripts.web import script as web_script
class WebKeyGrabRegressionTests(unittest.TestCase):
def _make_partial_script(self):
testScript = web_script.Script.__new__(web_script.Script)
testScript._lastCommandWasCaretNav = True
testScript._lastCommandWasStructNav = True
testScript._lastCommandWasMouseButton = True
testScript._lastMouseButtonContext = ("old", 7)
testScript._madeFindAnnouncement = True
testScript._inFocusMode = True
testScript._navSuspended = False
testScript.removeKeyGrabs = mock.Mock()
testScript.refreshKeyGrabs = mock.Mock()
testScript._setNavigationSuspended = mock.Mock()
testScript.utilities = mock.Mock()
testScript.utilities.isZombie.return_value = False
testScript.utilities.isDocument.return_value = False
testScript.utilities.getTopLevelDocumentForObject.return_value = None
return testScript
def test_window_deactivate_does_not_drop_key_grabs(self):
testScript = self._make_partial_script()
result = web_script.Script.onWindowDeactivated(testScript, mock.Mock())
self.assertFalse(result)
self.assertFalse(testScript._lastCommandWasCaretNav)
self.assertFalse(testScript._lastCommandWasStructNav)
self.assertFalse(testScript._lastCommandWasMouseButton)
self.assertEqual(testScript._lastMouseButtonContext, (None, -1))
testScript.removeKeyGrabs.assert_not_called()
def test_non_document_focus_change_without_prior_document_does_not_refresh_grabs(self):
testScript = self._make_partial_script()
oldFocus = object()
newFocus = object()
with mock.patch("cthulhu.scripts.web.script.AXObject.is_dead", return_value=False):
result = web_script.Script.locus_of_focus_changed(testScript, None, oldFocus, newFocus)
self.assertFalse(result)
self.assertFalse(testScript._madeFindAnnouncement)
self.assertFalse(testScript._inFocusMode)
testScript._setNavigationSuspended.assert_called_once_with(
True,
"focus left document content",
)
testScript.refreshKeyGrabs.assert_not_called()
def test_non_document_focus_change_refreshes_grabs_after_leaving_document(self):
testScript = self._make_partial_script()
oldFocus = object()
newFocus = object()
oldDocument = object()
testScript.utilities.getTopLevelDocumentForObject.side_effect = (
lambda obj: oldDocument if obj is oldFocus else None
)
with mock.patch("cthulhu.scripts.web.script.AXObject.is_dead", return_value=False):
result = web_script.Script.locus_of_focus_changed(testScript, None, oldFocus, newFocus)
self.assertFalse(result)
testScript.refreshKeyGrabs.assert_called_once_with()
def test_non_document_focus_change_refreshes_grabs_when_old_focus_missing(self):
testScript = self._make_partial_script()
newFocus = object()
with mock.patch("cthulhu.scripts.web.script.AXObject.is_dead", return_value=False):
result = web_script.Script.locus_of_focus_changed(testScript, None, None, newFocus)
self.assertFalse(result)
testScript.refreshKeyGrabs.assert_called_once_with()
if __name__ == "__main__":
unittest.main()