fix(inject): explain the silent-drop risk of an explicit IBus pin on niri

An explicit ibus pin (VOCULINUX_FORCE_BACKEND or text_injection.backend)
is still honoured on niri, as the documented escape hatch. The one warning
it logs now names niri and says IBus there can report success while text
is silently dropped, instead of the generic compositor wording.

Refs #16
This commit is contained in:
2026-11-06 19:53:04 +05:30
parent e88afd224f
commit 5a0e16da89
2 changed files with 45 additions and 8 deletions
+27 -1
View File
@@ -497,6 +497,7 @@ class TestCheckDependencies(unittest.TestCase):
desktop: str = "Hyprland",
env: Any = None,
config_pin: bool = False,
ibus_class: Any = None,
) -> tuple[list[str], int]:
"""Drive _check_dependencies with an ibus pin; return (logs, bridge_call_count)."""
from vocalinux.text_injection.text_injector import DesktopEnvironment, TextInjector
@@ -536,7 +537,10 @@ class TestCheckDependencies(unittest.TestCase):
patch(
"vocalinux.text_injection.text_injector.is_ibus_daemon_running", return_value=True
),
patch("vocalinux.text_injection.text_injector.IBusTextInjector"),
patch(
"vocalinux.text_injection.text_injector.IBusTextInjector",
new=ibus_class if ibus_class is not None else MagicMock(),
),
patch.object(TextInjector, "_start_ibus_initialization", lambda s: None),
# shutil.which is patched to claim every tool exists, so without this
# the real probe shells out to a ydotoold that may not be installed
@@ -595,6 +599,28 @@ class TestCheckDependencies(unittest.TestCase):
_, call_count = self._run_ibus_pin(bridges=bridges)
self.assertEqual(call_count, 1, f"bridges={bridges}: expected 1 call, got {call_count}")
def test_ibus_pin_on_niri_is_honoured_with_one_silent_drop_warning(self):
"""An explicit IBus pin stays an escape hatch on niri, with one clear warning.
Both pin sources must construct the IBus injector (the pin is honoured)
and log exactly one WARNING saying IBus on niri can report success while
text is silently dropped.
"""
for config_pin in (False, True):
with self.subTest(config_pin=config_pin):
ibus_class = MagicMock()
output, _ = self._run_ibus_pin(
bridges=False,
desktop="niri",
config_pin=config_pin,
ibus_class=ibus_class,
)
ibus_class.assert_called_once()
warnings = [line for line in output if line.startswith("WARNING:")]
self.assertEqual(len(warnings), 1, f"expected one WARNING, got: {warnings}")
self.assertIn("niri", warnings[0])
self.assertIn("can report success while text is silently dropped", warnings[0])
def test_ibus_pin_on_x11_does_not_warn(self):
"""The denylist is a Wayland concern; X11 reaches apps through XIM."""
from vocalinux.text_injection.text_injector import DesktopEnvironment