Skip to content

Commit 57b04e4

Browse files
committed
pyobject availability does not impact glib testing
1 parent 808497b commit 57b04e4

1 file changed

Lines changed: 33 additions & 1 deletion

File tree

tests/test_plugin_glib.py

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,11 +152,43 @@ def test_plugin_glib_send_raises_glib_error(mocker, enabled_glib_environment):
152152

153153
def test_plugin_glib_send_raises_generic(mocker, enabled_glib_environment):
154154
"""Simulate generic error in gio_iface.Notify()"""
155+
# Re: https://github.com/caronc/apprise/issues/1383
156+
# This test validates that the NotifyGLib plugin correctly handles a
157+
# generic exception raised by the `Notify()` method call on a mocked
158+
# DBus interface. However, it is only meaningful in environments that:
159+
#
160+
# 1. Do NOT have PyGObject (`gi`) installed, OR
161+
# 2. Have `gi`, but without introspection or live bindings activated.
162+
#
163+
# When PyGObject is installed and active, the `gi.repository` namespace
164+
# becomes populated by introspected C-based objects that do not behave
165+
# like regular Python functions. This causes mock patching via
166+
# `mocker.patch("gi.repository.Gio.DBusProxy.new_for_bus_sync")` to
167+
# silently fail or be ignored, as Python's mocking machinery cannot
168+
# reliably override these introspected symbols.
169+
#
170+
# This test exists to ensure coverage of legacy or minimal environments
171+
# where Apprise's GLib support can still be used through soft mocks,
172+
# such as CI/CD pipelines or headless test setups where PyGObject is
173+
# absent or stubbed (as done via `enabled_glib_environment`).
174+
#
175+
# Note: In production environments with active PyGObject, exception
176+
# handling is already tested via `GLib.Error` branches or during actual
177+
# usage of `NotifyGLib.send()`. This test supplements that by simulating
178+
# the rare fallback case of a non-GLib-related exception during Notify().
179+
import gi
180+
if hasattr(gi, "repository"):
181+
pytest.skip(
182+
"pygobject introspection active, test won't behave as expected")
183+
155184
fake_iface = Mock()
156185
fake_iface.Notify.side_effect = RuntimeError("boom")
186+
157187
mocker.patch(
158188
"gi.repository.Gio.DBusProxy.new_for_bus_sync",
159-
return_value=fake_iface)
189+
return_value=fake_iface,
190+
)
191+
160192
obj = apprise.Apprise.instantiate("glib://", suppress_exceptions=False)
161193
logger = mocker.spy(obj, "logger")
162194
assert obj.notify("boom", title="fail") is False

0 commit comments

Comments
 (0)