From dd01b6f846e55b7b86e4f81fc64bc729defe507f Mon Sep 17 00:00:00 2001 From: Krzysztof kuhy Rudnicki Date: Mon, 22 Jun 2026 09:14:29 +0200 Subject: [PATCH] Fix the real cause of the wake_alarm CI coverage gap The previous two fix attempts (removing -n 4 xdist parallelism, ruling out a Python 3.12-vs-3.14 difference) both targeted the wrong cause for the coverage gap on _alarm_display.py:71. The actual bug: _restore_display() was never mocked in the _block_extra_devices fixture shared by test_alarm_part2/3/4.py, so every test exercising on_close()/_lock.close() ran the REAL _restore_display(), which calls the REAL shutil.which('xset'). My dev machine has /usr/bin/xset installed, so it always hit the "found" branch by accident; the CI runner doesn't, so it always hit the "missing" branch instead, and there was no dedicated unit test for the "found" path at all. Fix: mock _restore_display in that fixture (matching its already-mocked siblings _restore_fans/_restore_alarm_audio/turn_off_plug), and add a dedicated, hermetic test for the xset-found branch that doesn't depend on whether the running machine actually has xset on PATH. Side benefit: the test suite no longer makes a real `xset s on` subprocess call on the developer's desktop as an untracked side effect of running tests. Co-Authored-By: Claude Sonnet 4.6 Claude-Session: https://claude.ai/code/session_01A7vbgtFfZmfxJtN5DdtJky --- wake_alarm/tests/test_alarm_display.py | 17 +++++++++++++++++ wake_alarm/tests/test_alarm_part2.py | 1 + wake_alarm/tests/test_alarm_part3.py | 1 + wake_alarm/tests/test_alarm_part4.py | 1 + 4 files changed, 20 insertions(+) diff --git a/wake_alarm/tests/test_alarm_display.py b/wake_alarm/tests/test_alarm_display.py index 6dc4900..a71f74c 100644 --- a/wake_alarm/tests/test_alarm_display.py +++ b/wake_alarm/tests/test_alarm_display.py @@ -127,3 +127,20 @@ class TestDisplayHelpers: ): _restore_display() mock_run.assert_not_called() + + def test_restore_display_runs_xset_s_on_when_present(self) -> None: + """_restore_display re-enables the screensaver via xset when present.""" + with ( + patch( + "python_pkg.wake_alarm._alarm_display.shutil.which", + return_value="/usr/bin/xset", + ), + patch("python_pkg.wake_alarm._alarm_display.subprocess.run") as mock_run, + ): + _restore_display() + mock_run.assert_called_once_with( + ["/usr/bin/xset", "s", "on"], + check=False, + capture_output=True, + timeout=5, + ) diff --git a/wake_alarm/tests/test_alarm_part2.py b/wake_alarm/tests/test_alarm_part2.py index e7a7181..81b60c8 100644 --- a/wake_alarm/tests/test_alarm_part2.py +++ b/wake_alarm/tests/test_alarm_part2.py @@ -59,6 +59,7 @@ def _block_extra_devices() -> Generator[MagicMock]: patch("python_pkg.wake_alarm._alarm._restore_fans"), patch("python_pkg.wake_alarm._alarm._set_max_brightness"), patch("python_pkg.wake_alarm._alarm._wake_display"), + patch("python_pkg.wake_alarm._alarm._restore_display"), patch("python_pkg.wake_alarm._alarm._warn_if_no_real_sink"), patch("python_pkg.wake_alarm._alarm._activate_alarm_audio", return_value=None), patch("python_pkg.wake_alarm._alarm._restore_alarm_audio"), diff --git a/wake_alarm/tests/test_alarm_part3.py b/wake_alarm/tests/test_alarm_part3.py index 249c4d5..f2772f4 100644 --- a/wake_alarm/tests/test_alarm_part3.py +++ b/wake_alarm/tests/test_alarm_part3.py @@ -58,6 +58,7 @@ def _block_extra_devices() -> Generator[MagicMock]: patch("python_pkg.wake_alarm._alarm._restore_fans"), patch("python_pkg.wake_alarm._alarm._set_max_brightness"), patch("python_pkg.wake_alarm._alarm._wake_display"), + patch("python_pkg.wake_alarm._alarm._restore_display"), patch("python_pkg.wake_alarm._alarm._warn_if_no_real_sink"), patch("python_pkg.wake_alarm._alarm._activate_alarm_audio", return_value=None), patch("python_pkg.wake_alarm._alarm._restore_alarm_audio"), diff --git a/wake_alarm/tests/test_alarm_part4.py b/wake_alarm/tests/test_alarm_part4.py index b091264..31e52a5 100644 --- a/wake_alarm/tests/test_alarm_part4.py +++ b/wake_alarm/tests/test_alarm_part4.py @@ -56,6 +56,7 @@ def _block_extra_devices() -> Generator[MagicMock]: patch("python_pkg.wake_alarm._alarm._restore_fans"), patch("python_pkg.wake_alarm._alarm._set_max_brightness"), patch("python_pkg.wake_alarm._alarm._wake_display"), + patch("python_pkg.wake_alarm._alarm._restore_display"), patch("python_pkg.wake_alarm._alarm._warn_if_no_real_sink"), patch("python_pkg.wake_alarm._alarm._activate_alarm_audio", return_value=None), patch("python_pkg.wake_alarm._alarm._restore_alarm_audio"),